| Index: src/string.js
|
| diff --git a/src/string.js b/src/string.js
|
| index b39976c51ed8a15332eccabecc2d1c34e26cf962..569fe8325702e0a67b212440f28c90e02eb35c33 100644
|
| --- a/src/string.js
|
| +++ b/src/string.js
|
| @@ -203,16 +203,6 @@ function StringMatch(regexp) {
|
| }
|
|
|
|
|
| -// SubString is an internal function that returns the sub string of 'string'.
|
| -// If resulting string is of length 1, we use the one character cache
|
| -// otherwise we call the runtime system.
|
| -function SubString(string, start, end) {
|
| - // Use the one character string cache.
|
| - if (start + 1 == end) return %_StringCharAt(string, start);
|
| - return %_SubString(string, start, end);
|
| -}
|
| -
|
| -
|
| // This has the same size as the lastMatchInfo array, and can be used for
|
| // functions that expect that structure to be returned. It is used when the
|
| // needle is a string rather than a regexp. In this case we can't update
|
| @@ -296,7 +286,7 @@ function StringReplace(search, replace) {
|
| if (start < 0) return subject;
|
| var end = start + search.length;
|
|
|
| - var result = SubString(subject, 0, start);
|
| + var result = %_SubString(subject, 0, start);
|
|
|
| // Compute the string to replace with.
|
| if (IS_SPEC_FUNCTION(replace)) {
|
| @@ -309,7 +299,7 @@ function StringReplace(search, replace) {
|
| result = ExpandReplacement(replace, subject, reusableMatchInfo, result);
|
| }
|
|
|
| - return result + SubString(subject, end, subject.length);
|
| + return result + %_SubString(subject, end, subject.length);
|
| }
|
|
|
|
|
| @@ -323,7 +313,7 @@ function ExpandReplacement(string, subject, matchInfo, result) {
|
| return result;
|
| }
|
|
|
| - if (next > 0) result += SubString(string, 0, next);
|
| + if (next > 0) result += %_SubString(string, 0, next);
|
|
|
| while (true) {
|
| var expansion = '$';
|
| @@ -335,13 +325,14 @@ function ExpandReplacement(string, subject, matchInfo, result) {
|
| result += '$';
|
| } else if (peek == 38) { // $& - match
|
| ++position;
|
| - result += SubString(subject, matchInfo[CAPTURE0], matchInfo[CAPTURE1]);
|
| + result +=
|
| + %_SubString(subject, matchInfo[CAPTURE0], matchInfo[CAPTURE1]);
|
| } else if (peek == 96) { // $` - prefix
|
| ++position;
|
| - result += SubString(subject, 0, matchInfo[CAPTURE0]);
|
| + result += %_SubString(subject, 0, matchInfo[CAPTURE0]);
|
| } else if (peek == 39) { // $' - suffix
|
| ++position;
|
| - result += SubString(subject, matchInfo[CAPTURE1], subject.length);
|
| + result += %_SubString(subject, matchInfo[CAPTURE1], subject.length);
|
| } else {
|
| result += '$';
|
| }
|
| @@ -356,14 +347,14 @@ function ExpandReplacement(string, subject, matchInfo, result) {
|
| // haven't reached the end, we need to append the suffix.
|
| if (next < 0) {
|
| if (position < length) {
|
| - result += SubString(string, position, length);
|
| + result += %_SubString(string, position, length);
|
| }
|
| return result;
|
| }
|
|
|
| // Append substring between the previous and the next $ character.
|
| if (next > position) {
|
| - result += SubString(string, position, next);
|
| + result += %_SubString(string, position, next);
|
| }
|
| }
|
| return result;
|
| @@ -379,7 +370,7 @@ function CaptureString(string, lastCaptureInfo, index) {
|
| // If start isn't valid, return undefined.
|
| if (start < 0) return;
|
| var end = lastCaptureInfo[CAPTURE(scaled + 1)];
|
| - return SubString(string, start, end);
|
| + return %_SubString(string, start, end);
|
| }
|
|
|
|
|
| @@ -475,7 +466,7 @@ function StringReplaceNonGlobalRegExpWithFunction(subject, regexp, replace) {
|
| return subject;
|
| }
|
| var index = matchInfo[CAPTURE0];
|
| - var result = SubString(subject, 0, index);
|
| + var result = %_SubString(subject, 0, index);
|
| var endOfMatch = matchInfo[CAPTURE1];
|
| // Compute the parameter list consisting of the match, captures, index,
|
| // and subject for the replace function invocation.
|
| @@ -485,7 +476,7 @@ function StringReplaceNonGlobalRegExpWithFunction(subject, regexp, replace) {
|
| var receiver = %GetDefaultReceiver(replace);
|
| if (m == 1) {
|
| // No captures, only the match, which is always valid.
|
| - var s = SubString(subject, index, endOfMatch);
|
| + var s = %_SubString(subject, index, endOfMatch);
|
| // Don't call directly to avoid exposing the built-in global object.
|
| replacement = %_CallFunction(receiver, s, index, subject, replace);
|
| } else {
|
| @@ -502,7 +493,7 @@ function StringReplaceNonGlobalRegExpWithFunction(subject, regexp, replace) {
|
| result += replacement; // The add method converts to string if necessary.
|
| // Can't use matchInfo any more from here, since the function could
|
| // overwrite it.
|
| - return result + SubString(subject, endOfMatch, subject.length);
|
| + return result + %_SubString(subject, endOfMatch, subject.length);
|
| }
|
|
|
|
|
| @@ -568,7 +559,7 @@ function StringSlice(start, end) {
|
| return '';
|
| }
|
|
|
| - return SubString(s, start_i, end_i);
|
| + return %_SubString(s, start_i, end_i);
|
| }
|
|
|
|
|
| @@ -629,13 +620,13 @@ function StringSplitOnRegExp(subject, separator, limit, length) {
|
| while (true) {
|
|
|
| if (startIndex === length) {
|
| - result.push(SubString(subject, currentIndex, length));
|
| + result.push(%_SubString(subject, currentIndex, length));
|
| break;
|
| }
|
|
|
| var matchInfo = DoRegExpExec(separator, subject, startIndex);
|
| if (matchInfo == null || length === (startMatch = matchInfo[CAPTURE0])) {
|
| - result.push(SubString(subject, currentIndex, length));
|
| + result.push(%_SubString(subject, currentIndex, length));
|
| break;
|
| }
|
| var endIndex = matchInfo[CAPTURE1];
|
| @@ -646,11 +637,7 @@ function StringSplitOnRegExp(subject, separator, limit, length) {
|
| continue;
|
| }
|
|
|
| - if (currentIndex + 1 == startMatch) {
|
| - result.push(%_StringCharAt(subject, currentIndex));
|
| - } else {
|
| - result.push(%_SubString(subject, currentIndex, startMatch));
|
| - }
|
| + result.push(%_SubString(subject, currentIndex, startMatch));
|
|
|
| if (result.length === limit) break;
|
|
|
| @@ -659,11 +646,7 @@ function StringSplitOnRegExp(subject, separator, limit, length) {
|
| var start = matchInfo[i++];
|
| var end = matchInfo[i++];
|
| if (end != -1) {
|
| - if (start + 1 == end) {
|
| - result.push(%_StringCharAt(subject, start));
|
| - } else {
|
| - result.push(%_SubString(subject, start, end));
|
| - }
|
| + result.push(%_SubString(subject, start, end));
|
| } else {
|
| result.push(void 0);
|
| }
|
| @@ -707,9 +690,7 @@ function StringSubstring(start, end) {
|
| }
|
| }
|
|
|
| - return ((start_i + 1 == end_i)
|
| - ? %_StringCharAt(s, start_i)
|
| - : %_SubString(s, start_i, end_i));
|
| + return %_SubString(s, start_i, end_i);
|
| }
|
|
|
|
|
| @@ -751,9 +732,7 @@ function StringSubstr(start, n) {
|
| var end = start + len;
|
| if (end > s.length) end = s.length;
|
|
|
| - return ((start + 1 == end)
|
| - ? %_StringCharAt(s, start)
|
| - : %_SubString(s, start, end));
|
| + return %_SubString(s, start, end);
|
| }
|
|
|
|
|
|
|