| Index: src/ia32/full-codegen-ia32.cc
 | 
| ===================================================================
 | 
| --- src/ia32/full-codegen-ia32.cc	(revision 6703)
 | 
| +++ src/ia32/full-codegen-ia32.cc	(working copy)
 | 
| @@ -310,12 +310,14 @@
 | 
|      // patch with the code required by the debugger.
 | 
|      __ mov(esp, ebp);
 | 
|      __ pop(ebp);
 | 
| -    __ ret((scope()->num_parameters() + 1) * kPointerSize);
 | 
| +
 | 
| +    int arguments_bytes = (scope()->num_parameters() + 1) * kPointerSize;
 | 
| +    __ Ret(arguments_bytes, ecx);
 | 
|  #ifdef ENABLE_DEBUGGER_SUPPORT
 | 
| -    // Check that the size of the code used for returning matches what is
 | 
| -    // expected by the debugger.
 | 
| -    ASSERT_EQ(Assembler::kJSReturnSequenceLength,
 | 
| -              masm_->SizeOfCodeGeneratedSince(&check_exit_codesize));
 | 
| +    // Check that the size of the code used for returning is large enough
 | 
| +    // for the debugger's requirements.
 | 
| +    ASSERT(Assembler::kJSReturnSequenceLength <=
 | 
| +           masm_->SizeOfCodeGeneratedSince(&check_exit_codesize));
 | 
|  #endif
 | 
|    }
 | 
|  }
 | 
| @@ -717,18 +719,25 @@
 | 
|    } else if (prop != NULL) {
 | 
|      if (function != NULL || mode == Variable::CONST) {
 | 
|        // We are declaring a function or constant that rewrites to a
 | 
| -      // property.  Use (keyed) IC to set the initial value.
 | 
| -      VisitForStackValue(prop->obj());
 | 
| +      // property.  Use (keyed) IC to set the initial value.  We cannot
 | 
| +      // visit the rewrite because it's shared and we risk recording
 | 
| +      // duplicate AST IDs for bailouts from optimized code.
 | 
| +      ASSERT(prop->obj()->AsVariableProxy() != NULL);
 | 
| +      { AccumulatorValueContext for_object(this);
 | 
| +        EmitVariableLoad(prop->obj()->AsVariableProxy()->var());
 | 
| +      }
 | 
| +
 | 
|        if (function != NULL) {
 | 
| -        VisitForStackValue(prop->key());
 | 
| +        __ push(eax);
 | 
|          VisitForAccumulatorValue(function);
 | 
| -        __ pop(ecx);
 | 
| +        __ pop(edx);
 | 
|        } else {
 | 
| -        VisitForAccumulatorValue(prop->key());
 | 
| -        __ mov(ecx, result_register());
 | 
| -        __ mov(result_register(), Factory::the_hole_value());
 | 
| +        __ mov(edx, eax);
 | 
| +        __ mov(eax, Factory::the_hole_value());
 | 
|        }
 | 
| -      __ pop(edx);
 | 
| +      ASSERT(prop->key()->AsLiteral() != NULL &&
 | 
| +             prop->key()->AsLiteral()->handle()->IsSmi());
 | 
| +      __ Set(ecx, Immediate(prop->key()->AsLiteral()->handle()));
 | 
|  
 | 
|        Handle<Code> ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize));
 | 
|        EmitCallIC(ic, RelocInfo::CODE_TARGET);
 | 
| @@ -3949,8 +3958,7 @@
 | 
|    // Call stub for +1/-1.
 | 
|    __ mov(edx, eax);
 | 
|    __ mov(eax, Immediate(Smi::FromInt(1)));
 | 
| -  TypeRecordingBinaryOpStub stub(expr->binary_op(),
 | 
| -                                 NO_OVERWRITE);
 | 
| +  TypeRecordingBinaryOpStub stub(expr->binary_op(), NO_OVERWRITE);
 | 
|    EmitCallIC(stub.GetCode(), &patch_site);
 | 
|    __ bind(&done);
 | 
|  
 | 
| 
 |