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

Side by Side Diff: src/array.js

Issue 1123353004: Revert of Wrap runtime.js in a function. (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/array-iterator.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 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
189 // matter what happens. 189 // matter what happens.
190 if (is_array) visited_arrays.length = visited_arrays.length - 1; 190 if (is_array) visited_arrays.length = visited_arrays.length - 1;
191 } 191 }
192 } 192 }
193 193
194 194
195 function ConvertToString(x) { 195 function ConvertToString(x) {
196 // Assumes x is a non-string. 196 // Assumes x is a non-string.
197 if (IS_NUMBER(x)) return %_NumberToString(x); 197 if (IS_NUMBER(x)) return %_NumberToString(x);
198 if (IS_BOOLEAN(x)) return x ? 'true' : 'false'; 198 if (IS_BOOLEAN(x)) return x ? 'true' : 'false';
199 return (IS_NULL_OR_UNDEFINED(x)) ? '' : $toString($defaultString(x)); 199 return (IS_NULL_OR_UNDEFINED(x)) ? '' : %ToString(%DefaultString(x));
200 } 200 }
201 201
202 202
203 function ConvertToLocaleString(e) { 203 function ConvertToLocaleString(e) {
204 if (IS_NULL_OR_UNDEFINED(e)) { 204 if (IS_NULL_OR_UNDEFINED(e)) {
205 return ''; 205 return '';
206 } else { 206 } else {
207 // According to ES5, section 15.4.4.3, the toLocaleString conversion 207 // According to ES5, section 15.4.4.3, the toLocaleString conversion
208 // must throw a TypeError if ToObject(e).toLocaleString isn't 208 // must throw a TypeError if ToObject(e).toLocaleString isn't
209 // callable. 209 // callable.
210 var e_obj = $toObject(e); 210 var e_obj = ToObject(e);
211 return $toString(e_obj.toLocaleString()); 211 return %ToString(e_obj.toLocaleString());
212 } 212 }
213 } 213 }
214 214
215 215
216 // This function implements the optimized splice implementation that can use 216 // This function implements the optimized splice implementation that can use
217 // special array operations to handle sparse arrays in a sensible fashion. 217 // special array operations to handle sparse arrays in a sensible fashion.
218 function SparseSlice(array, start_i, del_count, len, deleted_elements) { 218 function SparseSlice(array, start_i, del_count, len, deleted_elements) {
219 // Move deleted elements to a new array (the return value from splice). 219 // Move deleted elements to a new array (the return value from splice).
220 var indices = %GetArrayKeys(array, start_i + del_count); 220 var indices = %GetArrayKeys(array, start_i + del_count);
221 if (IS_NUMBER(indices)) { 221 if (IS_NUMBER(indices)) {
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
361 function ArrayToString() { 361 function ArrayToString() {
362 var array; 362 var array;
363 var func; 363 var func;
364 if (IS_ARRAY(this)) { 364 if (IS_ARRAY(this)) {
365 func = this.join; 365 func = this.join;
366 if (func === ArrayJoin) { 366 if (func === ArrayJoin) {
367 return Join(this, this.length, ',', ConvertToString); 367 return Join(this, this.length, ',', ConvertToString);
368 } 368 }
369 array = this; 369 array = this;
370 } else { 370 } else {
371 array = $toObject(this); 371 array = ToObject(this);
372 func = array.join; 372 func = array.join;
373 } 373 }
374 if (!IS_SPEC_FUNCTION(func)) { 374 if (!IS_SPEC_FUNCTION(func)) {
375 return %_CallFunction(array, $objectToString); 375 return %_CallFunction(array, $objectToString);
376 } 376 }
377 return %_CallFunction(array, func); 377 return %_CallFunction(array, func);
378 } 378 }
379 379
380 380
381 function ArrayToLocaleString() { 381 function ArrayToLocaleString() {
382 var array = $toObject(this); 382 var array = ToObject(this);
383 var arrayLen = array.length; 383 var arrayLen = array.length;
384 var len = TO_UINT32(arrayLen); 384 var len = TO_UINT32(arrayLen);
385 if (len === 0) return ""; 385 if (len === 0) return "";
386 return Join(array, len, ',', ConvertToLocaleString); 386 return Join(array, len, ',', ConvertToLocaleString);
387 } 387 }
388 388
389 389
390 function ArrayJoin(separator) { 390 function ArrayJoin(separator) {
391 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.join"); 391 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.join");
392 392
393 var array = TO_OBJECT_INLINE(this); 393 var array = TO_OBJECT_INLINE(this);
394 var length = TO_UINT32(array.length); 394 var length = TO_UINT32(array.length);
395 if (IS_UNDEFINED(separator)) { 395 if (IS_UNDEFINED(separator)) {
396 separator = ','; 396 separator = ',';
397 } else if (!IS_STRING(separator)) { 397 } else if (!IS_STRING(separator)) {
398 separator = $nonStringToString(separator); 398 separator = NonStringToString(separator);
399 } 399 }
400 400
401 var result = %_FastOneByteArrayJoin(array, separator); 401 var result = %_FastOneByteArrayJoin(array, separator);
402 if (!IS_UNDEFINED(result)) return result; 402 if (!IS_UNDEFINED(result)) return result;
403 403
404 // Fast case for one-element arrays. 404 // Fast case for one-element arrays.
405 if (length === 1) { 405 if (length === 1) {
406 var e = array[0]; 406 var e = array[0];
407 if (IS_STRING(e)) return e; 407 if (IS_STRING(e)) return e;
408 if (IS_NULL_OR_UNDEFINED(e)) return ''; 408 if (IS_NULL_OR_UNDEFINED(e)) return '';
409 return $nonStringToString(e); 409 return NonStringToString(e);
410 } 410 }
411 411
412 return Join(array, length, separator, ConvertToString); 412 return Join(array, length, separator, ConvertToString);
413 } 413 }
414 414
415 415
416 function ObservedArrayPop(n) { 416 function ObservedArrayPop(n) {
417 n--; 417 n--;
418 var value = this[n]; 418 var value = this[n];
419 419
(...skipping 20 matching lines...) Expand all
440 if (n == 0) { 440 if (n == 0) {
441 array.length = n; 441 array.length = n;
442 return; 442 return;
443 } 443 }
444 444
445 if (%IsObserved(array)) 445 if (%IsObserved(array))
446 return ObservedArrayPop.call(array, n); 446 return ObservedArrayPop.call(array, n);
447 447
448 n--; 448 n--;
449 var value = array[n]; 449 var value = array[n];
450 $delete(array, $toName(n), true); 450 $delete(array, ToName(n), true);
451 array.length = n; 451 array.length = n;
452 return value; 452 return value;
453 } 453 }
454 454
455 455
456 function ObservedArrayPush() { 456 function ObservedArrayPush() {
457 var n = TO_UINT32(this.length); 457 var n = TO_UINT32(this.length);
458 var m = %_ArgumentsLength(); 458 var m = %_ArgumentsLength();
459 459
460 try { 460 try {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
494 return new_length; 494 return new_length;
495 } 495 }
496 496
497 497
498 // Returns an array containing the array elements of the object followed 498 // Returns an array containing the array elements of the object followed
499 // by the array elements of each argument in order. See ECMA-262, 499 // by the array elements of each argument in order. See ECMA-262,
500 // section 15.4.4.7. 500 // section 15.4.4.7.
501 function ArrayConcatJS(arg1) { // length == 1 501 function ArrayConcatJS(arg1) { // length == 1
502 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.concat"); 502 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.concat");
503 503
504 var array = $toObject(this); 504 var array = ToObject(this);
505 var arg_count = %_ArgumentsLength(); 505 var arg_count = %_ArgumentsLength();
506 var arrays = new InternalArray(1 + arg_count); 506 var arrays = new InternalArray(1 + arg_count);
507 arrays[0] = array; 507 arrays[0] = array;
508 for (var i = 0; i < arg_count; i++) { 508 for (var i = 0; i < arg_count; i++) {
509 arrays[i + 1] = %_Arguments(i); 509 arrays[i + 1] = %_Arguments(i);
510 } 510 }
511 511
512 return %ArrayConcat(arrays); 512 return %ArrayConcat(arrays);
513 } 513 }
514 514
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after
859 859
860 // In-place QuickSort algorithm. 860 // In-place QuickSort algorithm.
861 // For short (length <= 22) arrays, insertion sort is used for efficiency. 861 // For short (length <= 22) arrays, insertion sort is used for efficiency.
862 862
863 if (!IS_SPEC_FUNCTION(comparefn)) { 863 if (!IS_SPEC_FUNCTION(comparefn)) {
864 comparefn = function (x, y) { 864 comparefn = function (x, y) {
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 InsertionSort = function InsertionSort(a, from, to) { 875 var InsertionSort = function InsertionSort(a, from, to) {
876 for (var i = from + 1; i < to; i++) { 876 for (var i = from + 1; i < to; i++) {
877 var element = a[i]; 877 var element = a[i];
878 for (var j = i - 1; j >= from; j--) { 878 for (var j = i - 1; j >= from; j--) {
879 var tmp = a[j]; 879 var tmp = a[j];
880 var order = %_CallFunction(UNDEFINED, tmp, element, comparefn); 880 var order = %_CallFunction(UNDEFINED, tmp, element, comparefn);
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
1141 1141
1142 1142
1143 // The following functions cannot be made efficient on sparse arrays while 1143 // The following functions cannot be made efficient on sparse arrays while
1144 // preserving the semantics, since the calls to the receiver function can add 1144 // preserving the semantics, since the calls to the receiver function can add
1145 // or delete elements from the array. 1145 // or delete elements from the array.
1146 function ArrayFilter(f, receiver) { 1146 function ArrayFilter(f, receiver) {
1147 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.filter"); 1147 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.filter");
1148 1148
1149 // 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
1150 // loop will not affect the looping and side effects are visible. 1150 // loop will not affect the looping and side effects are visible.
1151 var array = $toObject(this); 1151 var array = ToObject(this);
1152 var length = $toUint32(array.length); 1152 var length = ToUint32(array.length);
1153 1153
1154 if (!IS_SPEC_FUNCTION(f)) throw MakeTypeError(kCalledNonCallable, f); 1154 if (!IS_SPEC_FUNCTION(f)) throw MakeTypeError(kCalledNonCallable, f);
1155 var needs_wrapper = false; 1155 var needs_wrapper = false;
1156 if (IS_NULL(receiver)) { 1156 if (IS_NULL(receiver)) {
1157 if (%IsSloppyModeFunction(f)) receiver = UNDEFINED; 1157 if (%IsSloppyModeFunction(f)) receiver = UNDEFINED;
1158 } else if (!IS_UNDEFINED(receiver)) { 1158 } else if (!IS_UNDEFINED(receiver)) {
1159 needs_wrapper = SHOULD_CREATE_WRAPPER(f, receiver); 1159 needs_wrapper = SHOULD_CREATE_WRAPPER(f, receiver);
1160 } 1160 }
1161 1161
1162 var result = new GlobalArray(); 1162 var result = new GlobalArray();
1163 var accumulator = new InternalArray(); 1163 var accumulator = new InternalArray();
1164 var accumulator_length = 0; 1164 var accumulator_length = 0;
1165 var is_array = IS_ARRAY(array); 1165 var is_array = IS_ARRAY(array);
1166 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f); 1166 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f);
1167 for (var i = 0; i < length; i++) { 1167 for (var i = 0; i < length; i++) {
1168 if (HAS_INDEX(array, i, is_array)) { 1168 if (HAS_INDEX(array, i, is_array)) {
1169 var element = array[i]; 1169 var element = array[i];
1170 // Prepare break slots for debugger step in. 1170 // Prepare break slots for debugger step in.
1171 if (stepping) %DebugPrepareStepInIfStepping(f); 1171 if (stepping) %DebugPrepareStepInIfStepping(f);
1172 var new_receiver = needs_wrapper ? $toObject(receiver) : receiver; 1172 var new_receiver = needs_wrapper ? ToObject(receiver) : receiver;
1173 if (%_CallFunction(new_receiver, element, i, array, f)) { 1173 if (%_CallFunction(new_receiver, element, i, array, f)) {
1174 accumulator[accumulator_length++] = element; 1174 accumulator[accumulator_length++] = element;
1175 } 1175 }
1176 } 1176 }
1177 } 1177 }
1178 %MoveArrayContents(accumulator, result); 1178 %MoveArrayContents(accumulator, result);
1179 return result; 1179 return result;
1180 } 1180 }
1181 1181
1182 1182
1183 function ArrayForEach(f, receiver) { 1183 function ArrayForEach(f, receiver) {
1184 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.forEach"); 1184 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.forEach");
1185 1185
1186 // 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
1187 // loop will not affect the looping and side effects are visible. 1187 // loop will not affect the looping and side effects are visible.
1188 var array = $toObject(this); 1188 var array = ToObject(this);
1189 var length = TO_UINT32(array.length); 1189 var length = TO_UINT32(array.length);
1190 1190
1191 if (!IS_SPEC_FUNCTION(f)) throw MakeTypeError(kCalledNonCallable, f); 1191 if (!IS_SPEC_FUNCTION(f)) throw MakeTypeError(kCalledNonCallable, f);
1192 var needs_wrapper = false; 1192 var needs_wrapper = false;
1193 if (IS_NULL(receiver)) { 1193 if (IS_NULL(receiver)) {
1194 if (%IsSloppyModeFunction(f)) receiver = UNDEFINED; 1194 if (%IsSloppyModeFunction(f)) receiver = UNDEFINED;
1195 } else if (!IS_UNDEFINED(receiver)) { 1195 } else if (!IS_UNDEFINED(receiver)) {
1196 needs_wrapper = SHOULD_CREATE_WRAPPER(f, receiver); 1196 needs_wrapper = SHOULD_CREATE_WRAPPER(f, receiver);
1197 } 1197 }
1198 1198
1199 var is_array = IS_ARRAY(array); 1199 var is_array = IS_ARRAY(array);
1200 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f); 1200 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f);
1201 for (var i = 0; i < length; i++) { 1201 for (var i = 0; i < length; i++) {
1202 if (HAS_INDEX(array, i, is_array)) { 1202 if (HAS_INDEX(array, i, is_array)) {
1203 var element = array[i]; 1203 var element = array[i];
1204 // Prepare break slots for debugger step in. 1204 // Prepare break slots for debugger step in.
1205 if (stepping) %DebugPrepareStepInIfStepping(f); 1205 if (stepping) %DebugPrepareStepInIfStepping(f);
1206 var new_receiver = needs_wrapper ? $toObject(receiver) : receiver; 1206 var new_receiver = needs_wrapper ? ToObject(receiver) : receiver;
1207 %_CallFunction(new_receiver, element, i, array, f); 1207 %_CallFunction(new_receiver, element, i, array, f);
1208 } 1208 }
1209 } 1209 }
1210 } 1210 }
1211 1211
1212 1212
1213 // Executes the function once for each element present in the 1213 // Executes the function once for each element present in the
1214 // array until it finds one where callback returns true. 1214 // array until it finds one where callback returns true.
1215 function ArraySome(f, receiver) { 1215 function ArraySome(f, receiver) {
1216 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.some"); 1216 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.some");
1217 1217
1218 // 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
1219 // loop will not affect the looping and side effects are visible. 1219 // loop will not affect the looping and side effects are visible.
1220 var array = $toObject(this); 1220 var array = ToObject(this);
1221 var length = TO_UINT32(array.length); 1221 var length = TO_UINT32(array.length);
1222 1222
1223 if (!IS_SPEC_FUNCTION(f)) throw MakeTypeError(kCalledNonCallable, f); 1223 if (!IS_SPEC_FUNCTION(f)) throw MakeTypeError(kCalledNonCallable, f);
1224 var needs_wrapper = false; 1224 var needs_wrapper = false;
1225 if (IS_NULL(receiver)) { 1225 if (IS_NULL(receiver)) {
1226 if (%IsSloppyModeFunction(f)) receiver = UNDEFINED; 1226 if (%IsSloppyModeFunction(f)) receiver = UNDEFINED;
1227 } else if (!IS_UNDEFINED(receiver)) { 1227 } else if (!IS_UNDEFINED(receiver)) {
1228 needs_wrapper = SHOULD_CREATE_WRAPPER(f, receiver); 1228 needs_wrapper = SHOULD_CREATE_WRAPPER(f, receiver);
1229 } 1229 }
1230 1230
1231 var is_array = IS_ARRAY(array); 1231 var is_array = IS_ARRAY(array);
1232 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f); 1232 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f);
1233 for (var i = 0; i < length; i++) { 1233 for (var i = 0; i < length; i++) {
1234 if (HAS_INDEX(array, i, is_array)) { 1234 if (HAS_INDEX(array, i, is_array)) {
1235 var element = array[i]; 1235 var element = array[i];
1236 // Prepare break slots for debugger step in. 1236 // Prepare break slots for debugger step in.
1237 if (stepping) %DebugPrepareStepInIfStepping(f); 1237 if (stepping) %DebugPrepareStepInIfStepping(f);
1238 var new_receiver = needs_wrapper ? $toObject(receiver) : receiver; 1238 var new_receiver = needs_wrapper ? ToObject(receiver) : receiver;
1239 if (%_CallFunction(new_receiver, element, i, array, f)) return true; 1239 if (%_CallFunction(new_receiver, element, i, array, f)) return true;
1240 } 1240 }
1241 } 1241 }
1242 return false; 1242 return false;
1243 } 1243 }
1244 1244
1245 1245
1246 function ArrayEvery(f, receiver) { 1246 function ArrayEvery(f, receiver) {
1247 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.every"); 1247 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.every");
1248 1248
1249 // 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
1250 // loop will not affect the looping and side effects are visible. 1250 // loop will not affect the looping and side effects are visible.
1251 var array = $toObject(this); 1251 var array = ToObject(this);
1252 var length = TO_UINT32(array.length); 1252 var length = TO_UINT32(array.length);
1253 1253
1254 if (!IS_SPEC_FUNCTION(f)) throw MakeTypeError(kCalledNonCallable, f); 1254 if (!IS_SPEC_FUNCTION(f)) throw MakeTypeError(kCalledNonCallable, f);
1255 var needs_wrapper = false; 1255 var needs_wrapper = false;
1256 if (IS_NULL(receiver)) { 1256 if (IS_NULL(receiver)) {
1257 if (%IsSloppyModeFunction(f)) receiver = UNDEFINED; 1257 if (%IsSloppyModeFunction(f)) receiver = UNDEFINED;
1258 } else if (!IS_UNDEFINED(receiver)) { 1258 } else if (!IS_UNDEFINED(receiver)) {
1259 needs_wrapper = SHOULD_CREATE_WRAPPER(f, receiver); 1259 needs_wrapper = SHOULD_CREATE_WRAPPER(f, receiver);
1260 } 1260 }
1261 1261
1262 var is_array = IS_ARRAY(array); 1262 var is_array = IS_ARRAY(array);
1263 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f); 1263 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f);
1264 for (var i = 0; i < length; i++) { 1264 for (var i = 0; i < length; i++) {
1265 if (HAS_INDEX(array, i, is_array)) { 1265 if (HAS_INDEX(array, i, is_array)) {
1266 var element = array[i]; 1266 var element = array[i];
1267 // Prepare break slots for debugger step in. 1267 // Prepare break slots for debugger step in.
1268 if (stepping) %DebugPrepareStepInIfStepping(f); 1268 if (stepping) %DebugPrepareStepInIfStepping(f);
1269 var new_receiver = needs_wrapper ? $toObject(receiver) : receiver; 1269 var new_receiver = needs_wrapper ? ToObject(receiver) : receiver;
1270 if (!%_CallFunction(new_receiver, element, i, array, f)) return false; 1270 if (!%_CallFunction(new_receiver, element, i, array, f)) return false;
1271 } 1271 }
1272 } 1272 }
1273 return true; 1273 return true;
1274 } 1274 }
1275 1275
1276 1276
1277 function ArrayMap(f, receiver) { 1277 function ArrayMap(f, receiver) {
1278 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.map"); 1278 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.map");
1279 1279
1280 // 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
1281 // loop will not affect the looping and side effects are visible. 1281 // loop will not affect the looping and side effects are visible.
1282 var array = $toObject(this); 1282 var array = ToObject(this);
1283 var length = TO_UINT32(array.length); 1283 var length = TO_UINT32(array.length);
1284 1284
1285 if (!IS_SPEC_FUNCTION(f)) throw MakeTypeError(kCalledNonCallable, f); 1285 if (!IS_SPEC_FUNCTION(f)) throw MakeTypeError(kCalledNonCallable, f);
1286 var needs_wrapper = false; 1286 var needs_wrapper = false;
1287 if (IS_NULL(receiver)) { 1287 if (IS_NULL(receiver)) {
1288 if (%IsSloppyModeFunction(f)) receiver = UNDEFINED; 1288 if (%IsSloppyModeFunction(f)) receiver = UNDEFINED;
1289 } else if (!IS_UNDEFINED(receiver)) { 1289 } else if (!IS_UNDEFINED(receiver)) {
1290 needs_wrapper = SHOULD_CREATE_WRAPPER(f, receiver); 1290 needs_wrapper = SHOULD_CREATE_WRAPPER(f, receiver);
1291 } 1291 }
1292 1292
1293 var result = new GlobalArray(); 1293 var result = new GlobalArray();
1294 var accumulator = new InternalArray(length); 1294 var accumulator = new InternalArray(length);
1295 var is_array = IS_ARRAY(array); 1295 var is_array = IS_ARRAY(array);
1296 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f); 1296 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f);
1297 for (var i = 0; i < length; i++) { 1297 for (var i = 0; i < length; i++) {
1298 if (HAS_INDEX(array, i, is_array)) { 1298 if (HAS_INDEX(array, i, is_array)) {
1299 var element = array[i]; 1299 var element = array[i];
1300 // Prepare break slots for debugger step in. 1300 // Prepare break slots for debugger step in.
1301 if (stepping) %DebugPrepareStepInIfStepping(f); 1301 if (stepping) %DebugPrepareStepInIfStepping(f);
1302 var new_receiver = needs_wrapper ? $toObject(receiver) : receiver; 1302 var new_receiver = needs_wrapper ? ToObject(receiver) : receiver;
1303 accumulator[i] = %_CallFunction(new_receiver, element, i, array, f); 1303 accumulator[i] = %_CallFunction(new_receiver, element, i, array, f);
1304 } 1304 }
1305 } 1305 }
1306 %MoveArrayContents(accumulator, result); 1306 %MoveArrayContents(accumulator, result);
1307 return result; 1307 return result;
1308 } 1308 }
1309 1309
1310 1310
1311 function ArrayIndexOf(element, index) { 1311 function ArrayIndexOf(element, index) {
1312 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.indexOf"); 1312 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.indexOf");
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
1416 } 1416 }
1417 return -1; 1417 return -1;
1418 } 1418 }
1419 1419
1420 1420
1421 function ArrayReduce(callback, current) { 1421 function ArrayReduce(callback, current) {
1422 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.reduce"); 1422 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.reduce");
1423 1423
1424 // Pull out the length so that modifications to the length in the 1424 // Pull out the length so that modifications to the length in the
1425 // loop will not affect the looping and side effects are visible. 1425 // loop will not affect the looping and side effects are visible.
1426 var array = $toObject(this); 1426 var array = ToObject(this);
1427 var length = $toUint32(array.length); 1427 var length = ToUint32(array.length);
1428 1428
1429 if (!IS_SPEC_FUNCTION(callback)) { 1429 if (!IS_SPEC_FUNCTION(callback)) {
1430 throw MakeTypeError(kCalledNonCallable, callback); 1430 throw MakeTypeError(kCalledNonCallable, callback);
1431 } 1431 }
1432 1432
1433 var is_array = IS_ARRAY(array); 1433 var is_array = IS_ARRAY(array);
1434 var i = 0; 1434 var i = 0;
1435 find_initial: if (%_ArgumentsLength() < 2) { 1435 find_initial: if (%_ArgumentsLength() < 2) {
1436 for (; i < length; i++) { 1436 for (; i < length; i++) {
1437 if (HAS_INDEX(array, i, is_array)) { 1437 if (HAS_INDEX(array, i, is_array)) {
(...skipping 15 matching lines...) Expand all
1453 } 1453 }
1454 return current; 1454 return current;
1455 } 1455 }
1456 1456
1457 1457
1458 function ArrayReduceRight(callback, current) { 1458 function ArrayReduceRight(callback, current) {
1459 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.reduceRight"); 1459 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.reduceRight");
1460 1460
1461 // 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
1462 // callback function is checked. 1462 // callback function is checked.
1463 var array = $toObject(this); 1463 var array = ToObject(this);
1464 var length = $toUint32(array.length); 1464 var length = ToUint32(array.length);
1465 1465
1466 if (!IS_SPEC_FUNCTION(callback)) { 1466 if (!IS_SPEC_FUNCTION(callback)) {
1467 throw MakeTypeError(kCalledNonCallable, callback); 1467 throw MakeTypeError(kCalledNonCallable, callback);
1468 } 1468 }
1469 1469
1470 var is_array = IS_ARRAY(array); 1470 var is_array = IS_ARRAY(array);
1471 var i = length - 1; 1471 var i = length - 1;
1472 find_initial: if (%_ArgumentsLength() < 2) { 1472 find_initial: if (%_ArgumentsLength() < 2) {
1473 for (; i >= 0; i--) { 1473 for (; i >= 0; i--) {
1474 if (HAS_INDEX(array, i, is_array)) { 1474 if (HAS_INDEX(array, i, is_array)) {
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
1589 $arrayConcat = ArrayConcatJS; 1589 $arrayConcat = ArrayConcatJS;
1590 $arrayJoin = ArrayJoin; 1590 $arrayJoin = ArrayJoin;
1591 $arrayPush = ArrayPush; 1591 $arrayPush = ArrayPush;
1592 $arrayPop = ArrayPop; 1592 $arrayPop = ArrayPop;
1593 $arrayShift = ArrayShift; 1593 $arrayShift = ArrayShift;
1594 $arraySlice = ArraySlice; 1594 $arraySlice = ArraySlice;
1595 $arraySplice = ArraySplice; 1595 $arraySplice = ArraySplice;
1596 $arrayUnshift = ArrayUnshift; 1596 $arrayUnshift = ArrayUnshift;
1597 1597
1598 })(); 1598 })();
OLDNEW
« no previous file with comments | « no previous file | src/array-iterator.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698