| 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;
|
| @@ -166,12 +172,7 @@
|
| }
|
| string = regExpInput;
|
| }
|
| - var s;
|
| - if (IS_STRING(string)) {
|
| - s = string;
|
| - } else {
|
| - s = ToString(string);
|
| - }
|
| + string = TO_STRING_INLINE(string);
|
| var lastIndex = this.lastIndex;
|
|
|
| // Conversion is required by the ES5 specification (RegExp.prototype.exec
|
| @@ -180,7 +181,7 @@
|
|
|
| var global = this.global;
|
| if (global) {
|
| - if (i < 0 || i > s.length) {
|
| + if (i < 0 || i > string.length) {
|
| this.lastIndex = 0;
|
| return null;
|
| }
|
| @@ -188,9 +189,9 @@
|
| i = 0;
|
| }
|
|
|
| - %_Log('regexp', 'regexp-exec,%0r,%1S,%2i', [this, s, lastIndex]);
|
| + %_Log('regexp', 'regexp-exec,%0r,%1S,%2i', [this, string, lastIndex]);
|
| // matchIndices is either null or the lastMatchInfo array.
|
| - var matchIndices = %_RegExpExec(this, s, i, lastMatchInfo);
|
| + var matchIndices = %_RegExpExec(this, string, i, lastMatchInfo);
|
|
|
| if (matchIndices === null) {
|
| if (global) this.lastIndex = 0;
|
| @@ -202,7 +203,7 @@
|
| if (global) {
|
| this.lastIndex = lastMatchInfo[CAPTURE1];
|
| }
|
| - return BuildResultFromMatchInfo(matchIndices, s);
|
| + return BuildResultFromMatchInfo(matchIndices, string);
|
| }
|
|
|
|
|
| @@ -227,12 +228,7 @@
|
| string = regExpInput;
|
| }
|
|
|
| - var s;
|
| - if (IS_STRING(string)) {
|
| - s = string;
|
| - } else {
|
| - s = ToString(string);
|
| - }
|
| + string = TO_STRING_INLINE(string);
|
|
|
| var lastIndex = this.lastIndex;
|
|
|
| @@ -241,13 +237,13 @@
|
| var i = TO_INTEGER(lastIndex);
|
|
|
| if (this.global) {
|
| - if (i < 0 || i > s.length) {
|
| + if (i < 0 || i > string.length) {
|
| this.lastIndex = 0;
|
| return false;
|
| }
|
| - %_Log('regexp', 'regexp-exec,%0r,%1S,%2i', [this, s, lastIndex]);
|
| + %_Log('regexp', 'regexp-exec,%0r,%1S,%2i', [this, string, lastIndex]);
|
| // matchIndices is either null or the lastMatchInfo array.
|
| - var matchIndices = %_RegExpExec(this, s, i, lastMatchInfo);
|
| + var matchIndices = %_RegExpExec(this, string, i, lastMatchInfo);
|
| if (matchIndices === null) {
|
| this.lastIndex = 0;
|
| return false;
|
| @@ -269,11 +265,11 @@
|
| (this.ignoreCase ? 'i' : '')
|
| + (this.multiline ? 'm' : ''));
|
| }
|
| - if (!regexp_val.test(s)) return false;
|
| + if (!regexp_val.test(string)) return false;
|
| }
|
| - %_Log('regexp', 'regexp-exec,%0r,%1S,%2i', [this, s, lastIndex]);
|
| + %_Log('regexp', 'regexp-exec,%0r,%1S,%2i', [this, string, lastIndex]);
|
| // matchIndices is either null or the lastMatchInfo array.
|
| - var matchIndices = %_RegExpExec(this, s, 0, lastMatchInfo);
|
| + var matchIndices = %_RegExpExec(this, string, 0, lastMatchInfo);
|
| if (matchIndices === null) return false;
|
| lastMatchInfoOverride = null;
|
| return true;
|
|
|