OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
369 function ArrayToLocaleString() { | 369 function ArrayToLocaleString() { |
370 var array = ToObject(this); | 370 var array = ToObject(this); |
371 var arrayLen = array.length; | 371 var arrayLen = array.length; |
372 var len = TO_UINT32(arrayLen); | 372 var len = TO_UINT32(arrayLen); |
373 if (len === 0) return ""; | 373 if (len === 0) return ""; |
374 return Join(array, len, ',', ConvertToLocaleString); | 374 return Join(array, len, ',', ConvertToLocaleString); |
375 } | 375 } |
376 | 376 |
377 | 377 |
378 function ArrayJoin(separator) { | 378 function ArrayJoin(separator) { |
379 if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) { | 379 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.join"); |
380 throw MakeTypeError("called_on_null_or_undefined", | |
381 ["Array.prototype.join"]); | |
382 } | |
383 | 380 |
384 var length = TO_UINT32(this.length); | 381 var length = TO_UINT32(this.length); |
385 if (IS_UNDEFINED(separator)) { | 382 if (IS_UNDEFINED(separator)) { |
386 separator = ','; | 383 separator = ','; |
387 } else if (!IS_STRING(separator)) { | 384 } else if (!IS_STRING(separator)) { |
388 separator = NonStringToString(separator); | 385 separator = NonStringToString(separator); |
389 } | 386 } |
390 | 387 |
391 var result = %_FastAsciiArrayJoin(this, separator); | 388 var result = %_FastAsciiArrayJoin(this, separator); |
392 if (!IS_UNDEFINED(result)) return result; | 389 if (!IS_UNDEFINED(result)) return result; |
(...skipping 14 matching lines...) Expand all Loading... |
407 EndPerformSplice(this); | 404 EndPerformSplice(this); |
408 EnqueueSpliceRecord(this, n, [value], 0); | 405 EnqueueSpliceRecord(this, n, [value], 0); |
409 } | 406 } |
410 | 407 |
411 return value; | 408 return value; |
412 } | 409 } |
413 | 410 |
414 // Removes the last element from the array and returns it. See | 411 // Removes the last element from the array and returns it. See |
415 // ECMA-262, section 15.4.4.6. | 412 // ECMA-262, section 15.4.4.6. |
416 function ArrayPop() { | 413 function ArrayPop() { |
417 if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) { | 414 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.pop"); |
418 throw MakeTypeError("called_on_null_or_undefined", | |
419 ["Array.prototype.pop"]); | |
420 } | |
421 | 415 |
422 var n = TO_UINT32(this.length); | 416 var n = TO_UINT32(this.length); |
423 if (n == 0) { | 417 if (n == 0) { |
424 this.length = n; | 418 this.length = n; |
425 return; | 419 return; |
426 } | 420 } |
427 | 421 |
428 if ($Object.isSealed(this)) { | 422 if ($Object.isSealed(this)) { |
429 throw MakeTypeError("array_functions_change_sealed", | 423 throw MakeTypeError("array_functions_change_sealed", |
430 ["Array.prototype.pop"]); | 424 ["Array.prototype.pop"]); |
(...skipping 24 matching lines...) Expand all Loading... |
455 EndPerformSplice(this); | 449 EndPerformSplice(this); |
456 EnqueueSpliceRecord(this, n, [], m); | 450 EnqueueSpliceRecord(this, n, [], m); |
457 } | 451 } |
458 | 452 |
459 return this.length; | 453 return this.length; |
460 } | 454 } |
461 | 455 |
462 // Appends the arguments to the end of the array and returns the new | 456 // Appends the arguments to the end of the array and returns the new |
463 // length of the array. See ECMA-262, section 15.4.4.7. | 457 // length of the array. See ECMA-262, section 15.4.4.7. |
464 function ArrayPush() { | 458 function ArrayPush() { |
465 if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) { | 459 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.push"); |
466 throw MakeTypeError("called_on_null_or_undefined", | |
467 ["Array.prototype.push"]); | |
468 } | |
469 | 460 |
470 var n = TO_UINT32(this.length); | 461 var n = TO_UINT32(this.length); |
471 var m = %_ArgumentsLength(); | 462 var m = %_ArgumentsLength(); |
472 if (m > 0 && $Object.isSealed(this)) { | 463 if (m > 0 && $Object.isSealed(this)) { |
473 throw MakeTypeError("array_functions_change_sealed", | 464 throw MakeTypeError("array_functions_change_sealed", |
474 ["Array.prototype.push"]); | 465 ["Array.prototype.push"]); |
475 } | 466 } |
476 | 467 |
477 if (%IsObserved(this)) | 468 if (%IsObserved(this)) |
478 return ObservedArrayPush.apply(this, arguments); | 469 return ObservedArrayPush.apply(this, arguments); |
479 | 470 |
480 for (var i = 0; i < m; i++) { | 471 for (var i = 0; i < m; i++) { |
481 this[i+n] = %_Arguments(i); | 472 this[i+n] = %_Arguments(i); |
482 } | 473 } |
483 this.length = n + m; | 474 this.length = n + m; |
484 return this.length; | 475 return this.length; |
485 } | 476 } |
486 | 477 |
487 | 478 |
488 // Returns an array containing the array elements of the object followed | 479 // Returns an array containing the array elements of the object followed |
489 // by the array elements of each argument in order. See ECMA-262, | 480 // by the array elements of each argument in order. See ECMA-262, |
490 // section 15.4.4.7. | 481 // section 15.4.4.7. |
491 function ArrayConcat(arg1) { // length == 1 | 482 function ArrayConcat(arg1) { // length == 1 |
492 if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) { | 483 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.concat"); |
493 throw MakeTypeError("called_on_null_or_undefined", | |
494 ["Array.prototype.concat"]); | |
495 } | |
496 | 484 |
497 var array = ToObject(this); | 485 var array = ToObject(this); |
498 var arg_count = %_ArgumentsLength(); | 486 var arg_count = %_ArgumentsLength(); |
499 var arrays = new InternalArray(1 + arg_count); | 487 var arrays = new InternalArray(1 + arg_count); |
500 arrays[0] = array; | 488 arrays[0] = array; |
501 for (var i = 0; i < arg_count; i++) { | 489 for (var i = 0; i < arg_count; i++) { |
502 arrays[i + 1] = %_Arguments(i); | 490 arrays[i + 1] = %_Arguments(i); |
503 } | 491 } |
504 | 492 |
505 return %ArrayConcat(arrays); | 493 return %ArrayConcat(arrays); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
544 if (!IS_UNDEFINED(current_j) || high in array) { | 532 if (!IS_UNDEFINED(current_j) || high in array) { |
545 array[low] = current_j; | 533 array[low] = current_j; |
546 delete array[high]; | 534 delete array[high]; |
547 } | 535 } |
548 } | 536 } |
549 } | 537 } |
550 } | 538 } |
551 | 539 |
552 | 540 |
553 function ArrayReverse() { | 541 function ArrayReverse() { |
554 if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) { | 542 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.reverse"); |
555 throw MakeTypeError("called_on_null_or_undefined", | |
556 ["Array.prototype.reverse"]); | |
557 } | |
558 | 543 |
559 var j = TO_UINT32(this.length) - 1; | 544 var j = TO_UINT32(this.length) - 1; |
560 | 545 |
561 if (UseSparseVariant(this, j, IS_ARRAY(this))) { | 546 if (UseSparseVariant(this, j, IS_ARRAY(this))) { |
562 SparseReverse(this, j+1); | 547 SparseReverse(this, j+1); |
563 return this; | 548 return this; |
564 } | 549 } |
565 | 550 |
566 for (var i = 0; i < j; i++, j--) { | 551 for (var i = 0; i < j; i++, j--) { |
567 var current_i = this[i]; | 552 var current_i = this[i]; |
(...skipping 27 matching lines...) Expand all Loading... |
595 this.length = len - 1; | 580 this.length = len - 1; |
596 } finally { | 581 } finally { |
597 EndPerformSplice(this); | 582 EndPerformSplice(this); |
598 EnqueueSpliceRecord(this, 0, [first], 0); | 583 EnqueueSpliceRecord(this, 0, [first], 0); |
599 } | 584 } |
600 | 585 |
601 return first; | 586 return first; |
602 } | 587 } |
603 | 588 |
604 function ArrayShift() { | 589 function ArrayShift() { |
605 if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) { | 590 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.shift"); |
606 throw MakeTypeError("called_on_null_or_undefined", | |
607 ["Array.prototype.shift"]); | |
608 } | |
609 | 591 |
610 var len = TO_UINT32(this.length); | 592 var len = TO_UINT32(this.length); |
611 | 593 |
612 if (len === 0) { | 594 if (len === 0) { |
613 this.length = 0; | 595 this.length = 0; |
614 return; | 596 return; |
615 } | 597 } |
616 | 598 |
617 if ($Object.isSealed(this)) { | 599 if ($Object.isSealed(this)) { |
618 throw MakeTypeError("array_functions_change_sealed", | 600 throw MakeTypeError("array_functions_change_sealed", |
(...skipping 29 matching lines...) Expand all Loading... |
648 this.length = len + num_arguments; | 630 this.length = len + num_arguments; |
649 } finally { | 631 } finally { |
650 EndPerformSplice(this); | 632 EndPerformSplice(this); |
651 EnqueueSpliceRecord(this, 0, [], num_arguments); | 633 EnqueueSpliceRecord(this, 0, [], num_arguments); |
652 } | 634 } |
653 | 635 |
654 return len + num_arguments; | 636 return len + num_arguments; |
655 } | 637 } |
656 | 638 |
657 function ArrayUnshift(arg1) { // length == 1 | 639 function ArrayUnshift(arg1) { // length == 1 |
658 if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) { | 640 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.unshift"); |
659 throw MakeTypeError("called_on_null_or_undefined", | |
660 ["Array.prototype.unshift"]); | |
661 } | |
662 | 641 |
663 var len = TO_UINT32(this.length); | 642 var len = TO_UINT32(this.length); |
664 var num_arguments = %_ArgumentsLength(); | 643 var num_arguments = %_ArgumentsLength(); |
665 var is_sealed = $Object.isSealed(this); | 644 var is_sealed = $Object.isSealed(this); |
666 | 645 |
667 if (num_arguments > 0 && is_sealed) { | 646 if (num_arguments > 0 && is_sealed) { |
668 throw MakeTypeError("array_functions_change_sealed", | 647 throw MakeTypeError("array_functions_change_sealed", |
669 ["Array.prototype.unshift"]); | 648 ["Array.prototype.unshift"]); |
670 } | 649 } |
671 | 650 |
(...skipping 21 matching lines...) Expand all Loading... |
693 this[i] = %_Arguments(i); | 672 this[i] = %_Arguments(i); |
694 } | 673 } |
695 | 674 |
696 this.length = len + num_arguments; | 675 this.length = len + num_arguments; |
697 | 676 |
698 return this.length; | 677 return this.length; |
699 } | 678 } |
700 | 679 |
701 | 680 |
702 function ArraySlice(start, end) { | 681 function ArraySlice(start, end) { |
703 if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) { | 682 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.slice"); |
704 throw MakeTypeError("called_on_null_or_undefined", | |
705 ["Array.prototype.slice"]); | |
706 } | |
707 | 683 |
708 var len = TO_UINT32(this.length); | 684 var len = TO_UINT32(this.length); |
709 var start_i = TO_INTEGER(start); | 685 var start_i = TO_INTEGER(start); |
710 var end_i = len; | 686 var end_i = len; |
711 | 687 |
712 if (!IS_UNDEFINED(end)) end_i = TO_INTEGER(end); | 688 if (!IS_UNDEFINED(end)) end_i = TO_INTEGER(end); |
713 | 689 |
714 if (start_i < 0) { | 690 if (start_i < 0) { |
715 start_i += len; | 691 start_i += len; |
716 if (start_i < 0) start_i = 0; | 692 if (start_i < 0) start_i = 0; |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
810 num_elements_to_add); | 786 num_elements_to_add); |
811 } | 787 } |
812 } | 788 } |
813 | 789 |
814 // Return the deleted elements. | 790 // Return the deleted elements. |
815 return deleted_elements; | 791 return deleted_elements; |
816 } | 792 } |
817 | 793 |
818 | 794 |
819 function ArraySplice(start, delete_count) { | 795 function ArraySplice(start, delete_count) { |
820 if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) { | 796 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.splice"); |
821 throw MakeTypeError("called_on_null_or_undefined", | |
822 ["Array.prototype.splice"]); | |
823 } | |
824 | 797 |
825 if (%IsObserved(this)) | 798 if (%IsObserved(this)) |
826 return ObservedArraySplice.apply(this, arguments); | 799 return ObservedArraySplice.apply(this, arguments); |
827 | 800 |
828 var num_arguments = %_ArgumentsLength(); | 801 var num_arguments = %_ArgumentsLength(); |
829 var len = TO_UINT32(this.length); | 802 var len = TO_UINT32(this.length); |
830 var start_i = ComputeSpliceStartIndex(TO_INTEGER(start), len); | 803 var start_i = ComputeSpliceStartIndex(TO_INTEGER(start), len); |
831 var del_count = ComputeSpliceDeleteCount(delete_count, num_arguments, len, | 804 var del_count = ComputeSpliceDeleteCount(delete_count, num_arguments, len, |
832 start_i); | 805 start_i); |
833 var deleted_elements = []; | 806 var deleted_elements = []; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
871 this[i++] = %_Arguments(arguments_index++); | 844 this[i++] = %_Arguments(arguments_index++); |
872 } | 845 } |
873 this.length = len - del_count + num_elements_to_add; | 846 this.length = len - del_count + num_elements_to_add; |
874 | 847 |
875 // Return the deleted elements. | 848 // Return the deleted elements. |
876 return deleted_elements; | 849 return deleted_elements; |
877 } | 850 } |
878 | 851 |
879 | 852 |
880 function ArraySort(comparefn) { | 853 function ArraySort(comparefn) { |
881 if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) { | 854 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.sort"); |
882 throw MakeTypeError("called_on_null_or_undefined", | |
883 ["Array.prototype.sort"]); | |
884 } | |
885 | 855 |
886 // In-place QuickSort algorithm. | 856 // In-place QuickSort algorithm. |
887 // For short (length <= 22) arrays, insertion sort is used for efficiency. | 857 // For short (length <= 22) arrays, insertion sort is used for efficiency. |
888 | 858 |
889 if (!IS_SPEC_FUNCTION(comparefn)) { | 859 if (!IS_SPEC_FUNCTION(comparefn)) { |
890 comparefn = function (x, y) { | 860 comparefn = function (x, y) { |
891 if (x === y) return 0; | 861 if (x === y) return 0; |
892 if (%_IsSmi(x) && %_IsSmi(y)) { | 862 if (%_IsSmi(x) && %_IsSmi(y)) { |
893 return %SmiLexicographicCompare(x, y); | 863 return %SmiLexicographicCompare(x, y); |
894 } | 864 } |
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1164 } | 1134 } |
1165 | 1135 |
1166 return this; | 1136 return this; |
1167 } | 1137 } |
1168 | 1138 |
1169 | 1139 |
1170 // The following functions cannot be made efficient on sparse arrays while | 1140 // The following functions cannot be made efficient on sparse arrays while |
1171 // preserving the semantics, since the calls to the receiver function can add | 1141 // preserving the semantics, since the calls to the receiver function can add |
1172 // or delete elements from the array. | 1142 // or delete elements from the array. |
1173 function ArrayFilter(f, receiver) { | 1143 function ArrayFilter(f, receiver) { |
1174 if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) { | 1144 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.filter"); |
1175 throw MakeTypeError("called_on_null_or_undefined", | |
1176 ["Array.prototype.filter"]); | |
1177 } | |
1178 | 1145 |
1179 // Pull out the length so that modifications to the length in the | 1146 // Pull out the length so that modifications to the length in the |
1180 // loop will not affect the looping and side effects are visible. | 1147 // loop will not affect the looping and side effects are visible. |
1181 var array = ToObject(this); | 1148 var array = ToObject(this); |
1182 var length = ToUint32(array.length); | 1149 var length = ToUint32(array.length); |
1183 | 1150 |
1184 if (!IS_SPEC_FUNCTION(f)) { | 1151 if (!IS_SPEC_FUNCTION(f)) { |
1185 throw MakeTypeError('called_non_callable', [ f ]); | 1152 throw MakeTypeError('called_non_callable', [ f ]); |
1186 } | 1153 } |
1187 if (IS_NULL_OR_UNDEFINED(receiver)) { | 1154 if (IS_NULL_OR_UNDEFINED(receiver)) { |
(...skipping 27 matching lines...) Expand all Loading... |
1215 } | 1182 } |
1216 } | 1183 } |
1217 // End of duplicate. | 1184 // End of duplicate. |
1218 } | 1185 } |
1219 %MoveArrayContents(accumulator, result); | 1186 %MoveArrayContents(accumulator, result); |
1220 return result; | 1187 return result; |
1221 } | 1188 } |
1222 | 1189 |
1223 | 1190 |
1224 function ArrayForEach(f, receiver) { | 1191 function ArrayForEach(f, receiver) { |
1225 if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) { | 1192 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.forEach"); |
1226 throw MakeTypeError("called_on_null_or_undefined", | |
1227 ["Array.prototype.forEach"]); | |
1228 } | |
1229 | 1193 |
1230 // Pull out the length so that modifications to the length in the | 1194 // Pull out the length so that modifications to the length in the |
1231 // loop will not affect the looping and side effects are visible. | 1195 // loop will not affect the looping and side effects are visible. |
1232 var array = ToObject(this); | 1196 var array = ToObject(this); |
1233 var length = TO_UINT32(array.length); | 1197 var length = TO_UINT32(array.length); |
1234 | 1198 |
1235 if (!IS_SPEC_FUNCTION(f)) { | 1199 if (!IS_SPEC_FUNCTION(f)) { |
1236 throw MakeTypeError('called_non_callable', [ f ]); | 1200 throw MakeTypeError('called_non_callable', [ f ]); |
1237 } | 1201 } |
1238 if (IS_NULL_OR_UNDEFINED(receiver)) { | 1202 if (IS_NULL_OR_UNDEFINED(receiver)) { |
(...skipping 20 matching lines...) Expand all Loading... |
1259 } | 1223 } |
1260 } | 1224 } |
1261 // End of duplicate. | 1225 // End of duplicate. |
1262 } | 1226 } |
1263 } | 1227 } |
1264 | 1228 |
1265 | 1229 |
1266 // Executes the function once for each element present in the | 1230 // Executes the function once for each element present in the |
1267 // array until it finds one where callback returns true. | 1231 // array until it finds one where callback returns true. |
1268 function ArraySome(f, receiver) { | 1232 function ArraySome(f, receiver) { |
1269 if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) { | 1233 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.some"); |
1270 throw MakeTypeError("called_on_null_or_undefined", | |
1271 ["Array.prototype.some"]); | |
1272 } | |
1273 | 1234 |
1274 // Pull out the length so that modifications to the length in the | 1235 // Pull out the length so that modifications to the length in the |
1275 // loop will not affect the looping and side effects are visible. | 1236 // loop will not affect the looping and side effects are visible. |
1276 var array = ToObject(this); | 1237 var array = ToObject(this); |
1277 var length = TO_UINT32(array.length); | 1238 var length = TO_UINT32(array.length); |
1278 | 1239 |
1279 if (!IS_SPEC_FUNCTION(f)) { | 1240 if (!IS_SPEC_FUNCTION(f)) { |
1280 throw MakeTypeError('called_non_callable', [ f ]); | 1241 throw MakeTypeError('called_non_callable', [ f ]); |
1281 } | 1242 } |
1282 if (IS_NULL_OR_UNDEFINED(receiver)) { | 1243 if (IS_NULL_OR_UNDEFINED(receiver)) { |
(...skipping 19 matching lines...) Expand all Loading... |
1302 if (%_CallFunction(receiver, element, i, array, f)) return true; | 1263 if (%_CallFunction(receiver, element, i, array, f)) return true; |
1303 } | 1264 } |
1304 } | 1265 } |
1305 // End of duplicate. | 1266 // End of duplicate. |
1306 } | 1267 } |
1307 return false; | 1268 return false; |
1308 } | 1269 } |
1309 | 1270 |
1310 | 1271 |
1311 function ArrayEvery(f, receiver) { | 1272 function ArrayEvery(f, receiver) { |
1312 if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) { | 1273 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.every"); |
1313 throw MakeTypeError("called_on_null_or_undefined", | |
1314 ["Array.prototype.every"]); | |
1315 } | |
1316 | 1274 |
1317 // Pull out the length so that modifications to the length in the | 1275 // Pull out the length so that modifications to the length in the |
1318 // loop will not affect the looping and side effects are visible. | 1276 // loop will not affect the looping and side effects are visible. |
1319 var array = ToObject(this); | 1277 var array = ToObject(this); |
1320 var length = TO_UINT32(array.length); | 1278 var length = TO_UINT32(array.length); |
1321 | 1279 |
1322 if (!IS_SPEC_FUNCTION(f)) { | 1280 if (!IS_SPEC_FUNCTION(f)) { |
1323 throw MakeTypeError('called_non_callable', [ f ]); | 1281 throw MakeTypeError('called_non_callable', [ f ]); |
1324 } | 1282 } |
1325 if (IS_NULL_OR_UNDEFINED(receiver)) { | 1283 if (IS_NULL_OR_UNDEFINED(receiver)) { |
(...skipping 18 matching lines...) Expand all Loading... |
1344 var element = array[i]; | 1302 var element = array[i]; |
1345 if (!%_CallFunction(receiver, element, i, array, f)) return false; | 1303 if (!%_CallFunction(receiver, element, i, array, f)) return false; |
1346 } | 1304 } |
1347 } | 1305 } |
1348 // End of duplicate. | 1306 // End of duplicate. |
1349 } | 1307 } |
1350 return true; | 1308 return true; |
1351 } | 1309 } |
1352 | 1310 |
1353 function ArrayMap(f, receiver) { | 1311 function ArrayMap(f, receiver) { |
1354 if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) { | 1312 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.map"); |
1355 throw MakeTypeError("called_on_null_or_undefined", | |
1356 ["Array.prototype.map"]); | |
1357 } | |
1358 | 1313 |
1359 // Pull out the length so that modifications to the length in the | 1314 // Pull out the length so that modifications to the length in the |
1360 // loop will not affect the looping and side effects are visible. | 1315 // loop will not affect the looping and side effects are visible. |
1361 var array = ToObject(this); | 1316 var array = ToObject(this); |
1362 var length = TO_UINT32(array.length); | 1317 var length = TO_UINT32(array.length); |
1363 | 1318 |
1364 if (!IS_SPEC_FUNCTION(f)) { | 1319 if (!IS_SPEC_FUNCTION(f)) { |
1365 throw MakeTypeError('called_non_callable', [ f ]); | 1320 throw MakeTypeError('called_non_callable', [ f ]); |
1366 } | 1321 } |
1367 if (IS_NULL_OR_UNDEFINED(receiver)) { | 1322 if (IS_NULL_OR_UNDEFINED(receiver)) { |
(...skipping 22 matching lines...) Expand all Loading... |
1390 } | 1345 } |
1391 } | 1346 } |
1392 // End of duplicate. | 1347 // End of duplicate. |
1393 } | 1348 } |
1394 %MoveArrayContents(accumulator, result); | 1349 %MoveArrayContents(accumulator, result); |
1395 return result; | 1350 return result; |
1396 } | 1351 } |
1397 | 1352 |
1398 | 1353 |
1399 function ArrayIndexOf(element, index) { | 1354 function ArrayIndexOf(element, index) { |
1400 if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) { | 1355 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.indexOf"); |
1401 throw MakeTypeError("called_on_null_or_undefined", | |
1402 ["Array.prototype.indexOf"]); | |
1403 } | |
1404 | 1356 |
1405 var length = TO_UINT32(this.length); | 1357 var length = TO_UINT32(this.length); |
1406 if (length == 0) return -1; | 1358 if (length == 0) return -1; |
1407 if (IS_UNDEFINED(index)) { | 1359 if (IS_UNDEFINED(index)) { |
1408 index = 0; | 1360 index = 0; |
1409 } else { | 1361 } else { |
1410 index = TO_INTEGER(index); | 1362 index = TO_INTEGER(index); |
1411 // If index is negative, index from the end of the array. | 1363 // If index is negative, index from the end of the array. |
1412 if (index < 0) { | 1364 if (index < 0) { |
1413 index = length + index; | 1365 index = length + index; |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1449 for (var i = min; i < max; i++) { | 1401 for (var i = min; i < max; i++) { |
1450 if (IS_UNDEFINED(this[i]) && i in this) { | 1402 if (IS_UNDEFINED(this[i]) && i in this) { |
1451 return i; | 1403 return i; |
1452 } | 1404 } |
1453 } | 1405 } |
1454 return -1; | 1406 return -1; |
1455 } | 1407 } |
1456 | 1408 |
1457 | 1409 |
1458 function ArrayLastIndexOf(element, index) { | 1410 function ArrayLastIndexOf(element, index) { |
1459 if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) { | 1411 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.lastIndexOf"); |
1460 throw MakeTypeError("called_on_null_or_undefined", | |
1461 ["Array.prototype.lastIndexOf"]); | |
1462 } | |
1463 | 1412 |
1464 var length = TO_UINT32(this.length); | 1413 var length = TO_UINT32(this.length); |
1465 if (length == 0) return -1; | 1414 if (length == 0) return -1; |
1466 if (%_ArgumentsLength() < 2) { | 1415 if (%_ArgumentsLength() < 2) { |
1467 index = length - 1; | 1416 index = length - 1; |
1468 } else { | 1417 } else { |
1469 index = TO_INTEGER(index); | 1418 index = TO_INTEGER(index); |
1470 // If index is negative, index from end of the array. | 1419 // If index is negative, index from end of the array. |
1471 if (index < 0) index += length; | 1420 if (index < 0) index += length; |
1472 // If index is still negative, do not search the array. | 1421 // If index is still negative, do not search the array. |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1504 for (var i = max; i >= min; i--) { | 1453 for (var i = max; i >= min; i--) { |
1505 if (IS_UNDEFINED(this[i]) && i in this) { | 1454 if (IS_UNDEFINED(this[i]) && i in this) { |
1506 return i; | 1455 return i; |
1507 } | 1456 } |
1508 } | 1457 } |
1509 return -1; | 1458 return -1; |
1510 } | 1459 } |
1511 | 1460 |
1512 | 1461 |
1513 function ArrayReduce(callback, current) { | 1462 function ArrayReduce(callback, current) { |
1514 if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) { | 1463 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.reduce"); |
1515 throw MakeTypeError("called_on_null_or_undefined", | |
1516 ["Array.prototype.reduce"]); | |
1517 } | |
1518 | 1464 |
1519 // Pull out the length so that modifications to the length in the | 1465 // Pull out the length so that modifications to the length in the |
1520 // loop will not affect the looping and side effects are visible. | 1466 // loop will not affect the looping and side effects are visible. |
1521 var array = ToObject(this); | 1467 var array = ToObject(this); |
1522 var length = ToUint32(array.length); | 1468 var length = ToUint32(array.length); |
1523 | 1469 |
1524 if (!IS_SPEC_FUNCTION(callback)) { | 1470 if (!IS_SPEC_FUNCTION(callback)) { |
1525 throw MakeTypeError('called_non_callable', [callback]); | 1471 throw MakeTypeError('called_non_callable', [callback]); |
1526 } | 1472 } |
1527 | 1473 |
(...skipping 29 matching lines...) Expand all Loading... |
1557 current = | 1503 current = |
1558 %_CallFunction(receiver, current, element, i, array, callback); | 1504 %_CallFunction(receiver, current, element, i, array, callback); |
1559 } | 1505 } |
1560 } | 1506 } |
1561 // End of duplicate. | 1507 // End of duplicate. |
1562 } | 1508 } |
1563 return current; | 1509 return current; |
1564 } | 1510 } |
1565 | 1511 |
1566 function ArrayReduceRight(callback, current) { | 1512 function ArrayReduceRight(callback, current) { |
1567 if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) { | 1513 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.reduceRight"); |
1568 throw MakeTypeError("called_on_null_or_undefined", | |
1569 ["Array.prototype.reduceRight"]); | |
1570 } | |
1571 | 1514 |
1572 // Pull out the length so that side effects are visible before the | 1515 // Pull out the length so that side effects are visible before the |
1573 // callback function is checked. | 1516 // callback function is checked. |
1574 var array = ToObject(this); | 1517 var array = ToObject(this); |
1575 var length = ToUint32(array.length); | 1518 var length = ToUint32(array.length); |
1576 | 1519 |
1577 if (!IS_SPEC_FUNCTION(callback)) { | 1520 if (!IS_SPEC_FUNCTION(callback)) { |
1578 throw MakeTypeError('called_non_callable', [callback]); | 1521 throw MakeTypeError('called_non_callable', [callback]); |
1579 } | 1522 } |
1580 | 1523 |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1692 )); | 1635 )); |
1693 | 1636 |
1694 SetUpLockedPrototype(InternalPackedArray, $Array(), $Array( | 1637 SetUpLockedPrototype(InternalPackedArray, $Array(), $Array( |
1695 "join", getFunction("join", ArrayJoin), | 1638 "join", getFunction("join", ArrayJoin), |
1696 "pop", getFunction("pop", ArrayPop), | 1639 "pop", getFunction("pop", ArrayPop), |
1697 "push", getFunction("push", ArrayPush) | 1640 "push", getFunction("push", ArrayPush) |
1698 )); | 1641 )); |
1699 } | 1642 } |
1700 | 1643 |
1701 SetUpArray(); | 1644 SetUpArray(); |
OLD | NEW |