Index: src/regexp.js |
=================================================================== |
--- src/regexp.js (revision 5973) |
+++ src/regexp.js (working copy) |
@@ -120,22 +120,28 @@ |
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); |
+ var start = lastMatchInfo[CAPTURE0]; |
+ var end = lastMatchInfo[CAPTURE1]; |
+ var result = %_RegExpConstructResult(numResults, start, s); |
+ if (start + 1 == end) { |
+ result[0] = %_StringCharAt(s, start); |
} 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); |
+ result[0] = %_SubString(s, start, end); |
+ } |
+ var j = REGEXP_FIRST_CAPTURE + 2; |
+ for (var i = 1; i < numResults; i++) { |
+ start = lastMatchInfo[j++]; |
+ end = lastMatchInfo[j++]; |
+ if (end != -1) { |
+ if (start + 1 == end) { |
+ result[i] = %_StringCharAt(s, start); |
} else { |
- // Make sure the element is present. Avoid reading the undefined |
- // property from the global object since this may change. |
- result[i] = void 0; |
+ result[i] = %_SubString(s, start, end); |
} |
+ } 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; |