Index: src/regexp.js |
diff --git a/src/regexp.js b/src/regexp.js |
index c76b09d37706d9025614623f27d703a17aff0fbb..9929b112e8f1fff849c2fe1f83303fd6fc3fe111 100644 |
--- a/src/regexp.js |
+++ b/src/regexp.js |
@@ -135,19 +135,52 @@ function RegExpCache() { |
var regExpCache = new RegExpCache(); |
-function CloneRegexpAnswer(array) { |
+function CloneRegExpResult(array) { |
if (array == null) return null; |
- var len = array.length; |
- var answer = new $Array(len); |
- for (var i = 0; i < len; i++) { |
+ var length = array.length; |
+ var answer = %_RegExpConstructResult(length, array.index, array.input); |
Søren Thygesen Gjesse
2010/04/13 07:22:29
Will it be possible to pass in the array to have t
Lasse Reichstein
2010/04/13 09:50:56
It's a good idea for an optional argument. The fun
|
+ for (var i = 0; i < length; i++) { |
answer[i] = array[i]; |
} |
- answer.index = array.index; |
- answer.input = array.input; |
return answer; |
} |
+function BuildResultFromMatchInfo(lastMatchInfo, s) { |
+ var numResults = NUMBER_OF_CAPTURES(lastMatchInfo) >> 1; |
+ var result = %_RegExpConstructResult(numResults, lastMatchInfo[CAPTURE0], s); |
+ if (numResults === 1) { |
+ var matchStart = lastMatchInfo[CAPTURE(0)]; |
+ var matchEnd = lastMatchInfo[CAPTURE(1)]; |
+ result[0] = SubString(s, matchStart, matchEnd); |
+ } else { |
+ for (var i = 0; i < numResults; i++) { |
+ var matchStart = lastMatchInfo[CAPTURE(i << 1)]; |
+ var matchEnd = lastMatchInfo[CAPTURE((i << 1) + 1)]; |
+ if (matchStart != -1 && matchEnd != -1) { |
+ result[i] = SubString(s, matchStart, matchEnd); |
+ } else { |
+ // Make sure the element is present. Avoid reading the undefined |
+ // property from the global object since this may change. |
+ result[i] = void 0; |
+ } |
+ } |
+ } |
+ return result; |
+} |
+ |
+ |
+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; |
+ if (matchInfo !== null) { |
+ result = BuildResultFromMatchInfo(matchInfo, string); |
+ } |
+ return result; |
+} |
+ |
+ |
function RegExpExec(string) { |
if (!IS_REGEXP(this)) { |
throw MakeTypeError('incompatible_method_receiver', |
@@ -162,7 +195,7 @@ function RegExpExec(string) { |
%_ObjectEquals(cache.regExp, this) && |
%_ObjectEquals(cache.subject, string)) { |
if (cache.answerSaved) { |
- return CloneRegexpAnswer(cache.answer); |
+ return CloneRegExpResult(cache.answer); |
} else { |
saveAnswer = true; |
} |
@@ -205,36 +238,15 @@ function RegExpExec(string) { |
return matchIndices; // No match. |
} |
- var numResults = NUMBER_OF_CAPTURES(lastMatchInfo) >> 1; |
- var result; |
- if (numResults === 1) { |
- var matchStart = lastMatchInfo[CAPTURE(0)]; |
- var matchEnd = lastMatchInfo[CAPTURE(1)]; |
- result = [SubString(s, matchStart, matchEnd)]; |
- } else { |
- result = new $Array(numResults); |
- for (var i = 0; i < numResults; i++) { |
- var matchStart = lastMatchInfo[CAPTURE(i << 1)]; |
- var matchEnd = lastMatchInfo[CAPTURE((i << 1) + 1)]; |
- if (matchStart != -1 && matchEnd != -1) { |
- result[i] = SubString(s, matchStart, matchEnd); |
- } else { |
- // Make sure the element is present. Avoid reading the undefined |
- // property from the global object since this may change. |
- result[i] = void 0; |
- } |
- } |
- } |
+ var result = BuildResultFromMatchInfo(matchIndices, s); |
- result.index = lastMatchInfo[CAPTURE0]; |
- result.input = s; |
if (this.global) { |
this.lastIndex = lastMatchInfo[CAPTURE1]; |
} else { |
cache.regExp = this; |
cache.subject = s; |
cache.lastIndex = lastIndex; |
- if (saveAnswer) cache.answer = CloneRegexpAnswer(result); |
+ if (saveAnswer) cache.answer = CloneRegExpResult(result); |
cache.answerSaved = saveAnswer; |
cache.type = 'exec'; |
} |