| OLD | NEW |
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 691 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 702 a[i] = a[high_start]; | 702 a[i] = a[high_start]; |
| 703 a[high_start] = element; | 703 a[high_start] = element; |
| 704 } else { // order == 0 | 704 } else { // order == 0 |
| 705 i++; | 705 i++; |
| 706 } | 706 } |
| 707 } | 707 } |
| 708 QuickSort(a, from, low_end); | 708 QuickSort(a, from, low_end); |
| 709 QuickSort(a, high_start, to); | 709 QuickSort(a, high_start, to); |
| 710 } | 710 } |
| 711 | 711 |
| 712 var old_length = ToUint32(this.length); | 712 var length = ToUint32(this.length); |
| 713 if (old_length < 2) return this; | 713 if (!(length >= 2)) return this; |
| 714 | 714 |
| 715 %RemoveArrayHoles(this); | 715 var num_non_undefined = %RemoveArrayHoles(this, length); |
| 716 | 716 |
| 717 var length = ToUint32(this.length); | 717 QuickSort(this, 0, num_non_undefined); |
| 718 | |
| 719 // Move undefined elements to the end of the array. | |
| 720 for (var i = 0; i < length; ) { | |
| 721 if (IS_UNDEFINED(this[i])) { | |
| 722 length--; | |
| 723 this[i] = this[length]; | |
| 724 this[length] = void 0; | |
| 725 } else { | |
| 726 i++; | |
| 727 } | |
| 728 } | |
| 729 | |
| 730 QuickSort(this, 0, length); | |
| 731 | |
| 732 // We only changed the length of the this object (in | |
| 733 // RemoveArrayHoles) if it was an array. We are not allowed to set | |
| 734 // the length of the this object if it is not an array because this | |
| 735 // might introduce a new length property. | |
| 736 if (IS_ARRAY(this)) { | |
| 737 this.length = old_length; | |
| 738 } | |
| 739 | 718 |
| 740 return this; | 719 return this; |
| 741 } | 720 } |
| 742 | 721 |
| 743 | 722 |
| 744 // The following functions cannot be made efficient on sparse arrays while | 723 // The following functions cannot be made efficient on sparse arrays while |
| 745 // preserving the semantics, since the calls to the receiver function can add | 724 // preserving the semantics, since the calls to the receiver function can add |
| 746 // or delete elements from the array. | 725 // or delete elements from the array. |
| 747 function ArrayFilter(f, receiver) { | 726 function ArrayFilter(f, receiver) { |
| 748 if (!IS_FUNCTION(f)) { | 727 if (!IS_FUNCTION(f)) { |
| (...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 989 ArrayIndexOf: 1, | 968 ArrayIndexOf: 1, |
| 990 ArrayLastIndexOf: 1, | 969 ArrayLastIndexOf: 1, |
| 991 ArrayPush: 1, | 970 ArrayPush: 1, |
| 992 ArrayReduce: 1, | 971 ArrayReduce: 1, |
| 993 ArrayReduceRight: 1 | 972 ArrayReduceRight: 1 |
| 994 }); | 973 }); |
| 995 } | 974 } |
| 996 | 975 |
| 997 | 976 |
| 998 SetupArray(); | 977 SetupArray(); |
| OLD | NEW |