| 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 "test/cctest/test-api.h" | 8 #include "test/cctest/test-api.h" |
| 9 | 9 |
| 10 #include "src/v8.h" | 10 #include "src/v8.h" |
| (...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 381 Handle<Map> AddAccessorConstant(Handle<Map> map, | 381 Handle<Map> AddAccessorConstant(Handle<Map> map, |
| 382 PropertyAttributes attributes, | 382 PropertyAttributes attributes, |
| 383 Handle<Object> getter, | 383 Handle<Object> getter, |
| 384 Handle<Object> setter) { | 384 Handle<Object> setter) { |
| 385 CHECK_EQ(number_of_properties_, map->NumberOfOwnDescriptors()); | 385 CHECK_EQ(number_of_properties_, map->NumberOfOwnDescriptors()); |
| 386 int property_index = number_of_properties_++; | 386 int property_index = number_of_properties_++; |
| 387 SetAccessorConstant(property_index, attributes, getter, setter); | 387 SetAccessorConstant(property_index, attributes, getter, setter); |
| 388 | 388 |
| 389 Handle<String> name = MakeName("prop", property_index); | 389 Handle<String> name = MakeName("prop", property_index); |
| 390 | 390 |
| 391 CHECK(!getter->IsNull(isolate_) || !setter->IsNull(isolate_)); | 391 CHECK(!getter->IsNull() || !setter->IsNull()); |
| 392 Factory* factory = isolate_->factory(); | 392 Factory* factory = isolate_->factory(); |
| 393 | 393 |
| 394 if (!getter->IsNull(isolate_)) { | 394 if (!getter->IsNull()) { |
| 395 Handle<AccessorPair> pair = factory->NewAccessorPair(); | 395 Handle<AccessorPair> pair = factory->NewAccessorPair(); |
| 396 pair->SetComponents(*getter, *factory->null_value()); | 396 pair->SetComponents(*getter, *factory->null_value()); |
| 397 AccessorConstantDescriptor new_desc(name, pair, attributes); | 397 AccessorConstantDescriptor new_desc(name, pair, attributes); |
| 398 map = Map::CopyInsertDescriptor(map, &new_desc, INSERT_TRANSITION); | 398 map = Map::CopyInsertDescriptor(map, &new_desc, INSERT_TRANSITION); |
| 399 } | 399 } |
| 400 if (!setter->IsNull(isolate_)) { | 400 if (!setter->IsNull()) { |
| 401 Handle<AccessorPair> pair = factory->NewAccessorPair(); | 401 Handle<AccessorPair> pair = factory->NewAccessorPair(); |
| 402 pair->SetComponents(*getter, *setter); | 402 pair->SetComponents(*getter, *setter); |
| 403 AccessorConstantDescriptor new_desc(name, pair, attributes); | 403 AccessorConstantDescriptor new_desc(name, pair, attributes); |
| 404 map = Map::CopyInsertDescriptor(map, &new_desc, INSERT_TRANSITION); | 404 map = Map::CopyInsertDescriptor(map, &new_desc, INSERT_TRANSITION); |
| 405 } | 405 } |
| 406 return map; | 406 return map; |
| 407 } | 407 } |
| 408 | 408 |
| 409 Handle<Map> TransitionToAccessorConstant(Handle<Map> map, | 409 Handle<Map> TransitionToAccessorConstant(Handle<Map> map, |
| 410 PropertyAttributes attributes, | 410 PropertyAttributes attributes, |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 479 expectations.SetDataField(0, NONE, Representation::Smi(), any_type); | 479 expectations.SetDataField(0, NONE, Representation::Smi(), any_type); |
| 480 CHECK(prepared_map->is_stable()); | 480 CHECK(prepared_map->is_stable()); |
| 481 CHECK(expectations.Check(*prepared_map)); | 481 CHECK(expectations.Check(*prepared_map)); |
| 482 | 482 |
| 483 // Now create an object with |map|, migrate it to |prepared_map| and ensure | 483 // Now create an object with |map|, migrate it to |prepared_map| and ensure |
| 484 // that the data property is uninitialized. | 484 // that the data property is uninitialized. |
| 485 Factory* factory = isolate->factory(); | 485 Factory* factory = isolate->factory(); |
| 486 Handle<JSObject> obj = factory->NewJSObjectFromMap(map); | 486 Handle<JSObject> obj = factory->NewJSObjectFromMap(map); |
| 487 JSObject::MigrateToMap(obj, prepared_map); | 487 JSObject::MigrateToMap(obj, prepared_map); |
| 488 FieldIndex index = FieldIndex::ForDescriptor(*prepared_map, 0); | 488 FieldIndex index = FieldIndex::ForDescriptor(*prepared_map, 0); |
| 489 CHECK(obj->RawFastPropertyAt(index)->IsUninitialized(isolate)); | 489 CHECK(obj->RawFastPropertyAt(index)->IsUninitialized()); |
| 490 #ifdef VERIFY_HEAP | 490 #ifdef VERIFY_HEAP |
| 491 obj->ObjectVerify(); | 491 obj->ObjectVerify(); |
| 492 #endif | 492 #endif |
| 493 } | 493 } |
| 494 | 494 |
| 495 | 495 |
| 496 // This test checks that the LookupIterator machinery involved in | 496 // This test checks that the LookupIterator machinery involved in |
| 497 // JSObject::SetOwnPropertyIgnoreAttributes() does not try to migrate object | 497 // JSObject::SetOwnPropertyIgnoreAttributes() does not try to migrate object |
| 498 // to a map with a property with None representation. | 498 // to a map with a property with None representation. |
| 499 TEST(ReconfigureAccessorToNonExistingDataFieldHeavy) { | 499 TEST(ReconfigureAccessorToNonExistingDataFieldHeavy) { |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 637 CHECK_EQ(*map, *new_map); | 637 CHECK_EQ(*map, *new_map); |
| 638 | 638 |
| 639 CHECK_EQ(expected_field_type_dependency, info.dependencies()->HasAborted()); | 639 CHECK_EQ(expected_field_type_dependency, info.dependencies()->HasAborted()); |
| 640 } | 640 } |
| 641 | 641 |
| 642 { | 642 { |
| 643 // Check that all previous maps are not stable. | 643 // Check that all previous maps are not stable. |
| 644 Map* tmp = *new_map; | 644 Map* tmp = *new_map; |
| 645 while (true) { | 645 while (true) { |
| 646 Object* back = tmp->GetBackPointer(); | 646 Object* back = tmp->GetBackPointer(); |
| 647 if (back->IsUndefined(isolate)) break; | 647 if (back->IsUndefined()) break; |
| 648 tmp = Map::cast(back); | 648 tmp = Map::cast(back); |
| 649 CHECK(!tmp->is_stable()); | 649 CHECK(!tmp->is_stable()); |
| 650 } | 650 } |
| 651 } | 651 } |
| 652 | 652 |
| 653 info.dependencies()->Rollback(); // Properly cleanup compilation info. | 653 info.dependencies()->Rollback(); // Properly cleanup compilation info. |
| 654 | 654 |
| 655 // Update all deprecated maps and check that they are now the same. | 655 // Update all deprecated maps and check that they are now the same. |
| 656 Handle<Map> updated_map = Map::Update(map); | 656 Handle<Map> updated_map = Map::Update(map); |
| 657 CHECK_EQ(*new_map, *updated_map); | 657 CHECK_EQ(*new_map, *updated_map); |
| (...skipping 577 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1235 }; | 1235 }; |
| 1236 | 1236 |
| 1237 | 1237 |
| 1238 // Checks that given |map| is NOT deprecated, and |new_map| is a result of | 1238 // Checks that given |map| is NOT deprecated, and |new_map| is a result of |
| 1239 // copy-generalize-all-representations. | 1239 // copy-generalize-all-representations. |
| 1240 struct CheckCopyGeneralizeAllRepresentations { | 1240 struct CheckCopyGeneralizeAllRepresentations { |
| 1241 void Check(Handle<Map> map, Handle<Map> new_map, Expectations& expectations) { | 1241 void Check(Handle<Map> map, Handle<Map> new_map, Expectations& expectations) { |
| 1242 CHECK(!map->is_deprecated()); | 1242 CHECK(!map->is_deprecated()); |
| 1243 CHECK_NE(*map, *new_map); | 1243 CHECK_NE(*map, *new_map); |
| 1244 | 1244 |
| 1245 CHECK(new_map->GetBackPointer()->IsUndefined(map->GetIsolate())); | 1245 CHECK(new_map->GetBackPointer()->IsUndefined()); |
| 1246 for (int i = 0; i < kPropCount; i++) { | 1246 for (int i = 0; i < kPropCount; i++) { |
| 1247 expectations.GeneralizeRepresentation(i); | 1247 expectations.GeneralizeRepresentation(i); |
| 1248 } | 1248 } |
| 1249 | 1249 |
| 1250 CHECK(!new_map->is_deprecated()); | 1250 CHECK(!new_map->is_deprecated()); |
| 1251 CHECK(expectations.Check(*new_map)); | 1251 CHECK(expectations.Check(*new_map)); |
| 1252 } | 1252 } |
| 1253 }; | 1253 }; |
| 1254 | 1254 |
| 1255 | 1255 |
| (...skipping 610 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1866 Handle<String> name = MakeName("foo", i); | 1866 Handle<String> name = MakeName("foo", i); |
| 1867 Map::CopyWithField(map2, name, any_type, NONE, Representation::Smi(), | 1867 Map::CopyWithField(map2, name, any_type, NONE, Representation::Smi(), |
| 1868 INSERT_TRANSITION) | 1868 INSERT_TRANSITION) |
| 1869 .ToHandleChecked(); | 1869 .ToHandleChecked(); |
| 1870 } | 1870 } |
| 1871 CHECK(!TransitionArray::CanHaveMoreTransitions(map2)); | 1871 CHECK(!TransitionArray::CanHaveMoreTransitions(map2)); |
| 1872 | 1872 |
| 1873 // Try to update |map|, since there is no place for propX transition at |map2| | 1873 // Try to update |map|, since there is no place for propX transition at |map2| |
| 1874 // |map| should become "copy-generalized". | 1874 // |map| should become "copy-generalized". |
| 1875 Handle<Map> updated_map = Map::Update(map); | 1875 Handle<Map> updated_map = Map::Update(map); |
| 1876 CHECK(updated_map->GetBackPointer()->IsUndefined(isolate)); | 1876 CHECK(updated_map->GetBackPointer()->IsUndefined()); |
| 1877 | 1877 |
| 1878 for (int i = 0; i < kPropCount; i++) { | 1878 for (int i = 0; i < kPropCount; i++) { |
| 1879 expectations.SetDataField(i, Representation::Tagged(), any_type); | 1879 expectations.SetDataField(i, Representation::Tagged(), any_type); |
| 1880 } | 1880 } |
| 1881 CHECK(expectations.Check(*updated_map)); | 1881 CHECK(expectations.Check(*updated_map)); |
| 1882 } | 1882 } |
| 1883 | 1883 |
| 1884 | 1884 |
| 1885 //////////////////////////////////////////////////////////////////////////////// | 1885 //////////////////////////////////////////////////////////////////////////////// |
| 1886 // A set of tests involving special transitions (such as elements kind | 1886 // A set of tests involving special transitions (such as elements kind |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1966 // of Map::Update(). | 1966 // of Map::Update(). |
| 1967 CHECK_EQ(*new_map2, *tmp_map); | 1967 CHECK_EQ(*new_map2, *tmp_map); |
| 1968 } | 1968 } |
| 1969 | 1969 |
| 1970 if (config.is_non_equevalent_transition()) { | 1970 if (config.is_non_equevalent_transition()) { |
| 1971 // In case of non-equivalent transition currently we generalize all | 1971 // In case of non-equivalent transition currently we generalize all |
| 1972 // representations. | 1972 // representations. |
| 1973 for (int i = 0; i < kPropCount; i++) { | 1973 for (int i = 0; i < kPropCount; i++) { |
| 1974 expectations2.GeneralizeRepresentation(i); | 1974 expectations2.GeneralizeRepresentation(i); |
| 1975 } | 1975 } |
| 1976 CHECK(new_map2->GetBackPointer()->IsUndefined(isolate)); | 1976 CHECK(new_map2->GetBackPointer()->IsUndefined()); |
| 1977 CHECK(expectations2.Check(*new_map2)); | 1977 CHECK(expectations2.Check(*new_map2)); |
| 1978 } else { | 1978 } else { |
| 1979 CHECK(!new_map2->GetBackPointer()->IsUndefined(isolate)); | 1979 CHECK(!new_map2->GetBackPointer()->IsUndefined()); |
| 1980 CHECK(expectations2.Check(*new_map2)); | 1980 CHECK(expectations2.Check(*new_map2)); |
| 1981 } | 1981 } |
| 1982 } | 1982 } |
| 1983 | 1983 |
| 1984 Handle<Map> active_map = maps[kPropCount - 1]; | 1984 Handle<Map> active_map = maps[kPropCount - 1]; |
| 1985 CHECK(!active_map->is_deprecated()); | 1985 CHECK(!active_map->is_deprecated()); |
| 1986 | 1986 |
| 1987 // Update all deprecated maps and check that they are now the same. | 1987 // Update all deprecated maps and check that they are now the same. |
| 1988 Handle<Map> updated_map = Map::Update(map); | 1988 Handle<Map> updated_map = Map::Update(map); |
| 1989 CHECK_EQ(*active_map, *updated_map); | 1989 CHECK_EQ(*active_map, *updated_map); |
| (...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2405 Handle<AccessorPair> pair = CreateAccessorPair(true, true); | 2405 Handle<AccessorPair> pair = CreateAccessorPair(true, true); |
| 2406 TransitionToAccessorConstantOperator transition_op(pair); | 2406 TransitionToAccessorConstantOperator transition_op(pair); |
| 2407 | 2407 |
| 2408 SameMapChecker checker; | 2408 SameMapChecker checker; |
| 2409 TestTransitionTo(transition_op, transition_op, checker); | 2409 TestTransitionTo(transition_op, transition_op, checker); |
| 2410 } | 2410 } |
| 2411 | 2411 |
| 2412 | 2412 |
| 2413 // TODO(ishell): add this test once IS_ACCESSOR_FIELD_SUPPORTED is supported. | 2413 // TODO(ishell): add this test once IS_ACCESSOR_FIELD_SUPPORTED is supported. |
| 2414 // TEST(TransitionAccessorConstantToAnotherAccessorConstant) | 2414 // TEST(TransitionAccessorConstantToAnotherAccessorConstant) |
| OLD | NEW |