Index: src/builtins.cc |
diff --git a/src/builtins.cc b/src/builtins.cc |
index c4f171b1e3a2e415d037ede5d64dcb3e94230e89..51800ae783c904dc2091d3d7d40fd672018a89c7 100644 |
--- a/src/builtins.cc |
+++ b/src/builtins.cc |
@@ -63,17 +63,26 @@ class BuiltinArguments : public Arguments { |
return Arguments::at<Object>(0); |
} |
+ enum { |
+ kNewTargetOffset = 0, |
Yang
2016/06/30 12:34:23
I think we usually use constants and explicitly sp
jgruber
2016/06/30 14:40:29
Done.
|
+ kTargetOffset, |
+ kArgcOffset, |
+ kNumExtraArgs, |
+ kNumExtraArgsWithReceiver |
+ }; |
+ |
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; } |
}; |
@@ -422,8 +431,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); |
} |
@@ -4561,8 +4570,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); |
} |
@@ -5485,20 +5494,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); |
} |