 Chromium Code Reviews
 Chromium Code Reviews Issue 11369151:
  Minimal implementation and tests of observable array methods  (Closed) 
  Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge
    
  
    Issue 11369151:
  Minimal implementation and tests of observable array methods  (Closed) 
  Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge| OLD | NEW | 
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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(); | 
| OLD | NEW |