| 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 573 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 584 expectations.SetDataField(detach_property_at_index, | 584 expectations.SetDataField(detach_property_at_index, |
| 585 Representation::Tagged(), any_type); | 585 Representation::Tagged(), any_type); |
| 586 CHECK(map->is_deprecated()); | 586 CHECK(map->is_deprecated()); |
| 587 CHECK(expectations.Check(*detach_point_map, | 587 CHECK(expectations.Check(*detach_point_map, |
| 588 detach_point_map->NumberOfOwnDescriptors())); | 588 detach_point_map->NumberOfOwnDescriptors())); |
| 589 } | 589 } |
| 590 | 590 |
| 591 // Create new maps by generalizing representation of propX field. | 591 // Create new maps by generalizing representation of propX field. |
| 592 Handle<Map> field_owner(map->FindFieldOwner(property_index), isolate); | 592 Handle<Map> field_owner(map->FindFieldOwner(property_index), isolate); |
| 593 CompilationInfo info(&stub, isolate, &zone); | 593 CompilationInfo info(&stub, isolate, &zone); |
| 594 CHECK(!info.dependencies()->HasAborted()); | 594 CHECK(!info.HasAbortedDueToDependencyChange()); |
| 595 | 595 |
| 596 info.dependencies()->AssumeFieldType(field_owner); | 596 Map::AddDependentCompilationInfo(field_owner, DependentCode::kFieldTypeGroup, |
| 597 &info); |
| 597 | 598 |
| 598 Handle<Map> new_map = | 599 Handle<Map> new_map = |
| 599 Map::ReconfigureProperty(map, property_index, kData, NONE, | 600 Map::ReconfigureProperty(map, property_index, kData, NONE, |
| 600 to_representation, to_type, FORCE_FIELD); | 601 to_representation, to_type, FORCE_FIELD); |
| 601 | 602 |
| 602 expectations.SetDataField(property_index, expected_representation, | 603 expectations.SetDataField(property_index, expected_representation, |
| 603 expected_type); | 604 expected_type); |
| 604 | 605 |
| 605 CHECK(!new_map->is_deprecated()); | 606 CHECK(!new_map->is_deprecated()); |
| 606 CHECK(expectations.Check(*new_map)); | 607 CHECK(expectations.Check(*new_map)); |
| 607 | 608 |
| 608 if (is_detached_map) { | 609 if (is_detached_map) { |
| 609 CHECK(map->is_deprecated()); | 610 CHECK(map->is_deprecated()); |
| 610 CHECK_NE(*map, *new_map); | 611 CHECK_NE(*map, *new_map); |
| 611 CHECK_EQ(expected_field_type_dependency && !field_owner->is_deprecated(), | 612 CHECK_EQ(expected_field_type_dependency && !field_owner->is_deprecated(), |
| 612 info.dependencies()->HasAborted()); | 613 info.HasAbortedDueToDependencyChange()); |
| 613 | 614 |
| 614 } else if (expected_deprecation) { | 615 } else if (expected_deprecation) { |
| 615 CHECK(map->is_deprecated()); | 616 CHECK(map->is_deprecated()); |
| 616 CHECK(field_owner->is_deprecated()); | 617 CHECK(field_owner->is_deprecated()); |
| 617 CHECK_NE(*map, *new_map); | 618 CHECK_NE(*map, *new_map); |
| 618 CHECK(!info.dependencies()->HasAborted()); | 619 CHECK(!info.HasAbortedDueToDependencyChange()); |
| 619 | 620 |
| 620 } else { | 621 } else { |
| 621 CHECK(!field_owner->is_deprecated()); | 622 CHECK(!field_owner->is_deprecated()); |
| 622 CHECK_EQ(*map, *new_map); | 623 CHECK_EQ(*map, *new_map); |
| 623 | 624 |
| 624 CHECK_EQ(expected_field_type_dependency, info.dependencies()->HasAborted()); | 625 CHECK_EQ(expected_field_type_dependency, |
| 626 info.HasAbortedDueToDependencyChange()); |
| 625 } | 627 } |
| 626 | 628 |
| 627 info.dependencies()->Rollback(); // Properly cleanup compilation info. | 629 info.RollbackDependencies(); // Properly cleanup compilation info. |
| 628 | 630 |
| 629 // Update all deprecated maps and check that they are now the same. | 631 // Update all deprecated maps and check that they are now the same. |
| 630 Handle<Map> updated_map = Map::Update(map); | 632 Handle<Map> updated_map = Map::Update(map); |
| 631 CHECK_EQ(*new_map, *updated_map); | 633 CHECK_EQ(*new_map, *updated_map); |
| 632 } | 634 } |
| 633 | 635 |
| 634 | 636 |
| 635 static void TestGeneralizeRepresentation( | 637 static void TestGeneralizeRepresentation( |
| 636 Representation from_representation, Handle<HeapType> from_type, | 638 Representation from_representation, Handle<HeapType> from_type, |
| 637 Representation to_representation, Handle<HeapType> to_type, | 639 Representation to_representation, Handle<HeapType> to_type, |
| (...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 952 map2 = expectations2.AddDataField(map2, NONE, to_representation, to_type); | 954 map2 = expectations2.AddDataField(map2, NONE, to_representation, to_type); |
| 953 } | 955 } |
| 954 CHECK(!map2->is_deprecated()); | 956 CHECK(!map2->is_deprecated()); |
| 955 CHECK(map2->is_stable()); | 957 CHECK(map2->is_stable()); |
| 956 CHECK(expectations2.Check(*map2)); | 958 CHECK(expectations2.Check(*map2)); |
| 957 | 959 |
| 958 Zone zone; | 960 Zone zone; |
| 959 FakeStubForTesting stub(isolate); | 961 FakeStubForTesting stub(isolate); |
| 960 Handle<Map> field_owner(map->FindFieldOwner(kSplitProp), isolate); | 962 Handle<Map> field_owner(map->FindFieldOwner(kSplitProp), isolate); |
| 961 CompilationInfo info(&stub, isolate, &zone); | 963 CompilationInfo info(&stub, isolate, &zone); |
| 962 CHECK(!info.dependencies()->HasAborted()); | 964 CHECK(!info.HasAbortedDueToDependencyChange()); |
| 963 info.dependencies()->AssumeFieldType(field_owner); | 965 Map::AddDependentCompilationInfo(field_owner, DependentCode::kFieldTypeGroup, |
| 966 &info); |
| 964 | 967 |
| 965 // Reconfigure attributes of property |kSplitProp| of |map2| to NONE, which | 968 // Reconfigure attributes of property |kSplitProp| of |map2| to NONE, which |
| 966 // should generalize representations in |map1|. | 969 // should generalize representations in |map1|. |
| 967 Handle<Map> new_map = | 970 Handle<Map> new_map = |
| 968 Map::ReconfigureExistingProperty(map2, kSplitProp, kData, NONE); | 971 Map::ReconfigureExistingProperty(map2, kSplitProp, kData, NONE); |
| 969 | 972 |
| 970 // |map2| should be left unchanged. | 973 // |map2| should be left unchanged. |
| 971 CHECK(!map2->is_deprecated()); | 974 CHECK(!map2->is_deprecated()); |
| 972 CHECK_NE(*map2, *new_map); | 975 CHECK_NE(*map2, *new_map); |
| 973 CHECK(expectations2.Check(*map2)); | 976 CHECK(expectations2.Check(*map2)); |
| 974 | 977 |
| 975 // |map| should be deprecated and |new_map| should match new expectations. | 978 // |map| should be deprecated and |new_map| should match new expectations. |
| 976 for (int i = kSplitProp; i < kPropCount; i++) { | 979 for (int i = kSplitProp; i < kPropCount; i++) { |
| 977 expectations.SetDataField(i, expected_representation, expected_type); | 980 expectations.SetDataField(i, expected_representation, expected_type); |
| 978 } | 981 } |
| 979 CHECK(map->is_deprecated()); | 982 CHECK(map->is_deprecated()); |
| 980 CHECK(!info.dependencies()->HasAborted()); | 983 CHECK(!info.HasAbortedDueToDependencyChange()); |
| 981 info.dependencies()->Rollback(); // Properly cleanup compilation info. | 984 info.RollbackDependencies(); // Properly cleanup compilation info. |
| 982 CHECK_NE(*map, *new_map); | 985 CHECK_NE(*map, *new_map); |
| 983 | 986 |
| 984 CHECK(!new_map->is_deprecated()); | 987 CHECK(!new_map->is_deprecated()); |
| 985 CHECK(expectations.Check(*new_map)); | 988 CHECK(expectations.Check(*new_map)); |
| 986 | 989 |
| 987 // Update deprecated |map|, it should become |new_map|. | 990 // Update deprecated |map|, it should become |new_map|. |
| 988 Handle<Map> updated_map = Map::Update(map); | 991 Handle<Map> updated_map = Map::Update(map); |
| 989 CHECK_EQ(*new_map, *updated_map); | 992 CHECK_EQ(*new_map, *updated_map); |
| 990 } | 993 } |
| 991 | 994 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1037 map2 = expectations2.AddDataField(map2, NONE, to_representation, to_type); | 1040 map2 = expectations2.AddDataField(map2, NONE, to_representation, to_type); |
| 1038 } | 1041 } |
| 1039 CHECK(!map2->is_deprecated()); | 1042 CHECK(!map2->is_deprecated()); |
| 1040 CHECK(map2->is_stable()); | 1043 CHECK(map2->is_stable()); |
| 1041 CHECK(expectations2.Check(*map2)); | 1044 CHECK(expectations2.Check(*map2)); |
| 1042 | 1045 |
| 1043 Zone zone; | 1046 Zone zone; |
| 1044 FakeStubForTesting stub(isolate); | 1047 FakeStubForTesting stub(isolate); |
| 1045 Handle<Map> field_owner(map->FindFieldOwner(kSplitProp), isolate); | 1048 Handle<Map> field_owner(map->FindFieldOwner(kSplitProp), isolate); |
| 1046 CompilationInfo info(&stub, isolate, &zone); | 1049 CompilationInfo info(&stub, isolate, &zone); |
| 1047 CHECK(!info.dependencies()->HasAborted()); | 1050 CHECK(!info.HasAbortedDueToDependencyChange()); |
| 1048 info.dependencies()->AssumeFieldType(field_owner); | 1051 Map::AddDependentCompilationInfo(field_owner, DependentCode::kFieldTypeGroup, |
| 1052 &info); |
| 1049 | 1053 |
| 1050 // Reconfigure attributes of property |kSplitProp| of |map2| to NONE, which | 1054 // Reconfigure attributes of property |kSplitProp| of |map2| to NONE, which |
| 1051 // should generalize representations in |map1|. | 1055 // should generalize representations in |map1|. |
| 1052 Handle<Map> new_map = | 1056 Handle<Map> new_map = |
| 1053 Map::ReconfigureExistingProperty(map2, kSplitProp, kData, NONE); | 1057 Map::ReconfigureExistingProperty(map2, kSplitProp, kData, NONE); |
| 1054 | 1058 |
| 1055 // |map2| should be left unchanged. | 1059 // |map2| should be left unchanged. |
| 1056 CHECK(!map2->is_deprecated()); | 1060 CHECK(!map2->is_deprecated()); |
| 1057 CHECK_NE(*map2, *new_map); | 1061 CHECK_NE(*map2, *new_map); |
| 1058 CHECK(expectations2.Check(*map2)); | 1062 CHECK(expectations2.Check(*map2)); |
| 1059 | 1063 |
| 1060 // In trivial case |map| should be returned as a result of the property | 1064 // In trivial case |map| should be returned as a result of the property |
| 1061 // reconfiguration, respective field types should be generalized and | 1065 // reconfiguration, respective field types should be generalized and |
| 1062 // respective code dependencies should be invalidated. |map| should be NOT | 1066 // respective code dependencies should be invalidated. |map| should be NOT |
| 1063 // deprecated and it should match new expectations. | 1067 // deprecated and it should match new expectations. |
| 1064 for (int i = kSplitProp; i < kPropCount; i++) { | 1068 for (int i = kSplitProp; i < kPropCount; i++) { |
| 1065 expectations.SetDataField(i, expected_representation, expected_type); | 1069 expectations.SetDataField(i, expected_representation, expected_type); |
| 1066 } | 1070 } |
| 1067 CHECK(!map->is_deprecated()); | 1071 CHECK(!map->is_deprecated()); |
| 1068 CHECK_EQ(*map, *new_map); | 1072 CHECK_EQ(*map, *new_map); |
| 1069 CHECK_EQ(expected_field_type_dependency, info.dependencies()->HasAborted()); | 1073 CHECK_EQ(expected_field_type_dependency, |
| 1070 info.dependencies()->Rollback(); // Properly cleanup compilation info. | 1074 info.HasAbortedDueToDependencyChange()); |
| 1075 info.RollbackDependencies(); // Properly cleanup compilation info. |
| 1071 | 1076 |
| 1072 CHECK(!new_map->is_deprecated()); | 1077 CHECK(!new_map->is_deprecated()); |
| 1073 CHECK(expectations.Check(*new_map)); | 1078 CHECK(expectations.Check(*new_map)); |
| 1074 | 1079 |
| 1075 Handle<Map> updated_map = Map::Update(map); | 1080 Handle<Map> updated_map = Map::Update(map); |
| 1076 CHECK_EQ(*new_map, *updated_map); | 1081 CHECK_EQ(*new_map, *updated_map); |
| 1077 } | 1082 } |
| 1078 | 1083 |
| 1079 | 1084 |
| 1080 TEST(ReconfigureDataFieldAttribute_GeneralizeRepresentationSmiToDouble) { | 1085 TEST(ReconfigureDataFieldAttribute_GeneralizeRepresentationSmiToDouble) { |
| (...skipping 993 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2074 Handle<AccessorPair> pair = CreateAccessorPair(true, true); | 2079 Handle<AccessorPair> pair = CreateAccessorPair(true, true); |
| 2075 TransitionToAccessorConstantOperator transition_op(pair); | 2080 TransitionToAccessorConstantOperator transition_op(pair); |
| 2076 | 2081 |
| 2077 SameMapChecker checker; | 2082 SameMapChecker checker; |
| 2078 TestTransitionTo(transition_op, transition_op, checker); | 2083 TestTransitionTo(transition_op, transition_op, checker); |
| 2079 } | 2084 } |
| 2080 | 2085 |
| 2081 | 2086 |
| 2082 // 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. |
| 2083 // TEST(TransitionAccessorConstantToAnotherAccessorConstant) | 2088 // TEST(TransitionAccessorConstantToAnotherAccessorConstant) |
| OLD | NEW |