Index: test/cctest/test-transitions.cc |
diff --git a/test/cctest/test-transitions.cc b/test/cctest/test-transitions.cc |
index 59c9f74c96dbdb41ef34ccb1b55e634936fcf522..800c2a0e4436950798df310c1f2d7fa4eaf6e1f7 100644 |
--- a/test/cctest/test-transitions.cc |
+++ b/test/cctest/test-transitions.cc |
@@ -20,16 +20,6 @@ using namespace v8::internal; |
// Helper functions. |
// |
-static void ConnectTransition(Handle<Map> parent, |
- Handle<TransitionArray> transitions, |
- Handle<Map> child) { |
- if (!parent->HasTransitionArray() || *transitions != parent->transitions()) { |
- parent->set_transitions(*transitions); |
- } |
- child->SetBackPointer(*parent); |
-} |
- |
- |
static void CheckPropertyDetailsFieldsConsistency(PropertyType type, |
PropertyKind kind, |
PropertyLocation location) { |
@@ -69,34 +59,32 @@ TEST(TransitionArray_SimpleFieldTransitions) { |
attributes, Representation::Tagged(), |
OMIT_TRANSITION).ToHandleChecked(); |
- CHECK(!map0->HasTransitionArray()); |
- Handle<TransitionArray> transitions = TransitionArray::Allocate(isolate, 0); |
- CHECK(transitions->IsFullTransitionArray()); |
- |
- int transition; |
- transitions = |
- transitions->Insert(map0, name1, map1, SIMPLE_PROPERTY_TRANSITION); |
- ConnectTransition(map0, transitions, map1); |
- CHECK(transitions->IsSimpleTransition()); |
- transition = transitions->Search(kData, *name1, attributes); |
- CHECK_EQ(TransitionArray::kSimpleTransitionIndex, transition); |
- CHECK_EQ(*name1, transitions->GetKey(transition)); |
- CHECK_EQ(*map1, transitions->GetTarget(transition)); |
- |
- transitions = |
- transitions->Insert(map0, name2, map2, SIMPLE_PROPERTY_TRANSITION); |
- ConnectTransition(map0, transitions, map2); |
- CHECK(transitions->IsFullTransitionArray()); |
- |
- transition = transitions->Search(kData, *name1, attributes); |
- CHECK_EQ(*name1, transitions->GetKey(transition)); |
- CHECK_EQ(*map1, transitions->GetTarget(transition)); |
- |
- transition = transitions->Search(kData, *name2, attributes); |
- CHECK_EQ(*name2, transitions->GetKey(transition)); |
- CHECK_EQ(*map2, transitions->GetTarget(transition)); |
- |
- DCHECK(transitions->IsSortedNoDuplicates()); |
+ CHECK(map0->raw_transitions()->IsSmi()); |
+ |
+ TransitionArray::Insert(map0, name1, map1, SIMPLE_PROPERTY_TRANSITION); |
+ CHECK(TransitionArray::IsSimpleTransition(map0->raw_transitions())); |
+ CHECK_EQ(*map1, |
+ TransitionArray::SearchTransition(*map0, kData, *name1, attributes)); |
+ CHECK_EQ(1, TransitionArray::NumberOfTransitions(map0->raw_transitions())); |
+ CHECK_EQ(*name1, TransitionArray::GetKey(map0->raw_transitions(), 0)); |
+ CHECK_EQ(*map1, TransitionArray::GetTarget(map0->raw_transitions(), 0)); |
+ |
+ TransitionArray::Insert(map0, name2, map2, SIMPLE_PROPERTY_TRANSITION); |
+ CHECK(TransitionArray::IsFullTransitionArray(map0->raw_transitions())); |
+ |
+ CHECK_EQ(*map1, |
+ TransitionArray::SearchTransition(*map0, kData, *name1, attributes)); |
+ CHECK_EQ(*map2, |
+ TransitionArray::SearchTransition(*map0, kData, *name2, attributes)); |
+ CHECK_EQ(2, TransitionArray::NumberOfTransitions(map0->raw_transitions())); |
+ for (int i = 0; i < 2; i++) { |
+ Name* key = TransitionArray::GetKey(map0->raw_transitions(), i); |
+ Map* target = TransitionArray::GetTarget(map0->raw_transitions(), i); |
+ CHECK((key == *name1 && target == *map1) || |
+ (key == *name2 && target == *map2)); |
+ } |
+ |
+ DCHECK(TransitionArray::IsSortedNoDuplicates(*map0)); |
} |
@@ -120,31 +108,32 @@ TEST(TransitionArray_FullFieldTransitions) { |
attributes, Representation::Tagged(), |
OMIT_TRANSITION).ToHandleChecked(); |
- CHECK(!map0->HasTransitionArray()); |
- Handle<TransitionArray> transitions = TransitionArray::Allocate(isolate, 0); |
- CHECK(transitions->IsFullTransitionArray()); |
- |
- int transition; |
- transitions = transitions->Insert(map0, name1, map1, PROPERTY_TRANSITION); |
- ConnectTransition(map0, transitions, map1); |
- CHECK(transitions->IsFullTransitionArray()); |
- transition = transitions->Search(kData, *name1, attributes); |
- CHECK_EQ(*name1, transitions->GetKey(transition)); |
- CHECK_EQ(*map1, transitions->GetTarget(transition)); |
- |
- transitions = transitions->Insert(map0, name2, map2, PROPERTY_TRANSITION); |
- ConnectTransition(map0, transitions, map2); |
- CHECK(transitions->IsFullTransitionArray()); |
- |
- transition = transitions->Search(kData, *name1, attributes); |
- CHECK_EQ(*name1, transitions->GetKey(transition)); |
- CHECK_EQ(*map1, transitions->GetTarget(transition)); |
- |
- transition = transitions->Search(kData, *name2, attributes); |
- CHECK_EQ(*name2, transitions->GetKey(transition)); |
- CHECK_EQ(*map2, transitions->GetTarget(transition)); |
+ CHECK(map0->raw_transitions()->IsSmi()); |
+ |
+ TransitionArray::Insert(map0, name1, map1, PROPERTY_TRANSITION); |
+ CHECK(TransitionArray::IsFullTransitionArray(map0->raw_transitions())); |
+ CHECK_EQ(*map1, |
+ TransitionArray::SearchTransition(*map0, kData, *name1, attributes)); |
+ CHECK_EQ(1, TransitionArray::NumberOfTransitions(map0->raw_transitions())); |
+ CHECK_EQ(*name1, TransitionArray::GetKey(map0->raw_transitions(), 0)); |
+ CHECK_EQ(*map1, TransitionArray::GetTarget(map0->raw_transitions(), 0)); |
+ |
+ TransitionArray::Insert(map0, name2, map2, PROPERTY_TRANSITION); |
+ CHECK(TransitionArray::IsFullTransitionArray(map0->raw_transitions())); |
+ |
+ CHECK_EQ(*map1, |
+ TransitionArray::SearchTransition(*map0, kData, *name1, attributes)); |
+ CHECK_EQ(*map2, |
+ TransitionArray::SearchTransition(*map0, kData, *name2, attributes)); |
+ CHECK_EQ(2, TransitionArray::NumberOfTransitions(map0->raw_transitions())); |
+ for (int i = 0; i < 2; i++) { |
+ Name* key = TransitionArray::GetKey(map0->raw_transitions(), i); |
+ Map* target = TransitionArray::GetTarget(map0->raw_transitions(), i); |
+ CHECK((key == *name1 && target == *map1) || |
+ (key == *name2 && target == *map2)); |
+ } |
- DCHECK(transitions->IsSortedNoDuplicates()); |
+ DCHECK(TransitionArray::IsSortedNoDuplicates(*map0)); |
} |
@@ -160,9 +149,7 @@ TEST(TransitionArray_DifferentFieldNames) { |
PropertyAttributes attributes = NONE; |
Handle<Map> map0 = Map::Create(isolate, 0); |
- CHECK(!map0->HasTransitionArray()); |
- Handle<TransitionArray> transitions = TransitionArray::Allocate(isolate, 0); |
- CHECK(transitions->IsFullTransitionArray()); |
+ CHECK(map0->raw_transitions()->IsSmi()); |
for (int i = 0; i < PROPS_COUNT; i++) { |
EmbeddedVector<char, 64> buffer; |
@@ -175,17 +162,25 @@ TEST(TransitionArray_DifferentFieldNames) { |
names[i] = name; |
maps[i] = map; |
- transitions = transitions->Insert(map0, name, map, PROPERTY_TRANSITION); |
- ConnectTransition(map0, transitions, map); |
+ TransitionArray::Insert(map0, name, map, PROPERTY_TRANSITION); |
} |
for (int i = 0; i < PROPS_COUNT; i++) { |
- int transition = transitions->Search(kData, *names[i], attributes); |
- CHECK_EQ(*names[i], transitions->GetKey(transition)); |
- CHECK_EQ(*maps[i], transitions->GetTarget(transition)); |
+ CHECK_EQ(*maps[i], TransitionArray::SearchTransition( |
+ *map0, kData, *names[i], attributes)); |
+ } |
+ for (int i = 0; i < PROPS_COUNT; i++) { |
+ Name* key = TransitionArray::GetKey(map0->raw_transitions(), i); |
+ Map* target = TransitionArray::GetTarget(map0->raw_transitions(), i); |
+ for (int j = 0; j < PROPS_COUNT; j++) { |
+ if (*names[i] == key) { |
+ CHECK_EQ(*maps[i], target); |
+ break; |
+ } |
+ } |
} |
- DCHECK(transitions->IsSortedNoDuplicates()); |
+ DCHECK(TransitionArray::IsSortedNoDuplicates(*map0)); |
} |
@@ -196,9 +191,7 @@ TEST(TransitionArray_SameFieldNamesDifferentAttributesSimple) { |
Factory* factory = isolate->factory(); |
Handle<Map> map0 = Map::Create(isolate, 0); |
- CHECK(!map0->HasTransitionArray()); |
- Handle<TransitionArray> transitions = TransitionArray::Allocate(isolate, 0); |
- CHECK(transitions->IsFullTransitionArray()); |
+ CHECK(map0->raw_transitions()->IsSmi()); |
const int ATTRS_COUNT = (READ_ONLY | DONT_ENUM | DONT_DELETE) + 1; |
STATIC_ASSERT(ATTRS_COUNT == 8); |
@@ -215,20 +208,20 @@ TEST(TransitionArray_SameFieldNamesDifferentAttributesSimple) { |
OMIT_TRANSITION).ToHandleChecked(); |
attr_maps[i] = map; |
- transitions = transitions->Insert(map0, name, map, PROPERTY_TRANSITION); |
- ConnectTransition(map0, transitions, map); |
+ TransitionArray::Insert(map0, name, map, PROPERTY_TRANSITION); |
} |
// Ensure that transitions for |name| field are valid. |
for (int i = 0; i < ATTRS_COUNT; i++) { |
PropertyAttributes attributes = static_cast<PropertyAttributes>(i); |
- |
- int transition = transitions->Search(kData, *name, attributes); |
- CHECK_EQ(*name, transitions->GetKey(transition)); |
- CHECK_EQ(*attr_maps[i], transitions->GetTarget(transition)); |
+ CHECK_EQ(*attr_maps[i], TransitionArray::SearchTransition( |
+ *map0, kData, *name, attributes)); |
+ // All transitions use the same key, so this check doesn't need to |
+ // care about ordering. |
+ CHECK_EQ(*name, TransitionArray::GetKey(map0->raw_transitions(), i)); |
} |
- DCHECK(transitions->IsSortedNoDuplicates()); |
+ DCHECK(TransitionArray::IsSortedNoDuplicates(*map0)); |
} |
@@ -243,9 +236,7 @@ TEST(TransitionArray_SameFieldNamesDifferentAttributes) { |
Handle<Map> maps[PROPS_COUNT]; |
Handle<Map> map0 = Map::Create(isolate, 0); |
- CHECK(!map0->HasTransitionArray()); |
- Handle<TransitionArray> transitions = TransitionArray::Allocate(isolate, 0); |
- CHECK(transitions->IsFullTransitionArray()); |
+ CHECK(map0->raw_transitions()->IsSmi()); |
// Some number of fields. |
for (int i = 0; i < PROPS_COUNT; i++) { |
@@ -259,8 +250,7 @@ TEST(TransitionArray_SameFieldNamesDifferentAttributes) { |
names[i] = name; |
maps[i] = map; |
- transitions = transitions->Insert(map0, name, map, PROPERTY_TRANSITION); |
- ConnectTransition(map0, transitions, map); |
+ TransitionArray::Insert(map0, name, map, PROPERTY_TRANSITION); |
} |
const int ATTRS_COUNT = (READ_ONLY | DONT_ENUM | DONT_DELETE) + 1; |
@@ -278,25 +268,36 @@ TEST(TransitionArray_SameFieldNamesDifferentAttributes) { |
OMIT_TRANSITION).ToHandleChecked(); |
attr_maps[i] = map; |
- transitions = transitions->Insert(map0, name, map, PROPERTY_TRANSITION); |
- ConnectTransition(map0, transitions, map); |
+ TransitionArray::Insert(map0, name, map, PROPERTY_TRANSITION); |
} |
// Ensure that transitions for |name| field are valid. |
for (int i = 0; i < ATTRS_COUNT; i++) { |
- PropertyAttributes attributes = static_cast<PropertyAttributes>(i); |
- |
- int transition = transitions->Search(kData, *name, attributes); |
- CHECK_EQ(*name, transitions->GetKey(transition)); |
- CHECK_EQ(*attr_maps[i], transitions->GetTarget(transition)); |
+ PropertyAttributes attr = static_cast<PropertyAttributes>(i); |
+ CHECK_EQ(*attr_maps[i], |
+ TransitionArray::SearchTransition(*map0, kData, *name, attr)); |
} |
// Ensure that info about the other fields still valid. |
- for (int i = 0; i < PROPS_COUNT; i++) { |
- int transition = transitions->Search(kData, *names[i], NONE); |
- CHECK_EQ(*names[i], transitions->GetKey(transition)); |
- CHECK_EQ(*maps[i], transitions->GetTarget(transition)); |
+ CHECK_EQ(PROPS_COUNT + ATTRS_COUNT, |
+ TransitionArray::NumberOfTransitions(map0->raw_transitions())); |
+ for (int i = 0; i < PROPS_COUNT + ATTRS_COUNT; i++) { |
+ Name* key = TransitionArray::GetKey(map0->raw_transitions(), i); |
+ Map* target = TransitionArray::GetTarget(map0->raw_transitions(), i); |
+ if (key == *name) { |
+ // Attributes transition. |
+ PropertyAttributes attributes = |
+ target->GetLastDescriptorDetails().attributes(); |
+ CHECK_EQ(*attr_maps[static_cast<int>(attributes)], target); |
+ } else { |
+ for (int j = 0; j < PROPS_COUNT; j++) { |
+ if (*names[j] == key) { |
+ CHECK_EQ(*maps[j], target); |
+ break; |
+ } |
+ } |
+ } |
} |
- DCHECK(transitions->IsSortedNoDuplicates()); |
+ DCHECK(TransitionArray::IsSortedNoDuplicates(*map0)); |
} |