Chromium Code Reviews| Index: src/string.js |
| =================================================================== |
| --- src/string.js (revision 5973) |
| +++ src/string.js (working copy) |
| @@ -208,12 +208,15 @@ |
| replace); |
| } |
| } else { |
| - return StringReplaceRegExp(subject, search, replace); |
| + return %StringReplaceRegExpWithString(subject, |
| + search, |
| + TO_STRING_INLINE(replace), |
| + lastMatchInfo); |
| } |
| } |
| // Convert the search argument to a string and search for it. |
| - search = TO_STRING_INLINE(search); |
| + if (!IS_STRING(search)) search = NonStringToString(search); |
| var start = %StringIndexOf(subject, search, 0); |
| if (start < 0) return subject; |
| var end = start + search.length; |
| @@ -224,11 +227,15 @@ |
| // Compute the string to replace with. |
| if (IS_FUNCTION(replace)) { |
| - builder.add(replace.call(null, search, start, subject)); |
| + builder.add(%_CallFunction(%GetGlobalReceiver(), |
| + search, |
| + start, |
| + subject, |
| + replace)); |
| } else { |
| reusableMatchInfo[CAPTURE0] = start; |
| reusableMatchInfo[CAPTURE1] = end; |
| - replace = TO_STRING_INLINE(replace); |
| + if (!IS_STRING(replace)) replace = NonStringToString(replace); |
|
Lasse Reichstein
2010/12/13 09:29:13
Is this really faster than the macro:
macro TO_ST
sandholm
2010/12/13 12:03:35
No, not really. I reverted this change.
|
| ExpandReplacement(replace, subject, reusableMatchInfo, builder); |
| } |
| @@ -239,15 +246,6 @@ |
| } |
| -// Helper function for regular expressions in String.prototype.replace. |
| -function StringReplaceRegExp(subject, regexp, replace) { |
| - return %StringReplaceRegExpWithString(subject, |
| - regexp, |
| - TO_STRING_INLINE(replace), |
| - lastMatchInfo); |
| -} |
| - |
| - |
| // Expand the $-expressions in the string and return a new string with |
| // the result. |
| function ExpandReplacement(string, subject, matchInfo, builder) { |
| @@ -576,14 +574,14 @@ |
| while (true) { |
| if (startIndex === length) { |
| - result[result.length] = subject.slice(currentIndex, length); |
| + result.push(subject.slice(currentIndex, length)); |
| break; |
| } |
| var matchInfo = splitMatch(separator, subject, currentIndex, startIndex); |
| if (IS_NULL(matchInfo)) { |
| - result[result.length] = subject.slice(currentIndex, length); |
| + result.push(subject.slice(currentIndex, length)); |
| break; |
| } |
| @@ -595,17 +593,21 @@ |
| continue; |
| } |
| - result[result.length] = SubString(subject, currentIndex, matchInfo[CAPTURE0]); |
| + result.push(SubString(subject, currentIndex, matchInfo[CAPTURE0])); |
|
Lasse Reichstein
2010/12/13 09:29:13
No special casing of this substring?
sandholm
2010/12/13 12:03:35
I have only inlined SubString calls inside loops.
|
| if (result.length === limit) break; |
| - var num_captures = NUMBER_OF_CAPTURES(matchInfo); |
| - for (var i = 2; i < num_captures; i += 2) { |
| - var start = matchInfo[CAPTURE(i)]; |
| - var end = matchInfo[CAPTURE(i + 1)]; |
| - if (start != -1 && end != -1) { |
| - result[result.length] = SubString(subject, start, end); |
| + var num_captures_plus3 = NUMBER_OF_CAPTURES(matchInfo) + 3; |
|
Lasse Reichstein
2010/12/13 09:29:13
Use REGEXP_FIRST_CAPTURE instead of 3.
sandholm
2010/12/13 12:03:35
Done.
|
| + for (var i = 5; i < num_captures_plus3; ) { |
|
Lasse Reichstein
2010/12/13 09:29:13
And REGEXP_FIRST_CAPTURE + 2 instead of 5.
sandholm
2010/12/13 12:03:35
Done.
|
| + var start = matchInfo[i++]; |
| + var end = matchInfo[i++]; |
| + if (end != -1) { |
| + if (start + 1 == end) { |
| + result.push(%_StringCharAt(subject, start)); |
| + } else { |
| + result.push(%_SubString(subject, start, end)); |
| + } |
| } else { |
| - result[result.length] = void 0; |
| + result.push(void 0); |
| } |
| if (result.length === limit) break outer_loop; |
| } |