Chromium Code Reviews| 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 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 129 MaybeHandle<Object> Object::GetProperty(LookupIterator* it) { | 129 MaybeHandle<Object> Object::GetProperty(LookupIterator* it) { |
| 130 for (; it->IsFound(); it->Next()) { | 130 for (; it->IsFound(); it->Next()) { |
| 131 switch (it->state()) { | 131 switch (it->state()) { |
| 132 case LookupIterator::NOT_FOUND: | 132 case LookupIterator::NOT_FOUND: |
| 133 case LookupIterator::TRANSITION: | 133 case LookupIterator::TRANSITION: |
| 134 UNREACHABLE(); | 134 UNREACHABLE(); |
| 135 case LookupIterator::JSPROXY: | 135 case LookupIterator::JSPROXY: |
| 136 return JSProxy::GetPropertyWithHandler(it->GetHolder<JSProxy>(), | 136 return JSProxy::GetPropertyWithHandler(it->GetHolder<JSProxy>(), |
| 137 it->GetReceiver(), it->name()); | 137 it->GetReceiver(), it->name()); |
| 138 case LookupIterator::INTERCEPTOR: { | 138 case LookupIterator::INTERCEPTOR: { |
| 139 MaybeHandle<Object> maybe_result = JSObject::GetPropertyWithInterceptor( | 139 MaybeHandle<Object> maybe_result = |
| 140 it->GetHolder<JSObject>(), it->GetReceiver(), it->name()); | 140 JSObject::GetPropertyWithInterceptor(it); |
| 141 if (!maybe_result.is_null()) return maybe_result; | 141 if (!maybe_result.is_null()) return maybe_result; |
| 142 if (it->isolate()->has_pending_exception()) return maybe_result; | 142 if (it->isolate()->has_pending_exception()) return maybe_result; |
| 143 break; | 143 break; |
| 144 } | 144 } |
| 145 case LookupIterator::ACCESS_CHECK: | 145 case LookupIterator::ACCESS_CHECK: |
| 146 if (it->HasAccess()) break; | 146 if (it->HasAccess()) break; |
| 147 return JSObject::GetPropertyWithFailedAccessCheck(it); | 147 return JSObject::GetPropertyWithFailedAccessCheck(it); |
| 148 case LookupIterator::ACCESSOR: | 148 case LookupIterator::ACCESSOR: |
| 149 return GetPropertyWithAccessor(it->GetReceiver(), it->name(), | 149 return GetPropertyWithAccessor(it); |
| 150 it->GetHolder<JSObject>(), | |
| 151 it->GetAccessors()); | |
| 152 case LookupIterator::INTEGER_INDEXED_EXOTIC: | 150 case LookupIterator::INTEGER_INDEXED_EXOTIC: |
| 153 return it->factory()->undefined_value(); | 151 return it->factory()->undefined_value(); |
| 154 case LookupIterator::DATA: | 152 case LookupIterator::DATA: |
| 155 return it->GetDataValue(); | 153 return it->GetDataValue(); |
| 156 } | 154 } |
| 157 } | 155 } |
| 158 return it->factory()->undefined_value(); | 156 return it->factory()->undefined_value(); |
| 159 } | 157 } |
| 160 | 158 |
| 161 | 159 |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 296 | 294 |
| 297 // TODO(rossberg): adjust once there is a story for symbols vs proxies. | 295 // TODO(rossberg): adjust once there is a story for symbols vs proxies. |
| 298 if (name->IsSymbol()) return isolate->factory()->undefined_value(); | 296 if (name->IsSymbol()) return isolate->factory()->undefined_value(); |
| 299 | 297 |
| 300 Handle<Object> args[] = { receiver, name }; | 298 Handle<Object> args[] = { receiver, name }; |
| 301 return CallTrap( | 299 return CallTrap( |
| 302 proxy, "get", isolate->derived_get_trap(), arraysize(args), args); | 300 proxy, "get", isolate->derived_get_trap(), arraysize(args), args); |
| 303 } | 301 } |
| 304 | 302 |
| 305 | 303 |
| 306 MaybeHandle<Object> Object::GetPropertyWithAccessor(Handle<Object> receiver, | 304 MaybeHandle<Object> Object::GetPropertyWithAccessor(LookupIterator* it) { |
| 307 Handle<Name> name, | 305 Handle<Object> structure = it->GetAccessors(); |
| 308 Handle<JSObject> holder, | 306 Handle<Object> receiver = it->GetReceiver(); |
| 309 Handle<Object> structure) { | 307 |
| 310 Isolate* isolate = name->GetIsolate(); | |
| 311 DCHECK(!structure->IsForeign()); | 308 DCHECK(!structure->IsForeign()); |
| 312 // api style callbacks. | 309 // api style callbacks. |
| 313 if (structure->IsAccessorInfo()) { | 310 if (structure->IsAccessorInfo()) { |
| 311 Handle<JSObject> holder = it->GetHolder<JSObject>(); | |
| 312 Handle<Name> name = it->name(); | |
| 314 Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(structure); | 313 Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(structure); |
| 315 if (!info->IsCompatibleReceiver(*receiver)) { | 314 if (!info->IsCompatibleReceiver(*receiver)) { |
| 316 THROW_NEW_ERROR(isolate, | 315 THROW_NEW_ERROR(it->isolate(), |
|
Jakob Kummerow
2015/05/20 09:06:50
nit: consider "Isolate* isolate = it->isolate();"
| |
| 317 NewTypeError(MessageTemplate::kIncompatibleMethodReceiver, | 316 NewTypeError(MessageTemplate::kIncompatibleMethodReceiver, |
| 318 name, receiver), | 317 name, receiver), |
| 319 Object); | 318 Object); |
| 320 } | 319 } |
| 321 | 320 |
| 322 Handle<ExecutableAccessorInfo> data = | 321 Handle<ExecutableAccessorInfo> data = |
| 323 Handle<ExecutableAccessorInfo>::cast(structure); | 322 Handle<ExecutableAccessorInfo>::cast(structure); |
| 324 v8::AccessorNameGetterCallback call_fun = | 323 v8::AccessorNameGetterCallback call_fun = |
| 325 v8::ToCData<v8::AccessorNameGetterCallback>(data->getter()); | 324 v8::ToCData<v8::AccessorNameGetterCallback>(data->getter()); |
| 326 if (call_fun == NULL) return isolate->factory()->undefined_value(); | 325 if (call_fun == NULL) return it->isolate()->factory()->undefined_value(); |
| 327 | 326 |
| 328 LOG(isolate, ApiNamedPropertyAccess("load", *holder, *name)); | 327 LOG(it->isolate(), ApiNamedPropertyAccess("load", *holder, *name)); |
| 329 PropertyCallbackArguments args(isolate, data->data(), *receiver, *holder); | 328 PropertyCallbackArguments args(it->isolate(), data->data(), *receiver, |
| 329 *holder); | |
| 330 v8::Handle<v8::Value> result = | 330 v8::Handle<v8::Value> result = |
| 331 args.Call(call_fun, v8::Utils::ToLocal(name)); | 331 args.Call(call_fun, v8::Utils::ToLocal(name)); |
| 332 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); | 332 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object); |
| 333 if (result.IsEmpty()) { | 333 if (result.IsEmpty()) { |
| 334 return isolate->factory()->undefined_value(); | 334 return it->isolate()->factory()->undefined_value(); |
| 335 } | 335 } |
| 336 Handle<Object> return_value = v8::Utils::OpenHandle(*result); | 336 Handle<Object> return_value = v8::Utils::OpenHandle(*result); |
| 337 return_value->VerifyApiCallResultType(); | 337 return_value->VerifyApiCallResultType(); |
| 338 // Rebox handle before return. | 338 // Rebox handle before return. |
| 339 return handle(*return_value, isolate); | 339 return handle(*return_value, it->isolate()); |
| 340 } | 340 } |
| 341 | 341 |
| 342 // __defineGetter__ callback | 342 // __defineGetter__ callback |
| 343 Handle<Object> getter(Handle<AccessorPair>::cast(structure)->getter(), | 343 Handle<Object> getter(Handle<AccessorPair>::cast(structure)->getter(), |
| 344 isolate); | 344 it->isolate()); |
| 345 if (getter->IsSpecFunction()) { | 345 if (getter->IsSpecFunction()) { |
| 346 // TODO(rossberg): nicer would be to cast to some JSCallable here... | 346 // TODO(rossberg): nicer would be to cast to some JSCallable here... |
| 347 return Object::GetPropertyWithDefinedGetter( | 347 return Object::GetPropertyWithDefinedGetter( |
| 348 receiver, Handle<JSReceiver>::cast(getter)); | 348 receiver, Handle<JSReceiver>::cast(getter)); |
| 349 } | 349 } |
| 350 // Getter is not a function. | 350 // Getter is not a function. |
| 351 return isolate->factory()->undefined_value(); | 351 return it->isolate()->factory()->undefined_value(); |
| 352 } | 352 } |
| 353 | 353 |
| 354 | 354 |
| 355 bool AccessorInfo::IsCompatibleReceiverMap(Isolate* isolate, | 355 bool AccessorInfo::IsCompatibleReceiverMap(Isolate* isolate, |
| 356 Handle<AccessorInfo> info, | 356 Handle<AccessorInfo> info, |
| 357 Handle<Map> map) { | 357 Handle<Map> map) { |
| 358 if (!info->HasExpectedReceiverType()) return true; | 358 if (!info->HasExpectedReceiverType()) return true; |
| 359 if (!map->IsJSObjectMap()) return false; | 359 if (!map->IsJSObjectMap()) return false; |
| 360 return FunctionTemplateInfo::cast(info->expected_receiver_type()) | 360 return FunctionTemplateInfo::cast(info->expected_receiver_type()) |
| 361 ->IsTemplateFor(*map); | 361 ->IsTemplateFor(*map); |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 484 } | 484 } |
| 485 return false; | 485 return false; |
| 486 } | 486 } |
| 487 | 487 |
| 488 | 488 |
| 489 MaybeHandle<Object> JSObject::GetPropertyWithFailedAccessCheck( | 489 MaybeHandle<Object> JSObject::GetPropertyWithFailedAccessCheck( |
| 490 LookupIterator* it) { | 490 LookupIterator* it) { |
| 491 Handle<JSObject> checked = it->GetHolder<JSObject>(); | 491 Handle<JSObject> checked = it->GetHolder<JSObject>(); |
| 492 while (FindAllCanReadHolder(it)) { | 492 while (FindAllCanReadHolder(it)) { |
| 493 if (it->state() == LookupIterator::ACCESSOR) { | 493 if (it->state() == LookupIterator::ACCESSOR) { |
| 494 return GetPropertyWithAccessor(it->GetReceiver(), it->name(), | 494 return GetPropertyWithAccessor(it); |
| 495 it->GetHolder<JSObject>(), | |
| 496 it->GetAccessors()); | |
| 497 } | 495 } |
| 498 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state()); | 496 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state()); |
| 499 auto receiver = Handle<JSObject>::cast(it->GetReceiver()); | 497 auto result = GetPropertyWithInterceptor(it); |
| 500 auto result = GetPropertyWithInterceptor(it->GetHolder<JSObject>(), | |
| 501 receiver, it->name()); | |
| 502 if (it->isolate()->has_scheduled_exception()) break; | 498 if (it->isolate()->has_scheduled_exception()) break; |
| 503 if (!result.is_null()) return result; | 499 if (!result.is_null()) return result; |
| 504 } | 500 } |
| 505 it->isolate()->ReportFailedAccessCheck(checked); | 501 it->isolate()->ReportFailedAccessCheck(checked); |
| 506 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object); | 502 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object); |
| 507 return it->factory()->undefined_value(); | 503 return it->factory()->undefined_value(); |
| 508 } | 504 } |
| 509 | 505 |
| 510 | 506 |
| 511 Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithFailedAccessCheck( | 507 Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithFailedAccessCheck( |
| (...skipping 12241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 12753 DCHECK(!structure->IsForeign()); | 12749 DCHECK(!structure->IsForeign()); |
| 12754 // api style callbacks. | 12750 // api style callbacks. |
| 12755 if (structure->IsExecutableAccessorInfo()) { | 12751 if (structure->IsExecutableAccessorInfo()) { |
| 12756 Handle<ExecutableAccessorInfo> data = | 12752 Handle<ExecutableAccessorInfo> data = |
| 12757 Handle<ExecutableAccessorInfo>::cast(structure); | 12753 Handle<ExecutableAccessorInfo>::cast(structure); |
| 12758 Object* fun_obj = data->getter(); | 12754 Object* fun_obj = data->getter(); |
| 12759 v8::AccessorNameGetterCallback call_fun = | 12755 v8::AccessorNameGetterCallback call_fun = |
| 12760 v8::ToCData<v8::AccessorNameGetterCallback>(fun_obj); | 12756 v8::ToCData<v8::AccessorNameGetterCallback>(fun_obj); |
| 12761 if (call_fun == NULL) return isolate->factory()->undefined_value(); | 12757 if (call_fun == NULL) return isolate->factory()->undefined_value(); |
| 12762 Handle<JSObject> holder_handle = Handle<JSObject>::cast(holder); | 12758 Handle<JSObject> holder_handle = Handle<JSObject>::cast(holder); |
| 12763 Handle<Object> number = isolate->factory()->NewNumberFromUint(index); | 12759 Handle<String> key = isolate->factory()->Uint32ToString(index); |
| 12764 Handle<String> key = isolate->factory()->NumberToString(number); | |
| 12765 LOG(isolate, ApiNamedPropertyAccess("load", *holder_handle, *key)); | 12760 LOG(isolate, ApiNamedPropertyAccess("load", *holder_handle, *key)); |
| 12766 PropertyCallbackArguments | 12761 PropertyCallbackArguments |
| 12767 args(isolate, data->data(), *receiver, *holder_handle); | 12762 args(isolate, data->data(), *receiver, *holder_handle); |
| 12768 v8::Handle<v8::Value> result = args.Call(call_fun, v8::Utils::ToLocal(key)); | 12763 v8::Handle<v8::Value> result = args.Call(call_fun, v8::Utils::ToLocal(key)); |
| 12769 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); | 12764 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
| 12770 if (result.IsEmpty()) return isolate->factory()->undefined_value(); | 12765 if (result.IsEmpty()) return isolate->factory()->undefined_value(); |
| 12771 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); | 12766 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); |
| 12772 result_internal->VerifyApiCallResultType(); | 12767 result_internal->VerifyApiCallResultType(); |
| 12773 // Rebox handle before return. | 12768 // Rebox handle before return. |
| 12774 return handle(*result_internal, isolate); | 12769 return handle(*result_internal, isolate); |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 12802 DCHECK(!value->IsTheHole()); | 12797 DCHECK(!value->IsTheHole()); |
| 12803 DCHECK(!structure->IsForeign()); | 12798 DCHECK(!structure->IsForeign()); |
| 12804 if (structure->IsExecutableAccessorInfo()) { | 12799 if (structure->IsExecutableAccessorInfo()) { |
| 12805 // api style callbacks | 12800 // api style callbacks |
| 12806 Handle<ExecutableAccessorInfo> data = | 12801 Handle<ExecutableAccessorInfo> data = |
| 12807 Handle<ExecutableAccessorInfo>::cast(structure); | 12802 Handle<ExecutableAccessorInfo>::cast(structure); |
| 12808 Object* call_obj = data->setter(); | 12803 Object* call_obj = data->setter(); |
| 12809 v8::AccessorNameSetterCallback call_fun = | 12804 v8::AccessorNameSetterCallback call_fun = |
| 12810 v8::ToCData<v8::AccessorNameSetterCallback>(call_obj); | 12805 v8::ToCData<v8::AccessorNameSetterCallback>(call_obj); |
| 12811 if (call_fun == NULL) return value; | 12806 if (call_fun == NULL) return value; |
| 12812 Handle<Object> number = isolate->factory()->NewNumberFromUint(index); | 12807 Handle<String> key(isolate->factory()->Uint32ToString(index)); |
| 12813 Handle<String> key(isolate->factory()->NumberToString(number)); | |
| 12814 LOG(isolate, ApiNamedPropertyAccess("store", *holder, *key)); | 12808 LOG(isolate, ApiNamedPropertyAccess("store", *holder, *key)); |
| 12815 PropertyCallbackArguments | 12809 PropertyCallbackArguments |
| 12816 args(isolate, data->data(), *object, *holder); | 12810 args(isolate, data->data(), *object, *holder); |
| 12817 args.Call(call_fun, | 12811 args.Call(call_fun, |
| 12818 v8::Utils::ToLocal(key), | 12812 v8::Utils::ToLocal(key), |
| 12819 v8::Utils::ToLocal(value)); | 12813 v8::Utils::ToLocal(value)); |
| 12820 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); | 12814 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
| 12821 return value; | 12815 return value; |
| 12822 } | 12816 } |
| 12823 | 12817 |
| (...skipping 1195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 14019 InterceptorInfo* JSObject::GetIndexedInterceptor() { | 14013 InterceptorInfo* JSObject::GetIndexedInterceptor() { |
| 14020 DCHECK(map()->has_indexed_interceptor()); | 14014 DCHECK(map()->has_indexed_interceptor()); |
| 14021 JSFunction* constructor = JSFunction::cast(map()->GetConstructor()); | 14015 JSFunction* constructor = JSFunction::cast(map()->GetConstructor()); |
| 14022 DCHECK(constructor->shared()->IsApiFunction()); | 14016 DCHECK(constructor->shared()->IsApiFunction()); |
| 14023 Object* result = | 14017 Object* result = |
| 14024 constructor->shared()->get_api_func_data()->indexed_property_handler(); | 14018 constructor->shared()->get_api_func_data()->indexed_property_handler(); |
| 14025 return InterceptorInfo::cast(result); | 14019 return InterceptorInfo::cast(result); |
| 14026 } | 14020 } |
| 14027 | 14021 |
| 14028 | 14022 |
| 14029 MaybeHandle<Object> JSObject::GetPropertyWithInterceptor( | 14023 MaybeHandle<Object> JSObject::GetPropertyWithInterceptor(LookupIterator* it) { |
| 14030 Handle<JSObject> holder, | 14024 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state()); |
| 14031 Handle<Object> receiver, | 14025 Handle<InterceptorInfo> interceptor = it->GetInterceptor(); |
| 14032 Handle<Name> name) { | 14026 if (interceptor->getter()->IsUndefined()) return MaybeHandle<Object>(); |
| 14033 Isolate* isolate = holder->GetIsolate(); | |
| 14034 | 14027 |
| 14035 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor(), isolate); | 14028 Handle<Name> name = it->name(); |
| 14036 if (interceptor->getter()->IsUndefined()) return MaybeHandle<Object>(); | 14029 Handle<JSObject> holder = it->GetHolder<JSObject>(); |
| 14037 | 14030 |
| 14038 if (name->IsSymbol() && !interceptor->can_intercept_symbols()) { | 14031 if (name->IsSymbol() && !interceptor->can_intercept_symbols()) { |
| 14039 return MaybeHandle<Object>(); | 14032 return MaybeHandle<Object>(); |
| 14040 } | 14033 } |
| 14041 | 14034 |
| 14042 v8::GenericNamedPropertyGetterCallback getter = | 14035 v8::GenericNamedPropertyGetterCallback getter = |
| 14043 v8::ToCData<v8::GenericNamedPropertyGetterCallback>( | 14036 v8::ToCData<v8::GenericNamedPropertyGetterCallback>( |
| 14044 interceptor->getter()); | 14037 interceptor->getter()); |
| 14045 LOG(isolate, | 14038 LOG(it->isolate(), |
| 14046 ApiNamedPropertyAccess("interceptor-named-get", *holder, *name)); | 14039 ApiNamedPropertyAccess("interceptor-named-get", *holder, *name)); |
| 14047 PropertyCallbackArguments | 14040 PropertyCallbackArguments args(it->isolate(), interceptor->data(), |
| 14048 args(isolate, interceptor->data(), *receiver, *holder); | 14041 *it->GetReceiver(), *holder); |
| 14049 v8::Handle<v8::Value> result = args.Call(getter, v8::Utils::ToLocal(name)); | 14042 v8::Handle<v8::Value> result = args.Call(getter, v8::Utils::ToLocal(name)); |
| 14050 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); | 14043 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object); |
| 14051 if (result.IsEmpty()) return MaybeHandle<Object>(); | 14044 if (result.IsEmpty()) return MaybeHandle<Object>(); |
| 14052 | 14045 |
| 14053 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); | 14046 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); |
| 14054 result_internal->VerifyApiCallResultType(); | 14047 result_internal->VerifyApiCallResultType(); |
| 14055 // Rebox handle before return | 14048 // Rebox handle before return |
| 14056 return handle(*result_internal, isolate); | 14049 return handle(*result_internal, it->isolate()); |
| 14057 } | 14050 } |
| 14058 | 14051 |
| 14059 | 14052 |
| 14060 // Compute the property keys from the interceptor. | 14053 // Compute the property keys from the interceptor. |
| 14061 MaybeHandle<JSObject> JSObject::GetKeysForNamedInterceptor( | 14054 MaybeHandle<JSObject> JSObject::GetKeysForNamedInterceptor( |
| 14062 Handle<JSObject> object, Handle<JSReceiver> receiver) { | 14055 Handle<JSObject> object, Handle<JSReceiver> receiver) { |
| 14063 Isolate* isolate = receiver->GetIsolate(); | 14056 Isolate* isolate = receiver->GetIsolate(); |
| 14064 Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor()); | 14057 Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor()); |
| 14065 PropertyCallbackArguments | 14058 PropertyCallbackArguments |
| 14066 args(isolate, interceptor->data(), *receiver, *object); | 14059 args(isolate, interceptor->data(), *receiver, *object); |
| (...skipping 3183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 17250 void PropertyCell::SetValueWithInvalidation(Handle<PropertyCell> cell, | 17243 void PropertyCell::SetValueWithInvalidation(Handle<PropertyCell> cell, |
| 17251 Handle<Object> new_value) { | 17244 Handle<Object> new_value) { |
| 17252 if (cell->value() != *new_value) { | 17245 if (cell->value() != *new_value) { |
| 17253 cell->set_value(*new_value); | 17246 cell->set_value(*new_value); |
| 17254 Isolate* isolate = cell->GetIsolate(); | 17247 Isolate* isolate = cell->GetIsolate(); |
| 17255 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 17248 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
| 17256 isolate, DependentCode::kPropertyCellChangedGroup); | 17249 isolate, DependentCode::kPropertyCellChangedGroup); |
| 17257 } | 17250 } |
| 17258 } | 17251 } |
| 17259 } } // namespace v8::internal | 17252 } } // namespace v8::internal |
| OLD | NEW |