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

Side by Side Diff: src/array.js

Issue 303223004: Use InternalArray during ObservedArraySplice to avoid page script interfering with self-hosted code (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 6 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | 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 "use strict"; 5 "use strict";
6 6
7 // This file relies on the fact that the following declarations have been made 7 // This file relies on the fact that the following declarations have been made
8 // in runtime.js: 8 // in runtime.js:
9 // var $Array = global.Array; 9 // var $Array = global.Array;
10 10
(...skipping 706 matching lines...) Expand 10 before | Expand all | Expand 10 after
717 return del_count; 717 return del_count;
718 } 718 }
719 719
720 720
721 function ObservedArraySplice(start, delete_count) { 721 function ObservedArraySplice(start, delete_count) {
722 var num_arguments = %_ArgumentsLength(); 722 var num_arguments = %_ArgumentsLength();
723 var len = TO_UINT32(this.length); 723 var len = TO_UINT32(this.length);
724 var start_i = ComputeSpliceStartIndex(TO_INTEGER(start), len); 724 var start_i = ComputeSpliceStartIndex(TO_INTEGER(start), len);
725 var del_count = ComputeSpliceDeleteCount(delete_count, num_arguments, len, 725 var del_count = ComputeSpliceDeleteCount(delete_count, num_arguments, len,
726 start_i); 726 start_i);
727 var deleted_elements = []; 727 var deleted_elements = new InternalArray(del_count);
728 deleted_elements.length = del_count;
729 var num_elements_to_add = num_arguments > 2 ? num_arguments - 2 : 0; 728 var num_elements_to_add = num_arguments > 2 ? num_arguments - 2 : 0;
730 729
731 try { 730 try {
732 BeginPerformSplice(this); 731 BeginPerformSplice(this);
733 732
734 SimpleSlice(this, start_i, del_count, len, deleted_elements); 733 SimpleSlice(this, start_i, del_count, len, deleted_elements);
735 SimpleMove(this, start_i, del_count, len, num_elements_to_add); 734 SimpleMove(this, start_i, del_count, len, num_elements_to_add);
736 735
737 // Insert the arguments into the resulting array in 736 // Insert the arguments into the resulting array in
738 // place of the deleted elements. 737 // place of the deleted elements.
739 var i = start_i; 738 var i = start_i;
740 var arguments_index = 2; 739 var arguments_index = 2;
741 var arguments_length = %_ArgumentsLength(); 740 var arguments_length = %_ArgumentsLength();
742 while (arguments_index < arguments_length) { 741 while (arguments_index < arguments_length) {
743 this[i++] = %_Arguments(arguments_index++); 742 this[i++] = %_Arguments(arguments_index++);
744 } 743 }
745 this.length = len - del_count + num_elements_to_add; 744 this.length = len - del_count + num_elements_to_add;
746 745
747 } finally { 746 } finally {
748 EndPerformSplice(this); 747 EndPerformSplice(this);
749 if (deleted_elements.length || num_elements_to_add) { 748 if (deleted_elements.length || num_elements_to_add) {
750 EnqueueSpliceRecord(this, 749 var deleted_array = [];
751 start_i, 750 %MoveArrayContents(deleted_elements, deleted_array);
752 deleted_elements.slice(), 751 EnqueueSpliceRecord(this, start_i, deleted_array, num_elements_to_add);
753 num_elements_to_add);
754 } 752 }
755 } 753 }
756 754
757 // Return the deleted elements. 755 // Return the deleted elements.
758 return deleted_elements; 756 return deleted_elements;
759 } 757 }
760 758
761 759
762 function ArraySplice(start, delete_count) { 760 function ArraySplice(start, delete_count) {
763 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.splice"); 761 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.splice");
764 762
765 if (%IsObserved(this)) 763 if (%IsObserved(this))
766 return ObservedArraySplice.apply(this, arguments); 764 return ObservedArraySplice.apply(this, arguments);
767 765
768 var num_arguments = %_ArgumentsLength(); 766 var num_arguments = %_ArgumentsLength();
769 var array = TO_OBJECT_INLINE(this); 767 var array = TO_OBJECT_INLINE(this);
770 var len = TO_UINT32(array.length); 768 var len = TO_UINT32(array.length);
771 var start_i = ComputeSpliceStartIndex(TO_INTEGER(start), len); 769 var start_i = ComputeSpliceStartIndex(TO_INTEGER(start), len);
772 var del_count = ComputeSpliceDeleteCount(delete_count, num_arguments, len, 770 var del_count = ComputeSpliceDeleteCount(delete_count, num_arguments, len,
773 start_i); 771 start_i);
774 var deleted_elements = []; 772 var deleted_elements = [];
Toon Verwaest 2014/06/02 09:31:15 Now that you are fixing this above, can you also f
rafaelw 2014/06/02 20:32:56 So I tried doing this, but array-natives-elements.
775 deleted_elements.length = del_count; 773 deleted_elements.length = del_count;
776 var num_elements_to_add = num_arguments > 2 ? num_arguments - 2 : 0; 774 var num_elements_to_add = num_arguments > 2 ? num_arguments - 2 : 0;
777 775
778 if (del_count != num_elements_to_add && ObjectIsSealed(array)) { 776 if (del_count != num_elements_to_add && ObjectIsSealed(array)) {
779 throw MakeTypeError("array_functions_change_sealed", 777 throw MakeTypeError("array_functions_change_sealed",
780 ["Array.prototype.splice"]); 778 ["Array.prototype.splice"]);
781 } else if (del_count > 0 && ObjectIsFrozen(array)) { 779 } else if (del_count > 0 && ObjectIsFrozen(array)) {
782 throw MakeTypeError("array_functions_on_frozen", 780 throw MakeTypeError("array_functions_on_frozen",
783 ["Array.prototype.splice"]); 781 ["Array.prototype.splice"]);
784 } 782 }
(...skipping 740 matching lines...) Expand 10 before | Expand all | Expand 10 after
1525 )); 1523 ));
1526 1524
1527 SetUpLockedPrototype(InternalPackedArray, $Array(), $Array( 1525 SetUpLockedPrototype(InternalPackedArray, $Array(), $Array(
1528 "join", getFunction("join", ArrayJoin), 1526 "join", getFunction("join", ArrayJoin),
1529 "pop", getFunction("pop", ArrayPop), 1527 "pop", getFunction("pop", ArrayPop),
1530 "push", getFunction("push", ArrayPush) 1528 "push", getFunction("push", ArrayPush)
1531 )); 1529 ));
1532 } 1530 }
1533 1531
1534 SetUpArray(); 1532 SetUpArray();
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698