Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(865)

Unified Diff: src/string.js

Issue 5862002: Version 3.0.2. (Closed)
Patch Set: Created 10 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« ChangeLog ('K') | « src/spaces-inl.h ('k') | src/v8natives.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
}
« ChangeLog ('K') | « src/spaces-inl.h ('k') | src/v8natives.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698