| Index: src/string.js
|
| diff --git a/src/string.js b/src/string.js
|
| index 300baf968bf556351d56194ab301b994402245d2..7ddc467fc0de2421c21fd39e36456a438dcb30e3 100644
|
| --- a/src/string.js
|
| +++ b/src/string.js
|
| @@ -149,6 +149,16 @@ function StringLastIndexOf(searchString /* position */) { // length == 1
|
| }
|
|
|
|
|
| +function CloneDenseArray(array) {
|
| + if (array === null) return null;
|
| + var clone = new $Array(array.length);
|
| + for (var i = 0; i < array.length; i++) {
|
| + clone[i] = array[i];
|
| + }
|
| + return clone;
|
| +}
|
| +
|
| +
|
| // ECMA-262 section 15.5.4.9
|
| //
|
| // This function is implementation specific. For now, we do not
|
| @@ -164,33 +174,37 @@ function StringLocaleCompare(other) {
|
|
|
| // ECMA-262 section 15.5.4.10
|
| function StringMatch(regexp) {
|
| - if (!IS_REGEXP(regexp)) regexp = new $RegExp(regexp);
|
| var subject = TO_STRING_INLINE(this);
|
| -
|
| - if (!regexp.global) return regexp.exec(subject);
|
| -
|
| - var cache = regExpCache;
|
| - var saveAnswer = false;
|
| -
|
| - if (%_ObjectEquals(cache.type, 'match') &&
|
| - %_ObjectEquals(cache.regExp, regexp) &&
|
| - %_ObjectEquals(cache.subject, subject)) {
|
| - if (cache.answerSaved) {
|
| - return CloneRegexpAnswer(cache.answer);
|
| - } else {
|
| - saveAnswer = true;
|
| + if (IS_REGEXP(regexp)) {
|
| + if (!regexp.global) return regexp.exec(subject);
|
| +
|
| + var cache = regExpCache;
|
| + var saveAnswer = false;
|
| +
|
| + if (%_ObjectEquals(cache.type, 'match') &&
|
| + %_ObjectEquals(cache.regExp, regexp) &&
|
| + %_ObjectEquals(cache.subject, subject)) {
|
| + if (cache.answerSaved) {
|
| + return CloneDenseArray(cache.answer);
|
| + } else {
|
| + saveAnswer = true;
|
| + }
|
| }
|
| + %_Log('regexp', 'regexp-match,%0S,%1r', [subject, regexp]);
|
| + // lastMatchInfo is defined in regexp.js.
|
| + var result = %StringMatch(subject, regexp, lastMatchInfo);
|
| + cache.type = 'match';
|
| + cache.regExp = regexp;
|
| + cache.subject = subject;
|
| + if (saveAnswer) cache.answer = CloneDenseArray(result);
|
| + cache.answerSaved = saveAnswer;
|
| + return result;
|
| }
|
| -
|
| - %_Log('regexp', 'regexp-match,%0S,%1r', [subject, regexp]);
|
| - // lastMatchInfo is defined in regexp.js.
|
| - var result = %StringMatch(subject, regexp, lastMatchInfo);
|
| - cache.type = 'match';
|
| - cache.regExp = regexp;
|
| - cache.subject = subject;
|
| - if (saveAnswer) cache.answer = CloneRegexpAnswer(result);
|
| - cache.answerSaved = saveAnswer;
|
| - return result;
|
| + // Non-regexp argument.
|
| + regexp = new $RegExp(regexp);
|
| + // Don't check regexp exec cache, since the regexp is new.
|
| + // TODO(lrn): Change this if we start caching regexps here.
|
| + return RegExpExecNoTests(regexp, subject, 0);
|
| }
|
|
|
|
|
| @@ -599,7 +613,7 @@ function StringSplit(separator, limit) {
|
| %_ObjectEquals(cache.regExp, separator) &&
|
| %_ObjectEquals(cache.subject, subject)) {
|
| if (cache.answerSaved) {
|
| - return CloneRegexpAnswer(cache.answer);
|
| + return CloneDenseArray(cache.answer);
|
| } else {
|
| saveAnswer = true;
|
| }
|
| @@ -665,10 +679,9 @@ function StringSplit(separator, limit) {
|
|
|
| startIndex = currentIndex = endIndex;
|
| }
|
| - if (saveAnswer) cache.answer = CloneRegexpAnswer(result);
|
| + if (saveAnswer) cache.answer = CloneDenseArray(result);
|
| cache.answerSaved = saveAnswer;
|
| return result;
|
| -
|
| }
|
|
|
|
|
|
|