| Index: src/array.js
|
| ===================================================================
|
| --- src/array.js (revision 402)
|
| +++ src/array.js (working copy)
|
| @@ -650,14 +650,10 @@
|
| // In-place QuickSort algorithm.
|
| // For short (length <= 22) arrays, insertion sort is used for efficiency.
|
|
|
| + var custom_compare = IS_FUNCTION(comparefn);
|
| +
|
| function Compare(x,y) {
|
| - if (IS_UNDEFINED(x)) {
|
| - if (IS_UNDEFINED(y)) return 0;
|
| - return 1;
|
| - }
|
| - if (IS_UNDEFINED(y)) return -1;
|
| -
|
| - if (IS_FUNCTION(comparefn)) {
|
| + if (custom_compare) {
|
| return comparefn.call(null, x, y);
|
| }
|
| if (%_IsSmi(x) && %_IsSmi(y)) {
|
| @@ -691,15 +687,13 @@
|
| }
|
| }
|
| // place element at position min==max.
|
| - for (var j = min; j < i; j++) {
|
| - var tmp = a[j];
|
| - a[j] = element;
|
| - element = tmp;
|
| + for (var j = i; j > min; j--) {
|
| + a[j] = a[j - 1];
|
| }
|
| - a[i] = element;
|
| + a[min] = element;
|
| }
|
| }
|
| -
|
| +
|
| function QuickSort(a, from, to) {
|
| // Insertion sort is faster for short arrays.
|
| if (to - from <= 22) {
|
| @@ -743,6 +737,18 @@
|
| %RemoveArrayHoles(this);
|
|
|
| var length = ToUint32(this.length);
|
| +
|
| + // Move undefined elements to the end of the array.
|
| + for (var i = 0; i < length; ) {
|
| + if (IS_UNDEFINED(this[i])) {
|
| + length--;
|
| + this[i] = this[length];
|
| + this[length] = undefined;
|
| + } else {
|
| + i++;
|
| + }
|
| + }
|
| +
|
| QuickSort(this, 0, length);
|
|
|
| // We only changed the length of the this object (in
|
|
|