Index: src/string.js |
diff --git a/src/string.js b/src/string.js |
index 576ffc85d84b5ae9ec0384094816eabe7c7b3316..3b3c82bb7214e697c7845153c0eab73ec79a7f39 100644 |
--- a/src/string.js |
+++ b/src/string.js |
@@ -101,28 +101,28 @@ function StringConcat() { |
// ECMA-262 section 15.5.4.7 |
-function StringIndexOf(pattern /* position */) { // length == 1 |
- var subject = TO_STRING_INLINE(this); |
- var pattern = TO_STRING_INLINE(pattern); |
- var subject_len = subject.length; |
- var pattern_len = pattern.length; |
+function StringIndexOf(searchString /* position */) { // length == 1 |
+ var subject_str = TO_STRING_INLINE(this); |
+ var pattern_str = TO_STRING_INLINE(searchString); |
+ var subject_str_len = subject_str.length; |
+ var pattern_str_len = pattern_str.length; |
var index = 0; |
if (%_ArgumentsLength() > 1) { |
var arg1 = %_Arguments(1); // position |
index = TO_INTEGER(arg1); |
} |
if (index < 0) index = 0; |
- if (index > subject_len) index = subject_len; |
- if (pattern_len + index > subject_len) return -1; |
- return %StringIndexOf(subject, pattern, index); |
+ if (index > subject_str_len) index = subject_str_len; |
+ if (pattern_str_len + index > subject_str_len) return -1; |
+ return %StringIndexOf(subject_str, pattern_str, index); |
} |
// ECMA-262 section 15.5.4.8 |
-function StringLastIndexOf(pat /* position */) { // length == 1 |
+function StringLastIndexOf(searchString /* position */) { // length == 1 |
var sub = TO_STRING_INLINE(this); |
var subLength = sub.length; |
- var pat = TO_STRING_INLINE(pat); |
+ var pat = TO_STRING_INLINE(searchString); |
var patLength = pat.length; |
var index = subLength - patLength; |
if (%_ArgumentsLength() > 1) { |
@@ -150,8 +150,10 @@ function StringLastIndexOf(pat /* position */) { // length == 1 |
// do anything locale specific. |
function StringLocaleCompare(other) { |
if (%_ArgumentsLength() === 0) return 0; |
- return %StringLocaleCompare(TO_STRING_INLINE(this), |
- TO_STRING_INLINE(other)); |
+ |
+ var this_str = TO_STRING_INLINE(this); |
+ var other_str = TO_STRING_INLINE(other); |
+ return %StringLocaleCompare(this_str, other_str); |
} |
@@ -175,7 +177,9 @@ function StringMatch(regexp) { |
// 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); |
+ if (start + 1 == end) { |
+ return %_StringCharAt(string, start); |
+ } |
return %_SubString(string, start, end); |
} |
@@ -204,10 +208,7 @@ function StringReplace(search, replace) { |
replace); |
} |
} else { |
- return %StringReplaceRegExpWithString(subject, |
- search, |
- TO_STRING_INLINE(replace), |
- lastMatchInfo); |
+ return StringReplaceRegExp(subject, search, replace); |
} |
} |
@@ -223,11 +224,7 @@ function StringReplace(search, replace) { |
// Compute the string to replace with. |
if (IS_FUNCTION(replace)) { |
- builder.add(%_CallFunction(%GetGlobalReceiver(), |
- search, |
- start, |
- subject, |
- replace)); |
+ builder.add(replace.call(null, search, start, subject)); |
} else { |
reusableMatchInfo[CAPTURE0] = start; |
reusableMatchInfo[CAPTURE1] = end; |
@@ -242,6 +239,15 @@ function StringReplace(search, replace) { |
} |
+// Helper function for regular expressions in String.prototype.replace. |
+function StringReplaceRegExp(subject, regexp, replace) { |
+ return %StringReplaceRegExpWithString(subject, |
+ regexp, |
+ TO_STRING_INLINE(replace), |
+ lastMatchInfo); |
+} |
+ |
+ |
// Expand the $-expressions in the string and return a new string with |
// the result. |
function ExpandReplacement(string, subject, matchInfo, builder) { |
@@ -402,7 +408,9 @@ function StringReplaceGlobalRegExpWithFunction(subject, regexp, replace) { |
lastMatchInfoOverride = override; |
var func_result = |
%_CallFunction(receiver, elem, match_start, subject, replace); |
- func_result = TO_STRING_INLINE(func_result); |
+ if (!IS_STRING(func_result)) { |
+ func_result = NonStringToString(func_result); |
+ } |
res[i] = func_result; |
match_start += elem.length; |
} |
@@ -416,7 +424,9 @@ function StringReplaceGlobalRegExpWithFunction(subject, regexp, replace) { |
// Use the apply argument as backing for global RegExp properties. |
lastMatchInfoOverride = elem; |
var func_result = replace.apply(null, elem); |
- func_result = TO_STRING_INLINE(func_result); |
+ if (!IS_STRING(func_result)) { |
+ func_result = NonStringToString(func_result); |
+ } |
res[i] = func_result; |
} |
i++; |
@@ -477,7 +487,8 @@ function StringSearch(re) { |
} else { |
regexp = new $RegExp(re); |
} |
- var match = DoRegExpExec(regexp, TO_STRING_INLINE(this), 0); |
+ var s = TO_STRING_INLINE(this); |
+ var match = DoRegExpExec(regexp, s, 0); |
if (match) { |
return match[CAPTURE0]; |
} |
@@ -565,14 +576,14 @@ function StringSplit(separator, limit) { |
while (true) { |
if (startIndex === length) { |
- result.push(subject.slice(currentIndex, length)); |
+ result[result.length] = subject.slice(currentIndex, length); |
break; |
} |
var matchInfo = splitMatch(separator, subject, currentIndex, startIndex); |
if (IS_NULL(matchInfo)) { |
- result.push(subject.slice(currentIndex, length)); |
+ result[result.length] = subject.slice(currentIndex, length); |
break; |
} |
@@ -584,21 +595,17 @@ function StringSplit(separator, limit) { |
continue; |
} |
- result.push(SubString(subject, currentIndex, matchInfo[CAPTURE0])); |
+ result[result.length] = SubString(subject, currentIndex, matchInfo[CAPTURE0]); |
if (result.length === limit) break; |
- var matchinfo_len = NUMBER_OF_CAPTURES(matchInfo) + REGEXP_FIRST_CAPTURE; |
- for (var i = REGEXP_FIRST_CAPTURE + 2; i < matchinfo_len; ) { |
- 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)); |
- } |
+ var num_captures = NUMBER_OF_CAPTURES(matchInfo); |
+ for (var i = 2; i < num_captures; i += 2) { |
+ var start = matchInfo[CAPTURE(i)]; |
+ var end = matchInfo[CAPTURE(i + 1)]; |
+ if (start != -1 && end != -1) { |
+ result[result.length] = SubString(subject, start, end); |
} else { |
- result.push(void 0); |
+ result[result.length] = void 0; |
} |
if (result.length === limit) break outer_loop; |
} |
@@ -649,9 +656,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); |
} |
@@ -689,9 +694,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); |
} |