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

Side by Side Diff: src/array.js

Issue 1238593003: Array.prototype.reverse should call [[HasProperty]] on elements before [[Get]] (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Add packed implementation Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/harmony-typedarray.js » ('j') | test/mjsunit/es6/array-reverse-order.js » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 var $arrayConcat; 5 var $arrayConcat;
6 var $arrayPush; 6 var $arrayPush;
7 var $arrayPop; 7 var $arrayPop;
8 var $arrayShift; 8 var $arrayShift;
9 var $arraySlice; 9 var $arraySlice;
10 var $arraySplice; 10 var $arraySplice;
(...skipping 549 matching lines...) Expand 10 before | Expand all | Expand 10 after
560 high = j; 560 high = j;
561 while (keys[--high_counter] == j) { } 561 while (keys[--high_counter] == j) { }
562 low = j_complement; 562 low = j_complement;
563 } 563 }
564 if (j_complement >= i) { 564 if (j_complement >= i) {
565 low = i; 565 low = i;
566 while (keys[++low_counter] == i) { } 566 while (keys[++low_counter] == i) { }
567 high = len - i - 1; 567 high = len - i - 1;
568 } 568 }
569 569
570 var current_i = array[low]; 570 if (low in array) {
571 if (!IS_UNDEFINED(current_i) || low in array) { 571 var current_i = array[low];
adamk 2015/07/16 22:08:13 As discussed offline, I don't think SparseReverse
Dan Ehrenberg 2015/07/16 22:16:49 Done.
572 var current_j = array[high]; 572 if (high in array) {
573 if (!IS_UNDEFINED(current_j) || high in array) { 573 var current_j = array[high];
574 array[low] = current_j; 574 array[low] = current_j;
575 array[high] = current_i; 575 array[high] = current_i;
576 } else { 576 } else {
577 array[high] = current_i; 577 array[high] = current_i;
578 delete array[low]; 578 delete array[low];
579 } 579 }
580 } else { 580 } else {
581 var current_j = array[high]; 581 if (high in array) {
582 if (!IS_UNDEFINED(current_j) || high in array) { 582 var current_j = array[high];
583 array[low] = current_j; 583 array[low] = current_j;
584 delete array[high]; 584 delete array[high];
585 } 585 }
586 } 586 }
587 } 587 }
588 } 588 }
589 589
590 function PackedArrayReverse(array, len) {
591 var j = len - 1;
592 for (var i = 0; i < j; i++, j--) {
593 var current_i = array[i];
594 var current_j = array[j];
595 array[i] = current_j;
596 array[j] = current_i;
597 }
598 return array;
599 }
600
590 601
591 function InnerArrayReverse(array, len) { 602 function InnerArrayReverse(array, len) {
592 var j = len - 1; 603 var j = len - 1;
593 for (var i = 0; i < j; i++, j--) { 604 for (var i = 0; i < j; i++, j--) {
594 var current_i = array[i]; 605 if (i in array) {
595 if (!IS_UNDEFINED(current_i) || i in array) { 606 var current_i = array[i];
596 var current_j = array[j]; 607 if (j in array) {
597 if (!IS_UNDEFINED(current_j) || j in array) { 608 var current_j = array[j];
598 array[i] = current_j; 609 array[i] = current_j;
599 array[j] = current_i; 610 array[j] = current_i;
600 } else { 611 } else {
601 array[j] = current_i; 612 array[j] = current_i;
602 delete array[i]; 613 delete array[i];
603 } 614 }
604 } else { 615 } else {
605 var current_j = array[j]; 616 if (j in array) {
606 if (!IS_UNDEFINED(current_j) || j in array) { 617 var current_j = array[j];
607 array[i] = current_j; 618 array[i] = current_j;
608 delete array[j]; 619 delete array[j];
609 } 620 }
610 } 621 }
611 } 622 }
612 return array; 623 return array;
613 } 624 }
614 625
615 626
616 function ArrayReverse() { 627 function ArrayReverse() {
617 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.reverse"); 628 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.reverse");
618 629
619 var array = TO_OBJECT_INLINE(this); 630 var array = TO_OBJECT_INLINE(this);
620 var len = TO_UINT32(array.length); 631 var len = TO_UINT32(array.length);
621 632
622 if (UseSparseVariant(array, len, IS_ARRAY(array), len)) { 633 if (UseSparseVariant(array, len, IS_ARRAY(array), len)) {
623 %NormalizeElements(array); 634 %NormalizeElements(array);
624 SparseReverse(array, len); 635 SparseReverse(array, len);
625 return array; 636 return array;
637 } else if (%_HasFastPackedElements(array)) {
adamk 2015/07/16 22:08:13 This needs an IS_ARRAY check (you can cache this a
Toon Verwaest 2015/07/16 22:15:32 Do we have objects with packed elements that are n
Dan Ehrenberg 2015/07/16 22:16:49 Done.
638 return PackedArrayReverse(array, len);
639 } else {
640 return InnerArrayReverse(array, len);
adamk 2015/07/16 22:08:13 how about "GenericArrayReverse" as the name for th
Dan Ehrenberg 2015/07/16 22:16:49 Done.
626 } 641 }
627
628 return InnerArrayReverse(array, len);
629 } 642 }
630 643
631 644
632 function ObservedArrayShift(len) { 645 function ObservedArrayShift(len) {
633 var first = this[0]; 646 var first = this[0];
634 647
635 try { 648 try {
636 $observeBeginPerformSplice(this); 649 $observeBeginPerformSplice(this);
637 SimpleMove(this, 0, 1, len, 0); 650 SimpleMove(this, 0, 1, len, 0);
638 this.length = len - 1; 651 this.length = len - 1;
(...skipping 1042 matching lines...) Expand 10 before | Expand all | Expand 10 after
1681 to.ArrayToString = ArrayToString; 1694 to.ArrayToString = ArrayToString;
1682 to.InnerArrayEvery = InnerArrayEvery; 1695 to.InnerArrayEvery = InnerArrayEvery;
1683 to.InnerArrayFilter = InnerArrayFilter; 1696 to.InnerArrayFilter = InnerArrayFilter;
1684 to.InnerArrayForEach = InnerArrayForEach; 1697 to.InnerArrayForEach = InnerArrayForEach;
1685 to.InnerArrayIndexOf = InnerArrayIndexOf; 1698 to.InnerArrayIndexOf = InnerArrayIndexOf;
1686 to.InnerArrayJoin = InnerArrayJoin; 1699 to.InnerArrayJoin = InnerArrayJoin;
1687 to.InnerArrayLastIndexOf = InnerArrayLastIndexOf; 1700 to.InnerArrayLastIndexOf = InnerArrayLastIndexOf;
1688 to.InnerArrayMap = InnerArrayMap; 1701 to.InnerArrayMap = InnerArrayMap;
1689 to.InnerArrayReduce = InnerArrayReduce; 1702 to.InnerArrayReduce = InnerArrayReduce;
1690 to.InnerArrayReduceRight = InnerArrayReduceRight; 1703 to.InnerArrayReduceRight = InnerArrayReduceRight;
1691 to.InnerArrayReverse = InnerArrayReverse;
1692 to.InnerArraySome = InnerArraySome; 1704 to.InnerArraySome = InnerArraySome;
1693 to.InnerArraySort = InnerArraySort; 1705 to.InnerArraySort = InnerArraySort;
1694 to.InnerArrayToLocaleString = InnerArrayToLocaleString; 1706 to.InnerArrayToLocaleString = InnerArrayToLocaleString;
1707 to.PackedArrayReverse = PackedArrayReverse;
1695 }); 1708 });
1696 1709
1697 $arrayConcat = ArrayConcatJS; 1710 $arrayConcat = ArrayConcatJS;
1698 $arrayPush = ArrayPush; 1711 $arrayPush = ArrayPush;
1699 $arrayPop = ArrayPop; 1712 $arrayPop = ArrayPop;
1700 $arrayShift = ArrayShift; 1713 $arrayShift = ArrayShift;
1701 $arraySlice = ArraySlice; 1714 $arraySlice = ArraySlice;
1702 $arraySplice = ArraySplice; 1715 $arraySplice = ArraySplice;
1703 $arrayUnshift = ArrayUnshift; 1716 $arrayUnshift = ArrayUnshift;
1704 1717
1705 }); 1718 });
OLDNEW
« no previous file with comments | « no previous file | src/harmony-typedarray.js » ('j') | test/mjsunit/es6/array-reverse-order.js » ('J')

Powered by Google App Engine
This is Rietveld 408576698