@@ -21,17 +21,21 @@ namespace {
21
21
// Returns the holder JSObject if the function can legally be called with this
22
22
// receiver. Returns nullptr if the call is illegal.
23
23
// 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) {
26
26
Object* recv_type = info->signature ();
27
27
// No signature, return holder.
28
28
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);
29
33
FunctionTemplateInfo* signature = FunctionTemplateInfo::cast (recv_type);
30
34
31
35
// 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 ,
35
39
PrototypeIterator::END_AT_NON_HIDDEN);
36
40
!iter.IsAtEnd (); iter.Advance ()) {
37
41
JSObject* current = iter.GetCurrent <JSObject>();
@@ -45,8 +49,8 @@ MUST_USE_RESULT MaybeHandle<Object> HandleApiCallHelper(
45
49
Isolate* isolate, Handle <HeapObject> function,
46
50
Handle <HeapObject> new_target, Handle <FunctionTemplateInfo> fun_data,
47
51
Handle <Object> receiver, BuiltinArguments args) {
48
- Handle <JSObject > js_receiver;
49
- JSObject * raw_holder;
52
+ Handle <JSReceiver > js_receiver;
53
+ JSReceiver * raw_holder;
50
54
if (is_construct) {
51
55
DCHECK (args.receiver ()->IsTheHole (isolate));
52
56
if (fun_data->instance_template ()->IsUndefined (isolate)) {
@@ -68,21 +72,18 @@ MUST_USE_RESULT MaybeHandle<Object> HandleApiCallHelper(
68
72
raw_holder = *js_receiver;
69
73
} else {
70
74
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);
79
76
80
77
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
+ }
86
87
}
87
88
88
89
raw_holder = GetCompatibleReceiver (isolate, *fun_data, *js_receiver);
0 commit comments