@@ -89,17 +89,6 @@ Handle<S> BuiltinArguments<BuiltinExtraArguments::kTarget>::target() {
8989 return Arguments::at<S>(Arguments::length () - 1 );
9090}
9191
92- template <>
93- int BuiltinArguments<BuiltinExtraArguments::kNewTarget >::length() const {
94- return Arguments::length () - 1 ;
95- }
96-
97- template <>
98- Handle<HeapObject>
99- BuiltinArguments<BuiltinExtraArguments::kNewTarget >::new_target() {
100- return Arguments::at<HeapObject>(Arguments::length () - 1 );
101- }
102-
10392template <>
10493int BuiltinArguments<BuiltinExtraArguments::kTargetAndNewTarget >::length()
10594 const {
@@ -4247,11 +4236,13 @@ BUILTIN(RestrictedStrictArgumentsPropertiesThrower) {
42474236
42484237namespace {
42494238
4250- template <bool is_construct>
42514239MUST_USE_RESULT MaybeHandle<Object> HandleApiCallHelper (
4252- Isolate* isolate, BuiltinArguments<BuiltinExtraArguments::kTarget > args) {
4240+ Isolate* isolate,
4241+ BuiltinArguments<BuiltinExtraArguments::kTargetAndNewTarget > args) {
42534242 HandleScope scope (isolate);
42544243 Handle<HeapObject> function = args.target <HeapObject>();
4244+ Handle<HeapObject> new_target = args.new_target ();
4245+ bool is_construct = !new_target->IsUndefined ();
42554246 Handle<JSReceiver> receiver;
42564247
42574248 DCHECK (function->IsFunctionTemplateInfo () ||
@@ -4311,13 +4302,9 @@ MUST_USE_RESULT MaybeHandle<Object> HandleApiCallHelper(
43114302 LOG (isolate, ApiObjectAccess (" call" , JSObject::cast (*args.receiver ())));
43124303 DCHECK (raw_holder->IsJSObject ());
43134304
4314- FunctionCallbackArguments custom (isolate,
4315- data_obj,
4316- *function,
4317- raw_holder,
4318- &args[0 ] - 1 ,
4319- args.length () - 1 ,
4320- is_construct);
4305+ FunctionCallbackArguments custom (isolate, data_obj, *function, raw_holder,
4306+ *new_target, &args[0 ] - 1 ,
4307+ args.length () - 1 );
43214308
43224309 Handle<Object> result = custom.Call (callback);
43234310 if (result.is_null ()) result = isolate->factory ()->undefined_value ();
@@ -4338,19 +4325,11 @@ BUILTIN(HandleApiCall) {
43384325 HandleScope scope (isolate);
43394326 Handle<Object> result;
43404327 ASSIGN_RETURN_FAILURE_ON_EXCEPTION (isolate, result,
4341- HandleApiCallHelper< false > (isolate, args));
4328+ HandleApiCallHelper (isolate, args));
43424329 return *result;
43434330}
43444331
43454332
4346- BUILTIN (HandleApiCallConstruct) {
4347- HandleScope scope (isolate);
4348- Handle<Object> result;
4349- ASSIGN_RETURN_FAILURE_ON_EXCEPTION (isolate, result,
4350- HandleApiCallHelper<true >(isolate, args));
4351- return *result;
4352- }
4353-
43544333Handle<Code> Builtins::CallFunction (ConvertReceiverMode mode,
43554334 TailCallMode tail_call_mode) {
43564335 switch (tail_call_mode) {
@@ -4432,11 +4411,12 @@ Handle<Code> Builtins::InterpreterPushArgsAndCall(TailCallMode tail_call_mode) {
44324411namespace {
44334412
44344413class RelocatableArguments
4435- : public BuiltinArguments<BuiltinExtraArguments::kTarget >,
4414+ : public BuiltinArguments<BuiltinExtraArguments::kTargetAndNewTarget >,
44364415 public Relocatable {
44374416 public:
44384417 RelocatableArguments (Isolate* isolate, int length, Object** arguments)
4439- : BuiltinArguments<BuiltinExtraArguments::kTarget >(length, arguments),
4418+ : BuiltinArguments<BuiltinExtraArguments::kTargetAndNewTarget >(length,
4419+ arguments),
44404420 Relocatable (isolate) {}
44414421
44424422 virtual inline void IterateInstance (ObjectVisitor* v) {
@@ -4468,24 +4448,26 @@ MaybeHandle<Object> Builtins::InvokeApiFunction(Handle<HeapObject> function,
44684448 }
44694449 }
44704450 }
4471- // Construct BuiltinArguments object: function, arguments reversed, receiver.
4451+ // Construct BuiltinArguments object:
4452+ // new target, function, arguments reversed, receiver.
44724453 const int kBufferSize = 32 ;
44734454 Object* small_argv[kBufferSize ];
44744455 Object** argv;
4475- if (argc + 2 <= kBufferSize ) {
4456+ if (argc + 3 <= kBufferSize ) {
44764457 argv = small_argv;
44774458 } else {
4478- argv = new Object* [argc + 2 ];
4459+ argv = new Object*[argc + 3 ];
44794460 }
4480- argv[argc + 1 ] = *receiver;
4461+ argv[argc + 2 ] = *receiver;
44814462 for (int i = 0 ; i < argc; ++i) {
4482- argv[argc - i] = *args[i];
4463+ argv[argc - i + 1 ] = *args[i];
44834464 }
4484- argv[0 ] = *function;
4465+ argv[1 ] = *function;
4466+ argv[0 ] = isolate->heap ()->undefined_value (); // new target
44854467 MaybeHandle<Object> result;
44864468 {
4487- RelocatableArguments arguments (isolate, argc + 2 , &argv[argc + 1 ] );
4488- result = HandleApiCallHelper< false > (isolate, arguments);
4469+ RelocatableArguments arguments (isolate, argc + 3 , &argv[argc] + 2 );
4470+ result = HandleApiCallHelper (isolate, arguments);
44894471 }
44904472 if (argv != small_argv) {
44914473 delete[] argv;
@@ -4505,6 +4487,18 @@ MUST_USE_RESULT static Object* HandleApiCallAsFunctionOrConstructor(
45054487 // Get the object called.
45064488 JSObject* obj = JSObject::cast (*receiver);
45074489
4490+ // Set the new target.
4491+ HeapObject* new_target;
4492+ if (is_construct_call) {
4493+ // TODO(adamk): This should be passed through in args instead of
4494+ // being patched in here. We need to set a non-undefined value
4495+ // for v8::FunctionCallbackInfo::IsConstructCall() to get the
4496+ // right answer.
4497+ new_target = obj;
4498+ } else {
4499+ new_target = isolate->heap ()->undefined_value ();
4500+ }
4501+
45084502 // Get the invocation callback from the function descriptor that was
45094503 // used to create the called object.
45104504 DCHECK (obj->map ()->is_callable ());
@@ -4527,13 +4521,9 @@ MUST_USE_RESULT static Object* HandleApiCallAsFunctionOrConstructor(
45274521 HandleScope scope (isolate);
45284522 LOG (isolate, ApiObjectAccess (" call non-function" , obj));
45294523
4530- FunctionCallbackArguments custom (isolate,
4531- call_data->data (),
4532- constructor,
4533- obj,
4534- &args[0 ] - 1 ,
4535- args.length () - 1 ,
4536- is_construct_call);
4524+ FunctionCallbackArguments custom (isolate, call_data->data (), constructor,
4525+ obj, new_target, &args[0 ] - 1 ,
4526+ args.length () - 1 );
45374527 Handle<Object> result_handle = custom.Call (callback);
45384528 if (result_handle.is_null ()) {
45394529 result = isolate->heap ()->undefined_value ();
0 commit comments