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