OLD | NEW |
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 // This file relies on the fact that the following declarations have been made | 5 // This file relies on the fact that the following declarations have been made |
6 // in runtime.js: | 6 // in runtime.js: |
7 // var $Object = global.Object; | 7 // var $Object = global.Object; |
8 // var $Boolean = global.Boolean; | 8 // var $Boolean = global.Boolean; |
9 // var $Number = global.Number; | 9 // var $Number = global.Number; |
10 // var $Function = global.Function; | 10 // var $Function = global.Function; |
(...skipping 553 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
564 }, | 564 }, |
565 "hasSetter", function() { | 565 "hasSetter", function() { |
566 return this.hasSetter_; | 566 return this.hasSetter_; |
567 })); | 567 })); |
568 | 568 |
569 | 569 |
570 // Converts an array returned from Runtime_GetOwnProperty to an actual | 570 // Converts an array returned from Runtime_GetOwnProperty to an actual |
571 // property descriptor. For a description of the array layout please | 571 // property descriptor. For a description of the array layout please |
572 // see the runtime.cc file. | 572 // see the runtime.cc file. |
573 function ConvertDescriptorArrayToDescriptor(desc_array) { | 573 function ConvertDescriptorArrayToDescriptor(desc_array) { |
574 if (desc_array === false) { | |
575 throw 'Internal error: invalid desc_array'; | |
576 } | |
577 | |
578 if (IS_UNDEFINED(desc_array)) { | 574 if (IS_UNDEFINED(desc_array)) { |
579 return UNDEFINED; | 575 return UNDEFINED; |
580 } | 576 } |
581 | 577 |
582 var desc = new PropertyDescriptor(); | 578 var desc = new PropertyDescriptor(); |
583 // This is an accessor. | 579 // This is an accessor. |
584 if (desc_array[IS_ACCESSOR_INDEX]) { | 580 if (desc_array[IS_ACCESSOR_INDEX]) { |
585 desc.setGet(desc_array[GETTER_INDEX]); | 581 desc.setGet(desc_array[GETTER_INDEX]); |
586 desc.setSet(desc_array[SETTER_INDEX]); | 582 desc.setSet(desc_array[SETTER_INDEX]); |
587 } else { | 583 } else { |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
642 [handler, "getOwnPropertyDescriptor", p, descriptor]); | 638 [handler, "getOwnPropertyDescriptor", p, descriptor]); |
643 } | 639 } |
644 return desc; | 640 return desc; |
645 } | 641 } |
646 | 642 |
647 // GetOwnProperty returns an array indexed by the constants | 643 // GetOwnProperty returns an array indexed by the constants |
648 // defined in macros.py. | 644 // defined in macros.py. |
649 // If p is not a property on obj undefined is returned. | 645 // If p is not a property on obj undefined is returned. |
650 var props = %GetOwnProperty(ToObject(obj), p); | 646 var props = %GetOwnProperty(ToObject(obj), p); |
651 | 647 |
652 // A false value here means that access checks failed. | |
653 if (props === false) return UNDEFINED; | |
654 | |
655 return ConvertDescriptorArrayToDescriptor(props); | 648 return ConvertDescriptorArrayToDescriptor(props); |
656 } | 649 } |
657 | 650 |
658 | 651 |
659 // ES5 section 8.12.7. | 652 // ES5 section 8.12.7. |
660 function Delete(obj, p, should_throw) { | 653 function Delete(obj, p, should_throw) { |
661 var desc = GetOwnPropertyJS(obj, p); | 654 var desc = GetOwnPropertyJS(obj, p); |
662 if (IS_UNDEFINED(desc)) return true; | 655 if (IS_UNDEFINED(desc)) return true; |
663 if (desc.isConfigurable()) { | 656 if (desc.isConfigurable()) { |
664 %DeleteProperty(obj, p, 0); | 657 %DeleteProperty(obj, p, 0); |
(...skipping 20 matching lines...) Expand all Loading... |
685 } else { | 678 } else { |
686 return false; | 679 return false; |
687 } | 680 } |
688 } | 681 } |
689 return true; | 682 return true; |
690 } | 683 } |
691 | 684 |
692 | 685 |
693 // ES5 8.12.9. | 686 // ES5 8.12.9. |
694 function DefineObjectProperty(obj, p, desc, should_throw) { | 687 function DefineObjectProperty(obj, p, desc, should_throw) { |
695 var current_or_access = %GetOwnProperty(ToObject(obj), ToName(p)); | 688 var current_array = %GetOwnProperty(ToObject(obj), ToName(p)); |
696 // A false value here means that access checks failed. | 689 var current = ConvertDescriptorArrayToDescriptor(current_array); |
697 if (current_or_access === false) return UNDEFINED; | |
698 | |
699 var current = ConvertDescriptorArrayToDescriptor(current_or_access); | |
700 var extensible = %IsExtensible(ToObject(obj)); | 690 var extensible = %IsExtensible(ToObject(obj)); |
701 | 691 |
702 // Error handling according to spec. | 692 // Error handling according to spec. |
703 // Step 3 | 693 // Step 3 |
704 if (IS_UNDEFINED(current) && !extensible) { | 694 if (IS_UNDEFINED(current) && !extensible) { |
705 if (should_throw) { | 695 if (should_throw) { |
706 throw MakeTypeError("define_disallowed", [p]); | 696 throw MakeTypeError("define_disallowed", [p]); |
707 } else { | 697 } else { |
708 return false; | 698 return false; |
709 } | 699 } |
(...skipping 1201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1911 } | 1901 } |
1912 if (!IS_SPEC_FUNCTION(method)) { | 1902 if (!IS_SPEC_FUNCTION(method)) { |
1913 throw MakeTypeError('not_iterable', [obj]); | 1903 throw MakeTypeError('not_iterable', [obj]); |
1914 } | 1904 } |
1915 var iterator = %_CallFunction(obj, method); | 1905 var iterator = %_CallFunction(obj, method); |
1916 if (!IS_SPEC_OBJECT(iterator)) { | 1906 if (!IS_SPEC_OBJECT(iterator)) { |
1917 throw MakeTypeError('not_an_iterator', [iterator]); | 1907 throw MakeTypeError('not_an_iterator', [iterator]); |
1918 } | 1908 } |
1919 return iterator; | 1909 return iterator; |
1920 } | 1910 } |
OLD | NEW |