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

Side by Side Diff: src/array.js

Issue 279773002: Fix Array.prototype.push and Array.prototype.unshift for read-only length. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Rename ChangeOfReadOnlyLength and fix getting length from array. Created 6 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | src/builtins.cc » ('j') | src/builtins.cc » ('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 "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 585 matching lines...) Expand 10 before | Expand all | Expand 10 after
596 596
597 return first; 597 return first;
598 } 598 }
599 599
600 function ObservedArrayUnshift() { 600 function ObservedArrayUnshift() {
601 var len = TO_UINT32(this.length); 601 var len = TO_UINT32(this.length);
602 var num_arguments = %_ArgumentsLength(); 602 var num_arguments = %_ArgumentsLength();
603 603
604 try { 604 try {
605 BeginPerformSplice(this); 605 BeginPerformSplice(this);
606 SimpleMove(this, 0, 0, len, num_arguments); 606 if (len > 0) {
607 SimpleMove(this, 0, 0, len, num_arguments);
608 }
607 for (var i = 0; i < num_arguments; i++) { 609 for (var i = 0; i < num_arguments; i++) {
608 this[i] = %_Arguments(i); 610 this[i] = %_Arguments(i);
609 } 611 }
610 var new_length = len + num_arguments; 612 var new_length = len + num_arguments;
611 this.length = new_length; 613 this.length = new_length;
612 } finally { 614 } finally {
613 EndPerformSplice(this); 615 EndPerformSplice(this);
614 EnqueueSpliceRecord(this, 0, [], num_arguments); 616 EnqueueSpliceRecord(this, 0, [], num_arguments);
615 } 617 }
616 618
617 return new_length; 619 return new_length;
618 } 620 }
619 621
620 function ArrayUnshift(arg1) { // length == 1 622 function ArrayUnshift(arg1) { // length == 1
621 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.unshift"); 623 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.unshift");
622 624
623 if (%IsObserved(this)) 625 if (%IsObserved(this))
624 return ObservedArrayUnshift.apply(this, arguments); 626 return ObservedArrayUnshift.apply(this, arguments);
625 627
626 var array = TO_OBJECT_INLINE(this); 628 var array = TO_OBJECT_INLINE(this);
627 var len = TO_UINT32(array.length); 629 var len = TO_UINT32(array.length);
628 var num_arguments = %_ArgumentsLength(); 630 var num_arguments = %_ArgumentsLength();
629 var is_sealed = ObjectIsSealed(array); 631 var is_sealed = ObjectIsSealed(array);
630 632
631 if (IS_ARRAY(array) && !is_sealed) { 633 if (len > 0) {
632 SmartMove(array, 0, 0, len, num_arguments); 634 if (IS_ARRAY(array) && !is_sealed) {
633 } else { 635 SmartMove(array, 0, 0, len, num_arguments);
634 SimpleMove(array, 0, 0, len, num_arguments); 636 } else {
637 SimpleMove(array, 0, 0, len, num_arguments);
638 }
635 } 639 }
636 640
637 for (var i = 0; i < num_arguments; i++) { 641 for (var i = 0; i < num_arguments; i++) {
638 array[i] = %_Arguments(i); 642 array[i] = %_Arguments(i);
639 } 643 }
640 644
641 var new_length = len + num_arguments; 645 var new_length = len + num_arguments;
642 array.length = new_length; 646 array.length = new_length;
643 return new_length; 647 return new_length;
644 } 648 }
(...skipping 880 matching lines...) Expand 10 before | Expand all | Expand 10 after
1525 )); 1529 ));
1526 1530
1527 SetUpLockedPrototype(InternalPackedArray, $Array(), $Array( 1531 SetUpLockedPrototype(InternalPackedArray, $Array(), $Array(
1528 "join", getFunction("join", ArrayJoin), 1532 "join", getFunction("join", ArrayJoin),
1529 "pop", getFunction("pop", ArrayPop), 1533 "pop", getFunction("pop", ArrayPop),
1530 "push", getFunction("push", ArrayPush) 1534 "push", getFunction("push", ArrayPush)
1531 )); 1535 ));
1532 } 1536 }
1533 1537
1534 SetUpArray(); 1538 SetUpArray();
OLDNEW
« no previous file with comments | « no previous file | src/builtins.cc » ('j') | src/builtins.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698