| Index: src/ia32/full-codegen-ia32.cc
 | 
| ===================================================================
 | 
| --- src/ia32/full-codegen-ia32.cc	(revision 3894)
 | 
| +++ src/ia32/full-codegen-ia32.cc	(working copy)
 | 
| @@ -845,7 +845,7 @@
 | 
|  
 | 
|      // Load the object.
 | 
|      MemOperand object_loc = EmitSlotSearch(object_slot, eax);
 | 
| -    __ push(object_loc);
 | 
| +    __ mov(edx, object_loc);
 | 
|  
 | 
|      // Assert that the key is a smi.
 | 
|      Literal* key_literal = property->key()->AsLiteral();
 | 
| @@ -853,7 +853,7 @@
 | 
|      ASSERT(key_literal->handle()->IsSmi());
 | 
|  
 | 
|      // Load the key.
 | 
| -    __ push(Immediate(key_literal->handle()));
 | 
| +    __ mov(eax, Immediate(key_literal->handle()));
 | 
|  
 | 
|      // Do a keyed property load.
 | 
|      Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize));
 | 
| @@ -862,7 +862,7 @@
 | 
|      // call. It is treated specially by the LoadIC code.
 | 
|      __ nop();
 | 
|      // Drop key and object left on the stack by IC.
 | 
| -    DropAndApply(2, context, eax);
 | 
| +    Apply(context, eax);
 | 
|    }
 | 
|  }
 | 
|  
 | 
| @@ -1189,10 +1189,10 @@
 | 
|      Apply(context_, eax);
 | 
|    } else {
 | 
|      VisitForValue(expr->obj(), kStack);
 | 
| -    VisitForValue(expr->key(), kStack);
 | 
| +    VisitForValue(expr->key(), kAccumulator);
 | 
| +    __ pop(edx);
 | 
|      EmitKeyedPropertyLoad(expr);
 | 
| -    // Drop key and receiver left on the stack by IC.
 | 
| -    DropAndApply(2, context_, eax);
 | 
| +    Apply(context_, eax);
 | 
|    }
 | 
|  }
 | 
|  
 | 
| @@ -1263,25 +1263,31 @@
 | 
|        // Call to a keyed property, use keyed load IC followed by function
 | 
|        // call.
 | 
|        VisitForValue(prop->obj(), kStack);
 | 
| -      VisitForValue(prop->key(), kStack);
 | 
| +      VisitForValue(prop->key(), kAccumulator);
 | 
|        // Record source code position for IC call.
 | 
|        SetSourcePosition(prop->position());
 | 
| +      if (prop->is_synthetic()) {
 | 
| +        __ pop(edx);  // We do not need to keep the receiver.
 | 
| +      } else {
 | 
| +        __ mov(edx, Operand(esp, 0));  // Keep receiver, to call function on.
 | 
| +      }
 | 
| +
 | 
|        Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize));
 | 
|        __ call(ic, RelocInfo::CODE_TARGET);
 | 
|        // By emitting a nop we make sure that we do not have a "test eax,..."
 | 
|        // instruction after the call it is treated specially by the LoadIC code.
 | 
|        __ nop();
 | 
| -      // Drop key left on the stack by IC.
 | 
| -      __ Drop(1);
 | 
| -      // Pop receiver.
 | 
| -      __ pop(ebx);
 | 
| -      // Push result (function).
 | 
| -      __ push(eax);
 | 
| -      // Push receiver object on stack.
 | 
|        if (prop->is_synthetic()) {
 | 
| +        // Push result (function).
 | 
| +        __ push(eax);
 | 
| +        // Push Global receiver.
 | 
|          __ mov(ecx, CodeGenerator::GlobalObject());
 | 
|          __ push(FieldOperand(ecx, GlobalObject::kGlobalReceiverOffset));
 | 
|        } else {
 | 
| +        // Pop receiver.
 | 
| +        __ pop(ebx);
 | 
| +        // Push result (function).
 | 
| +        __ push(eax);
 | 
|          __ push(ebx);
 | 
|        }
 | 
|        EmitCallWithStub(expr);
 | 
| @@ -1570,7 +1576,9 @@
 | 
|        EmitNamedPropertyLoad(prop);
 | 
|      } else {
 | 
|        VisitForValue(prop->obj(), kStack);
 | 
| -      VisitForValue(prop->key(), kStack);
 | 
| +      VisitForValue(prop->key(), kAccumulator);
 | 
| +      __ mov(edx, Operand(esp, 0));
 | 
| +      __ push(eax);
 | 
|        EmitKeyedPropertyLoad(prop);
 | 
|      }
 | 
|    }
 | 
| 
 |