diff options
| author | Ben Murdoch <benm@google.com> | 2011-05-25 10:26:03 +0100 |
|---|---|---|
| committer | Ben Murdoch <benm@google.com> | 2011-05-25 16:24:42 +0100 |
| commit | e0cee9b3ed82e2391fd85d118aeaa4ea361c687d (patch) | |
| tree | 31c7963cf0dfc88be29e765884e1f235076c03a4 /src/array.js | |
| parent | 1e0659c275bb392c045087af4f6b0d7565cb3d77 (diff) | |
| download | android_external_v8-e0cee9b3ed82e2391fd85d118aeaa4ea361c687d.tar.gz android_external_v8-e0cee9b3ed82e2391fd85d118aeaa4ea361c687d.tar.bz2 android_external_v8-e0cee9b3ed82e2391fd85d118aeaa4ea361c687d.zip | |
Update V8 to r7079 as required by WebKit r80534.
Change-Id: I487c152e485d5a40b68997d7c0d2f1fba5da0834
Diffstat (limited to 'src/array.js')
| -rw-r--r-- | src/array.js | 65 |
1 files changed, 37 insertions, 28 deletions
diff --git a/src/array.js b/src/array.js index 1298434d..6ed14760 100644 --- a/src/array.js +++ b/src/array.js @@ -33,7 +33,7 @@ // Global list of arrays visited during toString, toLocaleString and // join invocations. -var visited_arrays = new $Array(); +var visited_arrays = new InternalArray(); // Gets a sorted array of array keys. Useful for operations on sparse @@ -73,7 +73,7 @@ function SparseJoin(array, len, convert) { var last_key = -1; var keys_length = keys.length; - var elements = new $Array(keys_length); + var elements = new InternalArray(keys_length); var elements_length = 0; for (var i = 0; i < keys_length; i++) { @@ -122,7 +122,7 @@ function Join(array, length, separator, convert) { } // Construct an array for the elements. - var elements = new $Array(length); + var elements = new InternalArray(length); // We pull the empty separator check outside the loop for speed! if (separator.length == 0) { @@ -140,7 +140,7 @@ function Join(array, length, separator, convert) { return %StringBuilderConcat(elements, elements_length, ''); } // Non-empty separator case. - // If the first element is a number then use the heuristic that the + // If the first element is a number then use the heuristic that the // remaining elements are also likely to be numbers. if (!IS_NUMBER(array[0])) { for (var i = 0; i < length; i++) { @@ -148,7 +148,7 @@ function Join(array, length, separator, convert) { if (!IS_STRING(e)) e = convert(e); elements[i] = e; } - } else { + } else { for (var i = 0; i < length; i++) { var e = array[i]; if (IS_NUMBER(e)) elements[i] = %_NumberToString(e); @@ -157,19 +157,11 @@ function Join(array, length, separator, convert) { elements[i] = e; } } - } - var result = %_FastAsciiArrayJoin(elements, separator); - if (!IS_UNDEFINED(result)) return result; - - var length2 = (length << 1) - 1; - var j = length2; - var i = length; - elements[--j] = elements[--i]; - while (i > 0) { - elements[--j] = separator; - elements[--j] = elements[--i]; } - return %StringBuilderConcat(elements, length2, ''); + var result = %_FastAsciiArrayJoin(elements, separator); + if (!IS_UNDEFINED(result)) return result; + + return %StringBuilderJoin(elements, length, separator); } finally { // Make sure to remove the last element of the visited array no // matter what happens. @@ -179,7 +171,7 @@ function Join(array, length, separator, convert) { function ConvertToString(x) { - // Assumes x is a non-string. + // Assumes x is a non-string. if (IS_NUMBER(x)) return %_NumberToString(x); if (IS_BOOLEAN(x)) return x ? 'true' : 'false'; return (IS_NULL_OR_UNDEFINED(x)) ? '' : %ToString(%DefaultString(x)); @@ -249,7 +241,7 @@ function SmartSlice(array, start_i, del_count, len, deleted_elements) { // special array operations to handle sparse arrays in a sensible fashion. function SmartMove(array, start_i, del_count, len, num_additional_args) { // Move data to new array. - var new_array = new $Array(len - del_count + num_additional_args); + var new_array = new InternalArray(len - del_count + num_additional_args); var intervals = %GetArrayKeys(array, len); var length = intervals.length; for (var k = 0; k < length; k++) { @@ -426,9 +418,8 @@ function ArrayPush() { function ArrayConcat(arg1) { // length == 1 - // TODO: can we just use arguments? var arg_count = %_ArgumentsLength(); - var arrays = new $Array(1 + arg_count); + var arrays = new InternalArray(1 + arg_count); arrays[0] = this; for (var i = 0; i < arg_count; i++) { arrays[i + 1] = %_Arguments(i); @@ -934,7 +925,9 @@ function ArrayFilter(f, receiver) { for (var i = 0; i < length; i++) { var current = this[i]; if (!IS_UNDEFINED(current) || i in this) { - if (f.call(receiver, current, i, this)) result[result_length++] = current; + if (f.call(receiver, current, i, this)) { + result[result_length++] = current; + } } } return result; @@ -999,13 +992,15 @@ function ArrayMap(f, receiver) { // Pull out the length so that modifications to the length in the // loop will not affect the looping. var length = TO_UINT32(this.length); - var result = new $Array(length); + var result = new $Array(); + var accumulator = new InternalArray(length); for (var i = 0; i < length; i++) { var current = this[i]; if (!IS_UNDEFINED(current) || i in this) { - result[i] = f.call(receiver, current, i, this); + accumulator[i] = f.call(receiver, current, i, this); } } + %MoveArrayContents(accumulator, result); return result; } @@ -1026,13 +1021,13 @@ function ArrayIndexOf(element, index) { } var min = index; var max = length; - if (UseSparseVariant(this, length, true)) { + if (UseSparseVariant(this, length, IS_ARRAY(this))) { var intervals = %GetArrayKeys(this, length); if (intervals.length == 2 && intervals[0] < 0) { // A single interval. var intervalMin = -(intervals[0] + 1); var intervalMax = intervalMin + intervals[1]; - min = MAX(min, intervalMin); + if (min < intervalMin) min = intervalMin; max = intervalMax; // Capped by length already. // Fall through to loop below. } else { @@ -1082,13 +1077,13 @@ function ArrayLastIndexOf(element, index) { } var min = 0; var max = index; - if (UseSparseVariant(this, length, true)) { + if (UseSparseVariant(this, length, IS_ARRAY(this))) { var intervals = %GetArrayKeys(this, index + 1); if (intervals.length == 2 && intervals[0] < 0) { // A single interval. var intervalMin = -(intervals[0] + 1); var intervalMax = intervalMin + intervals[1]; - min = MAX(min, intervalMin); + if (min < intervalMin) min = intervalMin; max = intervalMax; // Capped by index already. // Fall through to loop below. } else { @@ -1234,6 +1229,20 @@ function SetupArray() { )); %FinishArrayPrototypeSetup($Array.prototype); + + // The internal Array prototype doesn't need to be fancy, since it's never + // exposed to user code, so no hidden prototypes or DONT_ENUM attributes + // are necessary. + // The null __proto__ ensures that we never inherit any user created + // getters or setters from, e.g., Object.prototype. + InternalArray.prototype.__proto__ = null; + // Adding only the functions that are actually used, and a toString. + InternalArray.prototype.join = getFunction("join", ArrayJoin); + InternalArray.prototype.pop = getFunction("pop", ArrayPop); + InternalArray.prototype.push = getFunction("push", ArrayPush); + InternalArray.prototype.toString = function() { + return "Internal Array, length " + this.length; + }; } |
