Index: src/builtins.cc |
diff --git a/src/builtins.cc b/src/builtins.cc |
index de5817188d95db5b9c63cb773f8592b0e08ad5ab..76a1312aaa8dc23864d377648aff80f71d499872 100644 |
--- a/src/builtins.cc |
+++ b/src/builtins.cc |
@@ -59,7 +59,8 @@ class BuiltinArguments : public Arguments { |
return Arguments::at<Object>(0); |
} |
- Handle<JSFunction> target(); |
+ template <class S = JSFunction> |
+ Handle<S> target(); |
Handle<HeapObject> new_target(); |
// Gets the total number of arguments including the receiver (but |
@@ -81,8 +82,9 @@ int BuiltinArguments<BuiltinExtraArguments::kTarget>::length() const { |
} |
template <> |
-Handle<JSFunction> BuiltinArguments<BuiltinExtraArguments::kTarget>::target() { |
- return Arguments::at<JSFunction>(Arguments::length() - 1); |
+template <class S> |
+Handle<S> BuiltinArguments<BuiltinExtraArguments::kTarget>::target() { |
+ return Arguments::at<S>(Arguments::length() - 1); |
} |
template <> |
@@ -103,9 +105,10 @@ int BuiltinArguments<BuiltinExtraArguments::kTargetAndNewTarget>::length() |
} |
template <> |
-Handle<JSFunction> |
+template <class S> |
+Handle<S> |
BuiltinArguments<BuiltinExtraArguments::kTargetAndNewTarget>::target() { |
- return Arguments::at<JSFunction>(Arguments::length() - 2); |
+ return Arguments::at<S>(Arguments::length() - 2); |
} |
template <> |
@@ -3522,13 +3525,16 @@ template <bool is_construct> |
MUST_USE_RESULT MaybeHandle<Object> HandleApiCallHelper( |
Isolate* isolate, BuiltinArguments<BuiltinExtraArguments::kTarget> args) { |
HandleScope scope(isolate); |
- Handle<JSFunction> function = args.target(); |
+ Handle<HeapObject> function = args.target<HeapObject>(); |
DCHECK(args.receiver()->IsJSReceiver()); |
// TODO(ishell): turn this back to a DCHECK. |
- CHECK(function->shared()->IsApiFunction()); |
+ CHECK(function->IsFunctionTemplateInfo() || |
+ Handle<JSFunction>::cast(function)->shared()->IsApiFunction()); |
- Handle<FunctionTemplateInfo> fun_data( |
- function->shared()->get_api_func_data(), isolate); |
+ Handle<FunctionTemplateInfo> fun_data = |
+ function->IsFunctionTemplateInfo() |
+ ? Handle<FunctionTemplateInfo>::cast(function) |
+ : handle(JSFunction::cast(*function)->shared()->get_api_func_data()); |
if (is_construct) { |
ASSIGN_RETURN_ON_EXCEPTION( |
isolate, fun_data, |
@@ -3704,8 +3710,7 @@ class RelocatableArguments |
} // namespace |
- |
-MaybeHandle<Object> Builtins::InvokeApiFunction(Handle<JSFunction> function, |
+MaybeHandle<Object> Builtins::InvokeApiFunction(Handle<HeapObject> function, |
Handle<Object> receiver, |
int argc, |
Handle<Object> args[]) { |