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