| 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 "src/objects.h" | 5 #include "src/objects.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 #include <iomanip> | 8 #include <iomanip> |
| 9 #include <sstream> | 9 #include <sstream> |
| 10 | 10 |
| (...skipping 3028 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3039 details.representation().IsNone()); | 3039 details.representation().IsNone()); |
| 3040 | 3040 |
| 3041 // Skip if already updated the shared descriptor. | 3041 // Skip if already updated the shared descriptor. |
| 3042 if (instance_descriptors()->GetValue(descriptor) == *new_wrapped_type) return; | 3042 if (instance_descriptors()->GetValue(descriptor) == *new_wrapped_type) return; |
| 3043 DataDescriptor d(name, instance_descriptors()->GetFieldIndex(descriptor), | 3043 DataDescriptor d(name, instance_descriptors()->GetFieldIndex(descriptor), |
| 3044 new_wrapped_type, details.attributes(), new_representation); | 3044 new_wrapped_type, details.attributes(), new_representation); |
| 3045 instance_descriptors()->Replace(descriptor, &d); | 3045 instance_descriptors()->Replace(descriptor, &d); |
| 3046 } | 3046 } |
| 3047 | 3047 |
| 3048 | 3048 |
| 3049 bool FieldTypeIsCleared(Representation rep, Handle<HeapType> type) { | 3049 bool FieldTypeIsCleared(Representation rep, HeapType* type) { |
| 3050 return type->Is(HeapType::None()) && rep.IsHeapObject(); | 3050 return type->Is(HeapType::None()) && rep.IsHeapObject(); |
| 3051 } | 3051 } |
| 3052 | 3052 |
| 3053 | 3053 |
| 3054 // static | 3054 // static |
| 3055 Handle<HeapType> Map::GeneralizeFieldType(Representation rep1, | 3055 Handle<HeapType> Map::GeneralizeFieldType(Representation rep1, |
| 3056 Handle<HeapType> type1, | 3056 Handle<HeapType> type1, |
| 3057 Representation rep2, | 3057 Representation rep2, |
| 3058 Handle<HeapType> type2, | 3058 Handle<HeapType> type2, |
| 3059 Isolate* isolate) { | 3059 Isolate* isolate) { |
| 3060 // Cleared field types need special treatment. They represent lost knowledge, | 3060 // Cleared field types need special treatment. They represent lost knowledge, |
| 3061 // so we must be conservative, so their generalization with any other type | 3061 // so we must be conservative, so their generalization with any other type |
| 3062 // is "Any". | 3062 // is "Any". |
| 3063 if (FieldTypeIsCleared(rep1, type1) || FieldTypeIsCleared(rep2, type2)) { | 3063 if (FieldTypeIsCleared(rep1, *type1) || FieldTypeIsCleared(rep2, *type2)) { |
| 3064 return HeapType::Any(isolate); | 3064 return HeapType::Any(isolate); |
| 3065 } | 3065 } |
| 3066 if (type1->NowIs(type2)) return type2; | 3066 if (type1->NowIs(type2)) return type2; |
| 3067 if (type2->NowIs(type1)) return type1; | 3067 if (type2->NowIs(type1)) return type1; |
| 3068 return HeapType::Any(isolate); | 3068 return HeapType::Any(isolate); |
| 3069 } | 3069 } |
| 3070 | 3070 |
| 3071 | 3071 |
| 3072 // static | 3072 // static |
| 3073 void Map::GeneralizeFieldType(Handle<Map> map, int modify_index, | 3073 void Map::GeneralizeFieldType(Handle<Map> map, int modify_index, |
| 3074 Representation new_representation, | 3074 Representation new_representation, |
| 3075 Handle<HeapType> new_field_type) { | 3075 Handle<HeapType> new_field_type) { |
| 3076 Isolate* isolate = map->GetIsolate(); | 3076 Isolate* isolate = map->GetIsolate(); |
| 3077 | 3077 |
| 3078 // Check if we actually need to generalize the field type at all. | 3078 // Check if we actually need to generalize the field type at all. |
| 3079 Handle<DescriptorArray> old_descriptors(map->instance_descriptors(), isolate); | 3079 Handle<DescriptorArray> old_descriptors(map->instance_descriptors(), isolate); |
| 3080 Representation old_representation = | 3080 Representation old_representation = |
| 3081 old_descriptors->GetDetails(modify_index).representation(); | 3081 old_descriptors->GetDetails(modify_index).representation(); |
| 3082 Handle<HeapType> old_field_type(old_descriptors->GetFieldType(modify_index), | 3082 Handle<HeapType> old_field_type(old_descriptors->GetFieldType(modify_index), |
| 3083 isolate); | 3083 isolate); |
| 3084 | 3084 |
| 3085 if (old_representation.Equals(new_representation) && | 3085 if (old_representation.Equals(new_representation) && |
| 3086 !FieldTypeIsCleared(new_representation, new_field_type) && | 3086 !FieldTypeIsCleared(new_representation, *new_field_type) && |
| 3087 // Checking old_field_type for being cleared is not necessary because | 3087 // Checking old_field_type for being cleared is not necessary because |
| 3088 // the NowIs check below would fail anyway in that case. | 3088 // the NowIs check below would fail anyway in that case. |
| 3089 new_field_type->NowIs(old_field_type)) { | 3089 new_field_type->NowIs(old_field_type)) { |
| 3090 DCHECK(Map::GeneralizeFieldType(old_representation, old_field_type, | 3090 DCHECK(Map::GeneralizeFieldType(old_representation, old_field_type, |
| 3091 new_representation, new_field_type, isolate) | 3091 new_representation, new_field_type, isolate) |
| 3092 ->NowIs(old_field_type)); | 3092 ->NowIs(old_field_type)); |
| 3093 return; | 3093 return; |
| 3094 } | 3094 } |
| 3095 | 3095 |
| 3096 // Determine the field owner. | 3096 // Determine the field owner. |
| (...skipping 631 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3728 | 3728 |
| 3729 PropertyDetails new_details = new_descriptors->GetDetails(i); | 3729 PropertyDetails new_details = new_descriptors->GetDetails(i); |
| 3730 DCHECK_EQ(old_details.kind(), new_details.kind()); | 3730 DCHECK_EQ(old_details.kind(), new_details.kind()); |
| 3731 DCHECK_EQ(old_details.attributes(), new_details.attributes()); | 3731 DCHECK_EQ(old_details.attributes(), new_details.attributes()); |
| 3732 if (!old_details.representation().fits_into(new_details.representation())) { | 3732 if (!old_details.representation().fits_into(new_details.representation())) { |
| 3733 return MaybeHandle<Map>(); | 3733 return MaybeHandle<Map>(); |
| 3734 } | 3734 } |
| 3735 switch (new_details.type()) { | 3735 switch (new_details.type()) { |
| 3736 case DATA: { | 3736 case DATA: { |
| 3737 HeapType* new_type = new_descriptors->GetFieldType(i); | 3737 HeapType* new_type = new_descriptors->GetFieldType(i); |
| 3738 // Cleared field types need special treatment. They represent lost |
| 3739 // knowledge, so we must first generalize the old_type to "Any". |
| 3740 if (!FieldTypeIsCleared(new_details.representation(), new_type)) { |
| 3741 return MaybeHandle<Map>(); |
| 3742 } |
| 3738 PropertyType old_property_type = old_details.type(); | 3743 PropertyType old_property_type = old_details.type(); |
| 3739 if (old_property_type == DATA) { | 3744 if (old_property_type == DATA) { |
| 3740 HeapType* old_type = old_descriptors->GetFieldType(i); | 3745 HeapType* old_type = old_descriptors->GetFieldType(i); |
| 3741 if (!old_type->NowIs(new_type)) { | 3746 if (FieldTypeIsCleared(old_details.representation(), old_type) || |
| 3747 !old_type->NowIs(new_type)) { |
| 3742 return MaybeHandle<Map>(); | 3748 return MaybeHandle<Map>(); |
| 3743 } | 3749 } |
| 3744 } else { | 3750 } else { |
| 3745 DCHECK(old_property_type == DATA_CONSTANT); | 3751 DCHECK(old_property_type == DATA_CONSTANT); |
| 3746 Object* old_value = old_descriptors->GetValue(i); | 3752 Object* old_value = old_descriptors->GetValue(i); |
| 3747 if (!new_type->NowContains(old_value)) { | 3753 if (!new_type->NowContains(old_value)) { |
| 3748 return MaybeHandle<Map>(); | 3754 return MaybeHandle<Map>(); |
| 3749 } | 3755 } |
| 3750 } | 3756 } |
| 3751 break; | 3757 break; |
| (...skipping 15560 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 19312 if (cell->value() != *new_value) { | 19318 if (cell->value() != *new_value) { |
| 19313 cell->set_value(*new_value); | 19319 cell->set_value(*new_value); |
| 19314 Isolate* isolate = cell->GetIsolate(); | 19320 Isolate* isolate = cell->GetIsolate(); |
| 19315 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 19321 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
| 19316 isolate, DependentCode::kPropertyCellChangedGroup); | 19322 isolate, DependentCode::kPropertyCellChangedGroup); |
| 19317 } | 19323 } |
| 19318 } | 19324 } |
| 19319 | 19325 |
| 19320 } // namespace internal | 19326 } // namespace internal |
| 19321 } // namespace v8 | 19327 } // namespace v8 |
| OLD | NEW |