| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 <sstream> | 5 #include <sstream> |
| 6 | 6 |
| 7 #include "src/v8.h" | 7 #include "src/v8.h" |
| 8 | 8 |
| 9 #include "src/accessors.h" | 9 #include "src/accessors.h" |
| 10 #include "src/allocation-site-scopes.h" | 10 #include "src/allocation-site-scopes.h" |
| (...skipping 2848 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2859 for (int i = root_nof; i < old_nof; ++i) { | 2859 for (int i = root_nof; i < old_nof; ++i) { |
| 2860 PropertyDetails old_details = old_descriptors->GetDetails(i); | 2860 PropertyDetails old_details = old_descriptors->GetDetails(i); |
| 2861 int j = new_map->SearchTransition(old_details.kind(), | 2861 int j = new_map->SearchTransition(old_details.kind(), |
| 2862 old_descriptors->GetKey(i), | 2862 old_descriptors->GetKey(i), |
| 2863 old_details.attributes()); | 2863 old_details.attributes()); |
| 2864 if (j == TransitionArray::kNotFound) return MaybeHandle<Map>(); | 2864 if (j == TransitionArray::kNotFound) return MaybeHandle<Map>(); |
| 2865 new_map = new_map->GetTransition(j); | 2865 new_map = new_map->GetTransition(j); |
| 2866 DescriptorArray* new_descriptors = new_map->instance_descriptors(); | 2866 DescriptorArray* new_descriptors = new_map->instance_descriptors(); |
| 2867 | 2867 |
| 2868 PropertyDetails new_details = new_descriptors->GetDetails(i); | 2868 PropertyDetails new_details = new_descriptors->GetDetails(i); |
| 2869 if (old_details.attributes() != new_details.attributes() || | 2869 DCHECK_EQ(old_details.kind(), new_details.kind()); |
| 2870 !old_details.representation().fits_into(new_details.representation())) { | 2870 DCHECK_EQ(old_details.attributes(), new_details.attributes()); |
| 2871 if (!old_details.representation().fits_into(new_details.representation())) { |
| 2871 return MaybeHandle<Map>(); | 2872 return MaybeHandle<Map>(); |
| 2872 } | 2873 } |
| 2873 PropertyType new_type = new_details.type(); | |
| 2874 PropertyType old_type = old_details.type(); | |
| 2875 Object* new_value = new_descriptors->GetValue(i); | 2874 Object* new_value = new_descriptors->GetValue(i); |
| 2876 Object* old_value = old_descriptors->GetValue(i); | 2875 Object* old_value = old_descriptors->GetValue(i); |
| 2877 switch (new_type) { | 2876 switch (new_details.type()) { |
| 2878 case FIELD: | 2877 case FIELD: { |
| 2879 if ((old_type == FIELD && | 2878 PropertyType old_type = old_details.type(); |
| 2880 !HeapType::cast(old_value)->NowIs(HeapType::cast(new_value))) || | 2879 if (old_type == FIELD) { |
| 2881 (old_type == CONSTANT && | 2880 if (!HeapType::cast(old_value)->NowIs(HeapType::cast(new_value))) { |
| 2882 !HeapType::cast(new_value)->NowContains(old_value)) || | 2881 return MaybeHandle<Map>(); |
| 2883 (old_type == CALLBACKS && | 2882 } |
| 2884 !HeapType::Any()->Is(HeapType::cast(new_value)))) { | 2883 } else { |
| 2885 return MaybeHandle<Map>(); | 2884 DCHECK(old_type == CONSTANT); |
| 2885 if (!HeapType::cast(new_value)->NowContains(old_value)) { |
| 2886 return MaybeHandle<Map>(); |
| 2887 } |
| 2886 } | 2888 } |
| 2887 break; | 2889 break; |
| 2890 } |
| 2891 case ACCESSOR_FIELD: |
| 2892 DCHECK(HeapType::Any()->Is(HeapType::cast(new_value))); |
| 2893 break; |
| 2888 | 2894 |
| 2889 case CONSTANT: | 2895 case CONSTANT: |
| 2890 case CALLBACKS: | 2896 case CALLBACKS: |
| 2891 if (old_type != new_type || old_value != new_value) { | 2897 if (old_details.location() == IN_OBJECT || old_value != new_value) { |
| 2892 return MaybeHandle<Map>(); | 2898 return MaybeHandle<Map>(); |
| 2893 } | 2899 } |
| 2894 break; | 2900 break; |
| 2895 } | 2901 } |
| 2896 } | 2902 } |
| 2897 if (new_map->NumberOfOwnDescriptors() != old_nof) return MaybeHandle<Map>(); | 2903 if (new_map->NumberOfOwnDescriptors() != old_nof) return MaybeHandle<Map>(); |
| 2898 return handle(new_map); | 2904 return handle(new_map); |
| 2899 } | 2905 } |
| 2900 | 2906 |
| 2901 | 2907 |
| (...skipping 1456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4358 property_count += expected_additional_properties; | 4364 property_count += expected_additional_properties; |
| 4359 } else { | 4365 } else { |
| 4360 property_count += 2; // Make space for two more properties. | 4366 property_count += 2; // Make space for two more properties. |
| 4361 } | 4367 } |
| 4362 Handle<NameDictionary> dictionary = | 4368 Handle<NameDictionary> dictionary = |
| 4363 NameDictionary::New(isolate, property_count); | 4369 NameDictionary::New(isolate, property_count); |
| 4364 | 4370 |
| 4365 Handle<DescriptorArray> descs(map->instance_descriptors()); | 4371 Handle<DescriptorArray> descs(map->instance_descriptors()); |
| 4366 for (int i = 0; i < real_size; i++) { | 4372 for (int i = 0; i < real_size; i++) { |
| 4367 PropertyDetails details = descs->GetDetails(i); | 4373 PropertyDetails details = descs->GetDetails(i); |
| 4374 Handle<Name> key(descs->GetKey(i)); |
| 4368 switch (details.type()) { | 4375 switch (details.type()) { |
| 4369 case CONSTANT: { | 4376 case CONSTANT: { |
| 4370 Handle<Name> key(descs->GetKey(i)); | |
| 4371 Handle<Object> value(descs->GetConstant(i), isolate); | 4377 Handle<Object> value(descs->GetConstant(i), isolate); |
| 4372 PropertyDetails d(details.attributes(), FIELD, i + 1); | 4378 PropertyDetails d(details.attributes(), FIELD, i + 1); |
| 4373 dictionary = NameDictionary::Add(dictionary, key, value, d); | 4379 dictionary = NameDictionary::Add(dictionary, key, value, d); |
| 4374 break; | 4380 break; |
| 4375 } | 4381 } |
| 4376 case FIELD: { | 4382 case FIELD: { |
| 4377 Handle<Name> key(descs->GetKey(i)); | |
| 4378 FieldIndex index = FieldIndex::ForDescriptor(*map, i); | 4383 FieldIndex index = FieldIndex::ForDescriptor(*map, i); |
| 4379 Handle<Object> value; | 4384 Handle<Object> value; |
| 4380 if (object->IsUnboxedDoubleField(index)) { | 4385 if (object->IsUnboxedDoubleField(index)) { |
| 4381 double old_value = object->RawFastDoublePropertyAt(index); | 4386 double old_value = object->RawFastDoublePropertyAt(index); |
| 4382 value = isolate->factory()->NewHeapNumber(old_value); | 4387 value = isolate->factory()->NewHeapNumber(old_value); |
| 4383 } else { | 4388 } else { |
| 4384 value = handle(object->RawFastPropertyAt(index), isolate); | 4389 value = handle(object->RawFastPropertyAt(index), isolate); |
| 4385 if (details.representation().IsDouble()) { | 4390 if (details.representation().IsDouble()) { |
| 4386 DCHECK(value->IsMutableHeapNumber()); | 4391 DCHECK(value->IsMutableHeapNumber()); |
| 4387 Handle<HeapNumber> old = Handle<HeapNumber>::cast(value); | 4392 Handle<HeapNumber> old = Handle<HeapNumber>::cast(value); |
| 4388 value = isolate->factory()->NewHeapNumber(old->value()); | 4393 value = isolate->factory()->NewHeapNumber(old->value()); |
| 4389 } | 4394 } |
| 4390 } | 4395 } |
| 4391 PropertyDetails d(details.attributes(), FIELD, i + 1); | 4396 PropertyDetails d(details.attributes(), FIELD, i + 1); |
| 4392 dictionary = NameDictionary::Add(dictionary, key, value, d); | 4397 dictionary = NameDictionary::Add(dictionary, key, value, d); |
| 4393 break; | 4398 break; |
| 4394 } | 4399 } |
| 4400 case ACCESSOR_FIELD: { |
| 4401 FieldIndex index = FieldIndex::ForDescriptor(*map, i); |
| 4402 Handle<Object> value(object->RawFastPropertyAt(index), isolate); |
| 4403 PropertyDetails d(details.attributes(), CALLBACKS, i + 1); |
| 4404 dictionary = NameDictionary::Add(dictionary, key, value, d); |
| 4405 break; |
| 4406 } |
| 4395 case CALLBACKS: { | 4407 case CALLBACKS: { |
| 4396 Handle<Name> key(descs->GetKey(i)); | |
| 4397 Handle<Object> value(descs->GetCallbacksObject(i), isolate); | 4408 Handle<Object> value(descs->GetCallbacksObject(i), isolate); |
| 4398 PropertyDetails d(details.attributes(), CALLBACKS, i + 1); | 4409 PropertyDetails d(details.attributes(), CALLBACKS, i + 1); |
| 4399 dictionary = NameDictionary::Add(dictionary, key, value, d); | 4410 dictionary = NameDictionary::Add(dictionary, key, value, d); |
| 4400 break; | 4411 break; |
| 4401 } | 4412 } |
| 4402 } | 4413 } |
| 4403 } | 4414 } |
| 4404 | 4415 |
| 4405 // Copy the next enumeration index from instance descriptor. | 4416 // Copy the next enumeration index from instance descriptor. |
| 4406 dictionary->SetNextEnumerationIndex(real_size + 1); | 4417 dictionary->SetNextEnumerationIndex(real_size + 1); |
| (...skipping 2650 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7057 switch (details.type()) { | 7068 switch (details.type()) { |
| 7058 case FIELD: | 7069 case FIELD: |
| 7059 return value->FitsRepresentation(details.representation()) && | 7070 return value->FitsRepresentation(details.representation()) && |
| 7060 GetFieldType(descriptor)->NowContains(value); | 7071 GetFieldType(descriptor)->NowContains(value); |
| 7061 | 7072 |
| 7062 case CONSTANT: | 7073 case CONSTANT: |
| 7063 DCHECK(GetConstant(descriptor) != value || | 7074 DCHECK(GetConstant(descriptor) != value || |
| 7064 value->FitsRepresentation(details.representation())); | 7075 value->FitsRepresentation(details.representation())); |
| 7065 return GetConstant(descriptor) == value; | 7076 return GetConstant(descriptor) == value; |
| 7066 | 7077 |
| 7078 case ACCESSOR_FIELD: |
| 7067 case CALLBACKS: | 7079 case CALLBACKS: |
| 7068 return false; | 7080 return false; |
| 7069 } | 7081 } |
| 7070 | 7082 |
| 7071 UNREACHABLE(); | 7083 UNREACHABLE(); |
| 7072 return false; | 7084 return false; |
| 7073 } | 7085 } |
| 7074 | 7086 |
| 7075 | 7087 |
| 7076 Handle<Map> Map::PrepareForDataProperty(Handle<Map> map, int descriptor, | 7088 Handle<Map> Map::PrepareForDataProperty(Handle<Map> map, int descriptor, |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7182 ? KEEP_INOBJECT_PROPERTIES | 7194 ? KEEP_INOBJECT_PROPERTIES |
| 7183 : CLEAR_INOBJECT_PROPERTIES; | 7195 : CLEAR_INOBJECT_PROPERTIES; |
| 7184 | 7196 |
| 7185 int index = map->SearchTransition(ACCESSOR, *name, attributes); | 7197 int index = map->SearchTransition(ACCESSOR, *name, attributes); |
| 7186 if (index != TransitionArray::kNotFound) { | 7198 if (index != TransitionArray::kNotFound) { |
| 7187 Handle<Map> transition(map->GetTransition(index)); | 7199 Handle<Map> transition(map->GetTransition(index)); |
| 7188 DescriptorArray* descriptors = transition->instance_descriptors(); | 7200 DescriptorArray* descriptors = transition->instance_descriptors(); |
| 7189 int descriptor = transition->LastAdded(); | 7201 int descriptor = transition->LastAdded(); |
| 7190 DCHECK(descriptors->GetKey(descriptor)->Equals(*name)); | 7202 DCHECK(descriptors->GetKey(descriptor)->Equals(*name)); |
| 7191 | 7203 |
| 7192 DCHECK_EQ(CALLBACKS, descriptors->GetDetails(descriptor).type()); | 7204 DCHECK_EQ(ACCESSOR, descriptors->GetDetails(descriptor).kind()); |
| 7193 DCHECK_EQ(attributes, descriptors->GetDetails(descriptor).attributes()); | 7205 DCHECK_EQ(attributes, descriptors->GetDetails(descriptor).attributes()); |
| 7194 | 7206 |
| 7195 Handle<Object> maybe_pair(descriptors->GetValue(descriptor), isolate); | 7207 Handle<Object> maybe_pair(descriptors->GetValue(descriptor), isolate); |
| 7196 if (!maybe_pair->IsAccessorPair()) { | 7208 if (!maybe_pair->IsAccessorPair()) { |
| 7197 return Map::Normalize(map, mode, "TransitionToAccessorFromNonPair"); | 7209 return Map::Normalize(map, mode, "TransitionToAccessorFromNonPair"); |
| 7198 } | 7210 } |
| 7199 | 7211 |
| 7200 Handle<AccessorPair> pair = Handle<AccessorPair>::cast(maybe_pair); | 7212 Handle<AccessorPair> pair = Handle<AccessorPair>::cast(maybe_pair); |
| 7201 if (pair->get(component) != *accessor) { | 7213 if (pair->get(component) != *accessor) { |
| 7202 return Map::Normalize(map, mode, "TransitionToDifferentAccessor"); | 7214 return Map::Normalize(map, mode, "TransitionToDifferentAccessor"); |
| (...skipping 9700 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 16903 Handle<DependentCode> codes = | 16915 Handle<DependentCode> codes = |
| 16904 DependentCode::Insert(handle(cell->dependent_code(), info->isolate()), | 16916 DependentCode::Insert(handle(cell->dependent_code(), info->isolate()), |
| 16905 DependentCode::kPropertyCellChangedGroup, | 16917 DependentCode::kPropertyCellChangedGroup, |
| 16906 info->object_wrapper()); | 16918 info->object_wrapper()); |
| 16907 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes); | 16919 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes); |
| 16908 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add( | 16920 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add( |
| 16909 cell, info->zone()); | 16921 cell, info->zone()); |
| 16910 } | 16922 } |
| 16911 | 16923 |
| 16912 } } // namespace v8::internal | 16924 } } // namespace v8::internal |
| OLD | NEW |