Skip to content

Commit e774de1

Browse files
bnoordhuisMylesBorins
authored andcommitted
deps: back-port 306c412c from v8 upstream
The patch has been modified to maintain ABI compatibility. The original change removes the v8::FunctionCallbackInfo<T>::is_construct_call_ field from deps/v8/include/v8.h. The field is set directly by JIT-ted code so the removal of those code paths has been backed out as well. Original commit message: [api] Expose FunctionCallbackInfo::NewTarget This is needed by Blink to implement the Custom Elements spec. BUG=v8:4261 LOG=y Review-Url: https://codereview.chromium.org/1910253005 Cr-Commit-Position: refs/heads/master@{#35833} Fixes: #9288 PR-URL: #9293 Reviewed-By: Ali Ijaz Sheikh <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Myles Borins <[email protected]>
1 parent fd1ffe4 commit e774de1

23 files changed

+167
-150
lines changed

deps/v8/include/v8.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3177,12 +3177,13 @@ class FunctionCallbackInfo {
31773177
Local<Function> Callee() const);
31783178
V8_INLINE Local<Object> This() const;
31793179
V8_INLINE Local<Object> Holder() const;
3180+
V8_INLINE Local<Value> NewTarget() const;
31803181
V8_INLINE bool IsConstructCall() const;
31813182
V8_INLINE Local<Value> Data() const;
31823183
V8_INLINE Isolate* GetIsolate() const;
31833184
V8_INLINE ReturnValue<T> GetReturnValue() const;
31843185
// This shouldn't be public, but the arm compiler needs it.
3185-
static const int kArgsLength = 7;
3186+
static const int kArgsLength = 8;
31863187

31873188
protected:
31883189
friend class internal::FunctionCallbackArguments;
@@ -3194,6 +3195,7 @@ class FunctionCallbackInfo {
31943195
static const int kDataIndex = 4;
31953196
static const int kCalleeIndex = 5;
31963197
static const int kContextSaveIndex = 6;
3198+
static const int kNewTargetIndex = 7;
31973199

31983200
V8_INLINE FunctionCallbackInfo(internal::Object** implicit_args,
31993201
internal::Object** values,
@@ -7902,6 +7904,11 @@ Local<Object> FunctionCallbackInfo<T>::Holder() const {
79027904
&implicit_args_[kHolderIndex]));
79037905
}
79047906

7907+
template<typename T>
7908+
Local<Value> FunctionCallbackInfo<T>::NewTarget() const {
7909+
return Local<Value>(
7910+
reinterpret_cast<Value*>(&implicit_args_[kNewTargetIndex]));
7911+
}
79057912

79067913
template<typename T>
79077914
Local<Value> FunctionCallbackInfo<T>::Data() const {

deps/v8/src/api-arguments.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -206,19 +206,22 @@ class FunctionCallbackArguments
206206
static const int kIsolateIndex = T::kIsolateIndex;
207207
static const int kCalleeIndex = T::kCalleeIndex;
208208
static const int kContextSaveIndex = T::kContextSaveIndex;
209+
static const int kNewTargetIndex = T::kNewTargetIndex;
209210

210211
FunctionCallbackArguments(internal::Isolate* isolate, internal::Object* data,
211212
internal::HeapObject* callee,
212-
internal::Object* holder, internal::Object** argv,
213-
int argc, bool is_construct_call)
213+
internal::Object* holder,
214+
internal::HeapObject* new_target,
215+
internal::Object** argv, int argc)
214216
: Super(isolate),
215217
argv_(argv),
216218
argc_(argc),
217-
is_construct_call_(is_construct_call) {
219+
is_construct_call_(!new_target->IsUndefined()) {
218220
Object** values = begin();
219221
values[T::kDataIndex] = data;
220222
values[T::kCalleeIndex] = callee;
221223
values[T::kHolderIndex] = holder;
224+
values[T::kNewTargetIndex] = new_target;
222225
values[T::kContextSaveIndex] = isolate->heap()->the_hole_value();
223226
values[T::kIsolateIndex] = reinterpret_cast<internal::Object*>(isolate);
224227
// Here the hole is set as default value.

deps/v8/src/arm/builtins-arm.cc

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -604,16 +604,9 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
604604
// r0: number of arguments
605605
// r1: constructor function
606606
// r3: new target
607-
if (is_api_function) {
608-
__ ldr(cp, FieldMemOperand(r1, JSFunction::kContextOffset));
609-
Handle<Code> code =
610-
masm->isolate()->builtins()->HandleApiCallConstruct();
611-
__ Call(code, RelocInfo::CODE_TARGET);
612-
} else {
613-
ParameterCount actual(r0);
614-
__ InvokeFunction(r1, r3, actual, CALL_FUNCTION,
615-
CheckDebugStepCallWrapper());
616-
}
607+
ParameterCount actual(r0);
608+
__ InvokeFunction(r1, r3, actual, CALL_FUNCTION,
609+
CheckDebugStepCallWrapper());
617610

618611
// Store offset of return address for deoptimizer.
619612
if (create_implicit_receiver && !is_api_function) {

deps/v8/src/arm/code-stubs-arm.cc

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5423,7 +5423,11 @@ void CallApiCallbackStub::Generate(MacroAssembler* masm) {
54235423
STATIC_ASSERT(FCA::kReturnValueDefaultValueIndex == 2);
54245424
STATIC_ASSERT(FCA::kIsolateIndex == 1);
54255425
STATIC_ASSERT(FCA::kHolderIndex == 0);
5426-
STATIC_ASSERT(FCA::kArgsLength == 7);
5426+
STATIC_ASSERT(FCA::kNewTargetIndex == 7);
5427+
STATIC_ASSERT(FCA::kArgsLength == 8);
5428+
5429+
// new target
5430+
__ PushRoot(Heap::kUndefinedValueRootIndex);
54275431

54285432
// context save
54295433
__ push(context);

deps/v8/src/arm64/builtins-arm64.cc

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -605,16 +605,9 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
605605
// x0: number of arguments
606606
// x1: constructor function
607607
// x3: new target
608-
if (is_api_function) {
609-
__ Ldr(cp, FieldMemOperand(constructor, JSFunction::kContextOffset));
610-
Handle<Code> code =
611-
masm->isolate()->builtins()->HandleApiCallConstruct();
612-
__ Call(code, RelocInfo::CODE_TARGET);
613-
} else {
614-
ParameterCount actual(argc);
615-
__ InvokeFunction(constructor, new_target, actual, CALL_FUNCTION,
616-
CheckDebugStepCallWrapper());
617-
}
608+
ParameterCount actual(argc);
609+
__ InvokeFunction(constructor, new_target, actual, CALL_FUNCTION,
610+
CheckDebugStepCallWrapper());
618611

619612
// Store offset of return address for deoptimizer.
620613
if (create_implicit_receiver && !is_api_function) {

deps/v8/src/arm64/code-stubs-arm64.cc

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5807,9 +5807,15 @@ void CallApiCallbackStub::Generate(MacroAssembler* masm) {
58075807
STATIC_ASSERT(FCA::kReturnValueDefaultValueIndex == 2);
58085808
STATIC_ASSERT(FCA::kIsolateIndex == 1);
58095809
STATIC_ASSERT(FCA::kHolderIndex == 0);
5810-
STATIC_ASSERT(FCA::kArgsLength == 7);
5810+
STATIC_ASSERT(FCA::kNewTargetIndex == 7);
5811+
STATIC_ASSERT(FCA::kArgsLength == 8);
58115812

5812-
// FunctionCallbackArguments: context, callee and call data.
5813+
// FunctionCallbackArguments
5814+
5815+
// new target
5816+
__ PushRoot(Heap::kUndefinedValueRootIndex);
5817+
5818+
// context, callee and call data.
58135819
__ Push(context, callee, call_data);
58145820

58155821
if (!is_lazy()) {

deps/v8/src/builtins.cc

Lines changed: 36 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
10392
template <>
10493
int BuiltinArguments<BuiltinExtraArguments::kTargetAndNewTarget>::length()
10594
const {
@@ -4247,11 +4236,13 @@ BUILTIN(RestrictedStrictArgumentsPropertiesThrower) {
42474236

42484237
namespace {
42494238

4250-
template <bool is_construct>
42514239
MUST_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-
43544333
Handle<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) {
44324411
namespace {
44334412

44344413
class 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();

deps/v8/src/builtins.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,8 +166,7 @@ inline bool operator&(BuiltinExtraArguments lhs, BuiltinExtraArguments rhs) {
166166
V(SymbolConstructor, kNone) \
167167
V(SymbolConstructor_ConstructStub, kTarget) \
168168
\
169-
V(HandleApiCall, kTarget) \
170-
V(HandleApiCallConstruct, kTarget) \
169+
V(HandleApiCall, kTargetAndNewTarget) \
171170
V(HandleApiCallAsFunction, kNone) \
172171
V(HandleApiCallAsConstructor, kNone) \
173172
\

deps/v8/src/ia32/builtins-ia32.cc

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -186,16 +186,9 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
186186
__ j(greater_equal, &loop);
187187

188188
// Call the function.
189-
if (is_api_function) {
190-
__ mov(esi, FieldOperand(edi, JSFunction::kContextOffset));
191-
Handle<Code> code =
192-
masm->isolate()->builtins()->HandleApiCallConstruct();
193-
__ call(code, RelocInfo::CODE_TARGET);
194-
} else {
195-
ParameterCount actual(eax);
196-
__ InvokeFunction(edi, edx, actual, CALL_FUNCTION,
197-
CheckDebugStepCallWrapper());
198-
}
189+
ParameterCount actual(eax);
190+
__ InvokeFunction(edi, edx, actual, CALL_FUNCTION,
191+
CheckDebugStepCallWrapper());
199192

200193
// Store offset of return address for deoptimizer.
201194
if (create_implicit_receiver && !is_api_function) {

deps/v8/src/ia32/code-stubs-ia32.cc

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5686,9 +5686,14 @@ void CallApiCallbackStub::Generate(MacroAssembler* masm) {
56865686
STATIC_ASSERT(FCA::kReturnValueDefaultValueIndex == 2);
56875687
STATIC_ASSERT(FCA::kIsolateIndex == 1);
56885688
STATIC_ASSERT(FCA::kHolderIndex == 0);
5689-
STATIC_ASSERT(FCA::kArgsLength == 7);
5689+
STATIC_ASSERT(FCA::kNewTargetIndex == 7);
5690+
STATIC_ASSERT(FCA::kArgsLength == 8);
56905691

56915692
__ pop(return_address);
5693+
5694+
// new target
5695+
__ PushRoot(Heap::kUndefinedValueRootIndex);
5696+
56925697
// context save.
56935698
__ push(context);
56945699

0 commit comments

Comments
 (0)