diff --git a/deps/v8/include/v8.h b/deps/v8/include/v8.h index 8b7b7c2cc48c3b..ec45c91d77e728 100644 --- a/deps/v8/include/v8.h +++ b/deps/v8/include/v8.h @@ -3177,12 +3177,13 @@ class FunctionCallbackInfo { Local Callee() const); V8_INLINE Local This() const; V8_INLINE Local Holder() const; + V8_INLINE Local NewTarget() const; V8_INLINE bool IsConstructCall() const; V8_INLINE Local Data() const; V8_INLINE Isolate* GetIsolate() const; V8_INLINE ReturnValue GetReturnValue() const; // This shouldn't be public, but the arm compiler needs it. - static const int kArgsLength = 7; + static const int kArgsLength = 8; protected: friend class internal::FunctionCallbackArguments; @@ -3194,6 +3195,7 @@ class FunctionCallbackInfo { static const int kDataIndex = 4; static const int kCalleeIndex = 5; static const int kContextSaveIndex = 6; + static const int kNewTargetIndex = 7; V8_INLINE FunctionCallbackInfo(internal::Object** implicit_args, internal::Object** values, @@ -7902,6 +7904,11 @@ Local FunctionCallbackInfo::Holder() const { &implicit_args_[kHolderIndex])); } +template +Local FunctionCallbackInfo::NewTarget() const { + return Local( + reinterpret_cast(&implicit_args_[kNewTargetIndex])); +} template Local FunctionCallbackInfo::Data() const { diff --git a/deps/v8/src/api-arguments.h b/deps/v8/src/api-arguments.h index 3bfe34dc894c18..136282b102f1c8 100644 --- a/deps/v8/src/api-arguments.h +++ b/deps/v8/src/api-arguments.h @@ -206,19 +206,22 @@ class FunctionCallbackArguments static const int kIsolateIndex = T::kIsolateIndex; static const int kCalleeIndex = T::kCalleeIndex; static const int kContextSaveIndex = T::kContextSaveIndex; + static const int kNewTargetIndex = T::kNewTargetIndex; FunctionCallbackArguments(internal::Isolate* isolate, internal::Object* data, internal::HeapObject* callee, - internal::Object* holder, internal::Object** argv, - int argc, bool is_construct_call) + internal::Object* holder, + internal::HeapObject* new_target, + internal::Object** argv, int argc) : Super(isolate), argv_(argv), argc_(argc), - is_construct_call_(is_construct_call) { + is_construct_call_(!new_target->IsUndefined()) { Object** values = begin(); values[T::kDataIndex] = data; values[T::kCalleeIndex] = callee; values[T::kHolderIndex] = holder; + values[T::kNewTargetIndex] = new_target; values[T::kContextSaveIndex] = isolate->heap()->the_hole_value(); values[T::kIsolateIndex] = reinterpret_cast(isolate); // Here the hole is set as default value. diff --git a/deps/v8/src/arm/builtins-arm.cc b/deps/v8/src/arm/builtins-arm.cc index 1fffcb67e596dd..d2af1cb49c651a 100644 --- a/deps/v8/src/arm/builtins-arm.cc +++ b/deps/v8/src/arm/builtins-arm.cc @@ -604,16 +604,9 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm, // r0: number of arguments // r1: constructor function // r3: new target - if (is_api_function) { - __ ldr(cp, FieldMemOperand(r1, JSFunction::kContextOffset)); - Handle code = - masm->isolate()->builtins()->HandleApiCallConstruct(); - __ Call(code, RelocInfo::CODE_TARGET); - } else { - ParameterCount actual(r0); - __ InvokeFunction(r1, r3, actual, CALL_FUNCTION, - CheckDebugStepCallWrapper()); - } + ParameterCount actual(r0); + __ InvokeFunction(r1, r3, actual, CALL_FUNCTION, + CheckDebugStepCallWrapper()); // Store offset of return address for deoptimizer. if (create_implicit_receiver && !is_api_function) { diff --git a/deps/v8/src/arm/code-stubs-arm.cc b/deps/v8/src/arm/code-stubs-arm.cc index 31e3e95f0329c1..93fe16edcdbe8c 100644 --- a/deps/v8/src/arm/code-stubs-arm.cc +++ b/deps/v8/src/arm/code-stubs-arm.cc @@ -5423,7 +5423,11 @@ void CallApiCallbackStub::Generate(MacroAssembler* masm) { STATIC_ASSERT(FCA::kReturnValueDefaultValueIndex == 2); STATIC_ASSERT(FCA::kIsolateIndex == 1); STATIC_ASSERT(FCA::kHolderIndex == 0); - STATIC_ASSERT(FCA::kArgsLength == 7); + STATIC_ASSERT(FCA::kNewTargetIndex == 7); + STATIC_ASSERT(FCA::kArgsLength == 8); + + // new target + __ PushRoot(Heap::kUndefinedValueRootIndex); // context save __ push(context); diff --git a/deps/v8/src/arm64/builtins-arm64.cc b/deps/v8/src/arm64/builtins-arm64.cc index 44bfc1762d83cf..acaba1ef8c5164 100644 --- a/deps/v8/src/arm64/builtins-arm64.cc +++ b/deps/v8/src/arm64/builtins-arm64.cc @@ -605,16 +605,9 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm, // x0: number of arguments // x1: constructor function // x3: new target - if (is_api_function) { - __ Ldr(cp, FieldMemOperand(constructor, JSFunction::kContextOffset)); - Handle code = - masm->isolate()->builtins()->HandleApiCallConstruct(); - __ Call(code, RelocInfo::CODE_TARGET); - } else { - ParameterCount actual(argc); - __ InvokeFunction(constructor, new_target, actual, CALL_FUNCTION, - CheckDebugStepCallWrapper()); - } + ParameterCount actual(argc); + __ InvokeFunction(constructor, new_target, actual, CALL_FUNCTION, + CheckDebugStepCallWrapper()); // Store offset of return address for deoptimizer. if (create_implicit_receiver && !is_api_function) { diff --git a/deps/v8/src/arm64/code-stubs-arm64.cc b/deps/v8/src/arm64/code-stubs-arm64.cc index ee4053515a6b20..800dfad0081ed4 100644 --- a/deps/v8/src/arm64/code-stubs-arm64.cc +++ b/deps/v8/src/arm64/code-stubs-arm64.cc @@ -5807,9 +5807,15 @@ void CallApiCallbackStub::Generate(MacroAssembler* masm) { STATIC_ASSERT(FCA::kReturnValueDefaultValueIndex == 2); STATIC_ASSERT(FCA::kIsolateIndex == 1); STATIC_ASSERT(FCA::kHolderIndex == 0); - STATIC_ASSERT(FCA::kArgsLength == 7); + STATIC_ASSERT(FCA::kNewTargetIndex == 7); + STATIC_ASSERT(FCA::kArgsLength == 8); - // FunctionCallbackArguments: context, callee and call data. + // FunctionCallbackArguments + + // new target + __ PushRoot(Heap::kUndefinedValueRootIndex); + + // context, callee and call data. __ Push(context, callee, call_data); if (!is_lazy()) { diff --git a/deps/v8/src/builtins.cc b/deps/v8/src/builtins.cc index 1ad19946cb0acd..602905ef24b390 100644 --- a/deps/v8/src/builtins.cc +++ b/deps/v8/src/builtins.cc @@ -89,17 +89,6 @@ Handle BuiltinArguments::target() { return Arguments::at(Arguments::length() - 1); } -template <> -int BuiltinArguments::length() const { - return Arguments::length() - 1; -} - -template <> -Handle -BuiltinArguments::new_target() { - return Arguments::at(Arguments::length() - 1); -} - template <> int BuiltinArguments::length() const { @@ -4247,11 +4236,13 @@ BUILTIN(RestrictedStrictArgumentsPropertiesThrower) { namespace { -template MUST_USE_RESULT MaybeHandle HandleApiCallHelper( - Isolate* isolate, BuiltinArguments args) { + Isolate* isolate, + BuiltinArguments args) { HandleScope scope(isolate); Handle function = args.target(); + Handle new_target = args.new_target(); + bool is_construct = !new_target->IsUndefined(); Handle receiver; DCHECK(function->IsFunctionTemplateInfo() || @@ -4311,13 +4302,9 @@ MUST_USE_RESULT MaybeHandle HandleApiCallHelper( LOG(isolate, ApiObjectAccess("call", JSObject::cast(*args.receiver()))); DCHECK(raw_holder->IsJSObject()); - FunctionCallbackArguments custom(isolate, - data_obj, - *function, - raw_holder, - &args[0] - 1, - args.length() - 1, - is_construct); + FunctionCallbackArguments custom(isolate, data_obj, *function, raw_holder, + *new_target, &args[0] - 1, + args.length() - 1); Handle result = custom.Call(callback); if (result.is_null()) result = isolate->factory()->undefined_value(); @@ -4338,19 +4325,11 @@ BUILTIN(HandleApiCall) { HandleScope scope(isolate); Handle result; ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, - HandleApiCallHelper(isolate, args)); + HandleApiCallHelper(isolate, args)); return *result; } -BUILTIN(HandleApiCallConstruct) { - HandleScope scope(isolate); - Handle result; - ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, - HandleApiCallHelper(isolate, args)); - return *result; -} - Handle Builtins::CallFunction(ConvertReceiverMode mode, TailCallMode tail_call_mode) { switch (tail_call_mode) { @@ -4432,11 +4411,12 @@ Handle Builtins::InterpreterPushArgsAndCall(TailCallMode tail_call_mode) { namespace { class RelocatableArguments - : public BuiltinArguments, + : public BuiltinArguments, public Relocatable { public: RelocatableArguments(Isolate* isolate, int length, Object** arguments) - : BuiltinArguments(length, arguments), + : BuiltinArguments(length, + arguments), Relocatable(isolate) {} virtual inline void IterateInstance(ObjectVisitor* v) { @@ -4468,24 +4448,26 @@ MaybeHandle Builtins::InvokeApiFunction(Handle function, } } } - // Construct BuiltinArguments object: function, arguments reversed, receiver. + // Construct BuiltinArguments object: + // new target, function, arguments reversed, receiver. const int kBufferSize = 32; Object* small_argv[kBufferSize]; Object** argv; - if (argc + 2 <= kBufferSize) { + if (argc + 3 <= kBufferSize) { argv = small_argv; } else { - argv = new Object* [argc + 2]; + argv = new Object*[argc + 3]; } - argv[argc + 1] = *receiver; + argv[argc + 2] = *receiver; for (int i = 0; i < argc; ++i) { - argv[argc - i] = *args[i]; + argv[argc - i + 1] = *args[i]; } - argv[0] = *function; + argv[1] = *function; + argv[0] = isolate->heap()->undefined_value(); // new target MaybeHandle result; { - RelocatableArguments arguments(isolate, argc + 2, &argv[argc + 1]); - result = HandleApiCallHelper(isolate, arguments); + RelocatableArguments arguments(isolate, argc + 3, &argv[argc] + 2); + result = HandleApiCallHelper(isolate, arguments); } if (argv != small_argv) { delete[] argv; @@ -4505,6 +4487,18 @@ MUST_USE_RESULT static Object* HandleApiCallAsFunctionOrConstructor( // Get the object called. JSObject* obj = JSObject::cast(*receiver); + // Set the new target. + HeapObject* new_target; + if (is_construct_call) { + // TODO(adamk): This should be passed through in args instead of + // being patched in here. We need to set a non-undefined value + // for v8::FunctionCallbackInfo::IsConstructCall() to get the + // right answer. + new_target = obj; + } else { + new_target = isolate->heap()->undefined_value(); + } + // Get the invocation callback from the function descriptor that was // used to create the called object. DCHECK(obj->map()->is_callable()); @@ -4527,13 +4521,9 @@ MUST_USE_RESULT static Object* HandleApiCallAsFunctionOrConstructor( HandleScope scope(isolate); LOG(isolate, ApiObjectAccess("call non-function", obj)); - FunctionCallbackArguments custom(isolate, - call_data->data(), - constructor, - obj, - &args[0] - 1, - args.length() - 1, - is_construct_call); + FunctionCallbackArguments custom(isolate, call_data->data(), constructor, + obj, new_target, &args[0] - 1, + args.length() - 1); Handle result_handle = custom.Call(callback); if (result_handle.is_null()) { result = isolate->heap()->undefined_value(); diff --git a/deps/v8/src/builtins.h b/deps/v8/src/builtins.h index 221d06f30f845f..68788784584a87 100644 --- a/deps/v8/src/builtins.h +++ b/deps/v8/src/builtins.h @@ -166,8 +166,7 @@ inline bool operator&(BuiltinExtraArguments lhs, BuiltinExtraArguments rhs) { V(SymbolConstructor, kNone) \ V(SymbolConstructor_ConstructStub, kTarget) \ \ - V(HandleApiCall, kTarget) \ - V(HandleApiCallConstruct, kTarget) \ + V(HandleApiCall, kTargetAndNewTarget) \ V(HandleApiCallAsFunction, kNone) \ V(HandleApiCallAsConstructor, kNone) \ \ diff --git a/deps/v8/src/ia32/builtins-ia32.cc b/deps/v8/src/ia32/builtins-ia32.cc index b7e33d9a74fce5..1c788e2f2bf66e 100644 --- a/deps/v8/src/ia32/builtins-ia32.cc +++ b/deps/v8/src/ia32/builtins-ia32.cc @@ -186,16 +186,9 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm, __ j(greater_equal, &loop); // Call the function. - if (is_api_function) { - __ mov(esi, FieldOperand(edi, JSFunction::kContextOffset)); - Handle code = - masm->isolate()->builtins()->HandleApiCallConstruct(); - __ call(code, RelocInfo::CODE_TARGET); - } else { - ParameterCount actual(eax); - __ InvokeFunction(edi, edx, actual, CALL_FUNCTION, - CheckDebugStepCallWrapper()); - } + ParameterCount actual(eax); + __ InvokeFunction(edi, edx, actual, CALL_FUNCTION, + CheckDebugStepCallWrapper()); // Store offset of return address for deoptimizer. if (create_implicit_receiver && !is_api_function) { diff --git a/deps/v8/src/ia32/code-stubs-ia32.cc b/deps/v8/src/ia32/code-stubs-ia32.cc index 53b35a3a841c66..510c2aed855025 100644 --- a/deps/v8/src/ia32/code-stubs-ia32.cc +++ b/deps/v8/src/ia32/code-stubs-ia32.cc @@ -5686,9 +5686,14 @@ void CallApiCallbackStub::Generate(MacroAssembler* masm) { STATIC_ASSERT(FCA::kReturnValueDefaultValueIndex == 2); STATIC_ASSERT(FCA::kIsolateIndex == 1); STATIC_ASSERT(FCA::kHolderIndex == 0); - STATIC_ASSERT(FCA::kArgsLength == 7); + STATIC_ASSERT(FCA::kNewTargetIndex == 7); + STATIC_ASSERT(FCA::kArgsLength == 8); __ pop(return_address); + + // new target + __ PushRoot(Heap::kUndefinedValueRootIndex); + // context save. __ push(context); diff --git a/deps/v8/src/mips/builtins-mips.cc b/deps/v8/src/mips/builtins-mips.cc index 9693a52697aa58..63fbfcf5413f4c 100644 --- a/deps/v8/src/mips/builtins-mips.cc +++ b/deps/v8/src/mips/builtins-mips.cc @@ -603,16 +603,9 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm, // a0: number of arguments // a1: constructor function // a3: new target - if (is_api_function) { - __ lw(cp, FieldMemOperand(a1, JSFunction::kContextOffset)); - Handle code = - masm->isolate()->builtins()->HandleApiCallConstruct(); - __ Call(code, RelocInfo::CODE_TARGET); - } else { - ParameterCount actual(a0); - __ InvokeFunction(a1, a3, actual, CALL_FUNCTION, - CheckDebugStepCallWrapper()); - } + ParameterCount actual(a0); + __ InvokeFunction(a1, a3, actual, CALL_FUNCTION, + CheckDebugStepCallWrapper()); // Store offset of return address for deoptimizer. if (create_implicit_receiver && !is_api_function) { diff --git a/deps/v8/src/mips/code-stubs-mips.cc b/deps/v8/src/mips/code-stubs-mips.cc index fd286fbb77bead..93a20acad9e0b9 100644 --- a/deps/v8/src/mips/code-stubs-mips.cc +++ b/deps/v8/src/mips/code-stubs-mips.cc @@ -5608,7 +5608,11 @@ void CallApiCallbackStub::Generate(MacroAssembler* masm) { STATIC_ASSERT(FCA::kReturnValueDefaultValueIndex == 2); STATIC_ASSERT(FCA::kIsolateIndex == 1); STATIC_ASSERT(FCA::kHolderIndex == 0); - STATIC_ASSERT(FCA::kArgsLength == 7); + STATIC_ASSERT(FCA::kNewTargetIndex == 7); + STATIC_ASSERT(FCA::kArgsLength == 8); + + // new target + __ PushRoot(Heap::kUndefinedValueRootIndex); // Save context, callee and call data. __ Push(context, callee, call_data); diff --git a/deps/v8/src/mips64/builtins-mips64.cc b/deps/v8/src/mips64/builtins-mips64.cc index b55b77c51158bf..0e2df6962f7cfd 100644 --- a/deps/v8/src/mips64/builtins-mips64.cc +++ b/deps/v8/src/mips64/builtins-mips64.cc @@ -592,16 +592,9 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm, // a0: number of arguments // a1: constructor function // a3: new target - if (is_api_function) { - __ ld(cp, FieldMemOperand(a1, JSFunction::kContextOffset)); - Handle code = - masm->isolate()->builtins()->HandleApiCallConstruct(); - __ Call(code, RelocInfo::CODE_TARGET); - } else { - ParameterCount actual(a0); - __ InvokeFunction(a1, a3, actual, CALL_FUNCTION, - CheckDebugStepCallWrapper()); - } + ParameterCount actual(a0); + __ InvokeFunction(a1, a3, actual, CALL_FUNCTION, + CheckDebugStepCallWrapper()); // Store offset of return address for deoptimizer. if (create_implicit_receiver && !is_api_function) { diff --git a/deps/v8/src/mips64/code-stubs-mips64.cc b/deps/v8/src/mips64/code-stubs-mips64.cc index fdb6c81d2ee40b..30584f3f9eb79a 100644 --- a/deps/v8/src/mips64/code-stubs-mips64.cc +++ b/deps/v8/src/mips64/code-stubs-mips64.cc @@ -5636,7 +5636,11 @@ void CallApiCallbackStub::Generate(MacroAssembler* masm) { STATIC_ASSERT(FCA::kReturnValueDefaultValueIndex == 2); STATIC_ASSERT(FCA::kIsolateIndex == 1); STATIC_ASSERT(FCA::kHolderIndex == 0); - STATIC_ASSERT(FCA::kArgsLength == 7); + STATIC_ASSERT(FCA::kNewTargetIndex == 7); + STATIC_ASSERT(FCA::kArgsLength == 8); + + // new target + __ PushRoot(Heap::kUndefinedValueRootIndex); // Save context, callee and call data. __ Push(context, callee, call_data); diff --git a/deps/v8/src/ppc/builtins-ppc.cc b/deps/v8/src/ppc/builtins-ppc.cc index 884afedb21b789..bc31d593e3847e 100644 --- a/deps/v8/src/ppc/builtins-ppc.cc +++ b/deps/v8/src/ppc/builtins-ppc.cc @@ -605,15 +605,10 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm, // r3: number of arguments // r4: constructor function // r6: new target - if (is_api_function) { - __ LoadP(cp, FieldMemOperand(r4, JSFunction::kContextOffset)); - Handle code = masm->isolate()->builtins()->HandleApiCallConstruct(); - __ Call(code, RelocInfo::CODE_TARGET); - } else { - ParameterCount actual(r3); - __ InvokeFunction(r4, r6, actual, CALL_FUNCTION, - CheckDebugStepCallWrapper()); - } + + ParameterCount actual(r3); + __ InvokeFunction(r4, r6, actual, CALL_FUNCTION, + CheckDebugStepCallWrapper()); // Store offset of return address for deoptimizer. if (create_implicit_receiver && !is_api_function) { diff --git a/deps/v8/src/ppc/code-stubs-ppc.cc b/deps/v8/src/ppc/code-stubs-ppc.cc index 0671f990e8c5a6..98425fc6ad5416 100644 --- a/deps/v8/src/ppc/code-stubs-ppc.cc +++ b/deps/v8/src/ppc/code-stubs-ppc.cc @@ -5623,7 +5623,11 @@ void CallApiCallbackStub::Generate(MacroAssembler* masm) { STATIC_ASSERT(FCA::kReturnValueDefaultValueIndex == 2); STATIC_ASSERT(FCA::kIsolateIndex == 1); STATIC_ASSERT(FCA::kHolderIndex == 0); - STATIC_ASSERT(FCA::kArgsLength == 7); + STATIC_ASSERT(FCA::kNewTargetIndex == 7); + STATIC_ASSERT(FCA::kArgsLength == 8); + + // new target + __ PushRoot(Heap::kUndefinedValueRootIndex); // context save __ push(context); diff --git a/deps/v8/src/s390/builtins-s390.cc b/deps/v8/src/s390/builtins-s390.cc index 12b52c123cfd8c..5c871beb5000df 100644 --- a/deps/v8/src/s390/builtins-s390.cc +++ b/deps/v8/src/s390/builtins-s390.cc @@ -596,15 +596,10 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm, // r2: number of arguments // r3: constructor function // r5: new target - if (is_api_function) { - __ LoadP(cp, FieldMemOperand(r3, JSFunction::kContextOffset)); - Handle code = masm->isolate()->builtins()->HandleApiCallConstruct(); - __ Call(code, RelocInfo::CODE_TARGET); - } else { - ParameterCount actual(r2); - __ InvokeFunction(r3, r5, actual, CALL_FUNCTION, - CheckDebugStepCallWrapper()); - } + + ParameterCount actual(r2); + __ InvokeFunction(r3, r5, actual, CALL_FUNCTION, + CheckDebugStepCallWrapper()); // Store offset of return address for deoptimizer. if (create_implicit_receiver && !is_api_function) { diff --git a/deps/v8/src/s390/code-stubs-s390.cc b/deps/v8/src/s390/code-stubs-s390.cc index 1c7d27b5caec91..81aae6446a1d7b 100644 --- a/deps/v8/src/s390/code-stubs-s390.cc +++ b/deps/v8/src/s390/code-stubs-s390.cc @@ -5533,7 +5533,11 @@ void CallApiCallbackStub::Generate(MacroAssembler* masm) { STATIC_ASSERT(FCA::kReturnValueDefaultValueIndex == 2); STATIC_ASSERT(FCA::kIsolateIndex == 1); STATIC_ASSERT(FCA::kHolderIndex == 0); - STATIC_ASSERT(FCA::kArgsLength == 7); + STATIC_ASSERT(FCA::kNewTargetIndex == 7); + STATIC_ASSERT(FCA::kArgsLength == 8); + + // new target + __ PushRoot(Heap::kUndefinedValueRootIndex); // context save __ push(context); diff --git a/deps/v8/src/x64/builtins-x64.cc b/deps/v8/src/x64/builtins-x64.cc index 316378348c20fd..be3563f87b8a9e 100644 --- a/deps/v8/src/x64/builtins-x64.cc +++ b/deps/v8/src/x64/builtins-x64.cc @@ -185,16 +185,9 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm, __ j(greater_equal, &loop); // Call the function. - if (is_api_function) { - __ movp(rsi, FieldOperand(rdi, JSFunction::kContextOffset)); - Handle code = - masm->isolate()->builtins()->HandleApiCallConstruct(); - __ Call(code, RelocInfo::CODE_TARGET); - } else { - ParameterCount actual(rax); - __ InvokeFunction(rdi, rdx, actual, CALL_FUNCTION, - CheckDebugStepCallWrapper()); - } + ParameterCount actual(rax); + __ InvokeFunction(rdi, rdx, actual, CALL_FUNCTION, + CheckDebugStepCallWrapper()); // Store offset of return address for deoptimizer. if (create_implicit_receiver && !is_api_function) { diff --git a/deps/v8/src/x64/code-stubs-x64.cc b/deps/v8/src/x64/code-stubs-x64.cc index e737801f588f99..a96e31f6a23ca6 100644 --- a/deps/v8/src/x64/code-stubs-x64.cc +++ b/deps/v8/src/x64/code-stubs-x64.cc @@ -5404,10 +5404,14 @@ void CallApiCallbackStub::Generate(MacroAssembler* masm) { STATIC_ASSERT(FCA::kReturnValueDefaultValueIndex == 2); STATIC_ASSERT(FCA::kIsolateIndex == 1); STATIC_ASSERT(FCA::kHolderIndex == 0); - STATIC_ASSERT(FCA::kArgsLength == 7); + STATIC_ASSERT(FCA::kNewTargetIndex == 7); + STATIC_ASSERT(FCA::kArgsLength == 8); __ PopReturnAddressTo(return_address); + // new target + __ PushRoot(Heap::kUndefinedValueRootIndex); + // context save __ Push(context); diff --git a/deps/v8/src/x87/builtins-x87.cc b/deps/v8/src/x87/builtins-x87.cc index 9e13172c852ef5..f4a6986e03e14b 100644 --- a/deps/v8/src/x87/builtins-x87.cc +++ b/deps/v8/src/x87/builtins-x87.cc @@ -186,16 +186,9 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm, __ j(greater_equal, &loop); // Call the function. - if (is_api_function) { - __ mov(esi, FieldOperand(edi, JSFunction::kContextOffset)); - Handle code = - masm->isolate()->builtins()->HandleApiCallConstruct(); - __ call(code, RelocInfo::CODE_TARGET); - } else { - ParameterCount actual(eax); - __ InvokeFunction(edi, edx, actual, CALL_FUNCTION, - CheckDebugStepCallWrapper()); - } + ParameterCount actual(eax); + __ InvokeFunction(edi, edx, actual, CALL_FUNCTION, + CheckDebugStepCallWrapper()); // Store offset of return address for deoptimizer. if (create_implicit_receiver && !is_api_function) { diff --git a/deps/v8/src/x87/code-stubs-x87.cc b/deps/v8/src/x87/code-stubs-x87.cc index 71adfd353110eb..4432bd98fab0b3 100644 --- a/deps/v8/src/x87/code-stubs-x87.cc +++ b/deps/v8/src/x87/code-stubs-x87.cc @@ -5354,9 +5354,14 @@ void CallApiCallbackStub::Generate(MacroAssembler* masm) { STATIC_ASSERT(FCA::kReturnValueDefaultValueIndex == 2); STATIC_ASSERT(FCA::kIsolateIndex == 1); STATIC_ASSERT(FCA::kHolderIndex == 0); - STATIC_ASSERT(FCA::kArgsLength == 7); + STATIC_ASSERT(FCA::kNewTargetIndex == 7); + STATIC_ASSERT(FCA::kArgsLength == 8); __ pop(return_address); + + // new target + __ PushRoot(Heap::kUndefinedValueRootIndex); + // context save. __ push(context); diff --git a/deps/v8/test/cctest/test-api.cc b/deps/v8/test/cctest/test-api.cc index 220b0cd07784cb..b9cb9bd856cc39 100644 --- a/deps/v8/test/cctest/test-api.cc +++ b/deps/v8/test/cctest/test-api.cc @@ -13261,6 +13261,43 @@ THREADED_TEST(IsConstructCall) { CHECK(value->BooleanValue(context.local()).FromJust()); } +static void NewTargetHandler(const v8::FunctionCallbackInfo& args) { + ApiTestFuzzer::Fuzz(); + args.GetReturnValue().Set(args.NewTarget()); +} + +THREADED_TEST(NewTargetHandler) { + v8::Isolate* isolate = CcTest::isolate(); + v8::HandleScope scope(isolate); + + // Function template with call handler. + Local templ = v8::FunctionTemplate::New(isolate); + templ->SetCallHandler(NewTargetHandler); + + LocalContext context; + + Local function = + templ->GetFunction(context.local()).ToLocalChecked(); + CHECK(context->Global() + ->Set(context.local(), v8_str("f"), function) + .FromJust()); + Local value = CompileRun("f()"); + CHECK(value->IsUndefined()); + value = CompileRun("new f()"); + CHECK(value->IsFunction()); + CHECK(value == function); + Local subclass = CompileRun("var g = class extends f { }; g"); + CHECK(subclass->IsFunction()); + value = CompileRun("new g()"); + CHECK(value->IsFunction()); + CHECK(value == subclass); + value = CompileRun("Reflect.construct(f, [], Array)"); + CHECK(value->IsFunction()); + CHECK(value == + context->Global() + ->Get(context.local(), v8_str("Array")) + .ToLocalChecked()); +} THREADED_TEST(ObjectProtoToString) { v8::Isolate* isolate = CcTest::isolate();