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

Side by Side Diff: src/array.js

Issue 1309243003: ES6: Array.prototype.slice and friends should use ToLength instead of ToUint32 (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fixed nit: use factory()->ToBoolean() Created 5 years, 3 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/bootstrapper.cc » ('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 (function(global, utils) { 5 (function(global, utils) {
6 6
7 "use strict"; 7 "use strict";
8 8
9 %CheckIsBootstrapping(); 9 %CheckIsBootstrapping();
10 10
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after
388 func = array.join; 388 func = array.join;
389 } 389 }
390 if (!IS_CALLABLE(func)) { 390 if (!IS_CALLABLE(func)) {
391 return %_CallFunction(array, ObjectToString); 391 return %_CallFunction(array, ObjectToString);
392 } 392 }
393 return %_Call(func, array); 393 return %_Call(func, array);
394 } 394 }
395 395
396 396
397 function InnerArrayToLocaleString(array, length) { 397 function InnerArrayToLocaleString(array, length) {
398 var len = TO_UINT32(length); 398 var len = TO_LENGTH_OR_UINT32(length);
399 if (len === 0) return ""; 399 if (len === 0) return "";
400 return Join(array, len, ',', ConvertToLocaleString); 400 return Join(array, len, ',', ConvertToLocaleString);
401 } 401 }
402 402
403 403
404 function ArrayToLocaleString() { 404 function ArrayToLocaleString() {
405 var array = TO_OBJECT(this); 405 var array = TO_OBJECT(this);
406 var arrayLen = array.length; 406 var arrayLen = array.length;
407 return InnerArrayToLocaleString(array, arrayLen); 407 return InnerArrayToLocaleString(array, arrayLen);
408 } 408 }
(...skipping 18 matching lines...) Expand all
427 } 427 }
428 428
429 return Join(array, length, separator, ConvertToString); 429 return Join(array, length, separator, ConvertToString);
430 } 430 }
431 431
432 432
433 function ArrayJoin(separator) { 433 function ArrayJoin(separator) {
434 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.join"); 434 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.join");
435 435
436 var array = TO_OBJECT(this); 436 var array = TO_OBJECT(this);
437 var length = TO_UINT32(array.length); 437 var length = TO_LENGTH_OR_UINT32(array.length);
438 438
439 return InnerArrayJoin(separator, array, length); 439 return InnerArrayJoin(separator, array, length);
440 } 440 }
441 441
442 442
443 function ObservedArrayPop(n) { 443 function ObservedArrayPop(n) {
444 n--; 444 n--;
445 var value = this[n]; 445 var value = this[n];
446 446
447 try { 447 try {
448 $observeBeginPerformSplice(this); 448 $observeBeginPerformSplice(this);
449 delete this[n]; 449 delete this[n];
450 this.length = n; 450 this.length = n;
451 } finally { 451 } finally {
452 $observeEndPerformSplice(this); 452 $observeEndPerformSplice(this);
453 $observeEnqueueSpliceRecord(this, n, [value], 0); 453 $observeEnqueueSpliceRecord(this, n, [value], 0);
454 } 454 }
455 455
456 return value; 456 return value;
457 } 457 }
458 458
459 459
460 // Removes the last element from the array and returns it. See 460 // Removes the last element from the array and returns it. See
461 // ECMA-262, section 15.4.4.6. 461 // ECMA-262, section 15.4.4.6.
462 function ArrayPop() { 462 function ArrayPop() {
463 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.pop"); 463 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.pop");
464 464
465 var array = TO_OBJECT(this); 465 var array = TO_OBJECT(this);
466 var n = TO_UINT32(array.length); 466 var n = TO_LENGTH_OR_UINT32(array.length);
467 if (n == 0) { 467 if (n == 0) {
468 array.length = n; 468 array.length = n;
469 return; 469 return;
470 } 470 }
471 471
472 if (%IsObserved(array)) 472 if (%IsObserved(array))
473 return ObservedArrayPop.call(array, n); 473 return ObservedArrayPop.call(array, n);
474 474
475 n--; 475 n--;
476 var value = array[n]; 476 var value = array[n];
477 Delete(array, n, true); 477 Delete(array, n, true);
478 array.length = n; 478 array.length = n;
479 return value; 479 return value;
480 } 480 }
481 481
482 482
483 function ObservedArrayPush() { 483 function ObservedArrayPush() {
484 var n = TO_UINT32(this.length); 484 var n = TO_LENGTH_OR_UINT32(this.length);
485 var m = %_ArgumentsLength(); 485 var m = %_ArgumentsLength();
486 486
487 try { 487 try {
488 $observeBeginPerformSplice(this); 488 $observeBeginPerformSplice(this);
489 for (var i = 0; i < m; i++) { 489 for (var i = 0; i < m; i++) {
490 this[i+n] = %_Arguments(i); 490 this[i+n] = %_Arguments(i);
491 } 491 }
492 var new_length = n + m; 492 var new_length = n + m;
493 this.length = new_length; 493 this.length = new_length;
494 } finally { 494 } finally {
495 $observeEndPerformSplice(this); 495 $observeEndPerformSplice(this);
496 $observeEnqueueSpliceRecord(this, n, [], m); 496 $observeEnqueueSpliceRecord(this, n, [], m);
497 } 497 }
498 498
499 return new_length; 499 return new_length;
500 } 500 }
501 501
502 502
503 // Appends the arguments to the end of the array and returns the new 503 // Appends the arguments to the end of the array and returns the new
504 // length of the array. See ECMA-262, section 15.4.4.7. 504 // length of the array. See ECMA-262, section 15.4.4.7.
505 function ArrayPush() { 505 function ArrayPush() {
506 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.push"); 506 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.push");
507 507
508 if (%IsObserved(this)) 508 if (%IsObserved(this))
509 return ObservedArrayPush.apply(this, arguments); 509 return ObservedArrayPush.apply(this, arguments);
510 510
511 var array = TO_OBJECT(this); 511 var array = TO_OBJECT(this);
512 var n = TO_UINT32(array.length); 512 var n = TO_LENGTH_OR_UINT32(array.length);
513 var m = %_ArgumentsLength(); 513 var m = %_ArgumentsLength();
514 514
515 for (var i = 0; i < m; i++) { 515 for (var i = 0; i < m; i++) {
516 array[i+n] = %_Arguments(i); 516 array[i+n] = %_Arguments(i);
517 } 517 }
518 518
519 var new_length = n + m; 519 var new_length = n + m;
520 array.length = new_length; 520 array.length = new_length;
521 return new_length; 521 return new_length;
522 } 522 }
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
599 } 599 }
600 } 600 }
601 return array; 601 return array;
602 } 602 }
603 603
604 604
605 function ArrayReverse() { 605 function ArrayReverse() {
606 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.reverse"); 606 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.reverse");
607 607
608 var array = TO_OBJECT(this); 608 var array = TO_OBJECT(this);
609 var len = TO_UINT32(array.length); 609 var len = TO_LENGTH_OR_UINT32(array.length);
610 var isArray = IS_ARRAY(array); 610 var isArray = IS_ARRAY(array);
611 611
612 if (UseSparseVariant(array, len, isArray, len)) { 612 if (UseSparseVariant(array, len, isArray, len)) {
613 %NormalizeElements(array); 613 %NormalizeElements(array);
614 SparseReverse(array, len); 614 SparseReverse(array, len);
615 return array; 615 return array;
616 } else if (isArray && %_HasFastPackedElements(array)) { 616 } else if (isArray && %_HasFastPackedElements(array)) {
617 return PackedArrayReverse(array, len); 617 return PackedArrayReverse(array, len);
618 } else { 618 } else {
619 return GenericArrayReverse(array, len); 619 return GenericArrayReverse(array, len);
(...skipping 14 matching lines...) Expand all
634 } 634 }
635 635
636 return first; 636 return first;
637 } 637 }
638 638
639 639
640 function ArrayShift() { 640 function ArrayShift() {
641 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.shift"); 641 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.shift");
642 642
643 var array = TO_OBJECT(this); 643 var array = TO_OBJECT(this);
644 var len = TO_UINT32(array.length); 644 var len = TO_LENGTH_OR_UINT32(array.length);
645 645
646 if (len === 0) { 646 if (len === 0) {
647 array.length = 0; 647 array.length = 0;
648 return; 648 return;
649 } 649 }
650 650
651 if (ObjectIsSealed(array)) throw MakeTypeError(kArrayFunctionsOnSealed); 651 if (ObjectIsSealed(array)) throw MakeTypeError(kArrayFunctionsOnSealed);
652 652
653 if (%IsObserved(array)) 653 if (%IsObserved(array))
654 return ObservedArrayShift.call(array, len); 654 return ObservedArrayShift.call(array, len);
655 655
656 var first = array[0]; 656 var first = array[0];
657 657
658 if (UseSparseVariant(array, len, IS_ARRAY(array), len)) { 658 if (UseSparseVariant(array, len, IS_ARRAY(array), len)) {
659 SparseMove(array, 0, 1, len, 0); 659 SparseMove(array, 0, 1, len, 0);
660 } else { 660 } else {
661 SimpleMove(array, 0, 1, len, 0); 661 SimpleMove(array, 0, 1, len, 0);
662 } 662 }
663 663
664 array.length = len - 1; 664 array.length = len - 1;
665 665
666 return first; 666 return first;
667 } 667 }
668 668
669 669
670 function ObservedArrayUnshift() { 670 function ObservedArrayUnshift() {
671 var len = TO_UINT32(this.length); 671 var len = TO_LENGTH_OR_UINT32(this.length);
672 var num_arguments = %_ArgumentsLength(); 672 var num_arguments = %_ArgumentsLength();
673 673
674 try { 674 try {
675 $observeBeginPerformSplice(this); 675 $observeBeginPerformSplice(this);
676 SimpleMove(this, 0, 0, len, num_arguments); 676 SimpleMove(this, 0, 0, len, num_arguments);
677 for (var i = 0; i < num_arguments; i++) { 677 for (var i = 0; i < num_arguments; i++) {
678 this[i] = %_Arguments(i); 678 this[i] = %_Arguments(i);
679 } 679 }
680 var new_length = len + num_arguments; 680 var new_length = len + num_arguments;
681 this.length = new_length; 681 this.length = new_length;
682 } finally { 682 } finally {
683 $observeEndPerformSplice(this); 683 $observeEndPerformSplice(this);
684 $observeEnqueueSpliceRecord(this, 0, [], num_arguments); 684 $observeEnqueueSpliceRecord(this, 0, [], num_arguments);
685 } 685 }
686 686
687 return new_length; 687 return new_length;
688 } 688 }
689 689
690 690
691 function ArrayUnshift(arg1) { // length == 1 691 function ArrayUnshift(arg1) { // length == 1
692 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.unshift"); 692 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.unshift");
693 693
694 if (%IsObserved(this)) 694 if (%IsObserved(this))
695 return ObservedArrayUnshift.apply(this, arguments); 695 return ObservedArrayUnshift.apply(this, arguments);
696 696
697 var array = TO_OBJECT(this); 697 var array = TO_OBJECT(this);
698 var len = TO_UINT32(array.length); 698 var len = TO_LENGTH_OR_UINT32(array.length);
699 var num_arguments = %_ArgumentsLength(); 699 var num_arguments = %_ArgumentsLength();
700 700
701 if (len > 0 && UseSparseVariant(array, len, IS_ARRAY(array), len) && 701 if (len > 0 && UseSparseVariant(array, len, IS_ARRAY(array), len) &&
702 !ObjectIsSealed(array)) { 702 !ObjectIsSealed(array)) {
703 SparseMove(array, 0, 0, len, num_arguments); 703 SparseMove(array, 0, 0, len, num_arguments);
704 } else { 704 } else {
705 SimpleMove(array, 0, 0, len, num_arguments); 705 SimpleMove(array, 0, 0, len, num_arguments);
706 } 706 }
707 707
708 for (var i = 0; i < num_arguments; i++) { 708 for (var i = 0; i < num_arguments; i++) {
709 array[i] = %_Arguments(i); 709 array[i] = %_Arguments(i);
710 } 710 }
711 711
712 var new_length = len + num_arguments; 712 var new_length = len + num_arguments;
713 array.length = new_length; 713 array.length = new_length;
714 return new_length; 714 return new_length;
715 } 715 }
716 716
717 717
718 function ArraySlice(start, end) { 718 function ArraySlice(start, end) {
719 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.slice"); 719 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.slice");
720 720
721 var array = TO_OBJECT(this); 721 var array = TO_OBJECT(this);
722 var len = TO_UINT32(array.length); 722 var len = TO_LENGTH_OR_UINT32(array.length);
723 var start_i = TO_INTEGER(start); 723 var start_i = TO_INTEGER(start);
724 var end_i = len; 724 var end_i = len;
725 725
726 if (!IS_UNDEFINED(end)) end_i = TO_INTEGER(end); 726 if (!IS_UNDEFINED(end)) end_i = TO_INTEGER(end);
727 727
728 if (start_i < 0) { 728 if (start_i < 0) {
729 start_i += len; 729 start_i += len;
730 if (start_i < 0) start_i = 0; 730 if (start_i < 0) start_i = 0;
731 } else { 731 } else {
732 if (start_i > len) start_i = len; 732 if (start_i > len) start_i = len;
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
783 783
784 if (del_count > len - start_i) 784 if (del_count > len - start_i)
785 return len - start_i; 785 return len - start_i;
786 786
787 return del_count; 787 return del_count;
788 } 788 }
789 789
790 790
791 function ObservedArraySplice(start, delete_count) { 791 function ObservedArraySplice(start, delete_count) {
792 var num_arguments = %_ArgumentsLength(); 792 var num_arguments = %_ArgumentsLength();
793 var len = TO_UINT32(this.length); 793 var len = TO_LENGTH_OR_UINT32(this.length);
794 var start_i = ComputeSpliceStartIndex(TO_INTEGER(start), len); 794 var start_i = ComputeSpliceStartIndex(TO_INTEGER(start), len);
795 var del_count = ComputeSpliceDeleteCount(delete_count, num_arguments, len, 795 var del_count = ComputeSpliceDeleteCount(delete_count, num_arguments, len,
796 start_i); 796 start_i);
797 var deleted_elements = []; 797 var deleted_elements = [];
798 deleted_elements.length = del_count; 798 deleted_elements.length = del_count;
799 var num_elements_to_add = num_arguments > 2 ? num_arguments - 2 : 0; 799 var num_elements_to_add = num_arguments > 2 ? num_arguments - 2 : 0;
800 800
801 try { 801 try {
802 $observeBeginPerformSplice(this); 802 $observeBeginPerformSplice(this);
803 803
(...skipping 26 matching lines...) Expand all
830 830
831 831
832 function ArraySplice(start, delete_count) { 832 function ArraySplice(start, delete_count) {
833 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.splice"); 833 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.splice");
834 834
835 if (%IsObserved(this)) 835 if (%IsObserved(this))
836 return ObservedArraySplice.apply(this, arguments); 836 return ObservedArraySplice.apply(this, arguments);
837 837
838 var num_arguments = %_ArgumentsLength(); 838 var num_arguments = %_ArgumentsLength();
839 var array = TO_OBJECT(this); 839 var array = TO_OBJECT(this);
840 var len = TO_UINT32(array.length); 840 var len = TO_LENGTH_OR_UINT32(array.length);
841 var start_i = ComputeSpliceStartIndex(TO_INTEGER(start), len); 841 var start_i = ComputeSpliceStartIndex(TO_INTEGER(start), len);
842 var del_count = ComputeSpliceDeleteCount(delete_count, num_arguments, len, 842 var del_count = ComputeSpliceDeleteCount(delete_count, num_arguments, len,
843 start_i); 843 start_i);
844 var deleted_elements = []; 844 var deleted_elements = [];
845 deleted_elements.length = del_count; 845 deleted_elements.length = del_count;
846 var num_elements_to_add = num_arguments > 2 ? num_arguments - 2 : 0; 846 var num_elements_to_add = num_arguments > 2 ? num_arguments - 2 : 0;
847 847
848 if (del_count != num_elements_to_add && ObjectIsSealed(array)) { 848 if (del_count != num_elements_to_add && ObjectIsSealed(array)) {
849 throw MakeTypeError(kArrayFunctionsOnSealed); 849 throw MakeTypeError(kArrayFunctionsOnSealed);
850 } else if (del_count > 0 && ObjectIsFrozen(array)) { 850 } else if (del_count > 0 && ObjectIsFrozen(array)) {
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after
1166 } 1166 }
1167 1167
1168 return array; 1168 return array;
1169 } 1169 }
1170 1170
1171 1171
1172 function ArraySort(comparefn) { 1172 function ArraySort(comparefn) {
1173 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.sort"); 1173 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.sort");
1174 1174
1175 var array = TO_OBJECT(this); 1175 var array = TO_OBJECT(this);
1176 var length = TO_UINT32(array.length); 1176 var length = TO_LENGTH_OR_UINT32(array.length);
1177 return InnerArraySort(array, length, comparefn); 1177 return InnerArraySort(array, length, comparefn);
1178 } 1178 }
1179 1179
1180 1180
1181 // The following functions cannot be made efficient on sparse arrays while 1181 // The following functions cannot be made efficient on sparse arrays while
1182 // preserving the semantics, since the calls to the receiver function can add 1182 // preserving the semantics, since the calls to the receiver function can add
1183 // or delete elements from the array. 1183 // or delete elements from the array.
1184 function InnerArrayFilter(f, receiver, array, length) { 1184 function InnerArrayFilter(f, receiver, array, length) {
1185 if (!IS_CALLABLE(f)) throw MakeTypeError(kCalledNonCallable, f); 1185 if (!IS_CALLABLE(f)) throw MakeTypeError(kCalledNonCallable, f);
1186 1186
(...skipping 13 matching lines...) Expand all
1200 } 1200 }
1201 return accumulator; 1201 return accumulator;
1202 } 1202 }
1203 1203
1204 function ArrayFilter(f, receiver) { 1204 function ArrayFilter(f, receiver) {
1205 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.filter"); 1205 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.filter");
1206 1206
1207 // Pull out the length so that modifications to the length in the 1207 // Pull out the length so that modifications to the length in the
1208 // loop will not affect the looping and side effects are visible. 1208 // loop will not affect the looping and side effects are visible.
1209 var array = TO_OBJECT(this); 1209 var array = TO_OBJECT(this);
1210 var length = TO_UINT32(array.length); 1210 var length = TO_LENGTH_OR_UINT32(array.length);
1211 var accumulator = InnerArrayFilter(f, receiver, array, length); 1211 var accumulator = InnerArrayFilter(f, receiver, array, length);
1212 var result = new GlobalArray(); 1212 var result = new GlobalArray();
1213 %MoveArrayContents(accumulator, result); 1213 %MoveArrayContents(accumulator, result);
1214 return result; 1214 return result;
1215 } 1215 }
1216 1216
1217 function InnerArrayForEach(f, receiver, array, length) { 1217 function InnerArrayForEach(f, receiver, array, length) {
1218 if (!IS_CALLABLE(f)) throw MakeTypeError(kCalledNonCallable, f); 1218 if (!IS_CALLABLE(f)) throw MakeTypeError(kCalledNonCallable, f);
1219 1219
1220 var is_array = IS_ARRAY(array); 1220 var is_array = IS_ARRAY(array);
1221 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f); 1221 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f);
1222 for (var i = 0; i < length; i++) { 1222 for (var i = 0; i < length; i++) {
1223 if (HAS_INDEX(array, i, is_array)) { 1223 if (HAS_INDEX(array, i, is_array)) {
1224 var element = array[i]; 1224 var element = array[i];
1225 // Prepare break slots for debugger step in. 1225 // Prepare break slots for debugger step in.
1226 if (stepping) %DebugPrepareStepInIfStepping(f); 1226 if (stepping) %DebugPrepareStepInIfStepping(f);
1227 %_Call(f, receiver, element, i, array); 1227 %_Call(f, receiver, element, i, array);
1228 } 1228 }
1229 } 1229 }
1230 } 1230 }
1231 1231
1232 function ArrayForEach(f, receiver) { 1232 function ArrayForEach(f, receiver) {
1233 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.forEach"); 1233 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.forEach");
1234 1234
1235 // 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
1236 // loop will not affect the looping and side effects are visible. 1236 // loop will not affect the looping and side effects are visible.
1237 var array = TO_OBJECT(this); 1237 var array = TO_OBJECT(this);
1238 var length = TO_UINT32(array.length); 1238 var length = TO_LENGTH_OR_UINT32(array.length);
1239 InnerArrayForEach(f, receiver, array, length); 1239 InnerArrayForEach(f, receiver, array, length);
1240 } 1240 }
1241 1241
1242 1242
1243 function InnerArraySome(f, receiver, array, length) { 1243 function InnerArraySome(f, receiver, array, length) {
1244 if (!IS_CALLABLE(f)) throw MakeTypeError(kCalledNonCallable, f); 1244 if (!IS_CALLABLE(f)) throw MakeTypeError(kCalledNonCallable, f);
1245 1245
1246 var is_array = IS_ARRAY(array); 1246 var is_array = IS_ARRAY(array);
1247 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f); 1247 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f);
1248 for (var i = 0; i < length; i++) { 1248 for (var i = 0; i < length; i++) {
1249 if (HAS_INDEX(array, i, is_array)) { 1249 if (HAS_INDEX(array, i, is_array)) {
1250 var element = array[i]; 1250 var element = array[i];
1251 // Prepare break slots for debugger step in. 1251 // Prepare break slots for debugger step in.
1252 if (stepping) %DebugPrepareStepInIfStepping(f); 1252 if (stepping) %DebugPrepareStepInIfStepping(f);
1253 if (%_Call(f, receiver, element, i, array)) return true; 1253 if (%_Call(f, receiver, element, i, array)) return true;
1254 } 1254 }
1255 } 1255 }
1256 return false; 1256 return false;
1257 } 1257 }
1258 1258
1259 1259
1260 // Executes the function once for each element present in the 1260 // Executes the function once for each element present in the
1261 // array until it finds one where callback returns true. 1261 // array until it finds one where callback returns true.
1262 function ArraySome(f, receiver) { 1262 function ArraySome(f, receiver) {
1263 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.some"); 1263 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.some");
1264 1264
1265 // Pull out the length so that modifications to the length in the 1265 // Pull out the length so that modifications to the length in the
1266 // loop will not affect the looping and side effects are visible. 1266 // loop will not affect the looping and side effects are visible.
1267 var array = TO_OBJECT(this); 1267 var array = TO_OBJECT(this);
1268 var length = TO_UINT32(array.length); 1268 var length = TO_LENGTH_OR_UINT32(array.length);
1269 return InnerArraySome(f, receiver, array, length); 1269 return InnerArraySome(f, receiver, array, length);
1270 } 1270 }
1271 1271
1272 1272
1273 function InnerArrayEvery(f, receiver, array, length) { 1273 function InnerArrayEvery(f, receiver, array, length) {
1274 if (!IS_CALLABLE(f)) throw MakeTypeError(kCalledNonCallable, f); 1274 if (!IS_CALLABLE(f)) throw MakeTypeError(kCalledNonCallable, f);
1275 1275
1276 var is_array = IS_ARRAY(array); 1276 var is_array = IS_ARRAY(array);
1277 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f); 1277 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f);
1278 for (var i = 0; i < length; i++) { 1278 for (var i = 0; i < length; i++) {
1279 if (HAS_INDEX(array, i, is_array)) { 1279 if (HAS_INDEX(array, i, is_array)) {
1280 var element = array[i]; 1280 var element = array[i];
1281 // Prepare break slots for debugger step in. 1281 // Prepare break slots for debugger step in.
1282 if (stepping) %DebugPrepareStepInIfStepping(f); 1282 if (stepping) %DebugPrepareStepInIfStepping(f);
1283 if (!%_Call(f, receiver, element, i, array)) return false; 1283 if (!%_Call(f, receiver, element, i, array)) return false;
1284 } 1284 }
1285 } 1285 }
1286 return true; 1286 return true;
1287 } 1287 }
1288 1288
1289 function ArrayEvery(f, receiver) { 1289 function ArrayEvery(f, receiver) {
1290 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.every"); 1290 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.every");
1291 1291
1292 // Pull out the length so that modifications to the length in the 1292 // Pull out the length so that modifications to the length in the
1293 // loop will not affect the looping and side effects are visible. 1293 // loop will not affect the looping and side effects are visible.
1294 var array = TO_OBJECT(this); 1294 var array = TO_OBJECT(this);
1295 var length = TO_UINT32(array.length); 1295 var length = TO_LENGTH_OR_UINT32(array.length);
1296 return InnerArrayEvery(f, receiver, array, length); 1296 return InnerArrayEvery(f, receiver, array, length);
1297 } 1297 }
1298 1298
1299 1299
1300 function InnerArrayMap(f, receiver, array, length) { 1300 function InnerArrayMap(f, receiver, array, length) {
1301 if (!IS_CALLABLE(f)) throw MakeTypeError(kCalledNonCallable, f); 1301 if (!IS_CALLABLE(f)) throw MakeTypeError(kCalledNonCallable, f);
1302 1302
1303 var accumulator = new InternalArray(length); 1303 var accumulator = new InternalArray(length);
1304 var is_array = IS_ARRAY(array); 1304 var is_array = IS_ARRAY(array);
1305 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f); 1305 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f);
1306 for (var i = 0; i < length; i++) { 1306 for (var i = 0; i < length; i++) {
1307 if (HAS_INDEX(array, i, is_array)) { 1307 if (HAS_INDEX(array, i, is_array)) {
1308 var element = array[i]; 1308 var element = array[i];
1309 // Prepare break slots for debugger step in. 1309 // Prepare break slots for debugger step in.
1310 if (stepping) %DebugPrepareStepInIfStepping(f); 1310 if (stepping) %DebugPrepareStepInIfStepping(f);
1311 accumulator[i] = %_Call(f, receiver, element, i, array); 1311 accumulator[i] = %_Call(f, receiver, element, i, array);
1312 } 1312 }
1313 } 1313 }
1314 return accumulator; 1314 return accumulator;
1315 } 1315 }
1316 1316
1317 1317
1318 function ArrayMap(f, receiver) { 1318 function ArrayMap(f, receiver) {
1319 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.map"); 1319 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.map");
1320 1320
1321 // Pull out the length so that modifications to the length in the 1321 // Pull out the length so that modifications to the length in the
1322 // loop will not affect the looping and side effects are visible. 1322 // loop will not affect the looping and side effects are visible.
1323 var array = TO_OBJECT(this); 1323 var array = TO_OBJECT(this);
1324 var length = TO_UINT32(array.length); 1324 var length = TO_LENGTH_OR_UINT32(array.length);
1325 var accumulator = InnerArrayMap(f, receiver, array, length); 1325 var accumulator = InnerArrayMap(f, receiver, array, length);
1326 var result = new GlobalArray(); 1326 var result = new GlobalArray();
1327 %MoveArrayContents(accumulator, result); 1327 %MoveArrayContents(accumulator, result);
1328 return result; 1328 return result;
1329 } 1329 }
1330 1330
1331 1331
1332 // For .indexOf, we don't need to pass in the number of arguments 1332 // For .indexOf, we don't need to pass in the number of arguments
1333 // at the callsite since ToInteger(undefined) == 0; however, for 1333 // at the callsite since ToInteger(undefined) == 0; however, for
1334 // .lastIndexOf, we need to pass it, since the behavior for passing 1334 // .lastIndexOf, we need to pass it, since the behavior for passing
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
1383 return i; 1383 return i;
1384 } 1384 }
1385 } 1385 }
1386 return -1; 1386 return -1;
1387 } 1387 }
1388 1388
1389 1389
1390 function ArrayIndexOf(element, index) { 1390 function ArrayIndexOf(element, index) {
1391 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.indexOf"); 1391 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.indexOf");
1392 1392
1393 var length = TO_UINT32(this.length); 1393 var length = TO_LENGTH_OR_UINT32(this.length);
1394 return InnerArrayIndexOf(this, element, index, length); 1394 return InnerArrayIndexOf(this, element, index, length);
1395 } 1395 }
1396 1396
1397 1397
1398 function InnerArrayLastIndexOf(array, element, index, length, argumentsLength) { 1398 function InnerArrayLastIndexOf(array, element, index, length, argumentsLength) {
1399 if (length == 0) return -1; 1399 if (length == 0) return -1;
1400 if (argumentsLength < 2) { 1400 if (argumentsLength < 2) {
1401 index = length - 1; 1401 index = length - 1;
1402 } else { 1402 } else {
1403 index = TO_INTEGER(index); 1403 index = TO_INTEGER(index);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1441 return i; 1441 return i;
1442 } 1442 }
1443 } 1443 }
1444 return -1; 1444 return -1;
1445 } 1445 }
1446 1446
1447 1447
1448 function ArrayLastIndexOf(element, index) { 1448 function ArrayLastIndexOf(element, index) {
1449 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.lastIndexOf"); 1449 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.lastIndexOf");
1450 1450
1451 var length = TO_UINT32(this.length); 1451 var length = TO_LENGTH_OR_UINT32(this.length);
1452 return InnerArrayLastIndexOf(this, element, index, length, 1452 return InnerArrayLastIndexOf(this, element, index, length,
1453 %_ArgumentsLength()); 1453 %_ArgumentsLength());
1454 } 1454 }
1455 1455
1456 1456
1457 function InnerArrayReduce(callback, current, array, length, argumentsLength) { 1457 function InnerArrayReduce(callback, current, array, length, argumentsLength) {
1458 if (!IS_CALLABLE(callback)) { 1458 if (!IS_CALLABLE(callback)) {
1459 throw MakeTypeError(kCalledNonCallable, callback); 1459 throw MakeTypeError(kCalledNonCallable, callback);
1460 } 1460 }
1461 1461
(...skipping 21 matching lines...) Expand all
1483 return current; 1483 return current;
1484 } 1484 }
1485 1485
1486 1486
1487 function ArrayReduce(callback, current) { 1487 function ArrayReduce(callback, current) {
1488 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.reduce"); 1488 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.reduce");
1489 1489
1490 // Pull out the length so that modifications to the length in the 1490 // Pull out the length so that modifications to the length in the
1491 // loop will not affect the looping and side effects are visible. 1491 // loop will not affect the looping and side effects are visible.
1492 var array = TO_OBJECT(this); 1492 var array = TO_OBJECT(this);
1493 var length = TO_UINT32(array.length); 1493 var length = TO_LENGTH_OR_UINT32(array.length);
1494 return InnerArrayReduce(callback, current, array, length, 1494 return InnerArrayReduce(callback, current, array, length,
1495 %_ArgumentsLength()); 1495 %_ArgumentsLength());
1496 } 1496 }
1497 1497
1498 1498
1499 function InnerArrayReduceRight(callback, current, array, length, 1499 function InnerArrayReduceRight(callback, current, array, length,
1500 argumentsLength) { 1500 argumentsLength) {
1501 if (!IS_CALLABLE(callback)) { 1501 if (!IS_CALLABLE(callback)) {
1502 throw MakeTypeError(kCalledNonCallable, callback); 1502 throw MakeTypeError(kCalledNonCallable, callback);
1503 } 1503 }
(...skipping 22 matching lines...) Expand all
1526 return current; 1526 return current;
1527 } 1527 }
1528 1528
1529 1529
1530 function ArrayReduceRight(callback, current) { 1530 function ArrayReduceRight(callback, current) {
1531 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.reduceRight"); 1531 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.reduceRight");
1532 1532
1533 // Pull out the length so that side effects are visible before the 1533 // Pull out the length so that side effects are visible before the
1534 // callback function is checked. 1534 // callback function is checked.
1535 var array = TO_OBJECT(this); 1535 var array = TO_OBJECT(this);
1536 var length = TO_UINT32(array.length); 1536 var length = TO_LENGTH_OR_UINT32(array.length);
1537 return InnerArrayReduceRight(callback, current, array, length, 1537 return InnerArrayReduceRight(callback, current, array, length,
1538 %_ArgumentsLength()); 1538 %_ArgumentsLength());
1539 } 1539 }
1540 1540
1541 // ES5, 15.4.3.2 1541 // ES5, 15.4.3.2
1542 function ArrayIsArray(obj) { 1542 function ArrayIsArray(obj) {
1543 return IS_ARRAY(obj); 1543 return IS_ARRAY(obj);
1544 } 1544 }
1545 1545
1546 1546
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
1658 %InstallToContext([ 1658 %InstallToContext([
1659 "array_pop", ArrayPop, 1659 "array_pop", ArrayPop,
1660 "array_push", ArrayPush, 1660 "array_push", ArrayPush,
1661 "array_shift", ArrayShift, 1661 "array_shift", ArrayShift,
1662 "array_splice", ArraySplice, 1662 "array_splice", ArraySplice,
1663 "array_slice", ArraySlice, 1663 "array_slice", ArraySlice,
1664 "array_unshift", ArrayUnshift, 1664 "array_unshift", ArrayUnshift,
1665 ]); 1665 ]);
1666 1666
1667 }); 1667 });
OLDNEW
« no previous file with comments | « no previous file | src/bootstrapper.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698