| Index: src/codegen-ia32.cc
|
| ===================================================================
|
| --- src/codegen-ia32.cc (revision 409)
|
| +++ src/codegen-ia32.cc (working copy)
|
| @@ -661,21 +661,27 @@
|
| ASSERT(scope->arguments() != NULL);
|
| ASSERT(scope->arguments_shadow() != NULL);
|
| Comment cmnt(masm_, "[ store arguments object");
|
| - {
|
| - Reference target(this, scope->arguments());
|
| - if (!arguments_object_saved) {
|
| - __ push(Operand(ecx));
|
| + { Reference shadow_ref(this, scope->arguments_shadow());
|
| + { Reference arguments_ref(this, scope->arguments());
|
| + // If the newly-allocated arguments object is already on the
|
| + // stack, we make use of the property that references representing
|
| + // variables take up no space on the expression stack (ie, it
|
| + // doesn't matter that the stored value is actually below the
|
| + // reference).
|
| + ASSERT(arguments_ref.size() == 0);
|
| + ASSERT(shadow_ref.size() == 0);
|
| +
|
| + // If the newly-allocated argument object is not already on the
|
| + // stack, we rely on the property that loading a
|
| + // (zero-sized) reference will not clobber the ecx register.
|
| + if (!arguments_object_saved) {
|
| + __ push(ecx);
|
| + }
|
| + SetValue(&arguments_ref);
|
| }
|
| - SetValue(&target);
|
| + SetValue(&shadow_ref);
|
| }
|
| - // The value of arguments must also be stored in .arguments.
|
| - // TODO(1241813): This code can probably be improved by fusing it with
|
| - // the code that stores the arguments object above.
|
| - {
|
| - Reference target(this, scope->arguments_shadow());
|
| - Load(scope->arguments());
|
| - SetValue(&target);
|
| - }
|
| + __ pop(eax); // Value is no longer needed.
|
| }
|
|
|
| // Generate code to 'execute' declarations and initialize
|
|
|