Index: src/regexp.js |
diff --git a/src/regexp.js b/src/regexp.js |
index cc9723c8167bb0a3849bd84e4afed106e22f7169..e2492f7245b24ba8d1082d0bbcf94a99e309add7 100644 |
--- a/src/regexp.js |
+++ b/src/regexp.js |
@@ -71,10 +71,32 @@ function DoConstructRegExp(object, pattern, flags, isConstructorCall) { |
} |
} |
- if (!isConstructorCall) { |
+ if (isConstructorCall) { |
+ // ECMA-262, section 15.10.7.1. |
+ %SetProperty(object, 'source', pattern, |
+ DONT_DELETE | READ_ONLY | DONT_ENUM); |
+ |
+ // ECMA-262, section 15.10.7.2. |
+ %SetProperty(object, 'global', global, DONT_DELETE | READ_ONLY | DONT_ENUM); |
+ |
+ // ECMA-262, section 15.10.7.3. |
+ %SetProperty(object, 'ignoreCase', ignoreCase, |
+ DONT_DELETE | READ_ONLY | DONT_ENUM); |
+ |
+ // ECMA-262, section 15.10.7.4. |
+ %SetProperty(object, 'multiline', multiline, |
+ DONT_DELETE | READ_ONLY | DONT_ENUM); |
+ |
+ // ECMA-262, section 15.10.7.5. |
+ %SetProperty(object, 'lastIndex', 0, DONT_DELETE | DONT_ENUM); |
+ } else { // RegExp is being recompiled via RegExp.prototype.compile. |
+ %IgnoreAttributesAndSetProperty(object, 'source', pattern); |
+ %IgnoreAttributesAndSetProperty(object, 'global', global); |
+ %IgnoreAttributesAndSetProperty(object, 'ignoreCase', ignoreCase); |
+ %IgnoreAttributesAndSetProperty(object, 'multiline', multiline); |
+ %IgnoreAttributesAndSetProperty(object, 'lastIndex', 0); |
regExpCache.type = 'none'; |
} |
- %RegExpInitializeObject(object, pattern, global, ignoreCase, multiline); |
// Call internal function to compile the pattern. |
%RegExpCompile(object, pattern, flags); |
@@ -322,7 +344,6 @@ function RegExpToString() { |
// on the captures array of the last successful match and the subject string |
// of the last successful match. |
function RegExpGetLastMatch() { |
- if (lastMatchInfoOverride) { return lastMatchInfoOverride[0]; } |
var regExpSubject = LAST_SUBJECT(lastMatchInfo); |
return SubString(regExpSubject, |
lastMatchInfo[CAPTURE0], |
@@ -331,11 +352,6 @@ function RegExpGetLastMatch() { |
function RegExpGetLastParen() { |
- if (lastMatchInfoOverride) { |
- var override = lastMatchInfoOverride; |
- if (override.length <= 3) return ''; |
- return override[override.length - 3]; |
- } |
var length = NUMBER_OF_CAPTURES(lastMatchInfo); |
if (length <= 2) return ''; // There were no captures. |
// We match the SpiderMonkey behavior: return the substring defined by the |
@@ -352,32 +368,17 @@ function RegExpGetLastParen() { |
function RegExpGetLeftContext() { |
- var start_index; |
- var subject; |
- if (!lastMatchInfoOverride) { |
- start_index = lastMatchInfo[CAPTURE0]; |
- subject = LAST_SUBJECT(lastMatchInfo); |
- } else { |
- var override = lastMatchInfoOverride; |
- start_index = override[override.length - 2]; |
- subject = override[override.length - 1]; |
- } |
- return SubString(subject, 0, start_index); |
+ return SubString(LAST_SUBJECT(lastMatchInfo), |
+ 0, |
+ lastMatchInfo[CAPTURE0]); |
} |
function RegExpGetRightContext() { |
- var start_index; |
- var subject; |
- if (!lastMatchInfoOverride) { |
- start_index = lastMatchInfo[CAPTURE1]; |
- subject = LAST_SUBJECT(lastMatchInfo); |
- } else { |
- var override = lastMatchInfoOverride; |
- subject = override[override.length - 1]; |
- start_index = override[override.length - 2] + subject.length; |
- } |
- return SubString(subject, start_index, subject.length); |
+ var subject = LAST_SUBJECT(lastMatchInfo); |
+ return SubString(subject, |
+ lastMatchInfo[CAPTURE1], |
+ subject.length); |
} |
@@ -386,10 +387,6 @@ function RegExpGetRightContext() { |
// called with indices from 1 to 9. |
function RegExpMakeCaptureGetter(n) { |
return function() { |
- if (lastMatchInfoOverride) { |
- if (n < lastMatchInfoOverride.length - 2) return lastMatchInfoOverride[n]; |
- return ''; |
- } |
var index = n * 2; |
if (index >= NUMBER_OF_CAPTURES(lastMatchInfo)) return ''; |
var matchStart = lastMatchInfo[CAPTURE(index)]; |
@@ -414,12 +411,6 @@ var lastMatchInfo = [ |
0, // REGEXP_FIRST_CAPTURE + 1 |
]; |
-// Override last match info with an array of actual substrings. |
-// Used internally by replace regexp with function. |
-// The array has the format of an "apply" argument for a replacement |
-// function. |
-var lastMatchInfoOverride = null; |
- |
// ------------------------------------------------------------------- |
function SetupRegExp() { |