Index: src/string.js |
diff --git a/src/string.js b/src/string.js |
index 6115930b6c8ff69568f425b8b996a821bc93cb87..1f38194ac60b8409898ff262049faa2a72ce291d 100644 |
--- a/src/string.js |
+++ b/src/string.js |
@@ -186,6 +186,9 @@ function StringMatch(regexp) { |
} |
var subject = TO_STRING_INLINE(this); |
if (IS_REGEXP(regexp)) { |
+ // Emulate RegExp.prototype.exec's side effect in step 5, even though |
+ // value is discarded. |
+ ToInteger(regexp.lastIndex); |
if (!regexp.global) return RegExpExecNoTests(regexp, subject, 0); |
%_Log('regexp', 'regexp-match,%0S,%1r', [subject, regexp]); |
// lastMatchInfo is defined in regexp.js. |
@@ -227,6 +230,9 @@ function StringReplace(search, replace) { |
// Delegate to one of the regular expression variants if necessary. |
if (IS_REGEXP(search)) { |
+ // Emulate RegExp.prototype.exec's side effect in step 5, even though |
+ // value is discarded. |
+ ToInteger(search.lastIndex); |
%_Log('regexp', 'regexp-replace,%0r,%1S', [search, subject]); |
if (IS_SPEC_FUNCTION(replace)) { |
if (search.global) { |
@@ -451,7 +457,10 @@ function StringReplaceGlobalRegExpWithFunction(subject, regexp, replace) { |
function StringReplaceNonGlobalRegExpWithFunction(subject, regexp, replace) { |
var matchInfo = DoRegExpExec(regexp, subject, 0); |
- if (IS_NULL(matchInfo)) return subject; |
+ if (IS_NULL(matchInfo)) { |
+ regexp.lastIndex = 0; |
+ return subject; |
+ } |
var index = matchInfo[CAPTURE0]; |
var result = SubString(subject, 0, index); |
var endOfMatch = matchInfo[CAPTURE1]; |