199aa490225c81012235659d9a183226b286178c8yangguo@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 499aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 599aa490225c81012235659d9a183226b286178c8yangguo@chromium.org#ifndef V8_TRANSITIONS_INL_H_ 699aa490225c81012235659d9a183226b286178c8yangguo@chromium.org#define V8_TRANSITIONS_INL_H_ 799aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/transitions.h" 999aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 1099aa490225c81012235659d9a183226b286178c8yangguo@chromium.orgnamespace v8 { 1199aa490225c81012235659d9a183226b286178c8yangguo@chromium.orgnamespace internal { 1299aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 1399aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 1499aa490225c81012235659d9a183226b286178c8yangguo@chromium.org#define FIELD_ADDR(p, offset) \ 1599aa490225c81012235659d9a183226b286178c8yangguo@chromium.org (reinterpret_cast<byte*>(p) + offset - kHeapObjectTag) 1699aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 1799aa490225c81012235659d9a183226b286178c8yangguo@chromium.org#define WRITE_FIELD(p, offset, value) \ 1899aa490225c81012235659d9a183226b286178c8yangguo@chromium.org (*reinterpret_cast<Object**>(FIELD_ADDR(p, offset)) = value) 1999aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 2099aa490225c81012235659d9a183226b286178c8yangguo@chromium.org#define CONDITIONAL_WRITE_BARRIER(heap, object, offset, value, mode) \ 2199aa490225c81012235659d9a183226b286178c8yangguo@chromium.org if (mode == UPDATE_WRITE_BARRIER) { \ 2299aa490225c81012235659d9a183226b286178c8yangguo@chromium.org heap->incremental_marking()->RecordWrite( \ 2399aa490225c81012235659d9a183226b286178c8yangguo@chromium.org object, HeapObject::RawField(object, offset), value); \ 2499aa490225c81012235659d9a183226b286178c8yangguo@chromium.org if (heap->InNewSpace(value)) { \ 2599aa490225c81012235659d9a183226b286178c8yangguo@chromium.org heap->RecordWrite(object->address(), offset); \ 2699aa490225c81012235659d9a183226b286178c8yangguo@chromium.org } \ 2799aa490225c81012235659d9a183226b286178c8yangguo@chromium.org } 2899aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 2999aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 3099aa490225c81012235659d9a183226b286178c8yangguo@chromium.orgTransitionArray* TransitionArray::cast(Object* object) { 31e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(object->IsTransitionArray()); 3299aa490225c81012235659d9a183226b286178c8yangguo@chromium.org return reinterpret_cast<TransitionArray*>(object); 3399aa490225c81012235659d9a183226b286178c8yangguo@chromium.org} 3499aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 3599aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 3699aa490225c81012235659d9a183226b286178c8yangguo@chromium.orgbool TransitionArray::HasElementsTransition() { 37d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org return Search(GetHeap()->elements_transition_symbol()) != kNotFound; 3899aa490225c81012235659d9a183226b286178c8yangguo@chromium.org} 3999aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 4099aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 41de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.orgObject* TransitionArray::back_pointer_storage() { 42de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org return get(kBackPointerStorageIndex); 43de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org} 44de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org 45de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org 46de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.orgvoid TransitionArray::set_back_pointer_storage(Object* back_pointer, 47de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org WriteBarrierMode mode) { 48de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org Heap* heap = GetHeap(); 49de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org WRITE_FIELD(this, kBackPointerStorageOffset, back_pointer); 50de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org CONDITIONAL_WRITE_BARRIER( 51de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org heap, this, kBackPointerStorageOffset, back_pointer, mode); 52de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org} 53de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org 54de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org 5581cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.orgbool TransitionArray::HasPrototypeTransitions() { 5633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return IsFullTransitionArray() && 5733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org get(kPrototypeTransitionsIndex) != Smi::FromInt(0); 5881cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org} 5981cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org 6081cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org 6181cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.orgFixedArray* TransitionArray::GetPrototypeTransitions() { 62e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsFullTransitionArray()); 6381cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org Object* prototype_transitions = get(kPrototypeTransitionsIndex); 6481cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org return FixedArray::cast(prototype_transitions); 6581cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org} 6681cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org 6781cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org 6881cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.orgvoid TransitionArray::SetPrototypeTransitions(FixedArray* transitions, 6981cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org WriteBarrierMode mode) { 70e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsFullTransitionArray()); 71e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(transitions->IsFixedArray()); 7281cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org Heap* heap = GetHeap(); 7381cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org WRITE_FIELD(this, kPrototypeTransitionsOffset, transitions); 7481cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org CONDITIONAL_WRITE_BARRIER( 7581cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org heap, this, kPrototypeTransitionsOffset, transitions, mode); 7681cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org} 7781cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org 7881cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org 7981cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.orgObject** TransitionArray::GetPrototypeTransitionsSlot() { 8081cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org return HeapObject::RawField(reinterpret_cast<HeapObject*>(this), 8181cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org kPrototypeTransitionsOffset); 8281cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org} 8381cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org 8481cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org 8599aa490225c81012235659d9a183226b286178c8yangguo@chromium.orgObject** TransitionArray::GetKeySlot(int transition_number) { 86e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!IsSimpleTransition()); 87e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(transition_number < number_of_transitions()); 884954674151afa960af66efb4831df06bde727333yangguo@chromium.org return RawFieldOfElementAt(ToKeyIndex(transition_number)); 8999aa490225c81012235659d9a183226b286178c8yangguo@chromium.org} 9099aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 9199aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 92750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgName* TransitionArray::GetKey(int transition_number) { 9333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if (IsSimpleTransition()) { 9433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org Map* target = GetTarget(kSimpleTransitionIndex); 9533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org int descriptor = target->LastAdded(); 96750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Name* key = target->instance_descriptors()->GetKey(descriptor); 9733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return key; 9833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org } 99e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(transition_number < number_of_transitions()); 100750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return Name::cast(get(ToKeyIndex(transition_number))); 10199aa490225c81012235659d9a183226b286178c8yangguo@chromium.org} 10299aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 10399aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 104750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgvoid TransitionArray::SetKey(int transition_number, Name* key) { 105e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!IsSimpleTransition()); 106e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(transition_number < number_of_transitions()); 10799aa490225c81012235659d9a183226b286178c8yangguo@chromium.org set(ToKeyIndex(transition_number), key); 10899aa490225c81012235659d9a183226b286178c8yangguo@chromium.org} 10999aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 11099aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 111753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.orgMap* TransitionArray::GetTarget(int transition_number) { 11233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if (IsSimpleTransition()) { 113e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(transition_number == kSimpleTransitionIndex); 11433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return Map::cast(get(kSimpleTransitionTarget)); 11533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org } 116e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(transition_number < number_of_transitions()); 117753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org return Map::cast(get(ToTargetIndex(transition_number))); 11899aa490225c81012235659d9a183226b286178c8yangguo@chromium.org} 11999aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 12099aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 121753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.orgvoid TransitionArray::SetTarget(int transition_number, Map* value) { 12233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if (IsSimpleTransition()) { 123e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(transition_number == kSimpleTransitionIndex); 12433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return set(kSimpleTransitionTarget, value); 12533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org } 126e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(transition_number < number_of_transitions()); 127753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org set(ToTargetIndex(transition_number), value); 12899aa490225c81012235659d9a183226b286178c8yangguo@chromium.org} 12999aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 13099aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 13199aa490225c81012235659d9a183226b286178c8yangguo@chromium.orgPropertyDetails TransitionArray::GetTargetDetails(int transition_number) { 132753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org Map* map = GetTarget(transition_number); 133bfd1d202fb7cd6d54d956414bad9f75a995d0f65machenbach@chromium.org return map->GetLastDescriptorDetails(); 13499aa490225c81012235659d9a183226b286178c8yangguo@chromium.org} 13599aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 13699aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 137750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgint TransitionArray::Search(Name* name) { 13889e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org if (IsSimpleTransition()) { 139750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Name* key = GetKey(kSimpleTransitionIndex); 14089e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org if (key->Equals(name)) return kSimpleTransitionIndex; 14189e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org return kNotFound; 14289e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org } 14306ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org return internal::Search<ALL_ENTRIES>(this, name); 14499aa490225c81012235659d9a183226b286178c8yangguo@chromium.org} 14599aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 14699aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 14756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.orgvoid TransitionArray::NoIncrementalWriteBarrierSet(int transition_number, 148750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Name* key, 14956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org Map* target) { 15056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org FixedArray::NoIncrementalWriteBarrierSet( 15156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org this, ToKeyIndex(transition_number), key); 15256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org FixedArray::NoIncrementalWriteBarrierSet( 15356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org this, ToTargetIndex(transition_number), target); 15499aa490225c81012235659d9a183226b286178c8yangguo@chromium.org} 15599aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 15699aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 15799aa490225c81012235659d9a183226b286178c8yangguo@chromium.org#undef FIELD_ADDR 15899aa490225c81012235659d9a183226b286178c8yangguo@chromium.org#undef WRITE_FIELD 15999aa490225c81012235659d9a183226b286178c8yangguo@chromium.org#undef CONDITIONAL_WRITE_BARRIER 16099aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 16199aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 16299aa490225c81012235659d9a183226b286178c8yangguo@chromium.org} } // namespace v8::internal 16399aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 16499aa490225c81012235659d9a183226b286178c8yangguo@chromium.org#endif // V8_TRANSITIONS_INL_H_ 165