| 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 (function(global, utils) { | 5 (function(global, utils) { |
| 6 | 6 |
| 7 %CheckIsBootstrapping(); | 7 %CheckIsBootstrapping(); |
| 8 | 8 |
| 9 // ---------------------------------------------------------------------------- | 9 // ---------------------------------------------------------------------------- |
| 10 // Imports | 10 // Imports |
| 11 | 11 |
| 12 var GlobalArray = global.Array; | 12 var GlobalArray = global.Array; |
| 13 var GlobalNumber = global.Number; | 13 var GlobalNumber = global.Number; |
| 14 var GlobalObject = global.Object; | 14 var GlobalObject = global.Object; |
| 15 var InternalArray = utils.InternalArray; | 15 var InternalArray = utils.InternalArray; |
| 16 var iteratorSymbol = utils.ImportNow("iterator_symbol"); | 16 var iteratorSymbol = utils.ImportNow("iterator_symbol"); |
| 17 var MakeRangeError; | 17 var MakeRangeError; |
| 18 var MakeSyntaxError; | 18 var MakeSyntaxError; |
| 19 var MakeTypeError; | 19 var MakeTypeError; |
| 20 var MathAbs; | 20 var MathAbs; |
| 21 var NaN = %GetRootNaN(); | 21 var NaN = %GetRootNaN(); |
| 22 var ObjectToString = utils.ImportNow("object_to_string"); | 22 var ObjectToString = utils.ImportNow("object_to_string"); |
| 23 var ObserveBeginPerformSplice; | |
| 24 var ObserveEndPerformSplice; | |
| 25 var ObserveEnqueueSpliceRecord; | |
| 26 var toStringTagSymbol = utils.ImportNow("to_string_tag_symbol"); | 23 var toStringTagSymbol = utils.ImportNow("to_string_tag_symbol"); |
| 27 | 24 |
| 28 utils.Import(function(from) { | 25 utils.Import(function(from) { |
| 29 MakeRangeError = from.MakeRangeError; | 26 MakeRangeError = from.MakeRangeError; |
| 30 MakeSyntaxError = from.MakeSyntaxError; | 27 MakeSyntaxError = from.MakeSyntaxError; |
| 31 MakeTypeError = from.MakeTypeError; | 28 MakeTypeError = from.MakeTypeError; |
| 32 MathAbs = from.MathAbs; | 29 MathAbs = from.MathAbs; |
| 33 ObserveBeginPerformSplice = from.ObserveBeginPerformSplice; | |
| 34 ObserveEndPerformSplice = from.ObserveEndPerformSplice; | |
| 35 ObserveEnqueueSpliceRecord = from.ObserveEnqueueSpliceRecord; | |
| 36 }); | 30 }); |
| 37 | 31 |
| 38 // ---------------------------------------------------------------------------- | 32 // ---------------------------------------------------------------------------- |
| 39 | 33 |
| 40 | 34 |
| 41 // ES6 18.2.3 isNaN(number) | 35 // ES6 18.2.3 isNaN(number) |
| 42 function GlobalIsNaN(number) { | 36 function GlobalIsNaN(number) { |
| 43 number = TO_NUMBER(number); | 37 number = TO_NUMBER(number); |
| 44 return NUMBER_IS_NAN(number); | 38 return NUMBER_IS_NAN(number); |
| 45 } | 39 } |
| (...skipping 635 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 681 } | 675 } |
| 682 return true; | 676 return true; |
| 683 } | 677 } |
| 684 | 678 |
| 685 | 679 |
| 686 // ES5 section 15.4.5.1. | 680 // ES5 section 15.4.5.1. |
| 687 function DefineArrayProperty(obj, p, desc, should_throw) { | 681 function DefineArrayProperty(obj, p, desc, should_throw) { |
| 688 // Step 3 - Special handling for array index. | 682 // Step 3 - Special handling for array index. |
| 689 if (!IS_SYMBOL(p)) { | 683 if (!IS_SYMBOL(p)) { |
| 690 var index = TO_UINT32(p); | 684 var index = TO_UINT32(p); |
| 691 var emit_splice = false; | |
| 692 if (TO_STRING(index) == p && index != 4294967295) { | 685 if (TO_STRING(index) == p && index != 4294967295) { |
| 693 var length = obj.length; | 686 var length = obj.length; |
| 694 if (index >= length && %IsObserved(obj)) { | |
| 695 emit_splice = true; | |
| 696 ObserveBeginPerformSplice(obj); | |
| 697 } | |
| 698 | |
| 699 var length_desc = GetOwnPropertyJS(obj, "length"); | 687 var length_desc = GetOwnPropertyJS(obj, "length"); |
| 700 if ((index >= length && !length_desc.isWritable()) || | 688 if ((index >= length && !length_desc.isWritable()) || |
| 701 !DefineObjectProperty(obj, p, desc, true)) { | 689 !DefineObjectProperty(obj, p, desc, true)) { |
| 702 if (emit_splice) | |
| 703 ObserveEndPerformSplice(obj); | |
| 704 if (should_throw) { | 690 if (should_throw) { |
| 705 throw MakeTypeError(kDefineDisallowed, p); | 691 throw MakeTypeError(kDefineDisallowed, p); |
| 706 } else { | 692 } else { |
| 707 return false; | 693 return false; |
| 708 } | 694 } |
| 709 } | 695 } |
| 710 if (index >= length) { | 696 if (index >= length) { |
| 711 obj.length = index + 1; | 697 obj.length = index + 1; |
| 712 } | 698 } |
| 713 if (emit_splice) { | |
| 714 ObserveEndPerformSplice(obj); | |
| 715 ObserveEnqueueSpliceRecord(obj, length, [], index + 1 - length); | |
| 716 } | |
| 717 return true; | 699 return true; |
| 718 } | 700 } |
| 719 } | 701 } |
| 720 | 702 |
| 721 // Step 5 - Fallback to default implementation. | 703 // Step 5 - Fallback to default implementation. |
| 722 return DefineObjectProperty(obj, p, desc, should_throw); | 704 return DefineObjectProperty(obj, p, desc, should_throw); |
| 723 } | 705 } |
| 724 | 706 |
| 725 | 707 |
| 726 // ES5 section 8.12.9, ES5 section 15.4.5.1 and Harmony proxies. | 708 // ES5 section 8.12.9, ES5 section 15.4.5.1 and Harmony proxies. |
| (...skipping 30 matching lines...) Expand all Loading... |
| 757 } | 739 } |
| 758 | 740 |
| 759 return obj; | 741 return obj; |
| 760 } | 742 } |
| 761 | 743 |
| 762 | 744 |
| 763 // ES5 section 15.2.3.6. | 745 // ES5 section 15.2.3.6. |
| 764 function ObjectDefineProperty(obj, p, attributes) { | 746 function ObjectDefineProperty(obj, p, attributes) { |
| 765 // The new pure-C++ implementation doesn't support O.o. | 747 // The new pure-C++ implementation doesn't support O.o. |
| 766 // TODO(jkummerow): Implement missing features and remove fallback path. | 748 // TODO(jkummerow): Implement missing features and remove fallback path. |
| 767 if (%IsObserved(obj)) { | |
| 768 if (!IS_RECEIVER(obj)) { | |
| 769 throw MakeTypeError(kCalledOnNonObject, "Object.defineProperty"); | |
| 770 } | |
| 771 var name = TO_NAME(p); | |
| 772 var desc = ToPropertyDescriptor(attributes); | |
| 773 DefineOwnProperty(obj, name, desc, true); | |
| 774 return obj; | |
| 775 } | |
| 776 return %ObjectDefineProperty(obj, p, attributes); | 749 return %ObjectDefineProperty(obj, p, attributes); |
| 777 } | 750 } |
| 778 | 751 |
| 779 | 752 |
| 780 // ES5 section 15.2.3.7. | 753 // ES5 section 15.2.3.7. |
| 781 function ObjectDefineProperties(obj, properties) { | 754 function ObjectDefineProperties(obj, properties) { |
| 782 // The new pure-C++ implementation doesn't support O.o. | 755 // The new pure-C++ implementation doesn't support O.o. |
| 783 // TODO(jkummerow): Implement missing features and remove fallback path. | 756 // TODO(jkummerow): Implement missing features and remove fallback path. |
| 784 if (%IsObserved(obj)) { | |
| 785 if (!IS_RECEIVER(obj)) { | |
| 786 throw MakeTypeError(kCalledOnNonObject, "Object.defineProperties"); | |
| 787 } | |
| 788 var props = TO_OBJECT(properties); | |
| 789 var names = %GetOwnPropertyKeys(props, PROPERTY_FILTER_ONLY_ENUMERABLE); | |
| 790 var descriptors = new InternalArray(); | |
| 791 for (var i = 0; i < names.length; i++) { | |
| 792 descriptors.push(ToPropertyDescriptor(props[names[i]])); | |
| 793 } | |
| 794 for (var i = 0; i < names.length; i++) { | |
| 795 DefineOwnProperty(obj, names[i], descriptors[i], true); | |
| 796 } | |
| 797 return obj; | |
| 798 } | |
| 799 return %ObjectDefineProperties(obj, properties); | 757 return %ObjectDefineProperties(obj, properties); |
| 800 } | 758 } |
| 801 | 759 |
| 802 | 760 |
| 803 // ES6 B.2.2.1.1 | 761 // ES6 B.2.2.1.1 |
| 804 function ObjectGetProto() { | 762 function ObjectGetProto() { |
| 805 return %_GetPrototype(TO_OBJECT(this)); | 763 return %_GetPrototype(TO_OBJECT(this)); |
| 806 } | 764 } |
| 807 | 765 |
| 808 | 766 |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 853 // Set up non-enumerable functions in the Object object. | 811 // Set up non-enumerable functions in the Object object. |
| 854 utils.InstallFunctions(GlobalObject, DONT_ENUM, [ | 812 utils.InstallFunctions(GlobalObject, DONT_ENUM, [ |
| 855 // assign is added in bootstrapper.cc. | 813 // assign is added in bootstrapper.cc. |
| 856 // keys is added in bootstrapper.cc. | 814 // keys is added in bootstrapper.cc. |
| 857 "defineProperty", ObjectDefineProperty, | 815 "defineProperty", ObjectDefineProperty, |
| 858 "defineProperties", ObjectDefineProperties, | 816 "defineProperties", ObjectDefineProperties, |
| 859 "getPrototypeOf", ObjectGetPrototypeOf, | 817 "getPrototypeOf", ObjectGetPrototypeOf, |
| 860 "setPrototypeOf", ObjectSetPrototypeOf, | 818 "setPrototypeOf", ObjectSetPrototypeOf, |
| 861 // getOwnPropertySymbols is added in symbol.js. | 819 // getOwnPropertySymbols is added in symbol.js. |
| 862 // is is added in bootstrapper.cc. | 820 // is is added in bootstrapper.cc. |
| 863 // deliverChangeRecords, getNotifier, observe and unobserve are added | |
| 864 // in object-observe.js. | |
| 865 ]); | 821 ]); |
| 866 | 822 |
| 867 | 823 |
| 868 | 824 |
| 869 // ---------------------------------------------------------------------------- | 825 // ---------------------------------------------------------------------------- |
| 870 // Number | 826 // Number |
| 871 | 827 |
| 872 // ES6 Number.prototype.toString([ radix ]) | 828 // ES6 Number.prototype.toString([ radix ]) |
| 873 function NumberToStringJS(radix) { | 829 function NumberToStringJS(radix) { |
| 874 // NOTE: Both Number objects and values can enter here as | 830 // NOTE: Both Number objects and values can enter here as |
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1099 to.ObjectDefineProperties = ObjectDefineProperties; | 1055 to.ObjectDefineProperties = ObjectDefineProperties; |
| 1100 to.ObjectDefineProperty = ObjectDefineProperty; | 1056 to.ObjectDefineProperty = ObjectDefineProperty; |
| 1101 to.ObjectHasOwnProperty = GlobalObject.prototype.hasOwnProperty; | 1057 to.ObjectHasOwnProperty = GlobalObject.prototype.hasOwnProperty; |
| 1102 }); | 1058 }); |
| 1103 | 1059 |
| 1104 %InstallToContext([ | 1060 %InstallToContext([ |
| 1105 "object_value_of", ObjectValueOf, | 1061 "object_value_of", ObjectValueOf, |
| 1106 ]); | 1062 ]); |
| 1107 | 1063 |
| 1108 }) | 1064 }) |
| OLD | NEW |