diff options
author | Michaël Zasso <targos@protonmail.com> | 2018-03-07 08:54:53 +0100 |
---|---|---|
committer | Michaël Zasso <targos@protonmail.com> | 2018-03-07 16:48:52 +0100 |
commit | 88786fecff336342a56e6f2e7ff3b286be716e47 (patch) | |
tree | 92e6ba5b8ac8dae1a058988d20c9d27bfa654390 /deps/v8/src/ic/ic.cc | |
parent | 4e86f9b5ab83cbabf43839385bf383e6a7ef7d19 (diff) | |
download | node-new-88786fecff336342a56e6f2e7ff3b286be716e47.tar.gz |
deps: update V8 to 6.5.254.31
PR-URL: https://github.com/nodejs/node/pull/18453
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Yang Guo <yangguo@chromium.org>
Reviewed-By: Ali Ijaz Sheikh <ofrobots@google.com>
Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com>
Diffstat (limited to 'deps/v8/src/ic/ic.cc')
-rw-r--r-- | deps/v8/src/ic/ic.cc | 209 |
1 files changed, 128 insertions, 81 deletions
diff --git a/deps/v8/src/ic/ic.cc b/deps/v8/src/ic/ic.cc index 7e3e6556a1..62a2e7cf59 100644 --- a/deps/v8/src/ic/ic.cc +++ b/deps/v8/src/ic/ic.cc @@ -255,7 +255,7 @@ bool IC::ShouldRecomputeHandler(Handle<String> name) { // This is a contextual access, always just update the handler and stay // monomorphic. - if (IsLoadGlobalIC()) return true; + if (IsGlobalIC()) return true; // The current map wasn't handled yet. There's no reason to stay monomorphic, // *unless* we're moving from a deprecated map to its replacement, or @@ -395,6 +395,11 @@ void IC::ConfigureVectorState(Handle<Name> name, Handle<Map> map, if (IsLoadGlobalIC()) { LoadGlobalICNexus* nexus = casted_nexus<LoadGlobalICNexus>(); nexus->ConfigureHandlerMode(handler); + + } else if (IsStoreGlobalIC()) { + StoreGlobalICNexus* nexus = casted_nexus<StoreGlobalICNexus>(); + nexus->ConfigureHandlerMode(handler); + } else { // Non-keyed ICs don't track the name explicitly. if (!is_keyed()) name = Handle<Name>::null(); @@ -408,7 +413,7 @@ void IC::ConfigureVectorState(Handle<Name> name, Handle<Map> map, void IC::ConfigureVectorState(Handle<Name> name, MapHandles const& maps, ObjectHandles* handlers) { - DCHECK(!IsLoadGlobalIC()); + DCHECK(!IsGlobalIC()); // Non-keyed ICs don't track the name explicitly. if (!is_keyed()) name = Handle<Name>::null(); nexus()->ConfigurePolymorphic(name, maps, handlers); @@ -486,10 +491,16 @@ MaybeHandle<Object> LoadGlobalIC::Load(Handle<Name> name) { return ReferenceError(name); } - if (FLAG_use_ic && LoadScriptContextFieldStub::Accepted(&lookup_result)) { - TRACE_HANDLER_STATS(isolate(), LoadIC_LoadScriptContextFieldStub); - LoadScriptContextFieldStub stub(isolate(), &lookup_result); - PatchCache(name, stub.GetCode()); + if (FLAG_use_ic) { + LoadGlobalICNexus* nexus = casted_nexus<LoadGlobalICNexus>(); + if (nexus->ConfigureLexicalVarMode(lookup_result.context_index, + lookup_result.slot_index)) { + TRACE_HANDLER_STATS(isolate(), LoadGlobalIC_LoadScriptContextField); + } else { + // Given combination of indices can't be encoded, so use slow stub. + TRACE_HANDLER_STATS(isolate(), LoadGlobalIC_SlowStub); + PatchCache(name, slow_stub()); + } TRACE_IC("LoadGlobalIC", name); } return result; @@ -623,7 +634,7 @@ void IC::PatchCache(Handle<Name> name, Handle<Object> handler) { break; case RECOMPUTE_HANDLER: case MONOMORPHIC: - if (IsLoadGlobalIC()) { + if (IsGlobalIC()) { UpdateMonomorphicIC(handler, name); break; } @@ -664,7 +675,7 @@ void LoadIC::UpdateCaches(LookupIterator* lookup) { Handle<Smi> smi_handler = LoadHandler::LoadNonExistent(isolate()); code = LoadHandler::LoadFullChain(isolate(), receiver_map(), isolate()->factory()->null_value(), - lookup->name(), smi_handler); + smi_handler); } else { if (IsLoadGlobalIC()) { if (lookup->TryLookupCachedProperty()) { @@ -754,7 +765,7 @@ Handle<Object> LoadIC::ComputeHandler(LookupIterator* lookup) { } TRACE_HANDLER_STATS(isolate(), LoadIC_LoadNonMaskingInterceptorDH); return LoadHandler::LoadFullChain(isolate(), map, holder_ref, - lookup->name(), smi_handler); + smi_handler); } if (receiver_is_holder) { @@ -765,7 +776,7 @@ Handle<Object> LoadIC::ComputeHandler(LookupIterator* lookup) { TRACE_HANDLER_STATS(isolate(), LoadIC_LoadInterceptorFromPrototypeDH); return LoadHandler::LoadFromPrototype(isolate(), map, holder, - lookup->name(), smi_handler); + smi_handler); } case LookupIterator::ACCESSOR: { @@ -831,12 +842,10 @@ Handle<Object> LoadIC::ComputeHandler(LookupIterator* lookup) { isolate()->factory()->NewWeakCell(context); Handle<WeakCell> data_cell = isolate()->factory()->NewWeakCell( call_optimization.api_call_info()); - Handle<Tuple2> data = - isolate()->factory()->NewTuple2(context_cell, data_cell, TENURED); TRACE_HANDLER_STATS(isolate(), LoadIC_LoadApiGetterFromPrototypeDH); return LoadHandler::LoadFromPrototype( - isolate(), map, holder, lookup->name(), smi_handler, data); + isolate(), map, holder, smi_handler, data_cell, context_cell); } if (holder->HasFastProperties()) { @@ -851,8 +860,8 @@ Handle<Object> LoadIC::ComputeHandler(LookupIterator* lookup) { smi_handler = LoadHandler::LoadGlobal(isolate()); Handle<WeakCell> cell = isolate()->factory()->NewWeakCell(lookup->GetPropertyCell()); - return LoadHandler::LoadFromPrototype( - isolate(), map, holder, lookup->name(), smi_handler, cell); + return LoadHandler::LoadFromPrototype(isolate(), map, holder, + smi_handler, cell); } else { smi_handler = LoadHandler::LoadNormal(isolate()); @@ -862,7 +871,7 @@ Handle<Object> LoadIC::ComputeHandler(LookupIterator* lookup) { } return LoadHandler::LoadFromPrototype(isolate(), map, holder, - lookup->name(), smi_handler); + smi_handler); } Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(accessors); @@ -882,7 +891,7 @@ Handle<Object> LoadIC::ComputeHandler(LookupIterator* lookup) { TRACE_HANDLER_STATS(isolate(), LoadIC_LoadNativeDataPropertyFromPrototypeDH); return LoadHandler::LoadFromPrototype(isolate(), map, holder, - lookup->name(), smi_handler); + smi_handler); } case LookupIterator::DATA: { @@ -896,8 +905,8 @@ Handle<Object> LoadIC::ComputeHandler(LookupIterator* lookup) { smi_handler = LoadHandler::LoadGlobal(isolate()); Handle<WeakCell> cell = isolate()->factory()->NewWeakCell(lookup->GetPropertyCell()); - return LoadHandler::LoadFromPrototype( - isolate(), map, holder, lookup->name(), smi_handler, cell); + return LoadHandler::LoadFromPrototype(isolate(), map, holder, + smi_handler, cell); } smi_handler = LoadHandler::LoadNormal(isolate()); @@ -920,7 +929,7 @@ Handle<Object> LoadIC::ComputeHandler(LookupIterator* lookup) { TRACE_HANDLER_STATS(isolate(), LoadIC_LoadConstantFromPrototypeDH); } return LoadHandler::LoadFromPrototype(isolate(), map, holder, - lookup->name(), smi_handler); + smi_handler); } case LookupIterator::INTEGER_INDEXED_EXOTIC: TRACE_HANDLER_STATS(isolate(), LoadIC_LoadIntegerIndexedExoticDH); @@ -933,7 +942,7 @@ Handle<Object> LoadIC::ComputeHandler(LookupIterator* lookup) { return smi_handler; } return LoadHandler::LoadFromPrototype(isolate(), map, holder_proxy, - lookup->name(), smi_handler); + smi_handler); } case LookupIterator::ACCESS_CHECK: case LookupIterator::NOT_FOUND: @@ -957,8 +966,6 @@ static Handle<Object> TryConvertKey(Handle<Object> key, Isolate* isolate) { key = handle(Smi::FromInt(int_value), isolate); } } - } else if (key->IsUndefined(isolate)) { - key = isolate->factory()->undefined_string(); } else if (key->IsString()) { key = isolate->factory()->InternalizeString(Handle<String>::cast(key)); } @@ -1287,15 +1294,13 @@ bool StoreIC::LookupForWrite(LookupIterator* it, Handle<Object> value, return it->IsCacheableTransition(); } -MaybeHandle<Object> StoreGlobalIC::Store(Handle<Object> object, - Handle<Name> name, +MaybeHandle<Object> StoreGlobalIC::Store(Handle<Name> name, Handle<Object> value) { - DCHECK(object->IsJSGlobalObject()); DCHECK(name->IsString()); // Look up in script context table. Handle<String> str_name = Handle<String>::cast(name); - Handle<JSGlobalObject> global = Handle<JSGlobalObject>::cast(object); + Handle<JSGlobalObject> global = isolate()->global_object(); Handle<ScriptContextTable> script_contexts( global->native_context()->script_context_table()); @@ -1304,7 +1309,7 @@ MaybeHandle<Object> StoreGlobalIC::Store(Handle<Object> object, Handle<Context> script_context = ScriptContextTable::GetContext( script_contexts, lookup_result.context_index); if (lookup_result.mode == CONST) { - return TypeError(MessageTemplate::kConstAssign, object, name); + return TypeError(MessageTemplate::kConstAssign, global, name); } Handle<Object> previous_value = @@ -1316,17 +1321,24 @@ MaybeHandle<Object> StoreGlobalIC::Store(Handle<Object> object, return ReferenceError(name); } - if (FLAG_use_ic && StoreScriptContextFieldStub::Accepted(&lookup_result)) { - TRACE_HANDLER_STATS(isolate(), StoreIC_StoreScriptContextFieldStub); - StoreScriptContextFieldStub stub(isolate(), &lookup_result); - PatchCache(name, stub.GetCode()); + if (FLAG_use_ic) { + StoreGlobalICNexus* nexus = casted_nexus<StoreGlobalICNexus>(); + if (nexus->ConfigureLexicalVarMode(lookup_result.context_index, + lookup_result.slot_index)) { + TRACE_HANDLER_STATS(isolate(), StoreGlobalIC_StoreScriptContextField); + } else { + // Given combination of indices can't be encoded, so use slow stub. + TRACE_HANDLER_STATS(isolate(), StoreGlobalIC_SlowStub); + PatchCache(name, slow_stub()); + } + TRACE_IC("StoreGlobalIC", name); } script_context->set(lookup_result.slot_index, *value); return value; } - return StoreIC::Store(object, name, value); + return StoreIC::Store(global, name, value); } MaybeHandle<Object> StoreIC::Store(Handle<Object> object, Handle<Name> name, @@ -1381,7 +1393,7 @@ MaybeHandle<Object> StoreIC::Store(Handle<Object> object, Handle<Name> name, void StoreIC::UpdateCaches(LookupIterator* lookup, Handle<Object> value, JSReceiver::StoreFromKeyed store_mode, MaybeHandle<Object> cached_handler) { - if (state() == UNINITIALIZED) { + if (state() == UNINITIALIZED && !IsStoreGlobalIC()) { // This is the first time we execute this inline cache. Set the target to // the pre monomorphic stub to delay setting the monomorphic state. TRACE_HANDLER_STATS(isolate(), StoreIC_Premonomorphic); @@ -1394,6 +1406,17 @@ void StoreIC::UpdateCaches(LookupIterator* lookup, Handle<Object> value, if (!cached_handler.is_null()) { handler = cached_handler.ToHandleChecked(); } else if (LookupForWrite(lookup, value, store_mode)) { + if (IsStoreGlobalIC()) { + if (lookup->state() == LookupIterator::DATA && + lookup->GetReceiver().is_identical_to(lookup->GetHolder<Object>())) { + DCHECK(lookup->GetReceiver()->IsJSGlobalObject()); + // Now update the cell in the feedback vector. + StoreGlobalICNexus* nexus = casted_nexus<StoreGlobalICNexus>(); + nexus->ConfigurePropertyCellMode(lookup->GetPropertyCell()); + TRACE_IC("StoreGlobalIC", lookup->name()); + return; + } + } if (created_new_transition_) { // The first time a transition is performed, there's a good chance that // it won't be taken again, so don't bother creating a handler. @@ -1432,8 +1455,7 @@ Handle<Object> StoreIC::ComputeHandler(LookupIterator* lookup) { Handle<WeakCell> cell = isolate()->factory()->NewWeakCell(lookup->transition_cell()); Handle<Object> handler = StoreHandler::StoreThroughPrototype( - isolate(), receiver_map(), store_target, lookup->name(), - smi_handler, cell); + isolate(), receiver_map(), store_target, smi_handler, cell); return handler; } // Currently not handled by CompileStoreTransition. @@ -1457,7 +1479,7 @@ Handle<Object> StoreIC::ComputeHandler(LookupIterator* lookup) { Handle<WeakCell> cell = Map::WeakCellForMap(transition); Handle<Object> handler = StoreHandler::StoreThroughPrototype( - isolate(), receiver_map(), holder, lookup->name(), smi_handler, cell); + isolate(), receiver_map(), holder, smi_handler, cell); TransitionsAccessor(receiver_map()) .UpdateHandler(*lookup->name(), *handler); return handler; @@ -1511,8 +1533,8 @@ Handle<Object> StoreIC::ComputeHandler(LookupIterator* lookup) { if (receiver.is_identical_to(holder)) return smi_handler; TRACE_HANDLER_STATS(isolate(), StoreIC_StoreNativeDataPropertyOnPrototypeDH); - return StoreHandler::StoreThroughPrototype( - isolate(), receiver_map(), holder, lookup->name(), smi_handler); + return StoreHandler::StoreThroughPrototype(isolate(), receiver_map(), + holder, smi_handler); } else if (accessors->IsAccessorPair()) { Handle<Object> setter(Handle<AccessorPair>::cast(accessors)->setter(), @@ -1539,12 +1561,10 @@ Handle<Object> StoreIC::ComputeHandler(LookupIterator* lookup) { isolate()->factory()->NewWeakCell(context); Handle<WeakCell> data_cell = isolate()->factory()->NewWeakCell( call_optimization.api_call_info()); - Handle<Tuple2> data = isolate()->factory()->NewTuple2( - context_cell, data_cell, TENURED); TRACE_HANDLER_STATS(isolate(), StoreIC_StoreApiSetterOnPrototypeDH); return StoreHandler::StoreThroughPrototype( - isolate(), receiver_map(), holder, lookup->name(), smi_handler, - data); + isolate(), receiver_map(), holder, smi_handler, data_cell, + context_cell); } TRACE_GENERIC_IC("incompatible receiver"); TRACE_HANDLER_STATS(isolate(), StoreIC_SlowStub); @@ -1562,8 +1582,8 @@ Handle<Object> StoreIC::ComputeHandler(LookupIterator* lookup) { if (receiver.is_identical_to(holder)) return smi_handler; TRACE_HANDLER_STATS(isolate(), StoreIC_StoreAccessorOnPrototypeDH); - return StoreHandler::StoreThroughPrototype( - isolate(), receiver_map(), holder, lookup->name(), smi_handler); + return StoreHandler::StoreThroughPrototype(isolate(), receiver_map(), + holder, smi_handler); } TRACE_HANDLER_STATS(isolate(), StoreIC_SlowStub); return slow_stub(); @@ -1614,7 +1634,7 @@ Handle<Object> StoreIC::ComputeHandler(LookupIterator* lookup) { Handle<JSReceiver>::cast(lookup->GetReceiver()); Handle<JSProxy> holder = lookup->GetHolder<JSProxy>(); return StoreHandler::StoreProxy(isolate(), receiver_map(), holder, - receiver, lookup->name()); + receiver); } case LookupIterator::INTEGER_INDEXED_EXOTIC: @@ -1788,6 +1808,7 @@ Handle<Object> KeyedStoreIC::StoreElementHandler( return StoreHandler::StoreProxy(isolate()); } + // TODO(ishell): move to StoreHandler::StoreElement(). ElementsKind elements_kind = receiver_map->elements_kind(); bool is_jsarray = receiver_map->instance_type() == JS_ARRAY_TYPE; Handle<Code> stub; @@ -1809,7 +1830,10 @@ Handle<Object> KeyedStoreIC::StoreElementHandler( Handle<Object> validity_cell = Map::GetOrCreatePrototypeChainValidityCell(receiver_map, isolate()); if (validity_cell.is_null()) return stub; - return isolate()->factory()->NewTuple2(validity_cell, stub, TENURED); + Handle<StoreHandler> handler = isolate()->factory()->NewStoreHandler(0); + handler->set_validity_cell(*validity_cell); + handler->set_smi_handler(*stub); + return handler; } void KeyedStoreIC::StoreElementPolymorphicHandlers( @@ -2172,10 +2196,12 @@ RUNTIME_FUNCTION(Runtime_StoreIC_Miss) { ic.UpdateState(receiver, key); RETURN_RESULT_OR_FAILURE(isolate, ic.Store(receiver, key, value)); } else if (IsStoreGlobalICKind(kind)) { - StoreICNexus nexus(vector, vector_slot); + DCHECK_EQ(isolate->native_context()->global_proxy(), *receiver); + receiver = isolate->global_object(); + StoreGlobalICNexus nexus(vector, vector_slot); StoreGlobalIC ic(isolate, &nexus); ic.UpdateState(receiver, key); - RETURN_RESULT_OR_FAILURE(isolate, ic.Store(receiver, key, value)); + RETURN_RESULT_OR_FAILURE(isolate, ic.Store(key, value)); } else { DCHECK(IsKeyedStoreICKind(kind)); KeyedStoreICNexus nexus(vector, vector_slot); @@ -2185,6 +2211,22 @@ RUNTIME_FUNCTION(Runtime_StoreIC_Miss) { } } +RUNTIME_FUNCTION(Runtime_StoreGlobalIC_Miss) { + HandleScope scope(isolate); + DCHECK_EQ(4, args.length()); + // Runtime functions don't follow the IC's calling convention. + Handle<Object> value = args.at(0); + Handle<Smi> slot = args.at<Smi>(1); + Handle<FeedbackVector> vector = args.at<FeedbackVector>(2); + Handle<Name> key = args.at<Name>(3); + FeedbackSlot vector_slot = vector->ToSlot(slot->value()); + StoreGlobalICNexus nexus(vector, vector_slot); + StoreGlobalIC ic(isolate, &nexus); + Handle<JSGlobalObject> global = isolate->global_object(); + ic.UpdateState(global, key); + RETURN_RESULT_OR_FAILURE(isolate, ic.Store(key, value)); +} + RUNTIME_FUNCTION(Runtime_StoreGlobalIC_Slow) { HandleScope scope(isolate); DCHECK_EQ(5, args.length()); @@ -2192,9 +2234,19 @@ RUNTIME_FUNCTION(Runtime_StoreGlobalIC_Slow) { Handle<Object> value = args.at(0); Handle<Smi> slot = args.at<Smi>(1); Handle<FeedbackVector> vector = args.at<FeedbackVector>(2); - Handle<Object> object = args.at(3); CONVERT_ARG_HANDLE_CHECKED(String, name, 4); +#ifdef DEBUG + { + FeedbackSlot vector_slot = vector->ToSlot(slot->value()); + FeedbackSlotKind slot_kind = vector->GetKind(vector_slot); + DCHECK(IsStoreGlobalICKind(slot_kind)); + Handle<Object> receiver = args.at(3); + DCHECK(receiver->IsJSGlobalProxy()); + } +#endif + + Handle<JSGlobalObject> global = isolate->global_object(); Handle<Context> native_context = isolate->native_context(); Handle<ScriptContextTable> script_contexts( native_context->script_context_table()); @@ -2205,7 +2257,7 @@ RUNTIME_FUNCTION(Runtime_StoreGlobalIC_Slow) { script_contexts, lookup_result.context_index); if (lookup_result.mode == CONST) { THROW_NEW_ERROR_RETURN_FAILURE( - isolate, NewTypeError(MessageTemplate::kConstAssign, object, name)); + isolate, NewTypeError(MessageTemplate::kConstAssign, global, name)); } Handle<Object> previous_value = @@ -2224,7 +2276,7 @@ RUNTIME_FUNCTION(Runtime_StoreGlobalIC_Slow) { LanguageMode language_mode = vector->GetLanguageMode(vector_slot); RETURN_RESULT_OR_FAILURE( isolate, - Runtime::SetObjectProperty(isolate, object, name, value, language_mode)); + Runtime::SetObjectProperty(isolate, global, name, value, language_mode)); } // Used from ic-<arch>.cc. @@ -2286,8 +2338,6 @@ RUNTIME_FUNCTION(Runtime_ElementsTransitionAndStoreIC_Miss) { RUNTIME_FUNCTION(Runtime_Unreachable) { UNREACHABLE(); - CHECK(false); - return isolate->heap()->undefined_value(); } @@ -2306,23 +2356,18 @@ RUNTIME_FUNCTION(Runtime_StoreCallbackProperty) { language_mode)); } - Handle<AccessorInfo> callback( + Handle<AccessorInfo> info( callback_or_cell->IsWeakCell() ? AccessorInfo::cast(WeakCell::cast(*callback_or_cell)->value()) : AccessorInfo::cast(*callback_or_cell)); - DCHECK(callback->IsCompatibleReceiver(*receiver)); - - Address setter_address = v8::ToCData<Address>(callback->setter()); - v8::AccessorNameSetterCallback fun = - FUNCTION_CAST<v8::AccessorNameSetterCallback>(setter_address); - DCHECK_NOT_NULL(fun); + DCHECK(info->IsCompatibleReceiver(*receiver)); ShouldThrow should_throw = is_sloppy(language_mode) ? kDontThrow : kThrowOnError; - PropertyCallbackArguments custom_args(isolate, callback->data(), *receiver, - *holder, should_throw); - custom_args.Call(fun, name, value); + PropertyCallbackArguments arguments(isolate, info->data(), *receiver, *holder, + should_throw); + arguments.CallAccessorSetter(info, name, value); RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); return *value; } @@ -2344,14 +2389,10 @@ RUNTIME_FUNCTION(Runtime_LoadPropertyWithInterceptor) { isolate, receiver, Object::ConvertReceiver(isolate, receiver)); } - InterceptorInfo* interceptor = holder->GetNamedInterceptor(); + Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor(), isolate); PropertyCallbackArguments arguments(isolate, interceptor->data(), *receiver, *holder, kDontThrow); - - v8::GenericNamedPropertyGetterCallback getter = - v8::ToCData<v8::GenericNamedPropertyGetterCallback>( - interceptor->getter()); - Handle<Object> result = arguments.Call(getter, name); + Handle<Object> result = arguments.CallNamedGetter(interceptor, name); RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); @@ -2398,16 +2439,24 @@ RUNTIME_FUNCTION(Runtime_StorePropertyWithInterceptor) { FeedbackSlot vector_slot = vector->ToSlot(slot->value()); LanguageMode language_mode = vector->GetLanguageMode(vector_slot); - DCHECK(receiver->HasNamedInterceptor()); - InterceptorInfo* interceptor = receiver->GetNamedInterceptor(); + // TODO(ishell): Cache interceptor_holder in the store handler like we do + // for LoadHandler::kInterceptor case. + Handle<JSObject> interceptor_holder = receiver; + if (receiver->IsJSGlobalProxy()) { + FeedbackSlotKind kind = vector->GetKind(vector_slot); + if (IsStoreGlobalICKind(kind)) { + interceptor_holder = Handle<JSObject>::cast(isolate->global_object()); + } + } + DCHECK(interceptor_holder->HasNamedInterceptor()); + Handle<InterceptorInfo> interceptor(interceptor_holder->GetNamedInterceptor(), + isolate); + DCHECK(!interceptor->non_masking()); PropertyCallbackArguments arguments(isolate, interceptor->data(), *receiver, *receiver, kDontThrow); - v8::GenericNamedPropertySetterCallback setter = - v8::ToCData<v8::GenericNamedPropertySetterCallback>( - interceptor->setter()); - Handle<Object> result = arguments.Call(setter, name, value); + Handle<Object> result = arguments.CallNamedSetter(interceptor, name, value); RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); if (!result.is_null()) return *value; @@ -2435,13 +2484,11 @@ RUNTIME_FUNCTION(Runtime_LoadElementWithInterceptor) { DCHECK_GE(args.smi_at(1), 0); uint32_t index = args.smi_at(1); - InterceptorInfo* interceptor = receiver->GetIndexedInterceptor(); + Handle<InterceptorInfo> interceptor(receiver->GetIndexedInterceptor(), + isolate); PropertyCallbackArguments arguments(isolate, interceptor->data(), *receiver, *receiver, kDontThrow); - - v8::IndexedPropertyGetterCallback getter = - v8::ToCData<v8::IndexedPropertyGetterCallback>(interceptor->getter()); - Handle<Object> result = arguments.Call(getter, index); + Handle<Object> result = arguments.CallIndexedGetter(interceptor, index); RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); |