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; |