Index: src/js/array.js |
diff --git a/src/js/array.js b/src/js/array.js |
index 33c8120f34a9d32cd010bc6651effdb3ae001d8d..1468d57c6cae52f3f4c307609d1c58a9517382f5 100644 |
--- a/src/js/array.js |
+++ b/src/js/array.js |
@@ -74,6 +74,11 @@ |
} |
+// Global list of arrays visited during toString, toLocaleString and |
+// join invocations. |
+var visited_arrays = new InternalArray(); |
+ |
+ |
// Gets a sorted array of array keys. Useful for operations on sparse |
// arrays. Dupes have not been removed. |
function GetSortedArrayKeys(array, indices) { |
@@ -145,17 +150,6 @@ |
} |
-function StringBuilderJoin(elements, length, separator) { |
- length = MinSimple(elements.length, length); |
- if (length == 0) return ""; |
- var result = elements[0]; |
- for (var i = 1; i < length; i++) { |
- result = result + separator + elements[i]; |
- } |
- return result; |
-} |
- |
- |
function UseSparseVariant(array, length, is_array, touched) { |
// Only use the sparse variant on arrays that are likely to be sparse and the |
// number of elements touched in the operation is relatively small compared to |
@@ -173,36 +167,6 @@ |
(touched > estimated_elements * 4); |
} |
-function Stack() { |
- this.length = 0; |
- this.values = new InternalArray(); |
-} |
- |
-// Predeclare the instance variables on the prototype. Otherwise setting them in |
-// the constructor will leak the instance through settings on Object.prototype. |
-Stack.prototype.length = null; |
-Stack.prototype.values = null; |
- |
-function StackPush(stack, value) { |
- stack.values[stack.length++] = value; |
-} |
- |
-function StackPop(stack) { |
- stack.values[--stack.length] = null |
-} |
- |
-function StackHas(stack, v) { |
- var length = stack.length; |
- var values = stack.values; |
- for (var i = 0; i < length; i++) { |
- if (values[i] === v) return true; |
- } |
- return false; |
-} |
- |
-// Global list of arrays visited during toString, toLocaleString and |
-// join invocations. |
-var visited_arrays = new Stack(); |
function Join(array, length, separator, convert) { |
if (length == 0) return ''; |
@@ -212,8 +176,7 @@ |
if (is_array) { |
// If the array is cyclic, return the empty string for already |
// visited arrays. |
- if (StackHas(visited_arrays, array)) return ''; |
- StackPush(visited_arrays, array); |
+ if (!%PushIfAbsent(visited_arrays, array)) return ''; |
} |
// Attempt to convert the elements. |
@@ -272,11 +235,11 @@ |
elements[i] = e; |
} |
} |
- return StringBuilderJoin(elements, length, separator); |
+ return %StringBuilderJoin(elements, length, separator); |
} finally { |
// Make sure to remove the last element of the visited array no |
// matter what happens. |
- if (is_array) StackPop(visited_arrays); |
+ if (is_array) visited_arrays.length = visited_arrays.length - 1; |
} |
} |
@@ -1996,10 +1959,6 @@ |
to.InnerArraySort = InnerArraySort; |
to.InnerArrayToLocaleString = InnerArrayToLocaleString; |
to.PackedArrayReverse = PackedArrayReverse; |
- to.Stack = Stack; |
- to.StackHas = StackHas; |
- to.StackPush = StackPush; |
- to.StackPop = StackPop; |
}); |
%InstallToContext([ |