| 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;
|
|
|