Index: src/ia32/codegen-ia32.cc |
diff --git a/src/ia32/codegen-ia32.cc b/src/ia32/codegen-ia32.cc |
index 5b58a0f0e60394100ccf63f1a2b55b3b0271600e..bd2926f1cfacbf7c1cfb43a75486fca4be9ac304 100644 |
--- a/src/ia32/codegen-ia32.cc |
+++ b/src/ia32/codegen-ia32.cc |
@@ -13295,6 +13295,9 @@ void SubStringStub::Generate(MacroAssembler* masm) { |
__ test(edx, Immediate(kSmiTagMask)); |
__ j(not_zero, &runtime); |
__ sub(ecx, Operand(edx)); |
+ __ cmp(ecx, FieldOperand(eax, String::kLengthOffset)); |
+ Label return_eax; |
+ __ j(equal, &return_eax); |
// Special handling of sub-strings of length 1 and 2. One character strings |
// are handled in the runtime system (looked up in the single character |
// cache). Two character strings are looked for in the symbol cache. |
@@ -13399,12 +13402,15 @@ void SubStringStub::Generate(MacroAssembler* masm) { |
// esi: character of sub string start |
StringHelper::GenerateCopyCharactersREP(masm, edi, esi, ecx, ebx, false); |
__ mov(esi, edx); // Restore esi. |
+ |
+ __ bind(&return_eax); |
__ IncrementCounter(&Counters::sub_string_native, 1); |
__ ret(3 * kPointerSize); |
// Just jump to runtime to create the sub string. |
__ bind(&runtime); |
__ TailCallRuntime(Runtime::kSubString, 3, 1); |
+ |
} |