Chromium Code Reviews| Index: src/ia32/stub-cache-ia32.cc |
| diff --git a/src/ia32/stub-cache-ia32.cc b/src/ia32/stub-cache-ia32.cc |
| index bcb02ed7970558b298971f092ae012cd10c20c79..64e71d6aea2e8cd5889eaa85d4b0fd57a70d3460 100644 |
| --- a/src/ia32/stub-cache-ia32.cc |
| +++ b/src/ia32/stub-cache-ia32.cc |
| @@ -1362,11 +1362,11 @@ void CallStubCompiler::GenerateLoadFunctionFromCell(JSGlobalPropertyCell* cell, |
| MaybeObject* CallStubCompiler::GenerateMissBranch() { |
| + MaybeObject* maybe_obj = StubCache::ComputeCallMiss(arguments().immediate(), |
| + kind_, |
| + extra_ic_state_); |
|
Mads Ager (chromium)
2011/01/18 11:28:57
Why do you need the extra_ic_state_ here? One miss
|
| Object* obj; |
| - { MaybeObject* maybe_obj = |
| - StubCache::ComputeCallMiss(arguments().immediate(), kind_); |
| - if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
| - } |
| + if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
| __ jmp(Handle<Code>(Code::cast(obj)), RelocInfo::CODE_TARGET); |
| return obj; |
| } |
| @@ -1686,6 +1686,11 @@ MaybeObject* CallStubCompiler::CompileStringCharCodeAtCall( |
| Label miss; |
| Label index_out_of_range; |
| + Label* index_out_of_range_label = &index_out_of_range; |
| + |
| + if (kind_ == Code::CALL_IC && extra_ic_state_ == DEFAULT_STRING_STUB) { |
| + index_out_of_range_label = &miss; |
| + } |
| GenerateNameCheck(name, &miss); |
| @@ -1715,7 +1720,7 @@ MaybeObject* CallStubCompiler::CompileStringCharCodeAtCall( |
| result, |
| &miss, // When not a string. |
| &miss, // When not a number. |
| - &index_out_of_range, |
| + index_out_of_range_label, |
| STRING_INDEX_IS_NUMBER); |
| char_code_at_generator.GenerateFast(masm()); |
| __ ret((argc + 1) * kPointerSize); |
| @@ -1723,11 +1728,17 @@ MaybeObject* CallStubCompiler::CompileStringCharCodeAtCall( |
| StubRuntimeCallHelper call_helper; |
| char_code_at_generator.GenerateSlow(masm(), call_helper); |
| - __ bind(&index_out_of_range); |
| - __ Set(eax, Immediate(Factory::nan_value())); |
| - __ ret((argc + 1) * kPointerSize); |
| + if (index_out_of_range.is_linked()) { |
| + __ bind(&index_out_of_range); |
| + __ Set(eax, Immediate(Factory::nan_value())); |
| + __ ret((argc + 1) * kPointerSize); |
| + } |
| __ bind(&miss); |
| + if (kind_ == Code::CALL_IC) { |
| + // Restore function name in ecx. |
| + __ Set(ecx, Immediate(Handle<String>(name))); |
| + } |
| Object* obj; |
| { MaybeObject* maybe_obj = GenerateMissBranch(); |
| if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
| @@ -1759,6 +1770,11 @@ MaybeObject* CallStubCompiler::CompileStringCharAtCall( |
| Label miss; |
| Label index_out_of_range; |
| + Label* index_out_of_range_label = &index_out_of_range; |
| + |
| + if (kind_ == Code::CALL_IC && extra_ic_state_ == DEFAULT_STRING_STUB) { |
| + index_out_of_range_label = &miss; |
| + } |
| GenerateNameCheck(name, &miss); |
| @@ -1790,7 +1806,7 @@ MaybeObject* CallStubCompiler::CompileStringCharAtCall( |
| result, |
| &miss, // When not a string. |
| &miss, // When not a number. |
| - &index_out_of_range, |
| + index_out_of_range_label, |
| STRING_INDEX_IS_NUMBER); |
| char_at_generator.GenerateFast(masm()); |
| __ ret((argc + 1) * kPointerSize); |
| @@ -1798,11 +1814,17 @@ MaybeObject* CallStubCompiler::CompileStringCharAtCall( |
| StubRuntimeCallHelper call_helper; |
| char_at_generator.GenerateSlow(masm(), call_helper); |
| - __ bind(&index_out_of_range); |
| - __ Set(eax, Immediate(Factory::empty_string())); |
| - __ ret((argc + 1) * kPointerSize); |
| + if (index_out_of_range.is_linked()) { |
| + __ bind(&index_out_of_range); |
| + __ Set(eax, Immediate(Factory::empty_string())); |
| + __ ret((argc + 1) * kPointerSize); |
| + } |
| __ bind(&miss); |
| + if (kind_ == Code::CALL_IC) { |
| + // Restore function name in ecx. |
| + __ Set(ecx, Immediate(Handle<String>(name))); |
| + } |
| Object* obj; |
| { MaybeObject* maybe_obj = GenerateMissBranch(); |
| if (!maybe_obj->ToObject(&obj)) return maybe_obj; |