diff options
Diffstat (limited to 'deps/v8/src/js/array.js')
-rw-r--r-- | deps/v8/src/js/array.js | 321 |
1 files changed, 0 insertions, 321 deletions
diff --git a/deps/v8/src/js/array.js b/deps/v8/src/js/array.js index fe02afceea..16b140bb38 100644 --- a/deps/v8/src/js/array.js +++ b/deps/v8/src/js/array.js @@ -13,19 +13,12 @@ var GlobalArray = global.Array; var InternalArray = utils.InternalArray; -var MathMax = global.Math.max; -var MathMin = global.Math.min; -var ObjectHasOwnProperty = global.Object.prototype.hasOwnProperty; var ObjectToString = global.Object.prototype.toString; var iteratorSymbol = utils.ImportNow("iterator_symbol"); var unscopablesSymbol = utils.ImportNow("unscopables_symbol"); // ------------------------------------------------------------------- -macro IS_PROXY(arg) -(%_IsJSProxy(arg)) -endmacro - macro INVERT_NEG_ZERO(arg) ((arg) + 0) endmacro @@ -201,140 +194,6 @@ function ConvertToString(use_locale, x, locales, options) { } -// This function implements the optimized splice implementation that can use -// special array operations to handle sparse arrays in a sensible fashion. -function SparseSlice(array, start_i, del_count, len, deleted_elements) { - // Move deleted elements to a new array (the return value from splice). - var indices = %GetArrayKeys(array, start_i + del_count); - if (IS_NUMBER(indices)) { - var limit = indices; - for (var i = start_i; i < limit; ++i) { - var current = array[i]; - if (!IS_UNDEFINED(current) || i in array) { - %CreateDataProperty(deleted_elements, i - start_i, current); - } - } - } else { - var length = indices.length; - for (var k = 0; k < length; ++k) { - var key = indices[k]; - if (key >= start_i) { - var current = array[key]; - if (!IS_UNDEFINED(current) || key in array) { - %CreateDataProperty(deleted_elements, key - start_i, current); - } - } - } - } -} - - -// This function implements the optimized splice implementation that can use -// special array operations to handle sparse arrays in a sensible fashion. -function SparseMove(array, start_i, del_count, len, num_additional_args) { - // Bail out if no moving is necessary. - if (num_additional_args === del_count) return; - // Move data to new array. - var new_array = new InternalArray( - // Clamp array length to 2^32-1 to avoid early RangeError. - MathMin(len - del_count + num_additional_args, 0xffffffff)); - var big_indices; - var indices = %GetArrayKeys(array, len); - if (IS_NUMBER(indices)) { - var limit = indices; - for (var i = 0; i < start_i && i < limit; ++i) { - var current = array[i]; - if (!IS_UNDEFINED(current) || i in array) { - new_array[i] = current; - } - } - for (var i = start_i + del_count; i < limit; ++i) { - var current = array[i]; - if (!IS_UNDEFINED(current) || i in array) { - new_array[i - del_count + num_additional_args] = current; - } - } - } else { - var length = indices.length; - for (var k = 0; k < length; ++k) { - var key = indices[k]; - if (key < start_i) { - var current = array[key]; - if (!IS_UNDEFINED(current) || key in array) { - new_array[key] = current; - } - } else if (key >= start_i + del_count) { - var current = array[key]; - if (!IS_UNDEFINED(current) || key in array) { - var new_key = key - del_count + num_additional_args; - new_array[new_key] = current; - if (new_key > 0xfffffffe) { - big_indices = big_indices || new InternalArray(); - big_indices.push(new_key); - } - } - } - } - } - // Move contents of new_array into this array - %MoveArrayContents(new_array, array); - // Add any moved values that aren't elements anymore. - if (!IS_UNDEFINED(big_indices)) { - var length = big_indices.length; - for (var i = 0; i < length; ++i) { - var key = big_indices[i]; - array[key] = new_array[key]; - } - } -} - - -// This is part of the old simple-minded splice. We are using it either -// because the receiver is not an array (so we have no choice) or because we -// know we are not deleting or moving a lot of elements. -function SimpleSlice(array, start_i, del_count, len, deleted_elements) { - for (var i = 0; i < del_count; i++) { - var index = start_i + i; - if (index in array) { - var current = array[index]; - %CreateDataProperty(deleted_elements, i, current); - } - } -} - - -function SimpleMove(array, start_i, del_count, len, num_additional_args) { - if (num_additional_args !== del_count) { - // Move the existing elements after the elements to be deleted - // to the right position in the resulting array. - if (num_additional_args > del_count) { - for (var i = len - del_count; i > start_i; i--) { - var from_index = i + del_count - 1; - var to_index = i + num_additional_args - 1; - if (from_index in array) { - array[to_index] = array[from_index]; - } else { - delete array[to_index]; - } - } - } else { - for (var i = start_i; i < len - del_count; i++) { - var from_index = i + del_count; - var to_index = i + num_additional_args; - if (from_index in array) { - array[to_index] = array[from_index]; - } else { - delete array[to_index]; - } - } - for (var i = len; i > len - del_count + num_additional_args; i--) { - delete array[i - 1]; - } - } - } -} - - // ------------------------------------------------------------------- var ArrayJoin; @@ -408,55 +267,6 @@ DEFINE_METHOD( ); -function ArrayShiftFallback() { - var array = TO_OBJECT(this); - var len = TO_LENGTH(array.length); - - if (len === 0) { - array.length = 0; - return; - } - - var first = array[0]; - - if (UseSparseVariant(array, len, IS_ARRAY(array), len)) { - SparseMove(array, 0, 1, len, 0); - } else { - SimpleMove(array, 0, 1, len, 0); - } - - array.length = len - 1; - - return first; -} - - -function ArrayUnshiftFallback(arg1) { // length == 1 - var array = TO_OBJECT(this); - var len = TO_LENGTH(array.length); - var num_arguments = arguments.length; - - const new_len = len + num_arguments; - if (num_arguments > 0) { - if (new_len >= 2**53) throw %make_type_error(kInvalidArrayLength); - - if (len > 0 && UseSparseVariant(array, len, IS_ARRAY(array), len) && - !%object_is_sealed(array)) { - SparseMove(array, 0, 0, len, num_arguments); - } else { - SimpleMove(array, 0, 0, len, num_arguments); - } - - for (var i = 0; i < num_arguments; i++) { - array[i] = arguments[i]; - } - } - - array.length = new_len; - return new_len; -} - - // Oh the humanity... don't remove the following function because js2c for some // reason gets symbol minifiation wrong if it's not there. Instead of spending // the time fixing js2c (which will go away when all of the internal .js runtime @@ -465,83 +275,6 @@ function ArraySliceFallback(start, end) { return null; } -function ComputeSpliceStartIndex(start_i, len) { - if (start_i < 0) { - start_i += len; - return start_i < 0 ? 0 : start_i; - } - - return start_i > len ? len : start_i; -} - - -function ComputeSpliceDeleteCount(delete_count, num_arguments, len, start_i) { - // SpiderMonkey, TraceMonkey and JSC treat the case where no delete count is - // given as a request to delete all the elements from the start. - // And it differs from the case of undefined delete count. - // This does not follow ECMA-262, but we do the same for - // compatibility. - var del_count = 0; - if (num_arguments == 1) - return len - start_i; - - del_count = TO_INTEGER(delete_count); - if (del_count < 0) - return 0; - - if (del_count > len - start_i) - return len - start_i; - - return del_count; -} - - -function ArraySpliceFallback(start, delete_count) { - var num_arguments = arguments.length; - var array = TO_OBJECT(this); - var len = TO_LENGTH(array.length); - var start_i = ComputeSpliceStartIndex(TO_INTEGER(start), len); - var del_count = ComputeSpliceDeleteCount(delete_count, num_arguments, len, - start_i); - var num_elements_to_add = num_arguments > 2 ? num_arguments - 2 : 0; - - const new_len = len - del_count + num_elements_to_add; - if (new_len >= 2**53) throw %make_type_error(kInvalidArrayLength); - - var deleted_elements = ArraySpeciesCreate(array, del_count); - deleted_elements.length = del_count; - - var changed_elements = del_count; - if (num_elements_to_add != del_count) { - // If the slice needs to do a actually move elements after the insertion - // point, then include those in the estimate of changed elements. - changed_elements += len - start_i - del_count; - } - if (UseSparseVariant(array, len, IS_ARRAY(array), changed_elements)) { - %NormalizeElements(array); - if (IS_ARRAY(deleted_elements)) %NormalizeElements(deleted_elements); - SparseSlice(array, start_i, del_count, len, deleted_elements); - SparseMove(array, start_i, del_count, len, num_elements_to_add); - } else { - SimpleSlice(array, start_i, del_count, len, deleted_elements); - SimpleMove(array, start_i, del_count, len, num_elements_to_add); - } - - // Insert the arguments into the resulting array in - // place of the deleted elements. - var i = start_i; - var arguments_index = 2; - var arguments_length = arguments.length; - while (arguments_index < arguments_length) { - array[i++] = arguments[arguments_index++]; - } - array.length = new_len; - - // Return the deleted elements. - return deleted_elements; -} - - function InnerArraySort(array, length, comparefn) { // In-place QuickSort algorithm. // For short (length <= 10) arrays, insertion sort is used for efficiency. @@ -700,56 +433,6 @@ function InnerArraySort(array, length, comparefn) { } -DEFINE_METHOD_LEN( - GlobalArray.prototype, - lastIndexOf(element, index) { - var array = TO_OBJECT(this); - var length = TO_LENGTH(this.length); - - if (length == 0) return -1; - if (arguments.length < 2) { - index = length - 1; - } else { - index = INVERT_NEG_ZERO(TO_INTEGER(index)); - // If index is negative, index from end of the array. - if (index < 0) index += length; - // If index is still negative, do not search the array. - if (index < 0) return -1; - else if (index >= length) index = length - 1; - } - var min = 0; - var max = index; - if (UseSparseVariant(array, length, IS_ARRAY(array), index)) { - %NormalizeElements(array); - var indices = %GetArrayKeys(array, index + 1); - if (IS_NUMBER(indices)) { - // It's an interval. - max = indices; // Capped by index already. - // Fall through to loop below. - } else { - if (indices.length == 0) return -1; - // Get all the keys in sorted order. - var sortedKeys = GetSortedArrayKeys(array, indices); - var i = sortedKeys.length - 1; - while (i >= 0) { - var key = sortedKeys[i]; - if (array[key] === element) return key; - i--; - } - return -1; - } - } - // Lookup through the array. - for (var i = max; i >= min; i--) { - if (i in array && array[i] === element) return i; - } - return -1; - }, - 1 /* Set function length */ -); - - - // Set up unscopable properties on the Array.prototype object. var unscopables = { __proto__: null, @@ -827,10 +510,6 @@ utils.Export(function(to) { "array_for_each_iterator", ArrayForEach, "array_keys_iterator", ArrayKeys, "array_values_iterator", ArrayValues, - // Fallback implementations of Array builtins. - "array_shift", ArrayShiftFallback, - "array_splice", ArraySpliceFallback, - "array_unshift", ArrayUnshiftFallback, ]); }); |