Index: src/js/array.js |
diff --git a/src/js/array.js b/src/js/array.js |
index c29b8f7256ad1d2c568f5a5103d4c666f4aaf485..c28f96e8d94eaf3b0553a3abbb2d513804c63808 100644 |
--- a/src/js/array.js |
+++ b/src/js/array.js |
@@ -50,9 +50,9 @@ function KeySortCompare(a, b) { |
function GetSortedArrayKeys(array, indices) { |
if (IS_NUMBER(indices)) { |
- var keys = new InternalArray(); |
// It's an interval |
var limit = indices; |
+ var keys = new InternalArray(); |
for (var i = 0; i < limit; ++i) { |
var e = array[i]; |
if (!IS_UNDEFINED(e) || i in array) { |
@@ -65,26 +65,24 @@ function GetSortedArrayKeys(array, indices) { |
} |
-function SparseJoinWithSeparatorJS(array, keys, length, convert, separator) { |
+function SparseJoinWithSeparatorJS(array, keys, length, use_locale, separator) { |
var keys_length = keys.length; |
var elements = new InternalArray(keys_length * 2); |
for (var i = 0; i < keys_length; i++) { |
var key = keys[i]; |
- var e = array[key]; |
elements[i * 2] = key; |
- elements[i * 2 + 1] = IS_STRING(e) ? e : convert(e); |
+ elements[i * 2 + 1] = ConvertToString(use_locale, array[key]); |
} |
return %SparseJoinWithSeparator(elements, length, separator); |
} |
// Optimized for sparse arrays if separator is ''. |
-function SparseJoin(array, keys, convert) { |
+function SparseJoin(array, keys, use_locale) { |
var keys_length = keys.length; |
var elements = new InternalArray(keys_length); |
for (var i = 0; i < keys_length; i++) { |
- var e = array[keys[i]]; |
- elements[i] = IS_STRING(e) ? e : convert(e); |
+ elements[i] = ConvertToString(use_locale, array[keys[i]]); |
} |
return %StringBuilderConcat(elements, keys_length, ''); |
} |
@@ -137,60 +135,38 @@ function StackHas(stack, v) { |
// join invocations. |
var visited_arrays = new Stack(); |
-function DoJoin(array, length, is_array, separator, convert) { |
+function DoJoin(array, length, is_array, separator, use_locale) { |
if (UseSparseVariant(array, length, is_array, length)) { |
%NormalizeElements(array); |
var keys = GetSortedArrayKeys(array, %GetArrayKeys(array, length)); |
if (separator === '') { |
if (keys.length === 0) return ''; |
- return SparseJoin(array, keys, convert); |
+ return SparseJoin(array, keys, use_locale); |
} else { |
- return SparseJoinWithSeparatorJS(array, keys, length, convert, separator); |
+ return SparseJoinWithSeparatorJS( |
+ array, keys, length, use_locale, separator); |
} |
} |
// Fast case for one-element arrays. |
if (length === 1) { |
- var e = array[0]; |
- return IS_STRING(e) ? e : convert(e); |
+ return ConvertToString(use_locale, array[0]); |
} |
// Construct an array for the elements. |
var elements = new InternalArray(length); |
+ for (var i = 0; i < length; i++) { |
+ elements[i] = ConvertToString(use_locale, array[i]); |
+ } |
- // We pull the empty separator check outside the loop for speed! |
if (separator === '') { |
- for (var i = 0; i < length; i++) { |
- var e = array[i]; |
- elements[i] = IS_STRING(e) ? e : convert(e); |
- } |
return %StringBuilderConcat(elements, length, ''); |
- } |
- // Non-empty separator case. |
- // If the first element is a number then use the heuristic that the |
- // remaining elements are also likely to be numbers. |
- var e = array[0]; |
- if (IS_NUMBER(e)) { |
- elements[0] = %_NumberToString(e); |
- for (var i = 1; i < length; i++) { |
- e = array[i]; |
- if (IS_NUMBER(e)) { |
- elements[i] = %_NumberToString(e); |
- } else { |
- elements[i] = IS_STRING(e) ? e : convert(e); |
- } |
- } |
} else { |
- elements[0] = IS_STRING(e) ? e : convert(e); |
- for (var i = 1; i < length; i++) { |
- e = array[i]; |
- elements[i] = IS_STRING(e) ? e : convert(e); |
- } |
+ return %StringBuilderJoin(elements, length, separator); |
} |
- return %StringBuilderJoin(elements, length, separator); |
} |
-function Join(array, length, separator, convert) { |
+function Join(array, length, separator, use_locale) { |
if (length === 0) return ''; |
var is_array = IS_ARRAY(array); |
@@ -204,7 +180,7 @@ function Join(array, length, separator, convert) { |
// Attempt to convert the elements. |
try { |
- return DoJoin(array, length, is_array, separator, convert); |
+ return DoJoin(array, length, is_array, separator, use_locale); |
} finally { |
// Make sure to remove the last element of the visited array no |
// matter what happens. |
@@ -213,15 +189,9 @@ function Join(array, length, separator, convert) { |
} |
-function ConvertToString(x) { |
+function ConvertToString(use_locale, x) { |
if (IS_NULL_OR_UNDEFINED(x)) return ''; |
- return TO_STRING(x); |
-} |
- |
- |
-function ConvertToLocaleString(e) { |
- if (IS_NULL_OR_UNDEFINED(e)) return ''; |
- return TO_STRING(e.toLocaleString()); |
+ return TO_STRING(use_locale ? x.toLocaleString() : x); |
} |
@@ -368,7 +338,7 @@ function ArrayToString() { |
if (IS_ARRAY(this)) { |
func = this.join; |
if (func === ArrayJoin) { |
- return Join(this, this.length, ',', ConvertToString); |
+ return Join(this, this.length, ',', false); |
} |
array = this; |
} else { |
@@ -383,9 +353,7 @@ function ArrayToString() { |
function InnerArrayToLocaleString(array, length) { |
- var len = TO_LENGTH(length); |
- if (len === 0) return ""; |
- return Join(array, len, ',', ConvertToLocaleString); |
+ return Join(array, TO_LENGTH(length), ',', true); |
} |
@@ -410,7 +378,7 @@ function InnerArrayJoin(separator, array, length) { |
return TO_STRING(e); |
} |
- return Join(array, length, separator, ConvertToString); |
+ return Join(array, length, separator, false); |
} |