Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: src/objects.cc

Issue 1180073002: Introduce DefineOwnPropertyIgnoreAttributes and make it call SetPropertyWithInterceptor (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Revert HIDDEN to OWN Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698