@@ -4525,11 +4525,13 @@ BUILTIN(RestrictedStrictArgumentsPropertiesThrower) {
45254525
45264526namespace {
45274527
4528- template <bool is_construct>
45294528MUST_USE_RESULT MaybeHandle<Object> HandleApiCallHelper (
4530- Isolate* isolate, BuiltinArguments<BuiltinExtraArguments::kTarget > args) {
4529+ Isolate* isolate,
4530+ BuiltinArguments<BuiltinExtraArguments::kTargetAndNewTarget > args) {
45314531 HandleScope scope (isolate);
45324532 Handle<HeapObject> function = args.target <HeapObject>();
4533+ Handle<HeapObject> new_target = args.new_target ();
4534+ bool is_construct = !new_target->IsUndefined ();
45334535 Handle<JSReceiver> receiver;
45344536
45354537 DCHECK (function->IsFunctionTemplateInfo () ||
@@ -4589,13 +4591,9 @@ MUST_USE_RESULT MaybeHandle<Object> HandleApiCallHelper(
45894591 LOG (isolate, ApiObjectAccess (" call" , JSObject::cast (*args.receiver ())));
45904592 DCHECK (raw_holder->IsJSObject ());
45914593
4592- FunctionCallbackArguments custom (isolate,
4593- data_obj,
4594- *function,
4595- raw_holder,
4596- &args[0 ] - 1 ,
4597- args.length () - 1 ,
4598- is_construct);
4594+ FunctionCallbackArguments custom (isolate, data_obj, *function, raw_holder,
4595+ *new_target, &args[0 ] - 1 ,
4596+ args.length () - 1 );
45994597
46004598 Handle<Object> result = custom.Call (callback);
46014599 if (result.is_null ()) result = isolate->factory ()->undefined_value ();
@@ -4616,19 +4614,11 @@ BUILTIN(HandleApiCall) {
46164614 HandleScope scope (isolate);
46174615 Handle<Object> result;
46184616 ASSIGN_RETURN_FAILURE_ON_EXCEPTION (isolate, result,
4619- HandleApiCallHelper< false > (isolate, args));
4617+ HandleApiCallHelper (isolate, args));
46204618 return *result;
46214619}
46224620
46234621
4624- BUILTIN (HandleApiCallConstruct) {
4625- HandleScope scope (isolate);
4626- Handle<Object> result;
4627- ASSIGN_RETURN_FAILURE_ON_EXCEPTION (isolate, result,
4628- HandleApiCallHelper<true >(isolate, args));
4629- return *result;
4630- }
4631-
46324622Handle<Code> Builtins::CallFunction (ConvertReceiverMode mode,
46334623 TailCallMode tail_call_mode) {
46344624 switch (tail_call_mode) {
@@ -4710,11 +4700,12 @@ Handle<Code> Builtins::InterpreterPushArgsAndCall(TailCallMode tail_call_mode) {
47104700namespace {
47114701
47124702class RelocatableArguments
4713- : public BuiltinArguments<BuiltinExtraArguments::kTarget >,
4703+ : public BuiltinArguments<BuiltinExtraArguments::kTargetAndNewTarget >,
47144704 public Relocatable {
47154705 public:
47164706 RelocatableArguments (Isolate* isolate, int length, Object** arguments)
4717- : BuiltinArguments<BuiltinExtraArguments::kTarget >(length, arguments),
4707+ : BuiltinArguments<BuiltinExtraArguments::kTargetAndNewTarget >(length,
4708+ arguments),
47184709 Relocatable (isolate) {}
47194710
47204711 virtual inline void IterateInstance (ObjectVisitor* v) {
@@ -4746,24 +4737,26 @@ MaybeHandle<Object> Builtins::InvokeApiFunction(Handle<HeapObject> function,
47464737 }
47474738 }
47484739 }
4749- // Construct BuiltinArguments object: function, arguments reversed, receiver.
4740+ // Construct BuiltinArguments object:
4741+ // new target, function, arguments reversed, receiver.
47504742 const int kBufferSize = 32 ;
47514743 Object* small_argv[kBufferSize ];
47524744 Object** argv;
4753- if (argc + 2 <= kBufferSize ) {
4745+ if (argc + 3 <= kBufferSize ) {
47544746 argv = small_argv;
47554747 } else {
4756- argv = new Object* [argc + 2 ];
4748+ argv = new Object*[argc + 3 ];
47574749 }
4758- argv[argc + 1 ] = *receiver;
4750+ argv[argc + 2 ] = *receiver;
47594751 for (int i = 0 ; i < argc; ++i) {
4760- argv[argc - i] = *args[i];
4752+ argv[argc - i + 1 ] = *args[i];
47614753 }
4762- argv[0 ] = *function;
4754+ argv[1 ] = *function;
4755+ argv[0 ] = isolate->heap ()->undefined_value (); // new target
47634756 MaybeHandle<Object> result;
47644757 {
4765- RelocatableArguments arguments (isolate, argc + 2 , &argv[argc + 1 ] );
4766- result = HandleApiCallHelper< false > (isolate, arguments);
4758+ RelocatableArguments arguments (isolate, argc + 3 , &argv[argc] + 2 );
4759+ result = HandleApiCallHelper (isolate, arguments);
47674760 }
47684761 if (argv != small_argv) {
47694762 delete[] argv;
@@ -4783,6 +4776,18 @@ MUST_USE_RESULT static Object* HandleApiCallAsFunctionOrConstructor(
47834776 // Get the object called.
47844777 JSObject* obj = JSObject::cast (*receiver);
47854778
4779+ // Set the new target.
4780+ HeapObject* new_target;
4781+ if (is_construct_call) {
4782+ // TODO(adamk): This should be passed through in args instead of
4783+ // being patched in here. We need to set a non-undefined value
4784+ // for v8::FunctionCallbackInfo::IsConstructCall() to get the
4785+ // right answer.
4786+ new_target = obj;
4787+ } else {
4788+ new_target = isolate->heap ()->undefined_value ();
4789+ }
4790+
47864791 // Get the invocation callback from the function descriptor that was
47874792 // used to create the called object.
47884793 DCHECK (obj->map ()->is_callable ());
@@ -4805,13 +4810,9 @@ MUST_USE_RESULT static Object* HandleApiCallAsFunctionOrConstructor(
48054810 HandleScope scope (isolate);
48064811 LOG (isolate, ApiObjectAccess (" call non-function" , obj));
48074812
4808- FunctionCallbackArguments custom (isolate,
4809- call_data->data (),
4810- constructor,
4811- obj,
4812- &args[0 ] - 1 ,
4813- args.length () - 1 ,
4814- is_construct_call);
4813+ FunctionCallbackArguments custom (isolate, call_data->data (), constructor,
4814+ obj, new_target, &args[0 ] - 1 ,
4815+ args.length () - 1 );
48154816 Handle<Object> result_handle = custom.Call (callback);
48164817 if (result_handle.is_null ()) {
48174818 result = isolate->heap ()->undefined_value ();
0 commit comments