| Index: src/ia32/stub-cache-ia32.cc
|
| ===================================================================
|
| --- src/ia32/stub-cache-ia32.cc (revision 4791)
|
| +++ src/ia32/stub-cache-ia32.cc (working copy)
|
| @@ -1029,6 +1029,20 @@
|
| }
|
|
|
|
|
| +void CallStubCompiler::GenerateNameCheck(String* name, Label* miss) {
|
| + if (kind_ == Code::KEYED_CALL_IC) {
|
| + __ cmp(Operand(ecx), Immediate(Handle<String>(name)));
|
| + __ j(not_equal, miss, not_taken);
|
| + }
|
| +}
|
| +
|
| +
|
| +void CallStubCompiler::GenerateMissBranch() {
|
| + Handle<Code> ic = ComputeCallMiss(arguments().immediate(), kind_);
|
| + __ jmp(ic, RelocInfo::CODE_TARGET);
|
| +}
|
| +
|
| +
|
| Object* CallStubCompiler::CompileCallField(JSObject* object,
|
| JSObject* holder,
|
| int index,
|
| @@ -1042,6 +1056,8 @@
|
| // -----------------------------------
|
| Label miss;
|
|
|
| + GenerateNameCheck(name, &miss);
|
| +
|
| // Get the receiver from the stack.
|
| const int argc = arguments().immediate();
|
| __ mov(edx, Operand(esp, (argc + 1) * kPointerSize));
|
| @@ -1073,8 +1089,7 @@
|
|
|
| // Handle call cache miss.
|
| __ bind(&miss);
|
| - Handle<Code> ic = ComputeCallMiss(arguments().immediate());
|
| - __ jmp(ic, RelocInfo::CODE_TARGET);
|
| + GenerateMissBranch();
|
|
|
| // Return the generated code.
|
| return GetCode(FIELD, name);
|
| @@ -1102,6 +1117,8 @@
|
|
|
| Label miss;
|
|
|
| + GenerateNameCheck(name, &miss);
|
| +
|
| // Get the receiver from the stack.
|
| const int argc = arguments().immediate();
|
| __ mov(edx, Operand(esp, (argc + 1) * kPointerSize));
|
| @@ -1219,8 +1236,7 @@
|
| }
|
|
|
| __ bind(&miss);
|
| - Handle<Code> ic = ComputeCallMiss(arguments().immediate());
|
| - __ jmp(ic, RelocInfo::CODE_TARGET);
|
| + GenerateMissBranch();
|
|
|
| // Return the generated code.
|
| return GetCode(function);
|
| @@ -1248,6 +1264,8 @@
|
|
|
| Label miss, return_undefined, call_builtin;
|
|
|
| + GenerateNameCheck(name, &miss);
|
| +
|
| // Get the receiver from the stack.
|
| const int argc = arguments().immediate();
|
| __ mov(edx, Operand(esp, (argc + 1) * kPointerSize));
|
| @@ -1301,8 +1319,7 @@
|
| 1);
|
|
|
| __ bind(&miss);
|
| - Handle<Code> ic = ComputeCallMiss(arguments().immediate());
|
| - __ jmp(ic, RelocInfo::CODE_TARGET);
|
| + GenerateMissBranch();
|
|
|
| // Return the generated code.
|
| return GetCode(function);
|
| @@ -1326,6 +1343,7 @@
|
|
|
| Label miss;
|
| Label index_out_of_range;
|
| + GenerateNameCheck(name, &miss);
|
|
|
| // Check that the maps starting from the prototype haven't changed.
|
| GenerateLoadGlobalFunctionPrototype(masm(),
|
| @@ -1335,7 +1353,7 @@
|
| ebx, edx, name, &miss);
|
|
|
| Register receiver = ebx;
|
| - Register index = ecx;
|
| + Register index = edi;
|
| Register scratch = edx;
|
| Register result = eax;
|
| __ mov(receiver, Operand(esp, (argc + 1) * kPointerSize));
|
| @@ -1364,11 +1382,8 @@
|
| __ ret((argc + 1) * kPointerSize);
|
|
|
| __ bind(&miss);
|
| - // Restore function name in ecx.
|
| - __ Set(ecx, Immediate(Handle<String>(name)));
|
|
|
| - Handle<Code> ic = ComputeCallMiss(argc);
|
| - __ jmp(ic, RelocInfo::CODE_TARGET);
|
| + GenerateMissBranch();
|
|
|
| // Return the generated code.
|
| return GetCode(function);
|
| @@ -1393,6 +1408,8 @@
|
| Label miss;
|
| Label index_out_of_range;
|
|
|
| + GenerateNameCheck(name, &miss);
|
| +
|
| // Check that the maps starting from the prototype haven't changed.
|
| GenerateLoadGlobalFunctionPrototype(masm(),
|
| Context::STRING_FUNCTION_INDEX,
|
| @@ -1401,7 +1418,7 @@
|
| ebx, edx, name, &miss);
|
|
|
| Register receiver = eax;
|
| - Register index = ecx;
|
| + Register index = edi;
|
| Register scratch1 = ebx;
|
| Register scratch2 = edx;
|
| Register result = eax;
|
| @@ -1433,10 +1450,8 @@
|
|
|
| __ bind(&miss);
|
| // Restore function name in ecx.
|
| - __ Set(ecx, Immediate(Handle<String>(name)));
|
|
|
| - Handle<Code> ic = ComputeCallMiss(argc);
|
| - __ jmp(ic, RelocInfo::CODE_TARGET);
|
| + GenerateMissBranch();
|
|
|
| // Return the generated code.
|
| return GetCode(function);
|
| @@ -1469,6 +1484,8 @@
|
|
|
| Label miss_in_smi_check;
|
|
|
| + GenerateNameCheck(name, &miss_in_smi_check);
|
| +
|
| // Get the receiver from the stack.
|
| const int argc = arguments().immediate();
|
| __ mov(edx, Operand(esp, (argc + 1) * kPointerSize));
|
| @@ -1593,8 +1610,7 @@
|
| FreeSpaceForFastApiCall(masm(), eax);
|
| }
|
| __ bind(&miss_in_smi_check);
|
| - Handle<Code> ic = ComputeCallMiss(arguments().immediate());
|
| - __ jmp(ic, RelocInfo::CODE_TARGET);
|
| + GenerateMissBranch();
|
|
|
| // Return the generated code.
|
| return GetCode(function);
|
| @@ -1613,6 +1629,8 @@
|
| // -----------------------------------
|
| Label miss;
|
|
|
| + GenerateNameCheck(name, &miss);
|
| +
|
| // Get the number of arguments.
|
| const int argc = arguments().immediate();
|
|
|
| @@ -1655,8 +1673,7 @@
|
|
|
| // Handle load cache miss.
|
| __ bind(&miss);
|
| - Handle<Code> ic = ComputeCallMiss(argc);
|
| - __ jmp(ic, RelocInfo::CODE_TARGET);
|
| + GenerateMissBranch();
|
|
|
| // Return the generated code.
|
| return GetCode(INTERCEPTOR, name);
|
| @@ -1677,6 +1694,8 @@
|
| // -----------------------------------
|
| Label miss;
|
|
|
| + GenerateNameCheck(name, &miss);
|
| +
|
| // Get the number of arguments.
|
| const int argc = arguments().immediate();
|
|
|
| @@ -1739,8 +1758,7 @@
|
| // Handle call cache miss.
|
| __ bind(&miss);
|
| __ IncrementCounter(&Counters::call_global_inline_miss, 1);
|
| - Handle<Code> ic = ComputeCallMiss(arguments().immediate());
|
| - __ jmp(ic, RelocInfo::CODE_TARGET);
|
| + GenerateMissBranch();
|
|
|
| // Return the generated code.
|
| return GetCode(NORMAL, name);
|
|
|