Chromium Code Reviews| Index: src/arm/lithium-codegen-arm.cc |
| diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc |
| index 4be6d264a8f69d16cebe90c1a986703e2ccb0615..acb8b72e21b0dc2444b93c52b18512a98047284d 100644 |
| --- a/src/arm/lithium-codegen-arm.cc |
| +++ b/src/arm/lithium-codegen-arm.cc |
| @@ -464,7 +464,9 @@ MemOperand LCodeGen::ToHighMemOperand(LOperand* op) const { |
| void LCodeGen::WriteTranslation(LEnvironment* environment, |
| - Translation* translation) { |
| + Translation* translation, |
| + int* args_index, |
|
Sven Panne
2012/09/12 07:14:22
Nit: args_foo => arguments_foo for consistency her
Michael Starzinger
2012/09/12 10:07:28
Done.
|
| + int* args_count) { |
| if (environment == NULL) return; |
| // The translation includes one command per value in the environment. |
| @@ -472,7 +474,11 @@ void LCodeGen::WriteTranslation(LEnvironment* environment, |
| // The output frame height does not include the parameters. |
| int height = translation_size - environment->parameter_count(); |
| - WriteTranslation(environment->outer(), translation); |
| + // Function parameters are arguments to the outermost environment. |
| + *args_index = -environment->parameter_count(); |
| + *args_count = environment->parameter_count(); |
| + |
| + WriteTranslation(environment->outer(), translation, args_index, args_count); |
| int closure_id = *info()->closure() != *environment->closure() |
| ? DefineDeoptimizationLiteral(environment->closure()) |
| : Translation::kSelfLiteralId; |
| @@ -498,6 +504,16 @@ void LCodeGen::WriteTranslation(LEnvironment* environment, |
| translation->BeginArgumentsAdaptorFrame(closure_id, translation_size); |
| break; |
| } |
| + |
| + // Inlined frames which push their arguments cause the index to be |
| + // bumped and a new stack area to be used for materialization. |
| + if (environment->entry() != NULL && |
| + environment->entry()->arguments_pushed()) { |
| + bool outermost = *args_index < 0; |
| + *args_index = outermost ? GetStackSlotCount() : *args_index + *args_count; |
| + *args_count = environment->entry()->arguments_count() + 1; |
| + } |
| + |
| for (int i = 0; i < translation_size; ++i) { |
| LOperand* value = environment->values()->at(i); |
| // spilled_registers_ and spilled_double_registers_ are either |
| @@ -509,7 +525,9 @@ void LCodeGen::WriteTranslation(LEnvironment* environment, |
| AddToTranslation(translation, |
| environment->spilled_registers()[value->index()], |
| environment->HasTaggedValueAt(i), |
| - environment->HasUint32ValueAt(i)); |
| + environment->HasUint32ValueAt(i), |
| + *args_index, |
| + *args_count); |
| } else if ( |
| value->IsDoubleRegister() && |
| environment->spilled_double_registers()[value->index()] != NULL) { |
| @@ -518,14 +536,18 @@ void LCodeGen::WriteTranslation(LEnvironment* environment, |
| translation, |
| environment->spilled_double_registers()[value->index()], |
| false, |
| - false); |
| + false, |
| + *args_index, |
| + *args_count); |
| } |
| } |
| AddToTranslation(translation, |
| value, |
| environment->HasTaggedValueAt(i), |
| - environment->HasUint32ValueAt(i)); |
| + environment->HasUint32ValueAt(i), |
| + *args_index, |
| + *args_count); |
| } |
| } |
| @@ -533,12 +555,14 @@ void LCodeGen::WriteTranslation(LEnvironment* environment, |
| void LCodeGen::AddToTranslation(Translation* translation, |
| LOperand* op, |
| bool is_tagged, |
| - bool is_uint32) { |
| + bool is_uint32, |
| + int arguments_index, |
| + int arguments_count) { |
| if (op == NULL) { |
| // TODO(twuerthinger): Introduce marker operands to indicate that this value |
| // is not present and must be reconstructed from the deoptimizer. Currently |
| // this is only used for the arguments object. |
| - translation->StoreArgumentsObject(); |
| + translation->StoreArgumentsObject(arguments_index, arguments_count); |
| } else if (op->IsStackSlot()) { |
| if (is_tagged) { |
| translation->StoreStackSlot(op->index()); |
| @@ -644,15 +668,16 @@ void LCodeGen::RegisterEnvironmentForDeoptimization(LEnvironment* environment, |
| int frame_count = 0; |
| int jsframe_count = 0; |
| + int args_index = 0; |
| + int args_count = 0; |
| for (LEnvironment* e = environment; e != NULL; e = e->outer()) { |
| ++frame_count; |
| if (e->frame_type() == JS_FUNCTION) { |
| ++jsframe_count; |
| } |
| } |
| - Translation translation(&translations_, frame_count, jsframe_count, |
| - zone()); |
| - WriteTranslation(environment, &translation); |
| + Translation translation(&translations_, frame_count, jsframe_count, zone()); |
| + WriteTranslation(environment, &translation, &args_index, &args_count); |
| int deoptimization_index = deoptimizations_.length(); |
| int pc_offset = masm()->pc_offset(); |
| environment->Register(deoptimization_index, |