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

Side by Side Diff: src/array.js

Issue 11369151: Minimal implementation and tests of observable array methods (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 years, 1 month 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') | 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 // 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 423 matching lines...) Expand 10 before | Expand all | Expand 10 after
434 ["Array.prototype.pop"]); 434 ["Array.prototype.pop"]);
435 } 435 }
436 436
437 var n = TO_UINT32(this.length); 437 var n = TO_UINT32(this.length);
438 if (n == 0) { 438 if (n == 0) {
439 this.length = n; 439 this.length = n;
440 return; 440 return;
441 } 441 }
442 n--; 442 n--;
443 var value = this[n]; 443 var value = this[n];
444 delete this[n];
adamk 2012/11/09 12:06:30 This change is required for proper operation, and
444 this.length = n; 445 this.length = n;
445 delete this[n];
446 return value; 446 return value;
447 } 447 }
448 448
449 449
450 // Appends the arguments to the end of the array and returns the new 450 // Appends the arguments to the end of the array and returns the new
451 // length of the array. See ECMA-262, section 15.4.4.7. 451 // length of the array. See ECMA-262, section 15.4.4.7.
452 function ArrayPush() { 452 function ArrayPush() {
453 if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) { 453 if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) {
454 throw MakeTypeError("called_on_null_or_undefined", 454 throw MakeTypeError("called_on_null_or_undefined",
455 ["Array.prototype.push"]); 455 ["Array.prototype.push"]);
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
574 574
575 var len = TO_UINT32(this.length); 575 var len = TO_UINT32(this.length);
576 576
577 if (len === 0) { 577 if (len === 0) {
578 this.length = 0; 578 this.length = 0;
579 return; 579 return;
580 } 580 }
581 581
582 var first = this[0]; 582 var first = this[0];
583 583
584 if (IS_ARRAY(this)) { 584 if (IS_ARRAY(this) && !%IsObserved(this)) {
585 SmartMove(this, 0, 1, len, 0); 585 SmartMove(this, 0, 1, len, 0);
586 } else { 586 } else {
587 SimpleMove(this, 0, 1, len, 0); 587 SimpleMove(this, 0, 1, len, 0);
588 } 588 }
589 589
590 this.length = len - 1; 590 this.length = len - 1;
591 591
592 return first; 592 return first;
593 } 593 }
594 594
595 595
596 function ArrayUnshift(arg1) { // length == 1 596 function ArrayUnshift(arg1) { // length == 1
597 if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) { 597 if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) {
598 throw MakeTypeError("called_on_null_or_undefined", 598 throw MakeTypeError("called_on_null_or_undefined",
599 ["Array.prototype.unshift"]); 599 ["Array.prototype.unshift"]);
600 } 600 }
601 601
602 var len = TO_UINT32(this.length); 602 var len = TO_UINT32(this.length);
603 var num_arguments = %_ArgumentsLength(); 603 var num_arguments = %_ArgumentsLength();
604 604
605 if (IS_ARRAY(this)) { 605 if (IS_ARRAY(this) && !%IsObserved(this)) {
606 SmartMove(this, 0, 0, len, num_arguments); 606 SmartMove(this, 0, 0, len, num_arguments);
607 } else { 607 } else {
608 SimpleMove(this, 0, 0, len, num_arguments); 608 SimpleMove(this, 0, 0, len, num_arguments);
609 } 609 }
610 610
611 for (var i = 0; i < num_arguments; i++) { 611 for (var i = 0; i < num_arguments; i++) {
612 this[i] = %_Arguments(i); 612 this[i] = %_Arguments(i);
613 } 613 }
614 614
615 this.length = len + num_arguments; 615 this.length = len + num_arguments;
(...skipping 26 matching lines...) Expand all
642 if (end_i < 0) end_i = 0; 642 if (end_i < 0) end_i = 0;
643 } else { 643 } else {
644 if (end_i > len) end_i = len; 644 if (end_i > len) end_i = len;
645 } 645 }
646 646
647 var result = []; 647 var result = [];
648 648
649 if (end_i < start_i) return result; 649 if (end_i < start_i) return result;
650 650
651 if (IS_ARRAY(this) && 651 if (IS_ARRAY(this) &&
652 !%IsObserved(this) &&
652 (end_i > 1000) && 653 (end_i > 1000) &&
653 (%EstimateNumberOfElements(this) < end_i)) { 654 (%EstimateNumberOfElements(this) < end_i)) {
654 SmartSlice(this, start_i, end_i - start_i, len, result); 655 SmartSlice(this, start_i, end_i - start_i, len, result);
655 } else { 656 } else {
656 SimpleSlice(this, start_i, end_i - start_i, len, result); 657 SimpleSlice(this, start_i, end_i - start_i, len, result);
657 } 658 }
658 659
659 result.length = end_i - start_i; 660 result.length = end_i - start_i;
660 661
661 return result; 662 return result;
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
698 deleted_elements.length = del_count; 699 deleted_elements.length = del_count;
699 700
700 // Number of elements to add. 701 // Number of elements to add.
701 var num_additional_args = 0; 702 var num_additional_args = 0;
702 if (num_arguments > 2) { 703 if (num_arguments > 2) {
703 num_additional_args = num_arguments - 2; 704 num_additional_args = num_arguments - 2;
704 } 705 }
705 706
706 var use_simple_splice = true; 707 var use_simple_splice = true;
707 708
708 if (IS_ARRAY(this) && num_additional_args !== del_count) { 709 if (IS_ARRAY(this) &&
710 !%IsObserved(this) &&
711 num_additional_args !== del_count) {
709 // If we are only deleting/moving a few things near the end of the 712 // If we are only deleting/moving a few things near the end of the
710 // array then the simple version is going to be faster, because it 713 // array then the simple version is going to be faster, because it
711 // doesn't touch most of the array. 714 // doesn't touch most of the array.
712 var estimated_non_hole_elements = %EstimateNumberOfElements(this); 715 var estimated_non_hole_elements = %EstimateNumberOfElements(this);
713 if (len > 20 && (estimated_non_hole_elements >> 2) < (len - start_i)) { 716 if (len > 20 && (estimated_non_hole_elements >> 2) < (len - start_i)) {
714 use_simple_splice = false; 717 use_simple_splice = false;
715 } 718 }
716 } 719 }
717 720
718 if (use_simple_splice) { 721 if (use_simple_splice) {
(...skipping 832 matching lines...) Expand 10 before | Expand all | Expand 10 after
1551 SetUpLockedPrototype(InternalArray, $Array(), $Array( 1554 SetUpLockedPrototype(InternalArray, $Array(), $Array(
1552 "indexOf", getFunction("indexOf", ArrayIndexOf), 1555 "indexOf", getFunction("indexOf", ArrayIndexOf),
1553 "join", getFunction("join", ArrayJoin), 1556 "join", getFunction("join", ArrayJoin),
1554 "pop", getFunction("pop", ArrayPop), 1557 "pop", getFunction("pop", ArrayPop),
1555 "push", getFunction("push", ArrayPush), 1558 "push", getFunction("push", ArrayPush),
1556 "splice", getFunction("splice", ArraySplice) 1559 "splice", getFunction("splice", ArraySplice)
1557 )); 1560 ));
1558 } 1561 }
1559 1562
1560 SetUpArray(); 1563 SetUpArray();
OLDNEW
« no previous file with comments | « no previous file | src/builtins.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698