| Index: src/array.js
|
| diff --git a/src/array.js b/src/array.js
|
| index b413a0cff30f056aec87ef6a9962ef84aa8cad1a..e6a33dfeaf951bbd90602e87f0760fc175e88f1f 100644
|
| --- a/src/array.js
|
| +++ b/src/array.js
|
| @@ -66,7 +66,7 @@ function GetSortedArrayKeys(array, indices) {
|
| }
|
| }
|
| }
|
| - %_CallFunction(keys, function(a, b) { return a - b; }, ArraySort);
|
| + keys.sort(function(a, b) { return a - b; });
|
| }
|
| return keys;
|
| }
|
| @@ -900,7 +900,7 @@ function ArraySplice(start, delete_count) {
|
| }
|
|
|
|
|
| -function InnerArraySort(length, comparefn) {
|
| +function InnerArraySort(array, length, comparefn) {
|
| // In-place QuickSort algorithm.
|
| // For short (length <= 22) arrays, insertion sort is used for efficiency.
|
|
|
| @@ -1145,9 +1145,9 @@ function InnerArraySort(length, comparefn) {
|
| return first_undefined;
|
| };
|
|
|
| - if (length < 2) return this;
|
| + if (length < 2) return array;
|
|
|
| - var is_array = IS_ARRAY(this);
|
| + var is_array = IS_ARRAY(array);
|
| var max_prototype_element;
|
| if (!is_array) {
|
| // For compatibility with JSC, we also sort elements inherited from
|
| @@ -1158,28 +1158,28 @@ function InnerArraySort(length, comparefn) {
|
| // The specification allows "implementation dependent" behavior
|
| // if an element on the prototype chain has an element that
|
| // might interact with sorting.
|
| - max_prototype_element = CopyFromPrototype(this, length);
|
| + max_prototype_element = CopyFromPrototype(array, length);
|
| }
|
|
|
| // %RemoveArrayHoles returns -1 if fast removal is not supported.
|
| - var num_non_undefined = %RemoveArrayHoles(this, length);
|
| + var num_non_undefined = %RemoveArrayHoles(array, length);
|
|
|
| if (num_non_undefined == -1) {
|
| // The array is observed, or there were indexed accessors in the array.
|
| // Move array holes and undefineds to the end using a Javascript function
|
| // that is safe in the presence of accessors and is observable.
|
| - num_non_undefined = SafeRemoveArrayHoles(this);
|
| + num_non_undefined = SafeRemoveArrayHoles(array);
|
| }
|
|
|
| - QuickSort(this, 0, num_non_undefined);
|
| + QuickSort(array, 0, num_non_undefined);
|
|
|
| if (!is_array && (num_non_undefined + 1 < max_prototype_element)) {
|
| // For compatibility with JSC, we shadow any elements in the prototype
|
| // chain that has become exposed by sort moving a hole to its position.
|
| - ShadowPrototypeElements(this, num_non_undefined, max_prototype_element);
|
| + ShadowPrototypeElements(array, num_non_undefined, max_prototype_element);
|
| }
|
|
|
| - return this;
|
| + return array;
|
| }
|
|
|
|
|
| @@ -1188,7 +1188,7 @@ function ArraySort(comparefn) {
|
|
|
| var array = TO_OBJECT(this);
|
| var length = TO_UINT32(array.length);
|
| - return %_CallFunction(array, length, comparefn, InnerArraySort);
|
| + return InnerArraySort(array, length, comparefn);
|
| }
|
|
|
|
|
| @@ -1382,7 +1382,7 @@ function ArrayMap(f, receiver) {
|
| // at the callsite since ToInteger(undefined) == 0; however, for
|
| // .lastIndexOf, we need to pass it, since the behavior for passing
|
| // undefined is 0 but for not including the argument is length-1.
|
| -function InnerArrayIndexOf(element, index, length) {
|
| +function InnerArrayIndexOf(array, element, index, length) {
|
| if (length == 0) return -1;
|
| if (IS_UNDEFINED(index)) {
|
| index = 0;
|
| @@ -1397,9 +1397,9 @@ function InnerArrayIndexOf(element, index, length) {
|
| }
|
| var min = index;
|
| var max = length;
|
| - if (UseSparseVariant(this, length, IS_ARRAY(this), max - min)) {
|
| - %NormalizeElements(this);
|
| - var indices = %GetArrayKeys(this, length);
|
| + if (UseSparseVariant(array, length, IS_ARRAY(array), max - min)) {
|
| + %NormalizeElements(array);
|
| + var indices = %GetArrayKeys(array, length);
|
| if (IS_NUMBER(indices)) {
|
| // It's an interval.
|
| max = indices; // Capped by length already.
|
| @@ -1407,13 +1407,13 @@ function InnerArrayIndexOf(element, index, length) {
|
| } else {
|
| if (indices.length == 0) return -1;
|
| // Get all the keys in sorted order.
|
| - var sortedKeys = GetSortedArrayKeys(this, indices);
|
| + var sortedKeys = GetSortedArrayKeys(array, indices);
|
| var n = sortedKeys.length;
|
| var i = 0;
|
| while (i < n && sortedKeys[i] < index) i++;
|
| while (i < n) {
|
| var key = sortedKeys[i];
|
| - if (!IS_UNDEFINED(key) && this[key] === element) return key;
|
| + if (!IS_UNDEFINED(key) && array[key] === element) return key;
|
| i++;
|
| }
|
| return -1;
|
| @@ -1422,13 +1422,13 @@ function InnerArrayIndexOf(element, index, length) {
|
| // Lookup through the array.
|
| if (!IS_UNDEFINED(element)) {
|
| for (var i = min; i < max; i++) {
|
| - if (this[i] === element) return i;
|
| + if (array[i] === element) return i;
|
| }
|
| return -1;
|
| }
|
| // Lookup through the array.
|
| for (var i = min; i < max; i++) {
|
| - if (IS_UNDEFINED(this[i]) && i in this) {
|
| + if (IS_UNDEFINED(array[i]) && i in array) {
|
| return i;
|
| }
|
| }
|
| @@ -1440,11 +1440,11 @@ function ArrayIndexOf(element, index) {
|
| CHECK_OBJECT_COERCIBLE(this, "Array.prototype.indexOf");
|
|
|
| var length = TO_UINT32(this.length);
|
| - return %_CallFunction(this, element, index, length, InnerArrayIndexOf);
|
| + return InnerArrayIndexOf(this, element, index, length);
|
| }
|
|
|
|
|
| -function InnerArrayLastIndexOf(element, index, length, argumentsLength) {
|
| +function InnerArrayLastIndexOf(array, element, index, length, argumentsLength) {
|
| if (length == 0) return -1;
|
| if (argumentsLength < 2) {
|
| index = length - 1;
|
| @@ -1458,9 +1458,9 @@ function InnerArrayLastIndexOf(element, index, length, argumentsLength) {
|
| }
|
| var min = 0;
|
| var max = index;
|
| - if (UseSparseVariant(this, length, IS_ARRAY(this), index)) {
|
| - %NormalizeElements(this);
|
| - var indices = %GetArrayKeys(this, index + 1);
|
| + 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.
|
| @@ -1468,11 +1468,11 @@ function InnerArrayLastIndexOf(element, index, length, argumentsLength) {
|
| } else {
|
| if (indices.length == 0) return -1;
|
| // Get all the keys in sorted order.
|
| - var sortedKeys = GetSortedArrayKeys(this, indices);
|
| + var sortedKeys = GetSortedArrayKeys(array, indices);
|
| var i = sortedKeys.length - 1;
|
| while (i >= 0) {
|
| var key = sortedKeys[i];
|
| - if (!IS_UNDEFINED(key) && this[key] === element) return key;
|
| + if (!IS_UNDEFINED(key) && array[key] === element) return key;
|
| i--;
|
| }
|
| return -1;
|
| @@ -1481,12 +1481,12 @@ function InnerArrayLastIndexOf(element, index, length, argumentsLength) {
|
| // Lookup through the array.
|
| if (!IS_UNDEFINED(element)) {
|
| for (var i = max; i >= min; i--) {
|
| - if (this[i] === element) return i;
|
| + if (array[i] === element) return i;
|
| }
|
| return -1;
|
| }
|
| for (var i = max; i >= min; i--) {
|
| - if (IS_UNDEFINED(this[i]) && i in this) {
|
| + if (IS_UNDEFINED(array[i]) && i in array) {
|
| return i;
|
| }
|
| }
|
| @@ -1498,8 +1498,8 @@ function ArrayLastIndexOf(element, index) {
|
| CHECK_OBJECT_COERCIBLE(this, "Array.prototype.lastIndexOf");
|
|
|
| var length = TO_UINT32(this.length);
|
| - return %_CallFunction(this, element, index, length,
|
| - %_ArgumentsLength(), InnerArrayLastIndexOf);
|
| + return InnerArrayLastIndexOf(this, element, index, length,
|
| + %_ArgumentsLength());
|
| }
|
|
|
|
|
| @@ -1672,6 +1672,7 @@ utils.SetUpLockedPrototype(InternalArray, GlobalArray(), [
|
| "pop", getFunction("pop", ArrayPop),
|
| "push", getFunction("push", ArrayPush),
|
| "shift", getFunction("shift", ArrayShift),
|
| + "sort", getFunction("sort", ArraySort),
|
| "splice", getFunction("splice", ArraySplice)
|
| ]);
|
|
|
|
|