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