Reviewers: William Hesse,
Message:
Notice that we don't check the start position if the length is the entire
string.
We assume that we are called with valid arguments
(0<=start<=length<=length),
and as long as we don't crash on invalid arguments, it's ok to return any
value.
Description:
Add special case of taking a substring that is the entire string to stub.
Please review this at http://codereview.chromium.org/2800027/show
Affected files:
M src/ia32/codegen-ia32.cc
M src/x64/codegen-x64.cc
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);
+
}
Index: src/x64/codegen-x64.cc
diff --git a/src/x64/codegen-x64.cc b/src/x64/codegen-x64.cc
index
2854785914405fd1020f25b50a43cc67370b6ef5..7cfd6ce005be9934b45cfd2a1bcaa73efed27a38
100644
--- a/src/x64/codegen-x64.cc
+++ b/src/x64/codegen-x64.cc
@@ -11574,7 +11574,9 @@ void SubStringStub::Generate(MacroAssembler* masm) {
__ JumpIfNotBothPositiveSmi(rcx, rdx, &runtime);
__ SmiSub(rcx, rcx, rdx, NULL); // Overflow doesn't happen.
- __ j(negative, &runtime);
+ __ cmpq(FieldOperand(rax, String::kLengthOffset), rcx);
+ Label return_rax;
+ __ j(equal, &return_rax);
// 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.
@@ -11677,6 +11679,8 @@ void SubStringStub::Generate(MacroAssembler* masm) {
// rsi: character of sub string start
StringHelper::GenerateCopyCharactersREP(masm, rdi, rsi, rcx, false);
__ movq(rsi, rdx); // Restore esi.
+
+ __ bind(&return_rax);
__ IncrementCounter(&Counters::sub_string_native, 1);
__ ret(kArgumentsSize);
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev