Index: src/ia32/full-codegen-ia32.cc |
diff --git a/src/ia32/full-codegen-ia32.cc b/src/ia32/full-codegen-ia32.cc |
index 2622b5e5b45f2b24224ae6c6c02f3c1e30e0b08c..ea947eedaf940009e375493c78b6ecfc30511859 100644 |
--- a/src/ia32/full-codegen-ia32.cc |
+++ b/src/ia32/full-codegen-ia32.cc |
@@ -2339,16 +2339,21 @@ void FullCodeGenerator::VisitCall(Call* expr) { |
// Call to a keyed property. |
// For a synthetic property use keyed load IC followed by function call, |
// for a regular property use keyed EmitCallIC. |
- { PreservePositionScope scope(masm()->positions_recorder()); |
- VisitForStackValue(prop->obj()); |
- } |
if (prop->is_synthetic()) { |
- { PreservePositionScope scope(masm()->positions_recorder()); |
- VisitForAccumulatorValue(prop->key()); |
- } |
+ // Do not visit the object and key subexpressions (they are shared |
+ // by all occurrences of the same rewritten parameter). |
+ ASSERT(prop->obj()->AsVariableProxy() != NULL); |
+ ASSERT(prop->obj()->AsVariableProxy()->var()->AsSlot() != NULL); |
+ Slot* slot = prop->obj()->AsVariableProxy()->var()->AsSlot(); |
+ MemOperand operand = EmitSlotSearch(slot, edx); |
+ __ mov(edx, operand); |
+ |
+ ASSERT(prop->key()->AsLiteral() != NULL); |
+ ASSERT(prop->key()->AsLiteral()->handle()->IsSmi()); |
+ __ mov(eax, prop->key()->AsLiteral()->handle()); |
+ |
// Record source code position for IC call. |
SetSourcePosition(prop->position()); |
- __ pop(edx); // We do not need to keep the receiver. |
Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize)); |
EmitCallIC(ic, RelocInfo::CODE_TARGET); |
@@ -2359,6 +2364,9 @@ void FullCodeGenerator::VisitCall(Call* expr) { |
__ push(FieldOperand(ecx, GlobalObject::kGlobalReceiverOffset)); |
EmitCallWithStub(expr); |
} else { |
+ { PreservePositionScope scope(masm()->positions_recorder()); |
+ VisitForStackValue(prop->obj()); |
+ } |
EmitKeyedCallWithIC(expr, prop->key(), RelocInfo::CODE_TARGET); |
} |
} |