| Index: src/runtime.cc
|
| diff --git a/src/runtime.cc b/src/runtime.cc
|
| index bd3b8233a03a9a4042ff0f31fb9ecd5d96c9ad68..ddfdb7fd0c7d7f5f980c619c6e2a117bd9753d5d 100644
|
| --- a/src/runtime.cc
|
| +++ b/src/runtime.cc
|
| @@ -7066,6 +7066,46 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_NewClosure) {
|
| return *result;
|
| }
|
|
|
| +
|
| +static SmartPointer<Object**> GetNonBoundArguments(int bound_argc,
|
| + int* total_argc) {
|
| + // Find frame containing arguments passed to the caller.
|
| + JavaScriptFrameIterator it;
|
| + JavaScriptFrame* frame = it.frame();
|
| + List<JSFunction*> functions(2);
|
| + frame->GetFunctions(&functions);
|
| + if (functions.length() > 1) {
|
| + int inlined_frame_index = functions.length() - 1;
|
| + JSFunction* inlined_function = functions[inlined_frame_index];
|
| + int args_count = inlined_function->shared()->formal_parameter_count();
|
| + ScopedVector<SlotRef> args_slots(args_count);
|
| + SlotRef::ComputeSlotMappingForArguments(frame,
|
| + inlined_frame_index,
|
| + &args_slots);
|
| +
|
| + *total_argc = bound_argc + args_count;
|
| + SmartPointer<Object**> param_data(NewArray<Object**>(*total_argc));
|
| + for (int i = 0; i < args_count; i++) {
|
| + Handle<Object> val = args_slots[i].GetValue();
|
| + param_data[bound_argc + i] = val.location();
|
| + }
|
| + return param_data;
|
| + } else {
|
| + it.AdvanceToArgumentsFrame();
|
| + frame = it.frame();
|
| + int args_count = frame->ComputeParametersCount();
|
| +
|
| + *total_argc = bound_argc + args_count;
|
| + SmartPointer<Object**> param_data(NewArray<Object**>(*total_argc));
|
| + for (int i = 0; i < args_count; i++) {
|
| + Handle<Object> val = Handle<Object>(frame->GetParameter(i));
|
| + param_data[bound_argc + i] = val.location();
|
| + }
|
| + return param_data;
|
| + }
|
| +}
|
| +
|
| +
|
| RUNTIME_FUNCTION(MaybeObject*, Runtime_NewObjectFromBound) {
|
| HandleScope scope(isolate);
|
| ASSERT(args.length() == 2);
|
| @@ -7073,34 +7113,22 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_NewObjectFromBound) {
|
| CONVERT_ARG_CHECKED(JSFunction, function, 0);
|
|
|
| // Second argument is either null or an array of bound arguments.
|
| - FixedArray* bound_args = NULL;
|
| + Handle<FixedArray> bound_args;
|
| int bound_argc = 0;
|
| if (!args[1]->IsNull()) {
|
| CONVERT_ARG_CHECKED(JSArray, params, 1);
|
| RUNTIME_ASSERT(params->HasFastElements());
|
| - bound_args = FixedArray::cast(params->elements());
|
| + bound_args = Handle<FixedArray>(FixedArray::cast(params->elements()));
|
| bound_argc = Smi::cast(params->length())->value();
|
| }
|
|
|
| - // Find frame containing arguments passed to the caller.
|
| - JavaScriptFrameIterator it;
|
| - JavaScriptFrame* frame = it.frame();
|
| - ASSERT(!frame->is_optimized());
|
| - it.AdvanceToArgumentsFrame();
|
| - frame = it.frame();
|
| - int argc = frame->ComputeParametersCount();
|
| -
|
| - // Prepend bound arguments to caller's arguments.
|
| - int total_argc = bound_argc + argc;
|
| - SmartPointer<Object**> param_data(NewArray<Object**>(total_argc));
|
| + int total_argc = 0;
|
| + SmartPointer<Object**> param_data =
|
| + GetNonBoundArguments(bound_argc, &total_argc);
|
| for (int i = 0; i < bound_argc; i++) {
|
| Handle<Object> val = Handle<Object>(bound_args->get(i));
|
| param_data[i] = val.location();
|
| }
|
| - for (int i = 0; i < argc; i++) {
|
| - Handle<Object> val = Handle<Object>(frame->GetParameter(i));
|
| - param_data[bound_argc + i] = val.location();
|
| - }
|
|
|
| bool exception = false;
|
| Handle<Object> result =
|
|
|