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 <iomanip> | 5 #include <iomanip> |
6 #include <sstream> | 6 #include <sstream> |
7 | 7 |
8 #include "src/v8.h" | 8 #include "src/v8.h" |
9 | 9 |
10 #include "src/accessors.h" | 10 #include "src/accessors.h" |
(...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
529 if (accessors->IsAccessorInfo()) { | 529 if (accessors->IsAccessorInfo()) { |
530 if (AccessorInfo::cast(*accessors)->all_can_write()) return true; | 530 if (AccessorInfo::cast(*accessors)->all_can_write()) return true; |
531 } | 531 } |
532 } | 532 } |
533 } | 533 } |
534 return false; | 534 return false; |
535 } | 535 } |
536 | 536 |
537 | 537 |
538 MaybeHandle<Object> JSObject::SetPropertyWithFailedAccessCheck( | 538 MaybeHandle<Object> JSObject::SetPropertyWithFailedAccessCheck( |
539 LookupIterator* it, Handle<Object> value, LanguageMode language_mode) { | 539 LookupIterator* it, Handle<Object> value) { |
540 Handle<JSObject> checked = it->GetHolder<JSObject>(); | 540 Handle<JSObject> checked = it->GetHolder<JSObject>(); |
541 if (FindAllCanWriteHolder(it)) { | 541 if (FindAllCanWriteHolder(it)) { |
542 return SetPropertyWithAccessor(it, value, language_mode); | 542 // The supplied language-mode is ignored by SetPropertyWithAccessor. |
| 543 return SetPropertyWithAccessor(it, value, SLOPPY); |
543 } | 544 } |
544 | 545 |
545 it->isolate()->ReportFailedAccessCheck(checked); | 546 it->isolate()->ReportFailedAccessCheck(checked); |
546 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object); | 547 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object); |
547 return value; | 548 return value; |
548 } | 549 } |
549 | 550 |
550 | 551 |
551 void JSObject::SetNormalizedProperty(Handle<JSObject> object, | 552 void JSObject::SetNormalizedProperty(Handle<JSObject> object, |
552 Handle<Name> name, | 553 Handle<Name> name, |
(...skipping 2484 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3037 bool done = false; | 3038 bool done = false; |
3038 for (; it->IsFound(); it->Next()) { | 3039 for (; it->IsFound(); it->Next()) { |
3039 switch (it->state()) { | 3040 switch (it->state()) { |
3040 case LookupIterator::NOT_FOUND: | 3041 case LookupIterator::NOT_FOUND: |
3041 UNREACHABLE(); | 3042 UNREACHABLE(); |
3042 | 3043 |
3043 case LookupIterator::ACCESS_CHECK: | 3044 case LookupIterator::ACCESS_CHECK: |
3044 if (it->HasAccess()) break; | 3045 if (it->HasAccess()) break; |
3045 // Check whether it makes sense to reuse the lookup iterator. Here it | 3046 // Check whether it makes sense to reuse the lookup iterator. Here it |
3046 // might still call into setters up the prototype chain. | 3047 // might still call into setters up the prototype chain. |
3047 return JSObject::SetPropertyWithFailedAccessCheck(it, value, | 3048 return JSObject::SetPropertyWithFailedAccessCheck(it, value); |
3048 language_mode); | |
3049 | 3049 |
3050 case LookupIterator::JSPROXY: | 3050 case LookupIterator::JSPROXY: |
3051 if (it->HolderIsReceiverOrHiddenPrototype()) { | 3051 if (it->HolderIsReceiverOrHiddenPrototype()) { |
3052 return JSProxy::SetPropertyWithHandler( | 3052 return JSProxy::SetPropertyWithHandler( |
3053 it->GetHolder<JSProxy>(), it->GetReceiver(), it->GetName(), value, | 3053 it->GetHolder<JSProxy>(), it->GetReceiver(), it->GetName(), value, |
3054 language_mode); | 3054 language_mode); |
3055 } else { | 3055 } else { |
3056 // TODO(verwaest): Use the MaybeHandle to indicate result. | 3056 // TODO(verwaest): Use the MaybeHandle to indicate result. |
3057 bool has_result = false; | 3057 bool has_result = false; |
3058 MaybeHandle<Object> maybe_result = | 3058 MaybeHandle<Object> maybe_result = |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3158 | 3158 |
3159 LookupIterator::Configuration c = LookupIterator::OWN; | 3159 LookupIterator::Configuration c = LookupIterator::OWN; |
3160 LookupIterator own_lookup = | 3160 LookupIterator own_lookup = |
3161 it->IsElement() | 3161 it->IsElement() |
3162 ? LookupIterator(it->isolate(), it->GetReceiver(), it->index(), c) | 3162 ? LookupIterator(it->isolate(), it->GetReceiver(), it->index(), c) |
3163 : LookupIterator(it->GetReceiver(), it->name(), c); | 3163 : LookupIterator(it->GetReceiver(), it->name(), c); |
3164 | 3164 |
3165 for (; own_lookup.IsFound(); own_lookup.Next()) { | 3165 for (; own_lookup.IsFound(); own_lookup.Next()) { |
3166 switch (own_lookup.state()) { | 3166 switch (own_lookup.state()) { |
3167 case LookupIterator::ACCESS_CHECK: | 3167 case LookupIterator::ACCESS_CHECK: |
3168 if (!it->isolate()->MayAccess(own_lookup.GetHolder<JSObject>())) { | 3168 if (!own_lookup.HasAccess()) { |
3169 return JSObject::SetPropertyWithFailedAccessCheck(&own_lookup, value, | 3169 return JSObject::SetPropertyWithFailedAccessCheck(&own_lookup, value); |
3170 language_mode); | |
3171 } | 3170 } |
3172 break; | 3171 break; |
3173 | 3172 |
3174 case LookupIterator::INTEGER_INDEXED_EXOTIC: | 3173 case LookupIterator::INTEGER_INDEXED_EXOTIC: |
3175 return result; | 3174 return result; |
3176 | 3175 |
3177 case LookupIterator::DATA: { | 3176 case LookupIterator::DATA: { |
3178 PropertyDetails details = own_lookup.property_details(); | 3177 PropertyDetails details = own_lookup.property_details(); |
3179 if (details.IsConfigurable() || !details.IsReadOnly()) { | 3178 if (details.IsConfigurable() || !details.IsReadOnly()) { |
3180 return JSObject::ReconfigureAsDataProperty(&own_lookup, value, | 3179 return JSObject::DefineOwnPropertyIgnoreAttributes( |
3181 details.attributes()); | 3180 &own_lookup, value, details.attributes()); |
3182 } | 3181 } |
3183 return WriteToReadOnlyProperty(&own_lookup, value, language_mode); | 3182 return WriteToReadOnlyProperty(&own_lookup, value, language_mode); |
3184 } | 3183 } |
3185 | 3184 |
3186 case LookupIterator::ACCESSOR: { | 3185 case LookupIterator::ACCESSOR: { |
3187 PropertyDetails details = own_lookup.property_details(); | 3186 PropertyDetails details = own_lookup.property_details(); |
3188 if (details.IsConfigurable()) { | 3187 if (details.IsConfigurable()) { |
3189 return JSObject::ReconfigureAsDataProperty(&own_lookup, value, | 3188 return JSObject::DefineOwnPropertyIgnoreAttributes( |
3190 details.attributes()); | 3189 &own_lookup, value, details.attributes()); |
3191 } | 3190 } |
3192 | 3191 |
3193 return RedefineNonconfigurableProperty(it->isolate(), it->GetName(), | 3192 return RedefineNonconfigurableProperty(it->isolate(), it->GetName(), |
3194 value, language_mode); | 3193 value, language_mode); |
3195 } | 3194 } |
3196 | 3195 |
3197 case LookupIterator::INTERCEPTOR: | 3196 case LookupIterator::INTERCEPTOR: |
3198 case LookupIterator::JSPROXY: { | 3197 case LookupIterator::JSPROXY: { |
3199 bool found = false; | 3198 bool found = false; |
3200 MaybeHandle<Object> result = SetPropertyInternal( | 3199 MaybeHandle<Object> result = SetPropertyInternal( |
(...skipping 923 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4124 } | 4123 } |
4125 | 4124 |
4126 | 4125 |
4127 // static | 4126 // static |
4128 void ExecutableAccessorInfo::ClearSetter(Handle<ExecutableAccessorInfo> info) { | 4127 void ExecutableAccessorInfo::ClearSetter(Handle<ExecutableAccessorInfo> info) { |
4129 Handle<Object> object = v8::FromCData(info->GetIsolate(), nullptr); | 4128 Handle<Object> object = v8::FromCData(info->GetIsolate(), nullptr); |
4130 info->set_setter(*object); | 4129 info->set_setter(*object); |
4131 } | 4130 } |
4132 | 4131 |
4133 | 4132 |
4134 MaybeHandle<Object> JSObject::ReconfigureAsDataProperty( | 4133 // Reconfigures a property to a data property with attributes, even if it is not |
| 4134 // reconfigurable. |
| 4135 // Requires a LookupIterator that does not look at the prototype chain beyond |
| 4136 // hidden prototypes. |
| 4137 MaybeHandle<Object> JSObject::DefineOwnPropertyIgnoreAttributes( |
4135 LookupIterator* it, Handle<Object> value, PropertyAttributes attributes, | 4138 LookupIterator* it, Handle<Object> value, PropertyAttributes attributes, |
4136 ExecutableAccessorInfoHandling handling) { | 4139 ExecutableAccessorInfoHandling handling) { |
4137 Handle<JSObject> object = Handle<JSObject>::cast(it->GetReceiver()); | 4140 Handle<JSObject> object = Handle<JSObject>::cast(it->GetReceiver()); |
4138 bool is_observed = object->map()->is_observed() && | 4141 bool is_observed = object->map()->is_observed() && |
4139 (it->IsElement() || | 4142 (it->IsElement() || |
4140 !it->isolate()->IsInternallyUsedPropertyName(it->name())); | 4143 !it->isolate()->IsInternallyUsedPropertyName(it->name())); |
4141 | 4144 |
4142 switch (it->state()) { | 4145 for (; it->IsFound(); it->Next()) { |
4143 case LookupIterator::INTERCEPTOR: | 4146 switch (it->state()) { |
4144 case LookupIterator::JSPROXY: | 4147 case LookupIterator::JSPROXY: |
4145 case LookupIterator::NOT_FOUND: | 4148 case LookupIterator::NOT_FOUND: |
4146 case LookupIterator::TRANSITION: | 4149 case LookupIterator::TRANSITION: |
4147 case LookupIterator::ACCESS_CHECK: | 4150 UNREACHABLE(); |
4148 UNREACHABLE(); | |
4149 | 4151 |
4150 case LookupIterator::INTEGER_INDEXED_EXOTIC: | 4152 case LookupIterator::ACCESS_CHECK: |
4151 return value; | 4153 if (!it->HasAccess()) { |
| 4154 return SetPropertyWithFailedAccessCheck(it, value); |
| 4155 } |
| 4156 break; |
4152 | 4157 |
4153 case LookupIterator::ACCESSOR: { | 4158 // If there's an interceptor, try to store the property with the |
4154 PropertyDetails details = it->property_details(); | 4159 // interceptor. |
4155 // Ensure the context isn't changed after calling into accessors. | 4160 // In case of success, the attributes will have been reset to the default |
4156 AssertNoContextChange ncc(it->isolate()); | 4161 // attributes of the interceptor, rather than the incoming attributes. |
| 4162 // |
| 4163 // TODO(verwaest): JSProxy afterwards verify the attributes that the |
| 4164 // JSProxy claims it has, and verifies that they are compatible. If not, |
| 4165 // they throw. Here we should do the same. |
| 4166 case LookupIterator::INTERCEPTOR: |
| 4167 if (handling == DONT_FORCE_FIELD) { |
| 4168 MaybeHandle<Object> maybe_result = |
| 4169 JSObject::SetPropertyWithInterceptor(it, value); |
| 4170 if (!maybe_result.is_null()) return maybe_result; |
| 4171 if (it->isolate()->has_pending_exception()) return maybe_result; |
| 4172 } |
| 4173 break; |
4157 | 4174 |
4158 Handle<Object> accessors = it->GetAccessors(); | 4175 case LookupIterator::INTEGER_INDEXED_EXOTIC: |
| 4176 return value; |
4159 | 4177 |
4160 // Special handling for ExecutableAccessorInfo, which behaves like a | 4178 case LookupIterator::ACCESSOR: { |
4161 // data property. | 4179 Handle<Object> accessors = it->GetAccessors(); |
4162 if (accessors->IsExecutableAccessorInfo() && | |
4163 handling == DONT_FORCE_FIELD) { | |
4164 Handle<Object> result; | |
4165 ASSIGN_RETURN_ON_EXCEPTION( | |
4166 it->isolate(), result, | |
4167 JSObject::SetPropertyWithAccessor(it, value, STRICT), Object); | |
4168 DCHECK(result->SameValue(*value)); | |
4169 | 4180 |
4170 if (details.attributes() == attributes) return value; | 4181 // Special handling for ExecutableAccessorInfo, which behaves like a |
| 4182 // data property. |
| 4183 if (accessors->IsExecutableAccessorInfo() && |
| 4184 handling == DONT_FORCE_FIELD) { |
| 4185 PropertyDetails details = it->property_details(); |
| 4186 // Ensure the context isn't changed after calling into accessors. |
| 4187 AssertNoContextChange ncc(it->isolate()); |
4171 | 4188 |
4172 // Reconfigure the accessor if attributes mismatch. | 4189 Handle<Object> result; |
4173 Handle<ExecutableAccessorInfo> new_data = Accessors::CloneAccessor( | 4190 ASSIGN_RETURN_ON_EXCEPTION( |
4174 it->isolate(), Handle<ExecutableAccessorInfo>::cast(accessors)); | 4191 it->isolate(), result, |
4175 new_data->set_property_attributes(attributes); | 4192 JSObject::SetPropertyWithAccessor(it, value, STRICT), Object); |
4176 // By clearing the setter we don't have to introduce a lookup to | 4193 DCHECK(result->SameValue(*value)); |
4177 // the setter, simply make it unavailable to reflect the | 4194 |
4178 // attributes. | 4195 if (details.attributes() == attributes) return value; |
4179 if (attributes & READ_ONLY) { | 4196 |
4180 ExecutableAccessorInfo::ClearSetter(new_data); | 4197 // Reconfigure the accessor if attributes mismatch. |
| 4198 Handle<ExecutableAccessorInfo> new_data = Accessors::CloneAccessor( |
| 4199 it->isolate(), Handle<ExecutableAccessorInfo>::cast(accessors)); |
| 4200 new_data->set_property_attributes(attributes); |
| 4201 // By clearing the setter we don't have to introduce a lookup to |
| 4202 // the setter, simply make it unavailable to reflect the |
| 4203 // attributes. |
| 4204 if (attributes & READ_ONLY) { |
| 4205 ExecutableAccessorInfo::ClearSetter(new_data); |
| 4206 } |
| 4207 |
| 4208 if (it->IsElement()) { |
| 4209 SetElementCallback(it->GetHolder<JSObject>(), it->index(), new_data, |
| 4210 attributes); |
| 4211 } else { |
| 4212 SetPropertyCallback(it->GetHolder<JSObject>(), it->name(), new_data, |
| 4213 attributes); |
| 4214 } |
| 4215 } else { |
| 4216 it->ReconfigureDataProperty(value, attributes); |
| 4217 it->WriteDataValue(value); |
4181 } | 4218 } |
4182 | 4219 |
4183 if (it->IsElement()) { | |
4184 SetElementCallback(it->GetHolder<JSObject>(), it->index(), new_data, | |
4185 attributes); | |
4186 } else { | |
4187 SetPropertyCallback(it->GetHolder<JSObject>(), it->name(), new_data, | |
4188 attributes); | |
4189 } | |
4190 if (is_observed) { | 4220 if (is_observed) { |
4191 RETURN_ON_EXCEPTION( | 4221 RETURN_ON_EXCEPTION( |
4192 it->isolate(), | 4222 it->isolate(), |
4193 EnqueueChangeRecord(object, "reconfigure", it->GetName(), | 4223 EnqueueChangeRecord(object, "reconfigure", it->GetName(), |
4194 it->factory()->the_hole_value()), | 4224 it->factory()->the_hole_value()), |
4195 Object); | 4225 Object); |
4196 } | 4226 } |
| 4227 |
4197 return value; | 4228 return value; |
4198 } | 4229 } |
| 4230 case LookupIterator::DATA: { |
| 4231 PropertyDetails details = it->property_details(); |
| 4232 Handle<Object> old_value = it->factory()->the_hole_value(); |
| 4233 // Regular property update if the attributes match. |
| 4234 if (details.attributes() == attributes) { |
| 4235 return SetDataProperty(it, value); |
| 4236 } |
4199 | 4237 |
4200 it->ReconfigureDataProperty(value, attributes); | 4238 // Special case: properties of typed arrays cannot be reconfigured to |
4201 it->WriteDataValue(value); | 4239 // non-writable nor to non-enumerable. |
| 4240 if (it->IsElement() && (object->HasExternalArrayElements() || |
| 4241 object->HasFixedTypedArrayElements())) { |
| 4242 return RedefineNonconfigurableProperty(it->isolate(), it->GetName(), |
| 4243 value, STRICT); |
| 4244 } |
4202 | 4245 |
4203 if (is_observed) { | 4246 // Reconfigure the data property if the attributes mismatch. |
4204 RETURN_ON_EXCEPTION( | 4247 if (is_observed) old_value = it->GetDataValue(); |
4205 it->isolate(), | |
4206 EnqueueChangeRecord(object, "reconfigure", it->GetName(), | |
4207 it->factory()->the_hole_value()), | |
4208 Object); | |
4209 } | |
4210 | 4248 |
4211 return value; | 4249 it->ReconfigureDataProperty(value, attributes); |
4212 } | 4250 it->WriteDataValue(value); |
4213 | 4251 |
4214 case LookupIterator::DATA: { | 4252 if (is_observed) { |
4215 PropertyDetails details = it->property_details(); | 4253 if (old_value->SameValue(*value)) { |
4216 Handle<Object> old_value = it->factory()->the_hole_value(); | 4254 old_value = it->factory()->the_hole_value(); |
4217 // Regular property update if the attributes match. | 4255 } |
4218 if (details.attributes() == attributes) { | 4256 RETURN_ON_EXCEPTION(it->isolate(), |
4219 return SetDataProperty(it, value); | 4257 EnqueueChangeRecord(object, "reconfigure", |
4220 } | 4258 it->GetName(), old_value), |
4221 | 4259 Object); |
4222 // Special case: properties of typed arrays cannot be reconfigured to | |
4223 // non-writable nor to non-enumerable. | |
4224 if (it->IsElement() && (object->HasExternalArrayElements() || | |
4225 object->HasFixedTypedArrayElements())) { | |
4226 return RedefineNonconfigurableProperty(it->isolate(), it->GetName(), | |
4227 value, STRICT); | |
4228 } | |
4229 | |
4230 // Reconfigure the data property if the attributes mismatch. | |
4231 if (is_observed) old_value = it->GetDataValue(); | |
4232 | |
4233 it->ReconfigureDataProperty(value, attributes); | |
4234 it->WriteDataValue(value); | |
4235 | |
4236 if (is_observed) { | |
4237 if (old_value->SameValue(*value)) { | |
4238 old_value = it->factory()->the_hole_value(); | |
4239 } | 4260 } |
4240 RETURN_ON_EXCEPTION(it->isolate(), | 4261 return value; |
4241 EnqueueChangeRecord(object, "reconfigure", | |
4242 it->GetName(), old_value), | |
4243 Object); | |
4244 } | 4262 } |
4245 } | 4263 } |
4246 } | 4264 } |
4247 | 4265 |
4248 return value; | 4266 return AddDataProperty(it, value, attributes, STRICT, |
| 4267 CERTAINLY_NOT_STORE_FROM_KEYED); |
4249 } | 4268 } |
4250 | 4269 |
4251 | 4270 |
4252 // Reconfigures a property to a data property with attributes, even if it is not | |
4253 // reconfigurable. | |
4254 MaybeHandle<Object> JSObject::SetOwnPropertyIgnoreAttributes( | 4271 MaybeHandle<Object> JSObject::SetOwnPropertyIgnoreAttributes( |
4255 Handle<JSObject> object, Handle<Name> name, Handle<Object> value, | 4272 Handle<JSObject> object, Handle<Name> name, Handle<Object> value, |
4256 PropertyAttributes attributes, ExecutableAccessorInfoHandling handling) { | 4273 PropertyAttributes attributes, ExecutableAccessorInfoHandling handling) { |
4257 DCHECK(!value->IsTheHole()); | 4274 DCHECK(!value->IsTheHole()); |
4258 LookupIterator it(object, name, LookupIterator::OWN_SKIP_INTERCEPTOR); | 4275 LookupIterator it(object, name, LookupIterator::OWN); |
4259 if (it.state() == LookupIterator::ACCESS_CHECK) { | 4276 return DefineOwnPropertyIgnoreAttributes(&it, value, attributes, handling); |
4260 if (!it.HasAccess()) { | |
4261 return SetPropertyWithFailedAccessCheck(&it, value, SLOPPY); | |
4262 } | |
4263 it.Next(); | |
4264 } | |
4265 | |
4266 if (it.IsFound()) { | |
4267 return ReconfigureAsDataProperty(&it, value, attributes, handling); | |
4268 } | |
4269 | |
4270 return AddDataProperty(&it, value, attributes, STRICT, | |
4271 CERTAINLY_NOT_STORE_FROM_KEYED); | |
4272 } | 4277 } |
4273 | 4278 |
4274 | 4279 |
4275 MaybeHandle<Object> JSObject::SetOwnElementIgnoreAttributes( | 4280 MaybeHandle<Object> JSObject::SetOwnElementIgnoreAttributes( |
4276 Handle<JSObject> object, uint32_t index, Handle<Object> value, | 4281 Handle<JSObject> object, uint32_t index, Handle<Object> value, |
4277 PropertyAttributes attributes, ExecutableAccessorInfoHandling handling) { | 4282 PropertyAttributes attributes, ExecutableAccessorInfoHandling handling) { |
4278 Isolate* isolate = object->GetIsolate(); | 4283 Isolate* isolate = object->GetIsolate(); |
4279 LookupIterator it(isolate, object, index, | 4284 LookupIterator it(isolate, object, index, LookupIterator::OWN); |
4280 LookupIterator::OWN_SKIP_INTERCEPTOR); | 4285 return DefineOwnPropertyIgnoreAttributes(&it, value, attributes, handling); |
4281 if (it.state() == LookupIterator::ACCESS_CHECK) { | |
4282 if (!it.HasAccess()) { | |
4283 return SetPropertyWithFailedAccessCheck(&it, value, STRICT); | |
4284 } | |
4285 it.Next(); | |
4286 } | |
4287 | |
4288 if (it.IsFound()) { | |
4289 return ReconfigureAsDataProperty(&it, value, attributes, handling); | |
4290 } | |
4291 | |
4292 return AddDataProperty(&it, value, attributes, STRICT, | |
4293 MAY_BE_STORE_FROM_KEYED); | |
4294 } | 4286 } |
4295 | 4287 |
4296 | 4288 |
| 4289 MaybeHandle<Object> JSObject::DefinePropertyOrElementIgnoreAttributes( |
| 4290 Handle<JSObject> object, Handle<Name> name, Handle<Object> value, |
| 4291 PropertyAttributes attributes, ExecutableAccessorInfoHandling handling) { |
| 4292 Isolate* isolate = object->GetIsolate(); |
| 4293 uint32_t index; |
| 4294 LookupIterator it = |
| 4295 name->AsArrayIndex(&index) |
| 4296 ? LookupIterator(isolate, object, index, LookupIterator::OWN) |
| 4297 : LookupIterator(object, name, LookupIterator::OWN); |
| 4298 return DefineOwnPropertyIgnoreAttributes(&it, value, attributes, handling); |
| 4299 } |
| 4300 |
| 4301 |
4297 Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithInterceptor( | 4302 Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithInterceptor( |
4298 LookupIterator* it) { | 4303 LookupIterator* it) { |
4299 Isolate* isolate = it->isolate(); | 4304 Isolate* isolate = it->isolate(); |
4300 // Make sure that the top context does not change when doing | 4305 // Make sure that the top context does not change when doing |
4301 // callbacks or interceptor calls. | 4306 // callbacks or interceptor calls. |
4302 AssertNoContextChange ncc(isolate); | 4307 AssertNoContextChange ncc(isolate); |
4303 HandleScope scope(isolate); | 4308 HandleScope scope(isolate); |
4304 | 4309 |
4305 Handle<JSObject> holder = it->GetHolder<JSObject>(); | 4310 Handle<JSObject> holder = it->GetHolder<JSObject>(); |
4306 Handle<InterceptorInfo> interceptor(it->GetInterceptor()); | 4311 Handle<InterceptorInfo> interceptor(it->GetInterceptor()); |
(...skipping 12330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16637 Handle<Object> new_value) { | 16642 Handle<Object> new_value) { |
16638 if (cell->value() != *new_value) { | 16643 if (cell->value() != *new_value) { |
16639 cell->set_value(*new_value); | 16644 cell->set_value(*new_value); |
16640 Isolate* isolate = cell->GetIsolate(); | 16645 Isolate* isolate = cell->GetIsolate(); |
16641 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 16646 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
16642 isolate, DependentCode::kPropertyCellChangedGroup); | 16647 isolate, DependentCode::kPropertyCellChangedGroup); |
16643 } | 16648 } |
16644 } | 16649 } |
16645 } // namespace internal | 16650 } // namespace internal |
16646 } // namespace v8 | 16651 } // namespace v8 |
OLD | NEW |