Chromium Code Reviews| Index: src/regexp.js |
| =================================================================== |
| --- src/regexp.js (revision 6062) |
| +++ src/regexp.js (working copy) |
| @@ -32,7 +32,7 @@ |
| // A recursive descent parser for Patterns according to the grammar of |
| // ECMA-262 15.10.1, with deviations noted below. |
| -function DoConstructRegExp(object, pattern, flags, isConstructorCall) { |
| +function DoConstructRegExp(object, pattern, flags) { |
| // RegExp : Called as constructor; see ECMA-262, section 15.10.4. |
| if (IS_REGEXP(pattern)) { |
| if (!IS_UNDEFINED(flags)) { |
| @@ -80,7 +80,7 @@ |
| function RegExpConstructor(pattern, flags) { |
| if (%_IsConstructCall()) { |
| - DoConstructRegExp(this, pattern, flags, true); |
| + DoConstructRegExp(this, pattern, flags); |
| } else { |
| // RegExp : Called as function; see ECMA-262, section 15.10.3.1. |
| if (IS_REGEXP(pattern) && IS_UNDEFINED(flags)) { |
| @@ -104,9 +104,9 @@ |
| // the empty string. For compatibility with JSC, we match their |
| // behavior. |
| if (IS_UNDEFINED(pattern) && %_ArgumentsLength() != 0) { |
| - DoConstructRegExp(this, 'undefined', flags, false); |
| + DoConstructRegExp(this, 'undefined', flags); |
| } else { |
| - DoConstructRegExp(this, pattern, flags, false); |
| + DoConstructRegExp(this, pattern, flags); |
| } |
| } |
| @@ -150,12 +150,12 @@ |
| function RegExpExecNoTests(regexp, string, start) { |
| // Must be called with RegExp, string and positive integer as arguments. |
| - var matchInfo = DoRegExpExec(regexp, string, start); |
| - var result = null; |
| + var matchInfo = %_RegExpExec(regexp, string, start, lastMatchInfo); |
| if (matchInfo !== null) { |
| - result = BuildResultFromMatchInfo(matchInfo, string); |
| + lastMatchInfoOverride = null; |
| + return BuildResultFromMatchInfo(matchInfo, string); |
| } |
| - return result; |
| + return null; |
| } |
| @@ -261,11 +261,13 @@ |
| %_StringCharCodeAt(this.source, 2) != 63) { // '?' |
| if (!%_ObjectEquals(regexp_key, this)) { |
| regexp_key = this; |
| - regexp_val = new $RegExp(this.source.substring(2, this.source.length), |
| + regexp_val = new $RegExp(SubString(this.source, 2, this.source.length), |
| (this.ignoreCase ? 'i' : '') |
|
Lasse Reichstein
2010/12/17 10:38:30
How about:
(this.ignoreCase ? this.multiline ? "
sandholm
2010/12/17 11:50:24
Done.
|
| + (this.multiline ? 'm' : '')); |
| } |
| - if (!regexp_val.test(string)) return false; |
| + if (%_RegExpExec(regexp_val, string, 0, lastMatchInfo) === null) { |
|
Lasse Reichstein
2010/12/17 10:38:30
Use DoRegExpExec, or remember to clear lastMatchIn
sandholm
2010/12/17 11:50:24
The result is only used if there was no match. Oth
|
| + return false; |
| + } |
| } |
| %_Log('regexp', 'regexp-exec,%0r,%1S,%2i', [this, string, lastIndex]); |
| // matchIndices is either null or the lastMatchInfo array. |