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

Side by Side Diff: src/array.js

Issue 1116003005: Remove GetDefaultReceiver, pass in undefined to sloppy-mode functions instead. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Make sure it does TO_OBJECT 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/collection.js » ('j') | no next file with comments »
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;
(...skipping 854 matching lines...) Expand 10 before | Expand all | Expand 10 after
865 if (x === y) return 0; 865 if (x === y) return 0;
866 if (%_IsSmi(x) && %_IsSmi(y)) { 866 if (%_IsSmi(x) && %_IsSmi(y)) {
867 return %SmiLexicographicCompare(x, y); 867 return %SmiLexicographicCompare(x, y);
868 } 868 }
869 x = ToString(x); 869 x = ToString(x);
870 y = ToString(y); 870 y = ToString(y);
871 if (x == y) return 0; 871 if (x == y) return 0;
872 else return x < y ? -1 : 1; 872 else return x < y ? -1 : 1;
873 }; 873 };
874 } 874 }
875 var receiver = %GetDefaultReceiver(comparefn);
876
877 var InsertionSort = function InsertionSort(a, from, to) { 875 var InsertionSort = function InsertionSort(a, from, to) {
878 for (var i = from + 1; i < to; i++) { 876 for (var i = from + 1; i < to; i++) {
879 var element = a[i]; 877 var element = a[i];
880 for (var j = i - 1; j >= from; j--) { 878 for (var j = i - 1; j >= from; j--) {
881 var tmp = a[j]; 879 var tmp = a[j];
882 var order = %_CallFunction(receiver, tmp, element, comparefn); 880 var order = %_CallFunction(UNDEFINED, tmp, element, comparefn);
883 if (order > 0) { 881 if (order > 0) {
884 a[j + 1] = tmp; 882 a[j + 1] = tmp;
885 } else { 883 } else {
886 break; 884 break;
887 } 885 }
888 } 886 }
889 a[j + 1] = element; 887 a[j + 1] = element;
890 } 888 }
891 }; 889 };
892 890
893 var GetThirdIndex = function(a, from, to) { 891 var GetThirdIndex = function(a, from, to) {
894 var t_array = []; 892 var t_array = [];
895 // Use both 'from' and 'to' to determine the pivot candidates. 893 // Use both 'from' and 'to' to determine the pivot candidates.
896 var increment = 200 + ((to - from) & 15); 894 var increment = 200 + ((to - from) & 15);
897 for (var i = from + 1, j = 0; i < to - 1; i += increment, j++) { 895 for (var i = from + 1, j = 0; i < to - 1; i += increment, j++) {
898 t_array[j] = [i, a[i]]; 896 t_array[j] = [i, a[i]];
899 } 897 }
900 %_CallFunction(t_array, function(a, b) { 898 %_CallFunction(t_array, function(a, b) {
901 return %_CallFunction(receiver, a[1], b[1], comparefn); 899 return %_CallFunction(UNDEFINED, a[1], b[1], comparefn);
902 }, ArraySort); 900 }, ArraySort);
903 var third_index = t_array[t_array.length >> 1][0]; 901 var third_index = t_array[t_array.length >> 1][0];
904 return third_index; 902 return third_index;
905 } 903 }
906 904
907 var QuickSort = function QuickSort(a, from, to) { 905 var QuickSort = function QuickSort(a, from, to) {
908 var third_index = 0; 906 var third_index = 0;
909 while (true) { 907 while (true) {
910 // Insertion sort is faster for short arrays. 908 // Insertion sort is faster for short arrays.
911 if (to - from <= 10) { 909 if (to - from <= 10) {
912 InsertionSort(a, from, to); 910 InsertionSort(a, from, to);
913 return; 911 return;
914 } 912 }
915 if (to - from > 1000) { 913 if (to - from > 1000) {
916 third_index = GetThirdIndex(a, from, to); 914 third_index = GetThirdIndex(a, from, to);
917 } else { 915 } else {
918 third_index = from + ((to - from) >> 1); 916 third_index = from + ((to - from) >> 1);
919 } 917 }
920 // Find a pivot as the median of first, last and middle element. 918 // Find a pivot as the median of first, last and middle element.
921 var v0 = a[from]; 919 var v0 = a[from];
922 var v1 = a[to - 1]; 920 var v1 = a[to - 1];
923 var v2 = a[third_index]; 921 var v2 = a[third_index];
924 var c01 = %_CallFunction(receiver, v0, v1, comparefn); 922 var c01 = %_CallFunction(UNDEFINED, v0, v1, comparefn);
925 if (c01 > 0) { 923 if (c01 > 0) {
926 // v1 < v0, so swap them. 924 // v1 < v0, so swap them.
927 var tmp = v0; 925 var tmp = v0;
928 v0 = v1; 926 v0 = v1;
929 v1 = tmp; 927 v1 = tmp;
930 } // v0 <= v1. 928 } // v0 <= v1.
931 var c02 = %_CallFunction(receiver, v0, v2, comparefn); 929 var c02 = %_CallFunction(UNDEFINED, v0, v2, comparefn);
932 if (c02 >= 0) { 930 if (c02 >= 0) {
933 // v2 <= v0 <= v1. 931 // v2 <= v0 <= v1.
934 var tmp = v0; 932 var tmp = v0;
935 v0 = v2; 933 v0 = v2;
936 v2 = v1; 934 v2 = v1;
937 v1 = tmp; 935 v1 = tmp;
938 } else { 936 } else {
939 // v0 <= v1 && v0 < v2 937 // v0 <= v1 && v0 < v2
940 var c12 = %_CallFunction(receiver, v1, v2, comparefn); 938 var c12 = %_CallFunction(UNDEFINED, v1, v2, comparefn);
941 if (c12 > 0) { 939 if (c12 > 0) {
942 // v0 <= v2 < v1 940 // v0 <= v2 < v1
943 var tmp = v1; 941 var tmp = v1;
944 v1 = v2; 942 v1 = v2;
945 v2 = tmp; 943 v2 = tmp;
946 } 944 }
947 } 945 }
948 // v0 <= v1 <= v2 946 // v0 <= v1 <= v2
949 a[from] = v0; 947 a[from] = v0;
950 a[to - 1] = v2; 948 a[to - 1] = v2;
951 var pivot = v1; 949 var pivot = v1;
952 var low_end = from + 1; // Upper bound of elements lower than pivot. 950 var low_end = from + 1; // Upper bound of elements lower than pivot.
953 var high_start = to - 1; // Lower bound of elements greater than pivot. 951 var high_start = to - 1; // Lower bound of elements greater than pivot.
954 a[third_index] = a[low_end]; 952 a[third_index] = a[low_end];
955 a[low_end] = pivot; 953 a[low_end] = pivot;
956 954
957 // From low_end to i are elements equal to pivot. 955 // From low_end to i are elements equal to pivot.
958 // From i to high_start are elements that haven't been compared yet. 956 // From i to high_start are elements that haven't been compared yet.
959 partition: for (var i = low_end + 1; i < high_start; i++) { 957 partition: for (var i = low_end + 1; i < high_start; i++) {
960 var element = a[i]; 958 var element = a[i];
961 var order = %_CallFunction(receiver, element, pivot, comparefn); 959 var order = %_CallFunction(UNDEFINED, element, pivot, comparefn);
962 if (order < 0) { 960 if (order < 0) {
963 a[i] = a[low_end]; 961 a[i] = a[low_end];
964 a[low_end] = element; 962 a[low_end] = element;
965 low_end++; 963 low_end++;
966 } else if (order > 0) { 964 } else if (order > 0) {
967 do { 965 do {
968 high_start--; 966 high_start--;
969 if (high_start == i) break partition; 967 if (high_start == i) break partition;
970 var top_elem = a[high_start]; 968 var top_elem = a[high_start];
971 order = %_CallFunction(receiver, top_elem, pivot, comparefn); 969 order = %_CallFunction(UNDEFINED, top_elem, pivot, comparefn);
972 } while (order > 0); 970 } while (order > 0);
973 a[i] = a[high_start]; 971 a[i] = a[high_start];
974 a[high_start] = element; 972 a[high_start] = element;
975 if (order < 0) { 973 if (order < 0) {
976 element = a[i]; 974 element = a[i];
977 a[i] = a[low_end]; 975 a[i] = a[low_end];
978 a[low_end] = element; 976 a[low_end] = element;
979 low_end++; 977 low_end++;
980 } 978 }
981 } 979 }
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
1148 function ArrayFilter(f, receiver) { 1146 function ArrayFilter(f, receiver) {
1149 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.filter"); 1147 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.filter");
1150 1148
1151 // Pull out the length so that modifications to the length in the 1149 // Pull out the length so that modifications to the length in the
1152 // loop will not affect the looping and side effects are visible. 1150 // loop will not affect the looping and side effects are visible.
1153 var array = ToObject(this); 1151 var array = ToObject(this);
1154 var length = ToUint32(array.length); 1152 var length = ToUint32(array.length);
1155 1153
1156 if (!IS_SPEC_FUNCTION(f)) throw MakeTypeError(kCalledNonCallable, f); 1154 if (!IS_SPEC_FUNCTION(f)) throw MakeTypeError(kCalledNonCallable, f);
1157 var needs_wrapper = false; 1155 var needs_wrapper = false;
1158 if (IS_NULL_OR_UNDEFINED(receiver)) { 1156 if (IS_NULL(receiver)) {
1159 receiver = %GetDefaultReceiver(f) || receiver; 1157 if (%IsSloppyModeFunction(f)) receiver = UNDEFINED;
1160 } else { 1158 } else if (!IS_UNDEFINED(receiver)) {
1161 needs_wrapper = SHOULD_CREATE_WRAPPER(f, receiver); 1159 needs_wrapper = SHOULD_CREATE_WRAPPER(f, receiver);
1162 } 1160 }
1163 1161
1164 var result = new GlobalArray(); 1162 var result = new GlobalArray();
1165 var accumulator = new InternalArray(); 1163 var accumulator = new InternalArray();
1166 var accumulator_length = 0; 1164 var accumulator_length = 0;
1167 var is_array = IS_ARRAY(array); 1165 var is_array = IS_ARRAY(array);
1168 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f); 1166 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f);
1169 for (var i = 0; i < length; i++) { 1167 for (var i = 0; i < length; i++) {
1170 if (HAS_INDEX(array, i, is_array)) { 1168 if (HAS_INDEX(array, i, is_array)) {
(...skipping 14 matching lines...) Expand all
1185 function ArrayForEach(f, receiver) { 1183 function ArrayForEach(f, receiver) {
1186 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.forEach"); 1184 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.forEach");
1187 1185
1188 // Pull out the length so that modifications to the length in the 1186 // Pull out the length so that modifications to the length in the
1189 // loop will not affect the looping and side effects are visible. 1187 // loop will not affect the looping and side effects are visible.
1190 var array = ToObject(this); 1188 var array = ToObject(this);
1191 var length = TO_UINT32(array.length); 1189 var length = TO_UINT32(array.length);
1192 1190
1193 if (!IS_SPEC_FUNCTION(f)) throw MakeTypeError(kCalledNonCallable, f); 1191 if (!IS_SPEC_FUNCTION(f)) throw MakeTypeError(kCalledNonCallable, f);
1194 var needs_wrapper = false; 1192 var needs_wrapper = false;
1195 if (IS_NULL_OR_UNDEFINED(receiver)) { 1193 if (IS_NULL(receiver)) {
1196 receiver = %GetDefaultReceiver(f) || receiver; 1194 if (%IsSloppyModeFunction(f)) receiver = UNDEFINED;
1197 } else { 1195 } else if (!IS_UNDEFINED(receiver)) {
1198 needs_wrapper = SHOULD_CREATE_WRAPPER(f, receiver); 1196 needs_wrapper = SHOULD_CREATE_WRAPPER(f, receiver);
1199 } 1197 }
1200 1198
1201 var is_array = IS_ARRAY(array); 1199 var is_array = IS_ARRAY(array);
1202 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f); 1200 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f);
1203 for (var i = 0; i < length; i++) { 1201 for (var i = 0; i < length; i++) {
1204 if (HAS_INDEX(array, i, is_array)) { 1202 if (HAS_INDEX(array, i, is_array)) {
1205 var element = array[i]; 1203 var element = array[i];
1206 // Prepare break slots for debugger step in. 1204 // Prepare break slots for debugger step in.
1207 if (stepping) %DebugPrepareStepInIfStepping(f); 1205 if (stepping) %DebugPrepareStepInIfStepping(f);
1208 var new_receiver = needs_wrapper ? ToObject(receiver) : receiver; 1206 var new_receiver = needs_wrapper ? ToObject(receiver) : receiver;
1209 %_CallFunction(new_receiver, element, i, array, f); 1207 %_CallFunction(new_receiver, element, i, array, f);
1210 } 1208 }
1211 } 1209 }
1212 } 1210 }
1213 1211
1214 1212
1215 // Executes the function once for each element present in the 1213 // Executes the function once for each element present in the
1216 // array until it finds one where callback returns true. 1214 // array until it finds one where callback returns true.
1217 function ArraySome(f, receiver) { 1215 function ArraySome(f, receiver) {
1218 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.some"); 1216 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.some");
1219 1217
1220 // Pull out the length so that modifications to the length in the 1218 // Pull out the length so that modifications to the length in the
1221 // loop will not affect the looping and side effects are visible. 1219 // loop will not affect the looping and side effects are visible.
1222 var array = ToObject(this); 1220 var array = ToObject(this);
1223 var length = TO_UINT32(array.length); 1221 var length = TO_UINT32(array.length);
1224 1222
1225 if (!IS_SPEC_FUNCTION(f)) throw MakeTypeError(kCalledNonCallable, f); 1223 if (!IS_SPEC_FUNCTION(f)) throw MakeTypeError(kCalledNonCallable, f);
1226 var needs_wrapper = false; 1224 var needs_wrapper = false;
1227 if (IS_NULL_OR_UNDEFINED(receiver)) { 1225 if (IS_NULL(receiver)) {
1228 receiver = %GetDefaultReceiver(f) || receiver; 1226 if (%IsSloppyModeFunction(f)) receiver = UNDEFINED;
1229 } else { 1227 } else if (!IS_UNDEFINED(receiver)) {
1230 needs_wrapper = SHOULD_CREATE_WRAPPER(f, receiver); 1228 needs_wrapper = SHOULD_CREATE_WRAPPER(f, receiver);
1231 } 1229 }
1232 1230
1233 var is_array = IS_ARRAY(array); 1231 var is_array = IS_ARRAY(array);
1234 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f); 1232 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f);
1235 for (var i = 0; i < length; i++) { 1233 for (var i = 0; i < length; i++) {
1236 if (HAS_INDEX(array, i, is_array)) { 1234 if (HAS_INDEX(array, i, is_array)) {
1237 var element = array[i]; 1235 var element = array[i];
1238 // Prepare break slots for debugger step in. 1236 // Prepare break slots for debugger step in.
1239 if (stepping) %DebugPrepareStepInIfStepping(f); 1237 if (stepping) %DebugPrepareStepInIfStepping(f);
1240 var new_receiver = needs_wrapper ? ToObject(receiver) : receiver; 1238 var new_receiver = needs_wrapper ? ToObject(receiver) : receiver;
1241 if (%_CallFunction(new_receiver, element, i, array, f)) return true; 1239 if (%_CallFunction(new_receiver, element, i, array, f)) return true;
1242 } 1240 }
1243 } 1241 }
1244 return false; 1242 return false;
1245 } 1243 }
1246 1244
1247 1245
1248 function ArrayEvery(f, receiver) { 1246 function ArrayEvery(f, receiver) {
1249 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.every"); 1247 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.every");
1250 1248
1251 // Pull out the length so that modifications to the length in the 1249 // Pull out the length so that modifications to the length in the
1252 // loop will not affect the looping and side effects are visible. 1250 // loop will not affect the looping and side effects are visible.
1253 var array = ToObject(this); 1251 var array = ToObject(this);
1254 var length = TO_UINT32(array.length); 1252 var length = TO_UINT32(array.length);
1255 1253
1256 if (!IS_SPEC_FUNCTION(f)) throw MakeTypeError(kCalledNonCallable, f); 1254 if (!IS_SPEC_FUNCTION(f)) throw MakeTypeError(kCalledNonCallable, f);
1257 var needs_wrapper = false; 1255 var needs_wrapper = false;
1258 if (IS_NULL_OR_UNDEFINED(receiver)) { 1256 if (IS_NULL(receiver)) {
1259 receiver = %GetDefaultReceiver(f) || receiver; 1257 if (%IsSloppyModeFunction(f)) receiver = UNDEFINED;
1260 } else { 1258 } else if (!IS_UNDEFINED(receiver)) {
1261 needs_wrapper = SHOULD_CREATE_WRAPPER(f, receiver); 1259 needs_wrapper = SHOULD_CREATE_WRAPPER(f, receiver);
1262 } 1260 }
1263 1261
1264 var is_array = IS_ARRAY(array); 1262 var is_array = IS_ARRAY(array);
1265 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f); 1263 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f);
1266 for (var i = 0; i < length; i++) { 1264 for (var i = 0; i < length; i++) {
1267 if (HAS_INDEX(array, i, is_array)) { 1265 if (HAS_INDEX(array, i, is_array)) {
1268 var element = array[i]; 1266 var element = array[i];
1269 // Prepare break slots for debugger step in. 1267 // Prepare break slots for debugger step in.
1270 if (stepping) %DebugPrepareStepInIfStepping(f); 1268 if (stepping) %DebugPrepareStepInIfStepping(f);
1271 var new_receiver = needs_wrapper ? ToObject(receiver) : receiver; 1269 var new_receiver = needs_wrapper ? ToObject(receiver) : receiver;
1272 if (!%_CallFunction(new_receiver, element, i, array, f)) return false; 1270 if (!%_CallFunction(new_receiver, element, i, array, f)) return false;
1273 } 1271 }
1274 } 1272 }
1275 return true; 1273 return true;
1276 } 1274 }
1277 1275
1278 1276
1279 function ArrayMap(f, receiver) { 1277 function ArrayMap(f, receiver) {
1280 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.map"); 1278 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.map");
1281 1279
1282 // Pull out the length so that modifications to the length in the 1280 // Pull out the length so that modifications to the length in the
1283 // loop will not affect the looping and side effects are visible. 1281 // loop will not affect the looping and side effects are visible.
1284 var array = ToObject(this); 1282 var array = ToObject(this);
1285 var length = TO_UINT32(array.length); 1283 var length = TO_UINT32(array.length);
1286 1284
1287 if (!IS_SPEC_FUNCTION(f)) throw MakeTypeError(kCalledNonCallable, f); 1285 if (!IS_SPEC_FUNCTION(f)) throw MakeTypeError(kCalledNonCallable, f);
1288 var needs_wrapper = false; 1286 var needs_wrapper = false;
1289 if (IS_NULL_OR_UNDEFINED(receiver)) { 1287 if (IS_NULL(receiver)) {
1290 receiver = %GetDefaultReceiver(f) || receiver; 1288 if (%IsSloppyModeFunction(f)) receiver = UNDEFINED;
1291 } else { 1289 } else if (!IS_UNDEFINED(receiver)) {
1292 needs_wrapper = SHOULD_CREATE_WRAPPER(f, receiver); 1290 needs_wrapper = SHOULD_CREATE_WRAPPER(f, receiver);
1293 } 1291 }
1294 1292
1295 var result = new GlobalArray(); 1293 var result = new GlobalArray();
1296 var accumulator = new InternalArray(length); 1294 var accumulator = new InternalArray(length);
1297 var is_array = IS_ARRAY(array); 1295 var is_array = IS_ARRAY(array);
1298 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f); 1296 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f);
1299 for (var i = 0; i < length; i++) { 1297 for (var i = 0; i < length; i++) {
1300 if (HAS_INDEX(array, i, is_array)) { 1298 if (HAS_INDEX(array, i, is_array)) {
1301 var element = array[i]; 1299 var element = array[i];
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
1437 find_initial: if (%_ArgumentsLength() < 2) { 1435 find_initial: if (%_ArgumentsLength() < 2) {
1438 for (; i < length; i++) { 1436 for (; i < length; i++) {
1439 if (HAS_INDEX(array, i, is_array)) { 1437 if (HAS_INDEX(array, i, is_array)) {
1440 current = array[i++]; 1438 current = array[i++];
1441 break find_initial; 1439 break find_initial;
1442 } 1440 }
1443 } 1441 }
1444 throw MakeTypeError(kReduceNoInitial); 1442 throw MakeTypeError(kReduceNoInitial);
1445 } 1443 }
1446 1444
1447 var receiver = %GetDefaultReceiver(callback);
1448 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(callback); 1445 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(callback);
1449 for (; i < length; i++) { 1446 for (; i < length; i++) {
1450 if (HAS_INDEX(array, i, is_array)) { 1447 if (HAS_INDEX(array, i, is_array)) {
1451 var element = array[i]; 1448 var element = array[i];
1452 // Prepare break slots for debugger step in. 1449 // Prepare break slots for debugger step in.
1453 if (stepping) %DebugPrepareStepInIfStepping(callback); 1450 if (stepping) %DebugPrepareStepInIfStepping(callback);
1454 current = %_CallFunction(receiver, current, element, i, array, callback); 1451 current = %_CallFunction(UNDEFINED, current, element, i, array, callback);
1455 } 1452 }
1456 } 1453 }
1457 return current; 1454 return current;
1458 } 1455 }
1459 1456
1460 1457
1461 function ArrayReduceRight(callback, current) { 1458 function ArrayReduceRight(callback, current) {
1462 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.reduceRight"); 1459 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.reduceRight");
1463 1460
1464 // Pull out the length so that side effects are visible before the 1461 // Pull out the length so that side effects are visible before the
(...skipping 10 matching lines...) Expand all
1475 find_initial: if (%_ArgumentsLength() < 2) { 1472 find_initial: if (%_ArgumentsLength() < 2) {
1476 for (; i >= 0; i--) { 1473 for (; i >= 0; i--) {
1477 if (HAS_INDEX(array, i, is_array)) { 1474 if (HAS_INDEX(array, i, is_array)) {
1478 current = array[i--]; 1475 current = array[i--];
1479 break find_initial; 1476 break find_initial;
1480 } 1477 }
1481 } 1478 }
1482 throw MakeTypeError(kReduceNoInitial); 1479 throw MakeTypeError(kReduceNoInitial);
1483 } 1480 }
1484 1481
1485 var receiver = %GetDefaultReceiver(callback);
1486 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(callback); 1482 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(callback);
1487 for (; i >= 0; i--) { 1483 for (; i >= 0; i--) {
1488 if (HAS_INDEX(array, i, is_array)) { 1484 if (HAS_INDEX(array, i, is_array)) {
1489 var element = array[i]; 1485 var element = array[i];
1490 // Prepare break slots for debugger step in. 1486 // Prepare break slots for debugger step in.
1491 if (stepping) %DebugPrepareStepInIfStepping(callback); 1487 if (stepping) %DebugPrepareStepInIfStepping(callback);
1492 current = %_CallFunction(receiver, current, element, i, array, callback); 1488 current = %_CallFunction(UNDEFINED, current, element, i, array, callback);
1493 } 1489 }
1494 } 1490 }
1495 return current; 1491 return current;
1496 } 1492 }
1497 1493
1498 // ES5, 15.4.3.2 1494 // ES5, 15.4.3.2
1499 function ArrayIsArray(obj) { 1495 function ArrayIsArray(obj) {
1500 return IS_ARRAY(obj); 1496 return IS_ARRAY(obj);
1501 } 1497 }
1502 1498
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
1593 $arrayConcat = ArrayConcatJS; 1589 $arrayConcat = ArrayConcatJS;
1594 $arrayJoin = ArrayJoin; 1590 $arrayJoin = ArrayJoin;
1595 $arrayPush = ArrayPush; 1591 $arrayPush = ArrayPush;
1596 $arrayPop = ArrayPop; 1592 $arrayPop = ArrayPop;
1597 $arrayShift = ArrayShift; 1593 $arrayShift = ArrayShift;
1598 $arraySlice = ArraySlice; 1594 $arraySlice = ArraySlice;
1599 $arraySplice = ArraySplice; 1595 $arraySplice = ArraySplice;
1600 $arrayUnshift = ArrayUnshift; 1596 $arrayUnshift = ArrayUnshift;
1601 1597
1602 })(); 1598 })();
OLDNEW
« no previous file with comments | « no previous file | src/collection.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698