| 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 3078 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3089 receiver->map()->is_observed() && | 3089 receiver->map()->is_observed() && |
| 3090 !it->name().is_identical_to(it->factory()->hidden_string()); | 3090 !it->name().is_identical_to(it->factory()->hidden_string()); |
| 3091 MaybeHandle<Object> maybe_old; | 3091 MaybeHandle<Object> maybe_old; |
| 3092 if (is_observed) maybe_old = it->GetDataValue(); | 3092 if (is_observed) maybe_old = it->GetDataValue(); |
| 3093 | 3093 |
| 3094 // Possibly migrate to the most up-to-date map that will be able to store | 3094 // Possibly migrate to the most up-to-date map that will be able to store |
| 3095 // |value| under it->name(). | 3095 // |value| under it->name(). |
| 3096 it->PrepareForDataProperty(value); | 3096 it->PrepareForDataProperty(value); |
| 3097 | 3097 |
| 3098 // Write the property value. | 3098 // Write the property value. |
| 3099 it->WriteDataValue(value); | 3099 value = it->WriteDataValue(value); |
| 3100 | 3100 |
| 3101 // Send the change record if there are observers. | 3101 // Send the change record if there are observers. |
| 3102 if (is_observed && !value->SameValue(*maybe_old.ToHandleChecked())) { | 3102 if (is_observed && !value->SameValue(*maybe_old.ToHandleChecked())) { |
| 3103 RETURN_ON_EXCEPTION(it->isolate(), JSObject::EnqueueChangeRecord( | 3103 RETURN_ON_EXCEPTION(it->isolate(), JSObject::EnqueueChangeRecord( |
| 3104 receiver, "update", it->name(), | 3104 receiver, "update", it->name(), |
| 3105 maybe_old.ToHandleChecked()), | 3105 maybe_old.ToHandleChecked()), |
| 3106 Object); | 3106 Object); |
| 3107 } | 3107 } |
| 3108 | 3108 |
| 3109 return value; | 3109 return value; |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3145 } | 3145 } |
| 3146 it->ApplyTransitionToDataProperty(); | 3146 it->ApplyTransitionToDataProperty(); |
| 3147 | 3147 |
| 3148 // TODO(verwaest): Encapsulate dictionary handling better. | 3148 // TODO(verwaest): Encapsulate dictionary handling better. |
| 3149 if (receiver->map()->is_dictionary_map()) { | 3149 if (receiver->map()->is_dictionary_map()) { |
| 3150 // TODO(verwaest): Probably should ensure this is done beforehand. | 3150 // TODO(verwaest): Probably should ensure this is done beforehand. |
| 3151 it->InternalizeName(); | 3151 it->InternalizeName(); |
| 3152 JSObject::AddSlowProperty(receiver, it->name(), value, attributes); | 3152 JSObject::AddSlowProperty(receiver, it->name(), value, attributes); |
| 3153 } else { | 3153 } else { |
| 3154 // Write the property value. | 3154 // Write the property value. |
| 3155 it->WriteDataValue(value); | 3155 value = it->WriteDataValue(value); |
| 3156 } | 3156 } |
| 3157 | 3157 |
| 3158 // Send the change record if there are observers. | 3158 // Send the change record if there are observers. |
| 3159 if (receiver->map()->is_observed() && | 3159 if (receiver->map()->is_observed() && |
| 3160 !it->name().is_identical_to(it->factory()->hidden_string())) { | 3160 !it->name().is_identical_to(it->factory()->hidden_string())) { |
| 3161 RETURN_ON_EXCEPTION(it->isolate(), JSObject::EnqueueChangeRecord( | 3161 RETURN_ON_EXCEPTION(it->isolate(), JSObject::EnqueueChangeRecord( |
| 3162 receiver, "add", it->name(), | 3162 receiver, "add", it->name(), |
| 3163 it->factory()->the_hole_value()), | 3163 it->factory()->the_hole_value()), |
| 3164 Object); | 3164 Object); |
| 3165 } | 3165 } |
| (...skipping 866 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4032 it.isolate(), | 4032 it.isolate(), |
| 4033 EnqueueChangeRecord(object, "reconfigure", name, | 4033 EnqueueChangeRecord(object, "reconfigure", name, |
| 4034 it.isolate()->factory()->the_hole_value()), | 4034 it.isolate()->factory()->the_hole_value()), |
| 4035 Object); | 4035 Object); |
| 4036 } | 4036 } |
| 4037 return value; | 4037 return value; |
| 4038 } | 4038 } |
| 4039 | 4039 |
| 4040 it.ReconfigureDataProperty(value, attributes); | 4040 it.ReconfigureDataProperty(value, attributes); |
| 4041 it.PrepareForDataProperty(value); | 4041 it.PrepareForDataProperty(value); |
| 4042 it.WriteDataValue(value); | 4042 value = it.WriteDataValue(value); |
| 4043 | 4043 |
| 4044 if (is_observed) { | 4044 if (is_observed) { |
| 4045 RETURN_ON_EXCEPTION( | 4045 RETURN_ON_EXCEPTION( |
| 4046 it.isolate(), | 4046 it.isolate(), |
| 4047 EnqueueChangeRecord(object, "reconfigure", name, | 4047 EnqueueChangeRecord(object, "reconfigure", name, |
| 4048 it.isolate()->factory()->the_hole_value()), | 4048 it.isolate()->factory()->the_hole_value()), |
| 4049 Object); | 4049 Object); |
| 4050 } | 4050 } |
| 4051 | 4051 |
| 4052 return value; | 4052 return value; |
| 4053 } | 4053 } |
| 4054 | 4054 |
| 4055 case LookupIterator::DATA: { | 4055 case LookupIterator::DATA: { |
| 4056 PropertyDetails details = it.property_details(); | 4056 PropertyDetails details = it.property_details(); |
| 4057 Handle<Object> old_value = it.isolate()->factory()->the_hole_value(); | 4057 Handle<Object> old_value = it.isolate()->factory()->the_hole_value(); |
| 4058 // Regular property update if the attributes match. | 4058 // Regular property update if the attributes match. |
| 4059 if (details.attributes() == attributes) { | 4059 if (details.attributes() == attributes) { |
| 4060 return SetDataProperty(&it, value); | 4060 return SetDataProperty(&it, value); |
| 4061 } | 4061 } |
| 4062 // Reconfigure the data property if the attributes mismatch. | 4062 // Reconfigure the data property if the attributes mismatch. |
| 4063 if (is_observed) old_value = it.GetDataValue(); | 4063 if (is_observed) old_value = it.GetDataValue(); |
| 4064 | 4064 |
| 4065 it.ReconfigureDataProperty(value, attributes); | 4065 it.ReconfigureDataProperty(value, attributes); |
| 4066 it.PrepareForDataProperty(value); | 4066 it.PrepareForDataProperty(value); |
| 4067 it.WriteDataValue(value); | 4067 value = it.WriteDataValue(value); |
| 4068 | 4068 |
| 4069 if (is_observed) { | 4069 if (is_observed) { |
| 4070 if (old_value->SameValue(*value)) { | 4070 if (old_value->SameValue(*value)) { |
| 4071 old_value = it.isolate()->factory()->the_hole_value(); | 4071 old_value = it.isolate()->factory()->the_hole_value(); |
| 4072 } | 4072 } |
| 4073 RETURN_ON_EXCEPTION( | 4073 RETURN_ON_EXCEPTION( |
| 4074 it.isolate(), | 4074 it.isolate(), |
| 4075 EnqueueChangeRecord(object, "reconfigure", name, old_value), | 4075 EnqueueChangeRecord(object, "reconfigure", name, old_value), |
| 4076 Object); | 4076 Object); |
| 4077 } | 4077 } |
| (...skipping 12802 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 16880 isolate, DependentCode::kPropertyCellChangedGroup); | 16880 isolate, DependentCode::kPropertyCellChangedGroup); |
| 16881 | 16881 |
| 16882 if (old_type->Is(HeapType::None()) || old_type->Is(HeapType::Undefined())) { | 16882 if (old_type->Is(HeapType::None()) || old_type->Is(HeapType::Undefined())) { |
| 16883 return new_type; | 16883 return new_type; |
| 16884 } | 16884 } |
| 16885 | 16885 |
| 16886 return HeapType::Any(isolate); | 16886 return HeapType::Any(isolate); |
| 16887 } | 16887 } |
| 16888 | 16888 |
| 16889 | 16889 |
| 16890 void PropertyCell::SetValueInferType(Handle<PropertyCell> cell, | 16890 Handle<Object> PropertyCell::SetValueInferType(Handle<PropertyCell> cell, |
| 16891 Handle<Object> value) { | 16891 Handle<Object> value) { |
| 16892 // Heuristic: if a string is stored in a previously uninitialized |
| 16893 // property cell, internalize it. |
| 16894 if ((cell->type()->Is(HeapType::None()) || |
| 16895 cell->type()->Is(HeapType::Undefined())) && |
| 16896 value->IsString()) { |
| 16897 value = cell->GetIsolate()->factory()->InternalizeString( |
| 16898 Handle<String>::cast(value)); |
| 16899 } |
| 16892 cell->set_value(*value); | 16900 cell->set_value(*value); |
| 16893 if (!HeapType::Any()->Is(cell->type())) { | 16901 if (!HeapType::Any()->Is(cell->type())) { |
| 16894 Handle<HeapType> new_type = UpdatedType(cell, value); | 16902 Handle<HeapType> new_type = UpdatedType(cell, value); |
| 16895 cell->set_type(*new_type); | 16903 cell->set_type(*new_type); |
| 16896 } | 16904 } |
| 16905 return value; |
| 16897 } | 16906 } |
| 16898 | 16907 |
| 16899 | 16908 |
| 16900 // static | 16909 // static |
| 16901 void PropertyCell::AddDependentCompilationInfo(Handle<PropertyCell> cell, | 16910 void PropertyCell::AddDependentCompilationInfo(Handle<PropertyCell> cell, |
| 16902 CompilationInfo* info) { | 16911 CompilationInfo* info) { |
| 16903 Handle<DependentCode> codes = | 16912 Handle<DependentCode> codes = |
| 16904 DependentCode::Insert(handle(cell->dependent_code(), info->isolate()), | 16913 DependentCode::Insert(handle(cell->dependent_code(), info->isolate()), |
| 16905 DependentCode::kPropertyCellChangedGroup, | 16914 DependentCode::kPropertyCellChangedGroup, |
| 16906 info->object_wrapper()); | 16915 info->object_wrapper()); |
| 16907 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes); | 16916 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes); |
| 16908 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add( | 16917 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add( |
| 16909 cell, info->zone()); | 16918 cell, info->zone()); |
| 16910 } | 16919 } |
| 16911 | 16920 |
| 16912 } } // namespace v8::internal | 16921 } } // namespace v8::internal |
| OLD | NEW |