| Index: src/array.js
|
| ===================================================================
|
| --- src/array.js (revision 8618)
|
| +++ src/array.js (working copy)
|
| @@ -631,7 +631,9 @@
|
|
|
| if (end_i < start_i) return result;
|
|
|
| - if (IS_ARRAY(this)) {
|
| + if (IS_ARRAY(this) &&
|
| + (end_i > 1000) &&
|
| + (%EstimateNumberOfElements(this) < end_i)) {
|
| SmartSlice(this, start_i, end_i - start_i, len, result);
|
| } else {
|
| SimpleSlice(this, start_i, end_i - start_i, len, result);
|
| @@ -740,14 +742,15 @@
|
| else return x < y ? -1 : 1;
|
| };
|
| }
|
| - var global_receiver = %GetGlobalReceiver();
|
| + var receiver =
|
| + %_IsNativeOrStrictMode(comparefn) ? void 0 : %GetGlobalReceiver();
|
|
|
| function InsertionSort(a, from, to) {
|
| for (var i = from + 1; i < to; i++) {
|
| var element = a[i];
|
| for (var j = i - 1; j >= from; j--) {
|
| var tmp = a[j];
|
| - var order = %_CallFunction(global_receiver, tmp, element, comparefn);
|
| + var order = %_CallFunction(receiver, tmp, element, comparefn);
|
| if (order > 0) {
|
| a[j + 1] = tmp;
|
| } else {
|
| @@ -769,14 +772,14 @@
|
| var v1 = a[to - 1];
|
| var middle_index = from + ((to - from) >> 1);
|
| var v2 = a[middle_index];
|
| - var c01 = %_CallFunction(global_receiver, v0, v1, comparefn);
|
| + var c01 = %_CallFunction(receiver, v0, v1, comparefn);
|
| if (c01 > 0) {
|
| // v1 < v0, so swap them.
|
| var tmp = v0;
|
| v0 = v1;
|
| v1 = tmp;
|
| } // v0 <= v1.
|
| - var c02 = %_CallFunction(global_receiver, v0, v2, comparefn);
|
| + var c02 = %_CallFunction(receiver, v0, v2, comparefn);
|
| if (c02 >= 0) {
|
| // v2 <= v0 <= v1.
|
| var tmp = v0;
|
| @@ -785,7 +788,7 @@
|
| v1 = tmp;
|
| } else {
|
| // v0 <= v1 && v0 < v2
|
| - var c12 = %_CallFunction(global_receiver, v1, v2, comparefn);
|
| + var c12 = %_CallFunction(receiver, v1, v2, comparefn);
|
| if (c12 > 0) {
|
| // v0 <= v2 < v1
|
| var tmp = v1;
|
| @@ -806,7 +809,7 @@
|
| // From i to high_start are elements that haven't been compared yet.
|
| partition: for (var i = low_end + 1; i < high_start; i++) {
|
| var element = a[i];
|
| - var order = %_CallFunction(global_receiver, element, pivot, comparefn);
|
| + var order = %_CallFunction(receiver, element, pivot, comparefn);
|
| if (order < 0) {
|
| %_SwapElements(a, i, low_end);
|
| low_end++;
|
| @@ -815,7 +818,7 @@
|
| high_start--;
|
| if (high_start == i) break partition;
|
| var top_elem = a[high_start];
|
| - order = %_CallFunction(global_receiver, top_elem, pivot, comparefn);
|
| + order = %_CallFunction(receiver, top_elem, pivot, comparefn);
|
| } while (order > 0);
|
| %_SwapElements(a, i, high_start);
|
| if (order < 0) {
|
| @@ -1250,7 +1253,7 @@
|
| for (; i < length; i++) {
|
| var element = this[i];
|
| if (!IS_UNDEFINED(element) || i in this) {
|
| - current = callback.call(null, current, element, i, this);
|
| + current = callback.call(void 0, current, element, i, this);
|
| }
|
| }
|
| return current;
|
| @@ -1281,7 +1284,7 @@
|
| for (; i >= 0; i--) {
|
| var element = this[i];
|
| if (!IS_UNDEFINED(element) || i in this) {
|
| - current = callback.call(null, current, element, i, this);
|
| + current = callback.call(void 0, current, element, i, this);
|
| }
|
| }
|
| return current;
|
|
|