Chromium Code Reviews| 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); |
| } |