@@ -21,17 +21,21 @@ namespace {
2121// Returns the holder JSObject if the function can legally be called with this
2222// receiver. Returns nullptr if the call is illegal.
2323// TODO(dcarney): CallOptimization duplicates this logic, merge.
24- JSObject * GetCompatibleReceiver (Isolate* isolate, FunctionTemplateInfo* info,
25- JSObject * receiver) {
24+ JSReceiver * GetCompatibleReceiver (Isolate* isolate, FunctionTemplateInfo* info,
25+ JSReceiver * receiver) {
2626 Object* recv_type = info->signature ();
2727 // No signature, return holder.
2828 if (!recv_type->IsFunctionTemplateInfo ()) return receiver;
29+ // A Proxy cannot have been created from the signature template.
30+ if (!receiver->IsJSObject ()) return nullptr ;
31+
32+ JSObject* js_obj_receiver = JSObject::cast (receiver);
2933 FunctionTemplateInfo* signature = FunctionTemplateInfo::cast (recv_type);
3034
3135 // Check the receiver. Fast path for receivers with no hidden prototypes.
32- if (signature->IsTemplateFor (receiver )) return receiver;
33- if (!receiver ->map ()->has_hidden_prototype ()) return nullptr ;
34- for (PrototypeIterator iter (isolate, receiver , kStartAtPrototype ,
36+ if (signature->IsTemplateFor (js_obj_receiver )) return receiver;
37+ if (!js_obj_receiver ->map ()->has_hidden_prototype ()) return nullptr ;
38+ for (PrototypeIterator iter (isolate, js_obj_receiver , kStartAtPrototype ,
3539 PrototypeIterator::END_AT_NON_HIDDEN);
3640 !iter.IsAtEnd (); iter.Advance ()) {
3741 JSObject* current = iter.GetCurrent <JSObject>();
@@ -45,8 +49,8 @@ MUST_USE_RESULT MaybeHandle<Object> HandleApiCallHelper(
4549 Isolate* isolate, Handle<HeapObject> function,
4650 Handle<HeapObject> new_target, Handle<FunctionTemplateInfo> fun_data,
4751 Handle<Object> receiver, BuiltinArguments args) {
48- Handle<JSObject > js_receiver;
49- JSObject * raw_holder;
52+ Handle<JSReceiver > js_receiver;
53+ JSReceiver * raw_holder;
5054 if (is_construct) {
5155 DCHECK (args.receiver ()->IsTheHole (isolate));
5256 if (fun_data->instance_template ()->IsUndefined (isolate)) {
@@ -68,21 +72,18 @@ MUST_USE_RESULT MaybeHandle<Object> HandleApiCallHelper(
6872 raw_holder = *js_receiver;
6973 } else {
7074 DCHECK (receiver->IsJSReceiver ());
71-
72- if (!receiver->IsJSObject ()) {
73- // This function cannot be called with the given receiver. Abort!
74- THROW_NEW_ERROR (
75- isolate, NewTypeError (MessageTemplate::kIllegalInvocation ), Object);
76- }
77-
78- js_receiver = Handle<JSObject>::cast (receiver);
75+ js_receiver = Handle<JSReceiver>::cast (receiver);
7976
8077 if (!fun_data->accept_any_receiver () &&
81- js_receiver->IsAccessCheckNeeded () &&
82- !isolate->MayAccess (handle (isolate->context ()), js_receiver)) {
83- isolate->ReportFailedAccessCheck (js_receiver);
84- RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION (isolate, Object);
85- return isolate->factory ()->undefined_value ();
78+ js_receiver->IsAccessCheckNeeded ()) {
79+ // Proxies never need access checks.
80+ DCHECK (js_receiver->IsJSObject ());
81+ Handle<JSObject> js_obj_receiver = Handle<JSObject>::cast (js_receiver);
82+ if (!isolate->MayAccess (handle (isolate->context ()), js_obj_receiver)) {
83+ isolate->ReportFailedAccessCheck (js_obj_receiver);
84+ RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION (isolate, Object);
85+ return isolate->factory ()->undefined_value ();
86+ }
8687 }
8788
8889 raw_holder = GetCompatibleReceiver (isolate, *fun_data, *js_receiver);
0 commit comments