| Index: src/ia32/stub-cache-ia32.cc
|
| diff --git a/src/ia32/stub-cache-ia32.cc b/src/ia32/stub-cache-ia32.cc
|
| index 69e3bec5d1f6e0968aa428d7eb1a733058017f05..5dacfda51c17f5011a8aa97f6ae82d62b37e7c57 100644
|
| --- a/src/ia32/stub-cache-ia32.cc
|
| +++ b/src/ia32/stub-cache-ia32.cc
|
| @@ -152,22 +152,6 @@ void StubCache::GenerateProbe(MacroAssembler* masm,
|
| }
|
|
|
|
|
| -static void PushInterceptorArguments(MacroAssembler* masm,
|
| - Register receiver,
|
| - Register holder,
|
| - Register name,
|
| - JSObject* holder_obj) {
|
| - __ push(receiver);
|
| - __ push(holder);
|
| - __ push(name);
|
| - InterceptorInfo* interceptor = holder_obj->GetNamedInterceptor();
|
| - ASSERT(!Heap::InNewSpace(interceptor));
|
| - __ mov(receiver, Immediate(Handle<Object>(interceptor)));
|
| - __ push(receiver);
|
| - __ push(FieldOperand(receiver, InterceptorInfo::kDataOffset));
|
| -}
|
| -
|
| -
|
| void StubCompiler::GenerateLoadGlobalFunctionPrototype(MacroAssembler* masm,
|
| int index,
|
| Register prototype) {
|
| @@ -287,20 +271,31 @@ void StubCompiler::GenerateFastPropertyLoad(MacroAssembler* masm,
|
| }
|
|
|
|
|
| +static void PushInterceptorArguments(MacroAssembler* masm,
|
| + Register receiver,
|
| + Register holder,
|
| + Register name,
|
| + JSObject* holder_obj) {
|
| + __ push(receiver);
|
| + __ push(holder);
|
| + __ push(name);
|
| + InterceptorInfo* interceptor = holder_obj->GetNamedInterceptor();
|
| + ASSERT(!Heap::InNewSpace(interceptor));
|
| + __ mov(receiver, Immediate(Handle<Object>(interceptor)));
|
| + __ push(receiver);
|
| + __ push(FieldOperand(receiver, InterceptorInfo::kDataOffset));
|
| +}
|
| +
|
| +
|
| static void CompileCallLoadPropertyWithInterceptor(MacroAssembler* masm,
|
| Register receiver,
|
| Register holder,
|
| Register name,
|
| JSObject* holder_obj) {
|
| PushInterceptorArguments(masm, receiver, holder, name, holder_obj);
|
| -
|
| - ExternalReference ref =
|
| - ExternalReference(IC_Utility(IC::kLoadPropertyWithInterceptorOnly));
|
| - __ mov(eax, Immediate(5));
|
| - __ mov(ebx, Immediate(ref));
|
| -
|
| - CEntryStub stub(1);
|
| - __ CallStub(&stub);
|
| + __ CallExternalReference(
|
| + ExternalReference(IC_Utility(IC::kLoadPropertyWithInterceptorOnly)),
|
| + 5);
|
| }
|
|
|
|
|
| @@ -364,7 +359,7 @@ class LoadInterceptorCompiler BASE_EMBEDDED {
|
| LookupResult* lookup,
|
| String* name,
|
| Label* miss_label) {
|
| - AccessorInfo* callback = 0;
|
| + AccessorInfo* callback = NULL;
|
| bool optimize = false;
|
| // So far the most popular follow ups for interceptor loads are FIELD
|
| // and CALLBACKS, so inline only them, other cases may be added
|
| @@ -683,7 +678,6 @@ class CallInterceptorCompiler BASE_EMBEDDED {
|
| Register name)
|
| : stub_compiler_(stub_compiler),
|
| arguments_(arguments),
|
| - argc_(arguments.immediate()),
|
| name_(name) {}
|
|
|
| void Compile(MacroAssembler* masm,
|
| @@ -740,6 +734,7 @@ class CallInterceptorCompiler BASE_EMBEDDED {
|
| const CallOptimization& optimization,
|
| Label* miss_label) {
|
| ASSERT(optimization.is_constant_call());
|
| + ASSERT(!lookup->holder()->IsGlobalObject());
|
|
|
| int depth1 = kInvalidProtoDepth;
|
| int depth2 = kInvalidProtoDepth;
|
| @@ -780,27 +775,11 @@ class CallInterceptorCompiler BASE_EMBEDDED {
|
| scratch1, scratch2, name,
|
| depth2, miss);
|
|
|
| - if (lookup->holder()->IsGlobalObject()) {
|
| - ASSERT(!can_do_fast_api_call);
|
| - __ mov(edx, Operand(esp, (argc_ + 1) * kPointerSize));
|
| - __ mov(edx, FieldOperand(edx, GlobalObject::kGlobalReceiverOffset));
|
| - __ mov(Operand(esp, (argc_ + 1) * kPointerSize), edx);
|
| - }
|
| -
|
| if (can_do_fast_api_call) {
|
| - GenerateFastApiCall(masm, optimization, argc_);
|
| + GenerateFastApiCall(masm, optimization, arguments_.immediate());
|
| } else {
|
| - // Get the function and setup the context.
|
| - JSFunction* function = optimization.constant_function();
|
| - __ mov(edi, Immediate(Handle<JSFunction>(function)));
|
| - __ mov(esi, FieldOperand(edi, JSFunction::kContextOffset));
|
| -
|
| // Jump to the cached code (tail call).
|
| - ASSERT(function->is_compiled());
|
| - Handle<Code> code(function->code());
|
| - ParameterCount expected(function->shared()->formal_parameter_count());
|
| - __ InvokeCode(code, expected, arguments_,
|
| - RelocInfo::CODE_TARGET, JUMP_FUNCTION);
|
| + __ InvokeFunction(optimization.constant_function(), arguments_);
|
| }
|
|
|
| if (can_do_fast_api_call) {
|
| @@ -838,13 +817,10 @@ class CallInterceptorCompiler BASE_EMBEDDED {
|
| name_,
|
| holder_obj);
|
|
|
| - ExternalReference ref = ExternalReference(
|
| - IC_Utility(IC::kLoadPropertyWithInterceptorForCall));
|
| - __ mov(eax, Immediate(5));
|
| - __ mov(ebx, Immediate(ref));
|
| -
|
| - CEntryStub stub(1);
|
| - __ CallStub(&stub);
|
| + __ CallExternalReference(
|
| + ExternalReference(
|
| + IC_Utility(IC::kLoadPropertyWithInterceptorForCall)),
|
| + 5);
|
|
|
| // Restore the name_ register.
|
| __ pop(name_);
|
| @@ -876,7 +852,6 @@ class CallInterceptorCompiler BASE_EMBEDDED {
|
|
|
| StubCompiler* stub_compiler_;
|
| const ParameterCount& arguments_;
|
| - const int argc_;
|
| Register name_;
|
| };
|
|
|
| @@ -1378,16 +1353,7 @@ Object* CallStubCompiler::CompileCallConstant(Object* object,
|
| if (depth != kInvalidProtoDepth) {
|
| GenerateFastApiCall(masm(), optimization, argc);
|
| } else {
|
| - // Get the function and setup the context.
|
| - __ mov(edi, Immediate(Handle<JSFunction>(function)));
|
| - __ mov(esi, FieldOperand(edi, JSFunction::kContextOffset));
|
| -
|
| - // Jump to the cached code (tail call).
|
| - ASSERT(function->is_compiled());
|
| - Handle<Code> code(function->code());
|
| - ParameterCount expected(function->shared()->formal_parameter_count());
|
| - __ InvokeCode(code, expected, arguments(),
|
| - RelocInfo::CODE_TARGET, JUMP_FUNCTION);
|
| + __ InvokeFunction(function, arguments());
|
| }
|
|
|
| // Handle call cache miss.
|
|
|