summaryrefslogtreecommitdiff
path: root/deps/v8/src/ic/ic.cc
diff options
context:
space:
mode:
authorMichaël Zasso <targos@protonmail.com>2018-03-07 08:54:53 +0100
committerMichaël Zasso <targos@protonmail.com>2018-03-07 16:48:52 +0100
commit88786fecff336342a56e6f2e7ff3b286be716e47 (patch)
tree92e6ba5b8ac8dae1a058988d20c9d27bfa654390 /deps/v8/src/ic/ic.cc
parent4e86f9b5ab83cbabf43839385bf383e6a7ef7d19 (diff)
downloadnode-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.cc209
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);