Index: src/builtins.cc |
diff --git a/src/builtins.cc b/src/builtins.cc |
index dc4b4b95d64175b5ad571cf9432d5b0ffe93232f..5664c3b1a2a696c1740939d1ca42a86b44dd8a7e 100644 |
--- a/src/builtins.cc |
+++ b/src/builtins.cc |
@@ -64,17 +64,24 @@ class BuiltinArguments : public Arguments { |
return Arguments::at<Object>(0); |
} |
+ static const int kNewTargetOffset = 0; |
+ static const int kTargetOffset = 1; |
+ static const int kArgcOffset = 2; |
+ static const int kNumExtraArgs = 3; |
+ static const int kNumExtraArgsWithReceiver = 4; |
+ |
template <class S> |
Handle<S> target() { |
- return Arguments::at<S>(Arguments::length() - 2); |
+ return Arguments::at<S>(Arguments::length() - 1 - kTargetOffset); |
} |
Handle<HeapObject> new_target() { |
- return Arguments::at<HeapObject>(Arguments::length() - 1); |
+ return Arguments::at<HeapObject>(Arguments::length() - 1 - |
+ kNewTargetOffset); |
} |
// Gets the total number of arguments including the receiver (but |
// excluding extra arguments). |
- int length() const { return Arguments::length() - 2; } |
+ int length() const { return Arguments::length() - kNumExtraArgs; } |
}; |
@@ -423,8 +430,8 @@ RUNTIME_FUNCTION(Runtime_ArrayPush) { |
DCHECK_EQ(2, args.length()); |
Arguments* incoming = reinterpret_cast<Arguments*>(args[0]); |
// Rewrap the arguments as builtins arguments. |
- BuiltinArguments caller_args(incoming->length() + 3, |
- incoming->arguments() + 1); |
+ int argc = incoming->length() + BuiltinArguments::kNumExtraArgsWithReceiver; |
+ BuiltinArguments caller_args(argc, incoming->arguments() + 1); |
return DoArrayPush(isolate, caller_args); |
} |
@@ -4607,8 +4614,8 @@ RUNTIME_FUNCTION(Runtime_FunctionBind) { |
DCHECK_EQ(2, args.length()); |
Arguments* incoming = reinterpret_cast<Arguments*>(args[0]); |
// Rewrap the arguments as builtins arguments. |
- BuiltinArguments caller_args(incoming->length() + 3, |
- incoming->arguments() + 1); |
+ int argc = incoming->length() + BuiltinArguments::kNumExtraArgsWithReceiver; |
+ BuiltinArguments caller_args(argc, incoming->arguments() + 1); |
return DoFunctionBind(isolate, caller_args); |
} |
@@ -5531,20 +5538,24 @@ MaybeHandle<Object> Builtins::InvokeApiFunction(Isolate* isolate, |
const int kBufferSize = 32; |
Object* small_argv[kBufferSize]; |
Object** argv; |
- if (argc + 3 <= kBufferSize) { |
+ const int frame_argc = argc + BuiltinArguments::kNumExtraArgsWithReceiver; |
+ if (frame_argc <= kBufferSize) { |
argv = small_argv; |
} else { |
- argv = new Object*[argc + 3]; |
+ argv = new Object*[frame_argc]; |
} |
- argv[argc + 2] = *receiver; |
+ int cursor = frame_argc - 1; |
+ argv[cursor--] = *receiver; |
for (int i = 0; i < argc; ++i) { |
- argv[argc - i + 1] = *args[i]; |
+ argv[cursor--] = *args[i]; |
} |
- argv[1] = *function; |
- argv[0] = *new_target; |
+ DCHECK(cursor == BuiltinArguments::kArgcOffset); |
+ argv[BuiltinArguments::kArgcOffset] = Smi::FromInt(frame_argc); |
+ argv[BuiltinArguments::kTargetOffset] = *function; |
+ argv[BuiltinArguments::kNewTargetOffset] = *new_target; |
MaybeHandle<Object> result; |
{ |
- RelocatableArguments arguments(isolate, argc + 3, &argv[argc] + 2); |
+ RelocatableArguments arguments(isolate, frame_argc, &argv[frame_argc - 1]); |
result = HandleApiCallHelper<false>(isolate, function, new_target, fun_data, |
receiver, arguments); |
} |