| Index: src/ia32/stub-cache-ia32.cc
 | 
| ===================================================================
 | 
| --- src/ia32/stub-cache-ia32.cc	(revision 2553)
 | 
| +++ src/ia32/stub-cache-ia32.cc	(working copy)
 | 
| @@ -152,6 +152,27 @@
 | 
|  }
 | 
|  
 | 
|  
 | 
| +template <typename Pushable>
 | 
| +static void PushInterceptorArguments(MacroAssembler* masm,
 | 
| +                                     Register receiver,
 | 
| +                                     Register holder,
 | 
| +                                     Pushable name,
 | 
| +                                     JSObject* holder_obj,
 | 
| +                                     Smi* lookup_hint) {
 | 
| +  __ push(receiver);
 | 
| +  __ push(holder);
 | 
| +  __ push(name);
 | 
| +  // TODO(367): Maybe don't push lookup_hint for LOOKUP_IN_HOLDER and/or
 | 
| +  // LOOKUP_IN_PROTOTYPE, but use a special version of lookup method?
 | 
| +  __ push(Immediate(lookup_hint));
 | 
| +
 | 
| +  InterceptorInfo* interceptor = holder_obj->GetNamedInterceptor();
 | 
| +  __ mov(receiver, Immediate(Handle<Object>(interceptor)));
 | 
| +  __ push(receiver);
 | 
| +  __ push(FieldOperand(receiver, InterceptorInfo::kDataOffset));
 | 
| +}
 | 
| +
 | 
| +
 | 
|  void StubCompiler::GenerateLoadGlobalFunctionPrototype(MacroAssembler* masm,
 | 
|                                                         int index,
 | 
|                                                         Register prototype) {
 | 
| @@ -504,18 +525,18 @@
 | 
|  
 | 
|    // Push the arguments on the JS stack of the caller.
 | 
|    __ pop(scratch2);  // remove return address
 | 
| -  __ push(receiver);  // receiver
 | 
| -  __ push(reg);  // holder
 | 
| -  __ push(name_reg);  // name
 | 
| -  // TODO(367): Maybe don't push lookup_hint for LOOKUP_IN_HOLDER and/or
 | 
| -  // LOOKUP_IN_PROTOTYPE, but use a special version of lookup method?
 | 
| -  __ push(Immediate(lookup_hint));
 | 
| +  PushInterceptorArguments(masm(),
 | 
| +                           receiver,
 | 
| +                           reg,
 | 
| +                           name_reg,
 | 
| +                           holder,
 | 
| +                           lookup_hint);
 | 
|    __ push(scratch2);  // restore return address
 | 
|  
 | 
|    // Do tail-call to the runtime system.
 | 
|    ExternalReference load_ic_property =
 | 
|        ExternalReference(IC_Utility(IC::kLoadInterceptorProperty));
 | 
| -  __ TailCallRuntime(load_ic_property, 4);
 | 
| +  __ TailCallRuntime(load_ic_property, 6);
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -744,15 +765,17 @@
 | 
|    __ EnterInternalFrame();
 | 
|  
 | 
|    // Push arguments on the expression stack.
 | 
| -  __ push(edx);  // receiver
 | 
| -  __ push(reg);  // holder
 | 
| -  __ push(Operand(ebp, (argc + 3) * kPointerSize));  // name
 | 
| -  __ push(Immediate(holder->InterceptorPropertyLookupHint(name)));
 | 
| +  PushInterceptorArguments(masm(),
 | 
| +                           edx,
 | 
| +                           reg,
 | 
| +                           Operand(ebp, (argc + 3) * kPointerSize),
 | 
| +                           holder,
 | 
| +                           holder->InterceptorPropertyLookupHint(name));
 | 
|  
 | 
|    // Perform call.
 | 
|    ExternalReference load_interceptor =
 | 
|        ExternalReference(IC_Utility(IC::kLoadInterceptorProperty));
 | 
| -  __ mov(eax, Immediate(4));
 | 
| +  __ mov(eax, Immediate(6));
 | 
|    __ mov(ebx, Immediate(load_interceptor));
 | 
|  
 | 
|    CEntryStub stub;
 | 
| 
 |