| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stdlib.h> | 5 #include <stdlib.h> |
| 6 #include <utility> | 6 #include <utility> |
| 7 | 7 |
| 8 #include "src/v8.h" | 8 #include "src/v8.h" |
| 9 | 9 |
| 10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
| (...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 335 | 335 |
| 336 Handle<Map> FollowDataTransition(Handle<Map> map, | 336 Handle<Map> FollowDataTransition(Handle<Map> map, |
| 337 PropertyAttributes attributes, | 337 PropertyAttributes attributes, |
| 338 Representation representation, | 338 Representation representation, |
| 339 Handle<HeapType> heap_type) { | 339 Handle<HeapType> heap_type) { |
| 340 CHECK_EQ(number_of_properties_, map->NumberOfOwnDescriptors()); | 340 CHECK_EQ(number_of_properties_, map->NumberOfOwnDescriptors()); |
| 341 int property_index = number_of_properties_++; | 341 int property_index = number_of_properties_++; |
| 342 SetDataField(property_index, attributes, representation, heap_type); | 342 SetDataField(property_index, attributes, representation, heap_type); |
| 343 | 343 |
| 344 Handle<String> name = MakeName("prop", property_index); | 344 Handle<String> name = MakeName("prop", property_index); |
| 345 int t = map->SearchTransition(kData, *name, attributes); | 345 Map* target = |
| 346 CHECK_NE(TransitionArray::kNotFound, t); | 346 TransitionArray::SearchTransition(*map, kData, *name, attributes); |
| 347 return handle(map->GetTransition(t)); | 347 CHECK(target != NULL); |
| 348 return handle(target); |
| 348 } | 349 } |
| 349 | 350 |
| 350 Handle<Map> AddAccessorConstant(Handle<Map> map, | 351 Handle<Map> AddAccessorConstant(Handle<Map> map, |
| 351 PropertyAttributes attributes, | 352 PropertyAttributes attributes, |
| 352 Handle<AccessorPair> pair) { | 353 Handle<AccessorPair> pair) { |
| 353 CHECK_EQ(number_of_properties_, map->NumberOfOwnDescriptors()); | 354 CHECK_EQ(number_of_properties_, map->NumberOfOwnDescriptors()); |
| 354 int property_index = number_of_properties_++; | 355 int property_index = number_of_properties_++; |
| 355 SetAccessorConstant(property_index, attributes, pair); | 356 SetAccessorConstant(property_index, attributes, pair); |
| 356 | 357 |
| 357 Handle<String> name = MakeName("prop", property_index); | 358 Handle<String> name = MakeName("prop", property_index); |
| (...skipping 1112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1470 const int kSplitProp = kPropCount / 2; | 1471 const int kSplitProp = kPropCount / 2; |
| 1471 Handle<Map> split_map; | 1472 Handle<Map> split_map; |
| 1472 Handle<Map> map2 = initial_map; | 1473 Handle<Map> map2 = initial_map; |
| 1473 { | 1474 { |
| 1474 for (int i = 0; i < kSplitProp + 1; i++) { | 1475 for (int i = 0; i < kSplitProp + 1; i++) { |
| 1475 if (i == kSplitProp) { | 1476 if (i == kSplitProp) { |
| 1476 split_map = map2; | 1477 split_map = map2; |
| 1477 } | 1478 } |
| 1478 | 1479 |
| 1479 Handle<String> name = MakeName("prop", i); | 1480 Handle<String> name = MakeName("prop", i); |
| 1480 int t = map2->SearchTransition(kData, *name, NONE); | 1481 Map* target = |
| 1481 CHECK_NE(TransitionArray::kNotFound, t); | 1482 TransitionArray::SearchTransition(*map2, kData, *name, NONE); |
| 1482 map2 = handle(map2->GetTransition(t)); | 1483 CHECK(target != NULL); |
| 1484 map2 = handle(target); |
| 1483 } | 1485 } |
| 1484 | 1486 |
| 1485 map2 = Map::ReconfigureProperty(map2, kSplitProp, kData, NONE, | 1487 map2 = Map::ReconfigureProperty(map2, kSplitProp, kData, NONE, |
| 1486 Representation::Double(), any_type, | 1488 Representation::Double(), any_type, |
| 1487 FORCE_FIELD); | 1489 FORCE_FIELD); |
| 1488 expectations.SetDataField(kSplitProp, Representation::Double(), any_type); | 1490 expectations.SetDataField(kSplitProp, Representation::Double(), any_type); |
| 1489 | 1491 |
| 1490 CHECK(expectations.Check(*split_map, kSplitProp)); | 1492 CHECK(expectations.Check(*split_map, kSplitProp)); |
| 1491 CHECK(expectations.Check(*map2, kSplitProp + 1)); | 1493 CHECK(expectations.Check(*map2, kSplitProp + 1)); |
| 1492 } | 1494 } |
| 1493 | 1495 |
| 1494 // At this point |map| should be deprecated and disconnected from the | 1496 // At this point |map| should be deprecated and disconnected from the |
| 1495 // transition tree. | 1497 // transition tree. |
| 1496 CHECK(map->is_deprecated()); | 1498 CHECK(map->is_deprecated()); |
| 1497 CHECK(!split_map->is_deprecated()); | 1499 CHECK(!split_map->is_deprecated()); |
| 1498 CHECK(!map2->is_deprecated()); | 1500 CHECK(!map2->is_deprecated()); |
| 1499 | 1501 |
| 1500 // Fill in transition tree of |map2| so that it can't have more transitions. | 1502 // Fill in transition tree of |map2| so that it can't have more transitions. |
| 1501 for (int i = 0; i < TransitionArray::kMaxNumberOfTransitions; i++) { | 1503 for (int i = 0; i < TransitionArray::kMaxNumberOfTransitions; i++) { |
| 1502 CHECK(map2->CanHaveMoreTransitions()); | 1504 CHECK(TransitionArray::CanHaveMoreTransitions(map2)); |
| 1503 Handle<String> name = MakeName("foo", i); | 1505 Handle<String> name = MakeName("foo", i); |
| 1504 Map::CopyWithField(map2, name, any_type, NONE, Representation::Smi(), | 1506 Map::CopyWithField(map2, name, any_type, NONE, Representation::Smi(), |
| 1505 INSERT_TRANSITION).ToHandleChecked(); | 1507 INSERT_TRANSITION).ToHandleChecked(); |
| 1506 } | 1508 } |
| 1507 CHECK(!map2->CanHaveMoreTransitions()); | 1509 CHECK(!TransitionArray::CanHaveMoreTransitions(map2)); |
| 1508 | 1510 |
| 1509 // Try to update |map|, since there is no place for propX transition at |map2| | 1511 // Try to update |map|, since there is no place for propX transition at |map2| |
| 1510 // |map| should become "copy-generalized". | 1512 // |map| should become "copy-generalized". |
| 1511 Handle<Map> updated_map = Map::Update(map); | 1513 Handle<Map> updated_map = Map::Update(map); |
| 1512 CHECK(updated_map->GetBackPointer()->IsUndefined()); | 1514 CHECK(updated_map->GetBackPointer()->IsUndefined()); |
| 1513 | 1515 |
| 1514 for (int i = 0; i < kPropCount; i++) { | 1516 for (int i = 0; i < kPropCount; i++) { |
| 1515 expectations.SetDataField(i, Representation::Tagged(), any_type); | 1517 expectations.SetDataField(i, Representation::Tagged(), any_type); |
| 1516 } | 1518 } |
| 1517 CHECK(expectations.Check(*updated_map)); | 1519 CHECK(expectations.Check(*updated_map)); |
| (...skipping 559 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2077 Handle<AccessorPair> pair = CreateAccessorPair(true, true); | 2079 Handle<AccessorPair> pair = CreateAccessorPair(true, true); |
| 2078 TransitionToAccessorConstantOperator transition_op(pair); | 2080 TransitionToAccessorConstantOperator transition_op(pair); |
| 2079 | 2081 |
| 2080 SameMapChecker checker; | 2082 SameMapChecker checker; |
| 2081 TestTransitionTo(transition_op, transition_op, checker); | 2083 TestTransitionTo(transition_op, transition_op, checker); |
| 2082 } | 2084 } |
| 2083 | 2085 |
| 2084 | 2086 |
| 2085 // TODO(ishell): add this test once IS_ACCESSOR_FIELD_SUPPORTED is supported. | 2087 // TODO(ishell): add this test once IS_ACCESSOR_FIELD_SUPPORTED is supported. |
| 2086 // TEST(TransitionAccessorConstantToAnotherAccessorConstant) | 2088 // TEST(TransitionAccessorConstantToAnotherAccessorConstant) |
| OLD | NEW |