Commit ce86c1bf authored by yangguo@chromium.org's avatar yangguo@chromium.org

Avoid bailing out to runtime for short substrings.

This significantly improves the speed for creating short substrings (less than 13 characters) from slices, flat cons strings and external strings.

TEST=string-external-cached.js, string-slices.js

Review URL: http://codereview.chromium.org/8889012

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@10221 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent f1649cf3
This diff is collapsed.
...@@ -59,7 +59,7 @@ function test() { ...@@ -59,7 +59,7 @@ function test() {
} catch (ex) { } } catch (ex) { }
assertEquals("1", charat_short.charAt(1)); assertEquals("1", charat_short.charAt(1));
// Test regexp. // Test regexp and short substring.
var re = /(A|B)/; var re = /(A|B)/;
var rere = /(T.{1,2}B)/; var rere = /(T.{1,2}B)/;
var ascii = "ABCDEFGHIJKLMNOPQRST"; var ascii = "ABCDEFGHIJKLMNOPQRST";
...@@ -81,6 +81,10 @@ function test() { ...@@ -81,6 +81,10 @@ function test() {
assertEquals(["A", "A"], re.exec(twobyte)); assertEquals(["A", "A"], re.exec(twobyte));
assertEquals(["B", "B"], re.exec(twobyte_slice)); assertEquals(["B", "B"], re.exec(twobyte_slice));
assertEquals(["T_AB", "T_AB"], rere.exec(twobyte_cons)); assertEquals(["T_AB", "T_AB"], rere.exec(twobyte_cons));
assertEquals("DEFG", ascii_slice.substr(2, 4));
assertEquals("DEFG", twobyte_slice.substr(2, 4));
assertEquals("DEFG", ascii_cons.substr(3, 4));
assertEquals("DEFG", twobyte_cons.substr(4, 4));
} }
} }
......
...@@ -160,6 +160,23 @@ for ( var i = 0; i < 1000; i++) { ...@@ -160,6 +160,23 @@ for ( var i = 0; i < 1000; i++) {
f(flat, cons, slice, i); f(flat, cons, slice, i);
} }
// Short substrings.
flat = "abcdefghijkl12345";
cons = flat + flat.toUpperCase();
/x/.exec(cons); // Flatten cons
slice = "abcdefghijklmn12345".slice(1, -1);
assertEquals("cdefg", flat.substr(2, 5));
assertEquals("cdefg", cons.substr(2, 5));
assertEquals("cdefg", slice.substr(1, 5));
flat = "abc\u1234defghijkl12345";
cons = flat + flat.toUpperCase();
/x/.exec(cons); // Flatten cons
slice = "abc\u1234defghijklmn12345".slice(1, -1);
assertEquals("c\u1234def", flat.substr(2, 5));
assertEquals("c\u1234def", cons.substr(2, 5));
assertEquals("c\u1234def", slice.substr(1, 5));
// Concatenate substrings. // Concatenate substrings.
var ascii = 'abcdefghijklmnop'; var ascii = 'abcdefghijklmnop';
var utf = '\u03B1\u03B2\u03B3\u03B4\u03B5\u03B6\u03B7\u03B8\u03B9\u03BA\u03BB'; var utf = '\u03B1\u03B2\u03B3\u03B4\u03B5\u03B6\u03B7\u03B8\u03B9\u03BA\u03BB';
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment