Reviewers: Yang,
Message:
Committed patchset #1 manually as r21348 (presubmit successful).
Description:
Fix performance regression in regular expressions after Array.push()
optimizations
[email protected]
LOG=N
Committed: https://code.google.com/p/v8/source/detail?r=21348
Please review this at https://codereview.chromium.org/281953002/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files (+10, -12 lines):
M src/code-stubs-hydrogen.cc
M src/regexp.js
M src/string.js
Index: src/code-stubs-hydrogen.cc
diff --git a/src/code-stubs-hydrogen.cc b/src/code-stubs-hydrogen.cc
index
83b461de20bbb7c251f19e7cdd3ee511896a40e5..addc83d0f4cac9c0ac9847b809a2d4df6593dcdf
100644
--- a/src/code-stubs-hydrogen.cc
+++ b/src/code-stubs-hydrogen.cc
@@ -1483,6 +1483,8 @@ HValue*
CodeStubGraphBuilder<RegExpConstructResultStub>::BuildCodeStub() {
HValue* index = GetParameter(RegExpConstructResultStub::kIndex);
HValue* input = GetParameter(RegExpConstructResultStub::kInput);
+ info()->MarkMustNotHaveEagerFrame();
+
return BuildRegExpConstructResult(length, index, input);
}
Index: src/regexp.js
diff --git a/src/regexp.js b/src/regexp.js
index
6a0e2b5d92c00782d29ef1a78b42d382b10ae55c..bb1958bbca31a647710d975ec6881bd2474c1a70
100644
--- a/src/regexp.js
+++ b/src/regexp.js
@@ -112,8 +112,10 @@ function BuildResultFromMatchInfo(lastMatchInfo, s) {
var numResults = NUMBER_OF_CAPTURES(lastMatchInfo) >> 1;
var start = lastMatchInfo[CAPTURE0];
var end = lastMatchInfo[CAPTURE1];
+ var first_match = %_SubString(s, start, end);
var result = %_RegExpConstructResult(numResults, start, s);
- result[0] = %_SubString(s, start, end);
+ result[0] = first_match;
+ if (numResults == 1) return result;
var j = REGEXP_FIRST_CAPTURE + 2;
for (var i = 1; i < numResults; i++) {
start = lastMatchInfo[j++];
Index: src/string.js
diff --git a/src/string.js b/src/string.js
index
9c90427835342acff919b9725e05c159c13b548b..d4d679b175369d083ab33aafa7eeffe6f0eebce9
100644
--- a/src/string.js
+++ b/src/string.js
@@ -618,8 +618,6 @@ function StringSplit(separator, limit) {
}
-var ArrayPushBuiltin = $Array.prototype.push;
-
function StringSplitOnRegExp(subject, separator, limit, length) {
if (length === 0) {
if (DoRegExpExec(separator, subject, 0, 0) != null) {
@@ -637,15 +635,13 @@ function StringSplitOnRegExp(subject, separator,
limit, length) {
while (true) {
if (startIndex === length) {
- %_CallFunction(result, %_SubString(subject, currentIndex, length),
- ArrayPushBuiltin);
+ result[result.length] = %_SubString(subject, currentIndex, length);
break;
}
var matchInfo = DoRegExpExec(separator, subject, startIndex);
if (matchInfo == null || length === (startMatch =
matchInfo[CAPTURE0])) {
- %_CallFunction(result, %_SubString(subject, currentIndex, length),
- ArrayPushBuiltin);
+ result[result.length] = %_SubString(subject, currentIndex, length);
break;
}
var endIndex = matchInfo[CAPTURE1];
@@ -656,8 +652,7 @@ function StringSplitOnRegExp(subject, separator, limit,
length) {
continue;
}
- %_CallFunction(result, %_SubString(subject, currentIndex, startMatch),
- ArrayPushBuiltin);
+ result[result.length] = %_SubString(subject, currentIndex, startMatch);
if (result.length === limit) break;
@@ -666,10 +661,9 @@ function StringSplitOnRegExp(subject, separator,
limit, length) {
var start = matchInfo[i++];
var end = matchInfo[i++];
if (end != -1) {
- %_CallFunction(result, %_SubString(subject, start, end),
- ArrayPushBuiltin);
+ result[result.length] = %_SubString(subject, start, end);
} else {
- %_CallFunction(result, UNDEFINED, ArrayPushBuiltin);
+ result[result.length] = UNDEFINED;
}
if (result.length === limit) break outer_loop;
}
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.