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 "src/objects.h" | 5 #include "src/objects.h" |
6 | 6 |
7 #include <cmath> | 7 #include <cmath> |
8 #include <iomanip> | 8 #include <iomanip> |
9 #include <memory> | 9 #include <memory> |
10 #include <sstream> | 10 #include <sstream> |
(...skipping 3874 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3885 | 3885 |
3886 int Map::NumberOfFields() { | 3886 int Map::NumberOfFields() { |
3887 DescriptorArray* descriptors = instance_descriptors(); | 3887 DescriptorArray* descriptors = instance_descriptors(); |
3888 int result = 0; | 3888 int result = 0; |
3889 for (int i = 0; i < NumberOfOwnDescriptors(); i++) { | 3889 for (int i = 0; i < NumberOfOwnDescriptors(); i++) { |
3890 if (descriptors->GetDetails(i).location() == kField) result++; | 3890 if (descriptors->GetDetails(i).location() == kField) result++; |
3891 } | 3891 } |
3892 return result; | 3892 return result; |
3893 } | 3893 } |
3894 | 3894 |
3895 Handle<Map> Map::CopyGeneralizeAllRepresentations( | 3895 void DescriptorArray::GeneralizeAllFields() { |
3896 Handle<Map> map, ElementsKind elements_kind, int modify_index, | 3896 int length = number_of_descriptors(); |
3897 StoreMode store_mode, PropertyKind kind, PropertyAttributes attributes, | 3897 for (int i = 0; i < length; i++) { |
3898 const char* reason) { | 3898 PropertyDetails details = GetDetails(i); |
| 3899 details = details.CopyWithRepresentation(Representation::Tagged()); |
| 3900 if (details.location() == kField) { |
| 3901 DCHECK_EQ(kData, details.kind()); |
| 3902 SetValue(i, FieldType::Any()); |
| 3903 } |
| 3904 set(ToDetailsIndex(i), details.AsSmi()); |
| 3905 } |
| 3906 } |
| 3907 |
| 3908 Handle<Map> Map::CopyGeneralizeAllFields(Handle<Map> map, |
| 3909 ElementsKind elements_kind, |
| 3910 int modify_index, StoreMode store_mode, |
| 3911 PropertyKind kind, |
| 3912 PropertyAttributes attributes, |
| 3913 const char* reason) { |
3899 Isolate* isolate = map->GetIsolate(); | 3914 Isolate* isolate = map->GetIsolate(); |
3900 Handle<DescriptorArray> old_descriptors(map->instance_descriptors(), isolate); | 3915 Handle<DescriptorArray> old_descriptors(map->instance_descriptors(), isolate); |
3901 int number_of_own_descriptors = map->NumberOfOwnDescriptors(); | 3916 int number_of_own_descriptors = map->NumberOfOwnDescriptors(); |
3902 Handle<DescriptorArray> descriptors = | 3917 Handle<DescriptorArray> descriptors = |
3903 DescriptorArray::CopyUpTo(old_descriptors, number_of_own_descriptors); | 3918 DescriptorArray::CopyUpTo(old_descriptors, number_of_own_descriptors); |
3904 | 3919 descriptors->GeneralizeAllFields(); |
3905 for (int i = 0; i < number_of_own_descriptors; i++) { | |
3906 descriptors->SetRepresentation(i, Representation::Tagged()); | |
3907 if (descriptors->GetDetails(i).location() == kField) { | |
3908 DCHECK_EQ(kData, descriptors->GetDetails(i).kind()); | |
3909 descriptors->SetValue(i, FieldType::Any()); | |
3910 } | |
3911 } | |
3912 | 3920 |
3913 Handle<LayoutDescriptor> new_layout_descriptor( | 3921 Handle<LayoutDescriptor> new_layout_descriptor( |
3914 LayoutDescriptor::FastPointerLayout(), isolate); | 3922 LayoutDescriptor::FastPointerLayout(), isolate); |
3915 Handle<Map> new_map = CopyReplaceDescriptors( | 3923 Handle<Map> new_map = CopyReplaceDescriptors( |
3916 map, descriptors, new_layout_descriptor, OMIT_TRANSITION, | 3924 map, descriptors, new_layout_descriptor, OMIT_TRANSITION, |
3917 MaybeHandle<Name>(), reason, SPECIAL_TRANSITION); | 3925 MaybeHandle<Name>(), reason, SPECIAL_TRANSITION); |
3918 | 3926 |
3919 // Unless the instance is being migrated, ensure that modify_index is a field. | 3927 // Unless the instance is being migrated, ensure that modify_index is a field. |
3920 if (modify_index >= 0) { | 3928 if (modify_index >= 0) { |
3921 PropertyDetails details = descriptors->GetDetails(modify_index); | 3929 PropertyDetails details = descriptors->GetDetails(modify_index); |
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4162 } | 4170 } |
4163 | 4171 |
4164 // TODO(ishell): remove. | 4172 // TODO(ishell): remove. |
4165 // static | 4173 // static |
4166 Handle<Map> Map::ReconfigureElementsKind(Handle<Map> map, | 4174 Handle<Map> Map::ReconfigureElementsKind(Handle<Map> map, |
4167 ElementsKind new_elements_kind) { | 4175 ElementsKind new_elements_kind) { |
4168 MapUpdater mu(map->GetIsolate(), map); | 4176 MapUpdater mu(map->GetIsolate(), map); |
4169 return mu.ReconfigureElementsKind(new_elements_kind); | 4177 return mu.ReconfigureElementsKind(new_elements_kind); |
4170 } | 4178 } |
4171 | 4179 |
4172 // Generalize the representation of all DATA descriptors. | 4180 // Generalize all fields and update the transition tree. |
4173 Handle<Map> Map::GeneralizeAllFieldRepresentations( | 4181 Handle<Map> Map::GeneralizeAllFields(Handle<Map> map) { |
4174 Handle<Map> map) { | |
4175 Isolate* isolate = map->GetIsolate(); | 4182 Isolate* isolate = map->GetIsolate(); |
4176 Handle<FieldType> any_type = FieldType::Any(isolate); | 4183 Handle<FieldType> any_type = FieldType::Any(isolate); |
4177 | 4184 |
4178 Handle<DescriptorArray> descriptors(map->instance_descriptors()); | 4185 Handle<DescriptorArray> descriptors(map->instance_descriptors()); |
4179 for (int i = 0; i < map->NumberOfOwnDescriptors(); ++i) { | 4186 for (int i = 0; i < map->NumberOfOwnDescriptors(); ++i) { |
4180 PropertyDetails details = descriptors->GetDetails(i); | 4187 PropertyDetails details = descriptors->GetDetails(i); |
4181 if (details.location() == kField) { | 4188 if (details.location() == kField) { |
4182 DCHECK_EQ(kData, details.kind()); | 4189 DCHECK_EQ(kData, details.kind()); |
4183 MapUpdater mu(isolate, map); | 4190 MapUpdater mu(isolate, map); |
4184 map = mu.ReconfigureToDataField(i, details.attributes(), | 4191 map = mu.ReconfigureToDataField(i, details.attributes(), |
(...skipping 4651 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8836 | 8843 |
8837 if (!map->is_prototype_map()) { | 8844 if (!map->is_prototype_map()) { |
8838 if (flag == INSERT_TRANSITION && | 8845 if (flag == INSERT_TRANSITION && |
8839 TransitionArray::CanHaveMoreTransitions(map)) { | 8846 TransitionArray::CanHaveMoreTransitions(map)) { |
8840 result->InitializeDescriptors(*descriptors, *layout_descriptor); | 8847 result->InitializeDescriptors(*descriptors, *layout_descriptor); |
8841 | 8848 |
8842 Handle<Name> name; | 8849 Handle<Name> name; |
8843 CHECK(maybe_name.ToHandle(&name)); | 8850 CHECK(maybe_name.ToHandle(&name)); |
8844 ConnectTransition(map, result, name, simple_flag); | 8851 ConnectTransition(map, result, name, simple_flag); |
8845 } else { | 8852 } else { |
8846 int length = descriptors->number_of_descriptors(); | 8853 descriptors->GeneralizeAllFields(); |
8847 for (int i = 0; i < length; i++) { | |
8848 descriptors->SetRepresentation(i, Representation::Tagged()); | |
8849 if (descriptors->GetDetails(i).location() == kField) { | |
8850 DCHECK_EQ(kData, descriptors->GetDetails(i).kind()); | |
8851 descriptors->SetValue(i, FieldType::Any()); | |
8852 } | |
8853 } | |
8854 result->InitializeDescriptors(*descriptors, | 8854 result->InitializeDescriptors(*descriptors, |
8855 LayoutDescriptor::FastPointerLayout()); | 8855 LayoutDescriptor::FastPointerLayout()); |
8856 } | 8856 } |
8857 } else { | 8857 } else { |
8858 result->InitializeDescriptors(*descriptors, *layout_descriptor); | 8858 result->InitializeDescriptors(*descriptors, *layout_descriptor); |
8859 } | 8859 } |
8860 #if TRACE_MAPS | 8860 #if TRACE_MAPS |
8861 if (FLAG_trace_maps && | 8861 if (FLAG_trace_maps && |
8862 // Mirror conditions above that did not call ConnectTransition(). | 8862 // Mirror conditions above that did not call ConnectTransition(). |
8863 (map->is_prototype_map() || | 8863 (map->is_prototype_map() || |
(...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9251 | 9251 |
9252 Handle<Map> Map::ReconfigureExistingProperty(Handle<Map> map, int descriptor, | 9252 Handle<Map> Map::ReconfigureExistingProperty(Handle<Map> map, int descriptor, |
9253 PropertyKind kind, | 9253 PropertyKind kind, |
9254 PropertyAttributes attributes) { | 9254 PropertyAttributes attributes) { |
9255 // Dictionaries have to be reconfigured in-place. | 9255 // Dictionaries have to be reconfigured in-place. |
9256 DCHECK(!map->is_dictionary_map()); | 9256 DCHECK(!map->is_dictionary_map()); |
9257 | 9257 |
9258 if (!map->GetBackPointer()->IsMap()) { | 9258 if (!map->GetBackPointer()->IsMap()) { |
9259 // There is no benefit from reconstructing transition tree for maps without | 9259 // There is no benefit from reconstructing transition tree for maps without |
9260 // back pointers. | 9260 // back pointers. |
9261 return CopyGeneralizeAllRepresentations( | 9261 return CopyGeneralizeAllFields(map, map->elements_kind(), descriptor, |
9262 map, map->elements_kind(), descriptor, FORCE_FIELD, kind, attributes, | 9262 FORCE_FIELD, kind, attributes, |
9263 "GenAll_AttributesMismatchProtoMap"); | 9263 "GenAll_AttributesMismatchProtoMap"); |
9264 } | 9264 } |
9265 | 9265 |
9266 if (FLAG_trace_generalization) { | 9266 if (FLAG_trace_generalization) { |
9267 map->PrintReconfiguration(stdout, descriptor, kind, attributes); | 9267 map->PrintReconfiguration(stdout, descriptor, kind, attributes); |
9268 } | 9268 } |
9269 | 9269 |
9270 Isolate* isolate = map->GetIsolate(); | 9270 Isolate* isolate = map->GetIsolate(); |
9271 | 9271 |
9272 MapUpdater mu(isolate, map); | 9272 MapUpdater mu(isolate, map); |
9273 DCHECK_EQ(kData, kind); // Only kData case is supported so far. | 9273 DCHECK_EQ(kData, kind); // Only kData case is supported so far. |
(...skipping 10627 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
19901 // depend on this. | 19901 // depend on this. |
19902 return DICTIONARY_ELEMENTS; | 19902 return DICTIONARY_ELEMENTS; |
19903 } | 19903 } |
19904 DCHECK_LE(kind, LAST_ELEMENTS_KIND); | 19904 DCHECK_LE(kind, LAST_ELEMENTS_KIND); |
19905 return kind; | 19905 return kind; |
19906 } | 19906 } |
19907 } | 19907 } |
19908 | 19908 |
19909 } // namespace internal | 19909 } // namespace internal |
19910 } // namespace v8 | 19910 } // namespace v8 |
OLD | NEW |