Chromium Code Reviews| Index: src/regexp.js |
| =================================================================== |
| --- src/regexp.js (revision 5772) |
| +++ src/regexp.js (working copy) |
| @@ -193,20 +193,16 @@ |
| var matchIndices = %_RegExpExec(this, s, i, lastMatchInfo); |
| if (matchIndices === null) { |
| - if (global) { |
| - this.lastIndex = 0; |
| - } |
| + if (global) this.lastIndex = 0; |
| return null; |
| } |
| // Successful match. |
| lastMatchInfoOverride = null; |
| - var result = BuildResultFromMatchInfo(matchIndices, s); |
| - |
| if (global) { |
| this.lastIndex = lastMatchInfo[CAPTURE1]; |
| } |
| - return result; |
| + return BuildResultFromMatchInfo(matchIndices, s); |
| } |
| @@ -244,43 +240,44 @@ |
| // algorithm, step 5) even if the value is discarded for non-global RegExps. |
| var i = TO_INTEGER(lastIndex); |
| - var global = this.global; |
| - if (global) { |
| + if (this.global) { |
| if (i < 0 || i > s.length) { |
| this.lastIndex = 0; |
| return false; |
| } |
| + %_Log('regexp', 'regexp-exec,%0r,%1S,%2i', [this, s, lastIndex]); |
| + // matchIndices is either null or the lastMatchInfo array. |
| + var matchIndices = %_RegExpExec(this, s, i, lastMatchInfo); |
| + if (matchIndices === null) { |
| + this.lastIndex = 0; |
| + return false; |
| + } |
| + lastMatchInfoOverride = null; |
| + this.lastIndex = lastMatchInfo[CAPTURE1]; |
| + return true; |
| } else { |
| - i = 0; |
| + // Non-global regexp. |
| + // Remove irrelevant preceeding '.*' in a non-global test regexp. |
| + // The expression checks whether this.source starts with '.*' and |
| + // that the third char is not a '?'. |
| + if (%_StringCharCodeAt(this.source, 0) == 46 && // '.' |
| + %_StringCharCodeAt(this.source, 1) == 42 && // '*' |
| + %_StringCharCodeAt(this.source, 2) != 63) { // '?' |
|
Lasse Reichstein
2010/11/05 14:01:30
Why not do this for global regexps too?
|
| + if (!%_ObjectEquals(regexp_key, this)) { |
| + regexp_key = this; |
| + regexp_val = new $RegExp(this.source.substring(2, this.source.length), |
| + (this.ignoreCase ? 'i' : '') |
| + + (this.multiline ? 'm' : '')); |
| + } |
| + if (!regexp_val.test(s)) return false; |
| + } |
| + %_Log('regexp', 'regexp-exec,%0r,%1S,%2i', [this, s, lastIndex]); |
| + // matchIndices is either null or the lastMatchInfo array. |
| + var matchIndices = %_RegExpExec(this, s, 0, lastMatchInfo); |
| + if (matchIndices === null) return false; |
| + lastMatchInfoOverride = null; |
| + return true; |
| } |
| - |
| - // Remove irrelevant preceeding '.*' in a test regexp. The expression |
| - // checks whether this.source starts with '.*' and that the third |
| - // char is not a '?' |
| - if (%_StringCharCodeAt(this.source, 0) == 46 && // '.' |
| - %_StringCharCodeAt(this.source, 1) == 42 && // '*' |
| - %_StringCharCodeAt(this.source, 2) != 63) { // '?' |
| - if (!%_ObjectEquals(regexp_key, this)) { |
| - regexp_key = this; |
| - regexp_val = new $RegExp(this.source.substring(2, this.source.length), |
| - (global ? 'g' : '') |
| - + (this.ignoreCase ? 'i' : '') |
| - + (this.multiline ? 'm' : '')); |
| - } |
| - if (!regexp_val.test(s)) return false; |
| - } |
| - |
| - %_Log('regexp', 'regexp-exec,%0r,%1S,%2i', [this, s, lastIndex]); |
| - // matchIndices is either null or the lastMatchInfo array. |
| - var matchIndices = %_RegExpExec(this, s, i, lastMatchInfo); |
| - |
| - if (matchIndices === null) { |
| - if (global) this.lastIndex = 0; |
| - return false; |
| - } |
| - lastMatchInfoOverride = null; |
| - if (global) this.lastIndex = lastMatchInfo[CAPTURE1]; |
| - return true; |
| } |