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,14 @@ |
%_StringCharCodeAt(this.source, 2) != 63) { // '?' |
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' : '')); |
+ regexp_val = new $RegExp(SubString(this.source, 2, this.source.length), |
+ (!this.ignoreCase |
+ ? !this.multiline ? "" : "m" |
+ : !this.multiline ? "i" : "im")); |
} |
- if (!regexp_val.test(string)) return false; |
+ if (%_RegExpExec(regexp_val, string, 0, lastMatchInfo) === null) { |
+ return false; |
+ } |
} |
%_Log('regexp', 'regexp-exec,%0r,%1S,%2i', [this, string, lastIndex]); |
// matchIndices is either null or the lastMatchInfo array. |