Index: src/string.js |
=================================================================== |
--- src/string.js (revision 3544) |
+++ src/string.js (working copy) |
@@ -505,7 +505,7 @@ |
// ECMA-262 section 15.5.4.14 |
function StringSplit(separator, limit) { |
var subject = ToString(this); |
- limit = (limit === void 0) ? 0xffffffff : ToUint32(limit); |
+ limit = (IS_UNDEFINED(limit)) ? 0xffffffff : TO_UINT32(limit); |
if (limit === 0) return []; |
// ECMA-262 says that if separator is undefined, the result should |
@@ -604,22 +604,30 @@ |
// ECMA-262 section 15.5.4.15 |
function StringSubstring(start, end) { |
- var s = ToString(this); |
+ var s = this; |
+ if (!IS_STRING(s)) s = ToString(s); |
var s_len = s.length; |
+ |
var start_i = TO_INTEGER(start); |
+ if (start_i < 0) { |
+ start_i = 0; |
+ } else if (start_i > s_len) { |
+ start_i = s_len; |
+ } |
+ |
var end_i = s_len; |
- if (!IS_UNDEFINED(end)) |
+ if (!IS_UNDEFINED(end)) { |
end_i = TO_INTEGER(end); |
- |
- if (start_i < 0) start_i = 0; |
- if (start_i > s_len) start_i = s_len; |
- if (end_i < 0) end_i = 0; |
- if (end_i > s_len) end_i = s_len; |
- |
- if (start_i > end_i) { |
- var tmp = end_i; |
- end_i = start_i; |
- start_i = tmp; |
+ if (end_i > s_len) { |
+ end_i = s_len; |
+ } else { |
+ if (end_i < 0) end_i = 0; |
+ if (start_i > end_i) { |
+ var tmp = end_i; |
+ end_i = start_i; |
+ start_i = tmp; |
+ } |
+ } |
} |
return SubString(s, start_i, end_i); |
@@ -790,21 +798,14 @@ |
} |
-// StringBuilder support. |
- |
-function StringBuilder() { |
- this.elements = new $Array(); |
-} |
- |
- |
+// ReplaceResultBuilder support. |
function ReplaceResultBuilder(str) { |
this.elements = new $Array(); |
this.special_string = str; |
} |
-ReplaceResultBuilder.prototype.add = |
-StringBuilder.prototype.add = function(str) { |
+ReplaceResultBuilder.prototype.add = function(str) { |
if (!IS_STRING(str)) str = ToString(str); |
if (str.length > 0) { |
var elements = this.elements; |
@@ -828,13 +829,9 @@ |
} |
-StringBuilder.prototype.generate = function() { |
- return %StringBuilderConcat(this.elements, ""); |
-} |
- |
- |
ReplaceResultBuilder.prototype.generate = function() { |
- return %StringBuilderConcat(this.elements, this.special_string); |
+ var elements = this.elements; |
+ return %StringBuilderConcat(elements, elements.length, this.special_string); |
} |