Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(82)

Side by Side Diff: src/array.js

Issue 1148513002: Implement %TypedArray%.prototype.sort (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/harmony-typedarray.js » ('j') | src/harmony-typedarray.js » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 var $arrayConcat; 5 var $arrayConcat;
6 var $arrayJoin; 6 var $arrayJoin;
7 var $arrayPush; 7 var $arrayPush;
8 var $arrayPop; 8 var $arrayPop;
9 var $arrayShift; 9 var $arrayShift;
10 var $arraySlice; 10 var $arraySlice;
11 var $arraySplice; 11 var $arraySplice;
12 var $arrayUnshift; 12 var $arrayUnshift;
13 var $innerArrayForEach; 13 var $innerArrayForEach;
14 var $innerArrayEvery; 14 var $innerArrayEvery;
15 var $innerArraySort;
15 16
16 (function(global, shared, exports) { 17 (function(global, shared, exports) {
17 18
18 "use strict"; 19 "use strict";
19 20
20 %CheckIsBootstrapping(); 21 %CheckIsBootstrapping();
21 22
22 // ------------------------------------------------------------------- 23 // -------------------------------------------------------------------
23 // Imports 24 // Imports
24 25
(...skipping 829 matching lines...) Expand 10 before | Expand all | Expand 10 after
854 while (arguments_index < arguments_length) { 855 while (arguments_index < arguments_length) {
855 array[i++] = %_Arguments(arguments_index++); 856 array[i++] = %_Arguments(arguments_index++);
856 } 857 }
857 array.length = len - del_count + num_elements_to_add; 858 array.length = len - del_count + num_elements_to_add;
858 859
859 // Return the deleted elements. 860 // Return the deleted elements.
860 return deleted_elements; 861 return deleted_elements;
861 } 862 }
862 863
863 864
864 function ArraySort(comparefn) { 865 function InnerArraySort(length, comparefn) {
865 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.sort");
866
867 // In-place QuickSort algorithm. 866 // In-place QuickSort algorithm.
868 // For short (length <= 22) arrays, insertion sort is used for efficiency. 867 // For short (length <= 22) arrays, insertion sort is used for efficiency.
869 868
870 if (!IS_SPEC_FUNCTION(comparefn)) { 869 if (!IS_SPEC_FUNCTION(comparefn)) {
871 comparefn = function (x, y) { 870 comparefn = function (x, y) {
872 if (x === y) return 0; 871 if (x === y) return 0;
873 if (%_IsSmi(x) && %_IsSmi(y)) { 872 if (%_IsSmi(x) && %_IsSmi(y)) {
874 return %SmiLexicographicCompare(x, y); 873 return %SmiLexicographicCompare(x, y);
875 } 874 }
876 x = $toString(x); 875 x = $toString(x);
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
1101 obj[i] = UNDEFINED; 1100 obj[i] = UNDEFINED;
1102 } else { 1101 } else {
1103 delete obj[i]; 1102 delete obj[i];
1104 } 1103 }
1105 } 1104 }
1106 1105
1107 // Return the number of defined elements. 1106 // Return the number of defined elements.
1108 return first_undefined; 1107 return first_undefined;
1109 }; 1108 };
1110 1109
1111 var length = TO_UINT32(this.length);
1112 if (length < 2) return this; 1110 if (length < 2) return this;
1113 1111
1114 var is_array = IS_ARRAY(this); 1112 var is_array = IS_ARRAY(this);
1115 var max_prototype_element; 1113 var max_prototype_element;
1116 if (!is_array) { 1114 if (!is_array) {
1117 // For compatibility with JSC, we also sort elements inherited from 1115 // For compatibility with JSC, we also sort elements inherited from
1118 // the prototype chain on non-Array objects. 1116 // the prototype chain on non-Array objects.
1119 // We do this by copying them to this object and sorting only 1117 // We do this by copying them to this object and sorting only
1120 // own elements. This is not very efficient, but sorting with 1118 // own elements. This is not very efficient, but sorting with
1121 // inherited elements happens very, very rarely, if at all. 1119 // inherited elements happens very, very rarely, if at all.
(...skipping 18 matching lines...) Expand all
1140 if (!is_array && (num_non_undefined + 1 < max_prototype_element)) { 1138 if (!is_array && (num_non_undefined + 1 < max_prototype_element)) {
1141 // For compatibility with JSC, we shadow any elements in the prototype 1139 // For compatibility with JSC, we shadow any elements in the prototype
1142 // chain that has become exposed by sort moving a hole to its position. 1140 // chain that has become exposed by sort moving a hole to its position.
1143 ShadowPrototypeElements(this, num_non_undefined, max_prototype_element); 1141 ShadowPrototypeElements(this, num_non_undefined, max_prototype_element);
1144 } 1142 }
1145 1143
1146 return this; 1144 return this;
1147 } 1145 }
1148 1146
1149 1147
1148 function ArraySort(comparefn) {
1149 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.sort");
1150
1151 var length = TO_UINT32(this.length);
1152 return %_CallFunction(this, length, comparefn, InnerArraySort);
1153 }
1154
1155
1150 // The following functions cannot be made efficient on sparse arrays while 1156 // The following functions cannot be made efficient on sparse arrays while
1151 // preserving the semantics, since the calls to the receiver function can add 1157 // preserving the semantics, since the calls to the receiver function can add
1152 // or delete elements from the array. 1158 // or delete elements from the array.
1153 function ArrayFilter(f, receiver) { 1159 function ArrayFilter(f, receiver) {
1154 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.filter"); 1160 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.filter");
1155 1161
1156 // Pull out the length so that modifications to the length in the 1162 // Pull out the length so that modifications to the length in the
1157 // loop will not affect the looping and side effects are visible. 1163 // loop will not affect the looping and side effects are visible.
1158 var array = $toObject(this); 1164 var array = $toObject(this);
1159 var length = $toUint32(array.length); 1165 var length = $toUint32(array.length);
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after
1602 $arrayJoin = ArrayJoin; 1608 $arrayJoin = ArrayJoin;
1603 $arrayPush = ArrayPush; 1609 $arrayPush = ArrayPush;
1604 $arrayPop = ArrayPop; 1610 $arrayPop = ArrayPop;
1605 $arrayShift = ArrayShift; 1611 $arrayShift = ArrayShift;
1606 $arraySlice = ArraySlice; 1612 $arraySlice = ArraySlice;
1607 $arraySplice = ArraySplice; 1613 $arraySplice = ArraySplice;
1608 $arrayUnshift = ArrayUnshift; 1614 $arrayUnshift = ArrayUnshift;
1609 1615
1610 $innerArrayForEach = InnerArrayForEach; 1616 $innerArrayForEach = InnerArrayForEach;
1611 $innerArrayEvery = InnerArrayEvery; 1617 $innerArrayEvery = InnerArrayEvery;
1618 $innerArraySort = InnerArraySort;
1612 1619
1613 }); 1620 });
OLDNEW
« no previous file with comments | « no previous file | src/harmony-typedarray.js » ('j') | src/harmony-typedarray.js » ('J')

Powered by Google App Engine
This is Rietveld 408576698