Index: src/ia32/full-codegen-ia32.cc |
=================================================================== |
--- src/ia32/full-codegen-ia32.cc (revision 6703) |
+++ src/ia32/full-codegen-ia32.cc (working copy) |
@@ -307,12 +307,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 |
} |
} |
@@ -713,18 +715,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); |