Index: src/string.js |
diff --git a/src/string.js b/src/string.js |
index daa179bd9d177ae03a88a44696c8bea7e190dcc3..9433249188c9fccf26f42513a9bb011f1724c4a9 100644 |
--- a/src/string.js |
+++ b/src/string.js |
@@ -175,9 +175,9 @@ function StringLocaleCompare(other) { |
// ECMA-262 section 15.5.4.10 |
function StringMatch(regexp) { |
var subject = TO_STRING_INLINE(this); |
- if (IS_REGEXP(regexp)) { |
- if (!regexp.global) return regexp.exec(subject); |
- |
+ if (IS_REGEXP(regexp)) { |
+ if (!regexp.global) return regexp.exec(subject); |
+ |
var cache = regExpCache; |
var saveAnswer = false; |
@@ -435,63 +435,63 @@ function StringReplaceRegExpWithFunction(subject, regexp, replace) { |
// array to use in the future, or until the original is written back. |
resultArray = $Array(16); |
} |
- try { |
- // Must handle exceptions thrown by the replace functions correctly, |
- // including unregistering global regexps. |
- var res = %RegExpExecMultiple(regexp, |
- subject, |
- lastMatchInfo, |
- resultArray); |
- regexp.lastIndex = 0; |
- if (IS_NULL(res)) { |
- // No matches at all. |
- return subject; |
- } |
- var len = res.length; |
- var i = 0; |
- if (NUMBER_OF_CAPTURES(lastMatchInfo) == 2) { |
- var match_start = 0; |
- while (i < len) { |
- var elem = res[i]; |
- if (%_IsSmi(elem)) { |
- if (elem > 0) { |
- match_start = (elem >> 11) + (elem & 0x7ff); |
- } else { |
- match_start = res[++i] - elem; |
- } |
+ |
+ var res = %RegExpExecMultiple(regexp, |
+ subject, |
+ lastMatchInfo, |
+ resultArray); |
+ regexp.lastIndex = 0; |
+ if (IS_NULL(res)) { |
+ // No matches at all. |
+ return subject; |
+ } |
+ var len = res.length; |
+ var i = 0; |
+ if (NUMBER_OF_CAPTURES(lastMatchInfo) == 2) { |
+ var match_start = 0; |
+ var override = [null, 0, subject]; |
+ while (i < len) { |
+ var elem = res[i]; |
+ if (%_IsSmi(elem)) { |
+ if (elem > 0) { |
+ match_start = (elem >> 11) + (elem & 0x7ff); |
} else { |
- var func_result = replace.call(null, elem, match_start, subject); |
- if (!IS_STRING(func_result)) { |
- func_result = NonStringToString(func_result); |
- } |
- res[i] = func_result; |
- match_start += elem.length; |
+ match_start = res[++i] - elem; |
} |
- i++; |
+ } else { |
+ override[0] = elem; |
+ override[1] = match_start; |
+ lastMatchInfoOverride = override; |
+ var func_result = replace.call(null, elem, match_start, subject); |
+ if (!IS_STRING(func_result)) { |
+ func_result = NonStringToString(func_result); |
+ } |
+ res[i] = func_result; |
+ match_start += elem.length; |
} |
- } else { |
- while (i < len) { |
- var elem = res[i]; |
- if (!%_IsSmi(elem)) { |
- // elem must be an Array. |
- // Use the apply argument as backing for global RegExp properties. |
- lastMatchInfoOverride = elem; |
- var func_result = replace.apply(null, elem); |
- if (!IS_STRING(func_result)) { |
- func_result = NonStringToString(func_result); |
- } |
- res[i] = func_result; |
+ i++; |
+ } |
+ } else { |
+ while (i < len) { |
+ var elem = res[i]; |
+ if (!%_IsSmi(elem)) { |
+ // elem must be an Array. |
+ // Use the apply argument as backing for global RegExp properties. |
+ lastMatchInfoOverride = elem; |
+ var func_result = replace.apply(null, elem); |
+ if (!IS_STRING(func_result)) { |
+ func_result = NonStringToString(func_result); |
} |
- i++; |
+ res[i] = func_result; |
} |
+ i++; |
} |
- var result = new ReplaceResultBuilder(subject, res); |
- return result.generate(); |
- } finally { |
- lastMatchInfoOverride = null; |
- resultArray.length = 0; |
- reusableReplaceArray = resultArray; |
} |
+ var resultBuilder = new ReplaceResultBuilder(subject, res); |
+ var result = resultBuilder.generate(); |
+ resultArray.length = 0; |
+ reusableReplaceArray = resultArray; |
+ return result; |
} else { // Not a global regexp, no need to loop. |
var matchInfo = DoRegExpExec(regexp, subject, 0); |
if (IS_NULL(matchInfo)) return subject; |
@@ -542,7 +542,6 @@ function StringSearch(re) { |
var s = TO_STRING_INLINE(this); |
var match = DoRegExpExec(regexp, s, 0); |
if (match) { |
- lastMatchInfo = match; |
return match[CAPTURE0]; |
} |
return -1; |