Chromium Code Reviews| Index: src/runtime.cc |
| diff --git a/src/runtime.cc b/src/runtime.cc |
| index 6fff55b902ee1519267700e4f351d51d0e2df7af..b7fc651bbd0433fef4f140f040a3ece1ae2662f0 100644 |
| --- a/src/runtime.cc |
| +++ b/src/runtime.cc |
| @@ -7182,6 +7182,102 @@ static MaybeObject* Runtime_DateYMDFromTime(RUNTIME_CALLING_CONVENTION) { |
| static MaybeObject* Runtime_NewArgumentsFast(RUNTIME_CALLING_CONVENTION) { |
| RUNTIME_GET_ISOLATE; |
| + HandleScope scope(isolate); |
| + ASSERT(args.length() == 3); |
| + |
| + Handle<JSFunction> callee = args.at<JSFunction>(0); |
| + Object** parameters = reinterpret_cast<Object**>(args[1]); |
| + const int argument_count = Smi::cast(args[2])->value(); |
| + |
| + Handle<JSObject> result = |
| + isolate->factory()->NewArgumentsObject(callee, argument_count); |
| + // Allocate the elements if needed. |
| + int parameter_count = callee->shared()->formal_parameter_count(); |
| + if (argument_count > 0) { |
|
Kevin Millikin (Chromium)
2011/03/23 16:07:20
I'm aware this is monolithic.
There will eventual
|
| + if (parameter_count > 0) { |
| + int mapped_count = Min(argument_count, parameter_count); |
| + Handle<FixedArray> parameter_map = |
| + isolate->factory()->NewFixedArray(mapped_count + 2, NOT_TENURED); |
| + parameter_map->set_map( |
| + isolate->heap()->non_strict_arguments_elements_map()); |
| + |
| + Handle<Map> old_map(result->map()); |
| + Handle<Map> new_map = |
| + isolate->factory()->CopyMapDropTransitions(old_map); |
| + new_map->set_has_fast_elements(false); |
| + |
| + result->set_map(*new_map); |
| + result->set_elements(*parameter_map); |
| + |
| + // Store the context and the arguments array at the end of the |
|
Mads Ager (chromium)
2011/03/24 08:04:04
end -> beginning?
elements array -> parameter map
Kevin Millikin (Chromium)
2011/03/24 08:42:51
Thanks. Those were some stale comments.
|
| + // elements array. |
| + Handle<Context> context(isolate->context()); |
| + Handle<FixedArray> arguments = |
| + isolate->factory()->NewFixedArray(argument_count, NOT_TENURED); |
| + parameter_map->set(0, *context); |
| + parameter_map->set(1, *arguments); |
| + |
| + // Loop over the actual parameters backwards. |
| + int index = argument_count - 1; |
| + while (index >= mapped_count) { |
| + // These go directly in the arguments array and have no |
| + // corresponding slot in the elements array. |
| + arguments->set(index, *(parameters - index - 1)); |
| + --index; |
| + } |
| + |
| + ScopeInfo<> scope_info(callee->shared()->scope_info()); |
| + while (index >= 0) { |
| + // Detect duplicate names. |
| + Handle<String> name = scope_info.parameter_name(index); |
| + int context_slot_count = scope_info.number_of_context_slots(); |
| + bool duplicate = false; |
| + for (int j = 0; j < index; ++j) { |
| + if (scope_info.parameter_name(j).is_identical_to(name)) { |
| + duplicate = true; |
| + break; |
| + } |
| + } |
| + |
| + if (duplicate) { |
| + // This goes directly in the arguments array with a hole in the |
| + // elements array. |
|
Mads Ager (chromium)
2011/03/24 08:04:04
elements array -> parameter map
|
| + arguments->set(index, *(parameters - index - 1)); |
| + parameter_map->set_the_hole(index + 2); |
| + } else { |
| + // The context index goes in the elements array with a hole in the |
|
Mads Ager (chromium)
2011/03/24 08:04:04
elements array -> parameter map
|
| + // arguments array. |
| + int context_index = -1; |
| + for (int j = Context::MIN_CONTEXT_SLOTS; |
| + j < context_slot_count; |
| + ++j) { |
| + if (scope_info.context_slot_name(j).is_identical_to(name)) { |
| + context_index = j; |
| + break; |
| + } |
| + } |
| + ASSERT(context_index >= 0); |
| + arguments->set_the_hole(index); |
| + parameter_map->set(index + 2, Smi::FromInt(context_index)); |
| + } |
| + |
| + --index; |
| + } |
| + } else { |
| + Handle<FixedArray> elements = |
| + isolate->factory()->NewFixedArray(argument_count, NOT_TENURED); |
| + result->set_elements(*elements); |
| + for (int i = 0; i < argument_count; ++i) { |
| + elements->set(i, *(parameters - i - 1)); |
| + } |
| + } |
| + } |
| + return *result; |
| +} |
| + |
| + |
| +static MaybeObject* Runtime_NewStrictArgumentsFast(RUNTIME_CALLING_CONVENTION) { |
| + RUNTIME_GET_ISOLATE; |
| NoHandleAllocation ha; |
| ASSERT(args.length() == 3); |
| @@ -10683,6 +10779,7 @@ static Handle<Object> GetArgumentsObject(Isolate* isolate, |
| } |
| const int length = frame->ComputeParametersCount(); |
| + UNIMPLEMENTED(); |
| Handle<JSObject> arguments = |
| isolate->factory()->NewArgumentsObject(function, length); |
| Handle<FixedArray> array = isolate->factory()->NewFixedArray(length); |