| 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 |
| (...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 250 var receiver = this; | 250 var receiver = this; |
| 251 if (IS_NULL(receiver) || IS_UNDEFINED(receiver)) { | 251 if (IS_NULL(receiver) || IS_UNDEFINED(receiver)) { |
| 252 receiver = %GlobalProxy(ObjectLookupSetter); | 252 receiver = %GlobalProxy(ObjectLookupSetter); |
| 253 } | 253 } |
| 254 return %LookupAccessor(TO_OBJECT(receiver), TO_NAME(name), SETTER); | 254 return %LookupAccessor(TO_OBJECT(receiver), TO_NAME(name), SETTER); |
| 255 } | 255 } |
| 256 | 256 |
| 257 | 257 |
| 258 function ObjectKeys(obj) { | 258 function ObjectKeys(obj) { |
| 259 obj = TO_OBJECT(obj); | 259 obj = TO_OBJECT(obj); |
| 260 return %OwnKeys(obj); | 260 var filter = PROPERTY_FILTER_ONLY_ENUMERABLE | PROPERTY_FILTER_SKIP_SYMBOLS; |
| 261 return %GetOwnPropertyKeys(obj, filter); |
| 261 } | 262 } |
| 262 | 263 |
| 263 | 264 |
| 264 // ES5 8.10.1. | 265 // ES5 8.10.1. |
| 265 function IsAccessorDescriptor(desc) { | 266 function IsAccessorDescriptor(desc) { |
| 266 if (IS_UNDEFINED(desc)) return false; | 267 if (IS_UNDEFINED(desc)) return false; |
| 267 return desc.hasGetter() || desc.hasSetter(); | 268 return desc.hasGetter() || desc.hasSetter(); |
| 268 } | 269 } |
| 269 | 270 |
| 270 | 271 |
| (...skipping 577 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 848 return obj; | 849 return obj; |
| 849 } | 850 } |
| 850 | 851 |
| 851 | 852 |
| 852 // ES6 section 19.1.2.6 | 853 // ES6 section 19.1.2.6 |
| 853 function ObjectGetOwnPropertyDescriptor(obj, p) { | 854 function ObjectGetOwnPropertyDescriptor(obj, p) { |
| 854 return %GetOwnProperty(obj, p); | 855 return %GetOwnProperty(obj, p); |
| 855 } | 856 } |
| 856 | 857 |
| 857 | 858 |
| 858 // For Harmony proxies | |
| 859 function ToNameArray(obj, trap, includeSymbols) { | |
| 860 if (!IS_SPEC_OBJECT(obj)) { | |
| 861 throw MakeTypeError(kProxyNonObjectPropNames, trap, obj); | |
| 862 } | |
| 863 var n = TO_UINT32(obj.length); | |
| 864 var array = new GlobalArray(n); | |
| 865 var realLength = 0; | |
| 866 var names = { __proto__: null }; // TODO(rossberg): use sets once ready. | |
| 867 for (var index = 0; index < n; index++) { | |
| 868 var s = TO_NAME(obj[index]); | |
| 869 // TODO(rossberg): adjust once there is a story for symbols vs proxies. | |
| 870 if (IS_SYMBOL(s) && !includeSymbols) continue; | |
| 871 if (%HasOwnProperty(names, s)) { | |
| 872 throw MakeTypeError(kProxyRepeatedPropName, trap, s); | |
| 873 } | |
| 874 array[realLength] = s; | |
| 875 ++realLength; | |
| 876 names[s] = 0; | |
| 877 } | |
| 878 array.length = realLength; | |
| 879 return array; | |
| 880 } | |
| 881 | |
| 882 | |
| 883 function ObjectGetOwnPropertyKeys(obj, filter) { | |
| 884 var nameArrays = new InternalArray(); | |
| 885 filter |= PROPERTY_ATTRIBUTES_PRIVATE_SYMBOL; | |
| 886 var interceptorInfo = %GetInterceptorInfo(obj); | |
| 887 | |
| 888 // Find all the indexed properties. | |
| 889 | |
| 890 // Only get own element names if we want to include string keys. | |
| 891 if ((filter & PROPERTY_ATTRIBUTES_STRING) === 0) { | |
| 892 var ownElementNames = %GetOwnElementNames(obj); | |
| 893 for (var i = 0; i < ownElementNames.length; ++i) { | |
| 894 ownElementNames[i] = %_NumberToString(ownElementNames[i]); | |
| 895 } | |
| 896 nameArrays.push(ownElementNames); | |
| 897 // Get names for indexed interceptor properties. | |
| 898 if ((interceptorInfo & 1) != 0) { | |
| 899 var indexedInterceptorNames = %GetIndexedInterceptorElementNames(obj); | |
| 900 if (!IS_UNDEFINED(indexedInterceptorNames)) { | |
| 901 nameArrays.push(indexedInterceptorNames); | |
| 902 } | |
| 903 } | |
| 904 } | |
| 905 | |
| 906 // Find all the named properties. | |
| 907 | |
| 908 // Get own property names. | |
| 909 nameArrays.push(%GetOwnPropertyNames(obj, filter)); | |
| 910 | |
| 911 // Get names for named interceptor properties if any. | |
| 912 if ((interceptorInfo & 2) != 0) { | |
| 913 var namedInterceptorNames = | |
| 914 %GetNamedInterceptorPropertyNames(obj); | |
| 915 if (!IS_UNDEFINED(namedInterceptorNames)) { | |
| 916 nameArrays.push(namedInterceptorNames); | |
| 917 } | |
| 918 } | |
| 919 | |
| 920 var propertyNames = | |
| 921 %Apply(InternalArray.prototype.concat, | |
| 922 nameArrays[0], nameArrays, 1, nameArrays.length - 1); | |
| 923 | |
| 924 // Property names are expected to be unique strings, | |
| 925 // but interceptors can interfere with that assumption. | |
| 926 if (interceptorInfo != 0) { | |
| 927 var seenKeys = { __proto__: null }; | |
| 928 var j = 0; | |
| 929 for (var i = 0; i < propertyNames.length; ++i) { | |
| 930 var name = propertyNames[i]; | |
| 931 if (IS_SYMBOL(name)) { | |
| 932 if ((filter & PROPERTY_ATTRIBUTES_SYMBOLIC) || IS_PRIVATE(name)) { | |
| 933 continue; | |
| 934 } | |
| 935 } else { | |
| 936 if (filter & PROPERTY_ATTRIBUTES_STRING) continue; | |
| 937 name = TO_STRING(name); | |
| 938 } | |
| 939 if (seenKeys[name]) continue; | |
| 940 seenKeys[name] = true; | |
| 941 propertyNames[j++] = name; | |
| 942 } | |
| 943 propertyNames.length = j; | |
| 944 } | |
| 945 | |
| 946 return propertyNames; | |
| 947 } | |
| 948 | |
| 949 | |
| 950 // ES6 section 9.1.12 / 9.5.12 | 859 // ES6 section 9.1.12 / 9.5.12 |
| 951 function OwnPropertyKeys(obj) { | 860 function OwnPropertyKeys(obj) { |
| 952 if (%_IsJSProxy(obj)) { | 861 return %GetOwnPropertyKeys(obj, PROPERTY_FILTER_NONE); |
| 953 var handler = %GetHandler(obj); | |
| 954 // TODO(caitp): Proxy.[[OwnPropertyKeys]] can not be implemented to spec | |
| 955 // without an implementation of Direct Proxies. | |
| 956 var names = CallTrap0(handler, "ownKeys", UNDEFINED); | |
| 957 return ToNameArray(names, "getOwnPropertyNames", false); | |
| 958 } | |
| 959 return ObjectGetOwnPropertyKeys(obj, PROPERTY_ATTRIBUTES_PRIVATE_SYMBOL); | |
| 960 } | 862 } |
| 961 | 863 |
| 962 | 864 |
| 963 // ES5 section 15.2.3.4. | 865 // ES5 section 15.2.3.4. |
| 964 function ObjectGetOwnPropertyNames(obj) { | 866 function ObjectGetOwnPropertyNames(obj) { |
| 965 obj = TO_OBJECT(obj); | 867 obj = TO_OBJECT(obj); |
| 966 // Special handling for proxies. | 868 return %GetOwnPropertyKeys(obj, PROPERTY_FILTER_SKIP_SYMBOLS); |
| 967 if (%_IsJSProxy(obj)) { | |
| 968 var handler = %GetHandler(obj); | |
| 969 var names = CallTrap0(handler, "getOwnPropertyNames", UNDEFINED); | |
| 970 return ToNameArray(names, "getOwnPropertyNames", false); | |
| 971 } | |
| 972 | |
| 973 return ObjectGetOwnPropertyKeys(obj, PROPERTY_ATTRIBUTES_SYMBOLIC); | |
| 974 } | 869 } |
| 975 | 870 |
| 976 | 871 |
| 977 // ES5 section 15.2.3.5. | 872 // ES5 section 15.2.3.5. |
| 978 function ObjectCreate(proto, properties) { | 873 function ObjectCreate(proto, properties) { |
| 979 if (!IS_SPEC_OBJECT(proto) && proto !== null) { | 874 if (!IS_SPEC_OBJECT(proto) && proto !== null) { |
| 980 throw MakeTypeError(kProtoObjectOrNull, proto); | 875 throw MakeTypeError(kProtoObjectOrNull, proto); |
| 981 } | 876 } |
| 982 var obj = {}; | 877 var obj = {}; |
| 983 %InternalSetPrototype(obj, proto); | 878 %InternalSetPrototype(obj, proto); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 997 var name = TO_NAME(p); | 892 var name = TO_NAME(p); |
| 998 var desc = ToPropertyDescriptor(attributes); | 893 var desc = ToPropertyDescriptor(attributes); |
| 999 DefineOwnProperty(obj, name, desc, true); | 894 DefineOwnProperty(obj, name, desc, true); |
| 1000 return obj; | 895 return obj; |
| 1001 } | 896 } |
| 1002 return %ObjectDefineProperty(obj, p, attributes); | 897 return %ObjectDefineProperty(obj, p, attributes); |
| 1003 } | 898 } |
| 1004 | 899 |
| 1005 | 900 |
| 1006 function GetOwnEnumerablePropertyNames(object) { | 901 function GetOwnEnumerablePropertyNames(object) { |
| 1007 var names = new InternalArray(); | 902 return %GetOwnPropertyKeys(object, PROPERTY_FILTER_ONLY_ENUMERABLE); |
| 1008 for (var key in object) { | |
| 1009 if (%HasOwnProperty(object, key)) { | |
| 1010 names.push(key); | |
| 1011 } | |
| 1012 } | |
| 1013 | |
| 1014 var filter = PROPERTY_ATTRIBUTES_STRING | PROPERTY_ATTRIBUTES_PRIVATE_SYMBOL; | |
| 1015 var symbols = %GetOwnPropertyNames(object, filter); | |
| 1016 for (var i = 0; i < symbols.length; ++i) { | |
| 1017 var symbol = symbols[i]; | |
| 1018 if (IS_SYMBOL(symbol)) { | |
| 1019 var desc = ObjectGetOwnPropertyDescriptor(object, symbol); | |
| 1020 if (desc.enumerable) names.push(symbol); | |
| 1021 } | |
| 1022 } | |
| 1023 | |
| 1024 return names; | |
| 1025 } | 903 } |
| 1026 | 904 |
| 1027 | 905 |
| 1028 // ES5 section 15.2.3.7. | 906 // ES5 section 15.2.3.7. |
| 1029 function ObjectDefineProperties(obj, properties) { | 907 function ObjectDefineProperties(obj, properties) { |
| 1030 // The new pure-C++ implementation doesn't support O.o. | 908 // The new pure-C++ implementation doesn't support O.o. |
| 1031 // TODO(jkummerow): Implement missing features and remove fallback path. | 909 // TODO(jkummerow): Implement missing features and remove fallback path. |
| 1032 if (%IsObserved(obj)) { | 910 if (%IsObserved(obj)) { |
| 1033 if (!IS_SPEC_OBJECT(obj)) { | 911 if (!IS_SPEC_OBJECT(obj)) { |
| 1034 throw MakeTypeError(kCalledOnNonObject, "Object.defineProperties"); | 912 throw MakeTypeError(kCalledOnNonObject, "Object.defineProperties"); |
| (...skipping 688 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1723 to.FunctionSourceString = FunctionSourceString; | 1601 to.FunctionSourceString = FunctionSourceString; |
| 1724 to.GetIterator = GetIterator; | 1602 to.GetIterator = GetIterator; |
| 1725 to.GetMethod = GetMethod; | 1603 to.GetMethod = GetMethod; |
| 1726 to.IsFinite = GlobalIsFinite; | 1604 to.IsFinite = GlobalIsFinite; |
| 1727 to.IsNaN = GlobalIsNaN; | 1605 to.IsNaN = GlobalIsNaN; |
| 1728 to.NewFunctionString = NewFunctionString; | 1606 to.NewFunctionString = NewFunctionString; |
| 1729 to.NumberIsNaN = NumberIsNaN; | 1607 to.NumberIsNaN = NumberIsNaN; |
| 1730 to.ObjectDefineProperties = ObjectDefineProperties; | 1608 to.ObjectDefineProperties = ObjectDefineProperties; |
| 1731 to.ObjectDefineProperty = ObjectDefineProperty; | 1609 to.ObjectDefineProperty = ObjectDefineProperty; |
| 1732 to.ObjectFreeze = ObjectFreezeJS; | 1610 to.ObjectFreeze = ObjectFreezeJS; |
| 1733 to.ObjectGetOwnPropertyKeys = ObjectGetOwnPropertyKeys; | |
| 1734 to.ObjectHasOwnProperty = ObjectHasOwnProperty; | 1611 to.ObjectHasOwnProperty = ObjectHasOwnProperty; |
| 1735 to.ObjectIsFrozen = ObjectIsFrozen; | 1612 to.ObjectIsFrozen = ObjectIsFrozen; |
| 1736 to.ObjectIsSealed = ObjectIsSealed; | 1613 to.ObjectIsSealed = ObjectIsSealed; |
| 1737 to.ObjectToString = ObjectToString; | 1614 to.ObjectToString = ObjectToString; |
| 1738 to.ToNameArray = ToNameArray; | |
| 1739 }); | 1615 }); |
| 1740 | 1616 |
| 1741 %InstallToContext([ | 1617 %InstallToContext([ |
| 1742 "global_eval_fun", GlobalEval, | 1618 "global_eval_fun", GlobalEval, |
| 1743 "object_value_of", ObjectValueOf, | 1619 "object_value_of", ObjectValueOf, |
| 1744 "object_to_string", ObjectToString, | 1620 "object_to_string", ObjectToString, |
| 1745 "object_get_own_property_descriptor", ObjectGetOwnPropertyDescriptor, | 1621 "object_get_own_property_descriptor", ObjectGetOwnPropertyDescriptor, |
| 1746 "to_complete_property_descriptor", ToCompletePropertyDescriptor, | 1622 "to_complete_property_descriptor", ToCompletePropertyDescriptor, |
| 1747 ]); | 1623 ]); |
| 1748 | 1624 |
| 1749 }) | 1625 }) |
| OLD | NEW |