Index: src/string.js |
=================================================================== |
--- src/string.js (revision 2190) |
+++ src/string.js (working copy) |
@@ -370,10 +370,10 @@ |
// 'abcd'.replace(/(.)/g, function() { return RegExp.$1; } |
// should be 'abcd' and not 'dddd' (or anything else). |
function StringReplaceRegExpWithFunction(subject, regexp, replace) { |
- var result = new ReplaceResultBuilder(subject); |
var lastMatchInfo = DoRegExpExec(regexp, subject, 0); |
if (IS_NULL(lastMatchInfo)) return subject; |
+ var result = new ReplaceResultBuilder(subject); |
// There's at least one match. If the regexp is global, we have to loop |
// over all matches. The loop is not in C++ code here like the one in |
// RegExp.prototype.exec, because of the interleaved function application. |
@@ -498,39 +498,40 @@ |
// ECMA-262 section 15.5.4.14 |
function StringSplit(separator, limit) { |
var subject = ToString(this); |
- var result = []; |
- var lim = (limit === void 0) ? 0xffffffff : ToUint32(limit); |
+ limit = (limit === void 0) ? 0xffffffff : ToUint32(limit); |
+ if (limit === 0) return []; |
- if (lim === 0) return result; |
- |
// ECMA-262 says that if separator is undefined, the result should |
// be an array of size 1 containing the entire string. SpiderMonkey |
// and KJS have this behaviour only when no separator is given. If |
// undefined is explicitly given, they convert it to a string and |
// use that. We do as SpiderMonkey and KJS. |
if (%_ArgumentsLength() === 0) { |
- result[result.length] = subject; |
- return result; |
+ return [subject]; |
} |
var length = subject.length; |
- var currentIndex = 0; |
- var startIndex = 0; |
- |
- var sep; |
if (IS_REGEXP(separator)) { |
- sep = separator; |
- %_Log('regexp', 'regexp-split,%0S,%1r', [subject, sep]); |
+ %_Log('regexp', 'regexp-split,%0S,%1r', [subject, separator]); |
} else { |
- sep = ToString(separator); |
+ separator = ToString(separator); |
+ // If the separator string is empty then return the elements in the subject. |
+ if (separator.length == 0) { |
+ var result = $Array(length); |
+ for (var i = 0; i < length; i++) result[i] = subject[i]; |
+ return result; |
+ } |
} |
if (length === 0) { |
- if (splitMatch(sep, subject, 0, 0) != null) return result; |
- result[result.length] = subject; |
- return result; |
+ if (splitMatch(separator, subject, 0, 0) != null) return []; |
+ return [subject]; |
} |
+ var currentIndex = 0; |
+ var startIndex = 0; |
+ var result = []; |
+ |
while (true) { |
if (startIndex === length) { |
@@ -538,7 +539,7 @@ |
return result; |
} |
- var lastMatchInfo = splitMatch(sep, subject, currentIndex, startIndex); |
+ var lastMatchInfo = splitMatch(separator, subject, currentIndex, startIndex); |
if (IS_NULL(lastMatchInfo)) { |
result[result.length] = subject.slice(currentIndex, length); |
@@ -553,21 +554,18 @@ |
continue; |
} |
- result[result.length] = |
- SubString(subject, currentIndex, lastMatchInfo[CAPTURE0]); |
- if (result.length === lim) return result; |
+ result[result.length] = SubString(subject, currentIndex, lastMatchInfo[CAPTURE0]); |
+ if (result.length === limit) return result; |
for (var i = 2; i < NUMBER_OF_CAPTURES(lastMatchInfo); i += 2) { |
var start = lastMatchInfo[CAPTURE(i)]; |
var end = lastMatchInfo[CAPTURE(i + 1)]; |
if (start != -1 && end != -1) { |
- result[result.length] = SubString(subject, |
- lastMatchInfo[CAPTURE(i)], |
- lastMatchInfo[CAPTURE(i + 1)]); |
+ result[result.length] = SubString(subject, start, end); |
} else { |
result[result.length] = void 0; |
} |
- if (result.length === lim) return result; |
+ if (result.length === limit) return result; |
} |
startIndex = currentIndex = endIndex; |