Index: src/js/v8natives.js |
diff --git a/src/js/v8natives.js b/src/js/v8natives.js |
index 5be6eeac25ff989a5f29f2c0acf91244b5d0ce5b..d371e7e09bd06f2201996e99b7a85fdc6d480ab5 100644 |
--- a/src/js/v8natives.js |
+++ b/src/js/v8natives.js |
@@ -257,7 +257,8 @@ function ObjectLookupSetter(name) { |
function ObjectKeys(obj) { |
obj = TO_OBJECT(obj); |
- return %OwnKeys(obj); |
+ var filter = PROPERTY_FILTER_ONLY_ENUMERABLE | PROPERTY_FILTER_SKIP_SYMBOLS; |
+ return %GetOwnPropertyKeys(obj, filter); |
} |
@@ -855,122 +856,16 @@ function ObjectGetOwnPropertyDescriptor(obj, p) { |
} |
-// For Harmony proxies |
-function ToNameArray(obj, trap, includeSymbols) { |
- if (!IS_SPEC_OBJECT(obj)) { |
- throw MakeTypeError(kProxyNonObjectPropNames, trap, obj); |
- } |
- var n = TO_UINT32(obj.length); |
- var array = new GlobalArray(n); |
- var realLength = 0; |
- var names = { __proto__: null }; // TODO(rossberg): use sets once ready. |
- for (var index = 0; index < n; index++) { |
- var s = TO_NAME(obj[index]); |
- // TODO(rossberg): adjust once there is a story for symbols vs proxies. |
- if (IS_SYMBOL(s) && !includeSymbols) continue; |
- if (%HasOwnProperty(names, s)) { |
- throw MakeTypeError(kProxyRepeatedPropName, trap, s); |
- } |
- array[realLength] = s; |
- ++realLength; |
- names[s] = 0; |
- } |
- array.length = realLength; |
- return array; |
-} |
- |
- |
-function ObjectGetOwnPropertyKeys(obj, filter) { |
- var nameArrays = new InternalArray(); |
- filter |= PROPERTY_ATTRIBUTES_PRIVATE_SYMBOL; |
- var interceptorInfo = %GetInterceptorInfo(obj); |
- |
- // Find all the indexed properties. |
- |
- // Only get own element names if we want to include string keys. |
- if ((filter & PROPERTY_ATTRIBUTES_STRING) === 0) { |
- var ownElementNames = %GetOwnElementNames(obj); |
- for (var i = 0; i < ownElementNames.length; ++i) { |
- ownElementNames[i] = %_NumberToString(ownElementNames[i]); |
- } |
- nameArrays.push(ownElementNames); |
- // Get names for indexed interceptor properties. |
- if ((interceptorInfo & 1) != 0) { |
- var indexedInterceptorNames = %GetIndexedInterceptorElementNames(obj); |
- if (!IS_UNDEFINED(indexedInterceptorNames)) { |
- nameArrays.push(indexedInterceptorNames); |
- } |
- } |
- } |
- |
- // Find all the named properties. |
- |
- // Get own property names. |
- nameArrays.push(%GetOwnPropertyNames(obj, filter)); |
- |
- // Get names for named interceptor properties if any. |
- if ((interceptorInfo & 2) != 0) { |
- var namedInterceptorNames = |
- %GetNamedInterceptorPropertyNames(obj); |
- if (!IS_UNDEFINED(namedInterceptorNames)) { |
- nameArrays.push(namedInterceptorNames); |
- } |
- } |
- |
- var propertyNames = |
- %Apply(InternalArray.prototype.concat, |
- nameArrays[0], nameArrays, 1, nameArrays.length - 1); |
- |
- // Property names are expected to be unique strings, |
- // but interceptors can interfere with that assumption. |
- if (interceptorInfo != 0) { |
- var seenKeys = { __proto__: null }; |
- var j = 0; |
- for (var i = 0; i < propertyNames.length; ++i) { |
- var name = propertyNames[i]; |
- if (IS_SYMBOL(name)) { |
- if ((filter & PROPERTY_ATTRIBUTES_SYMBOLIC) || IS_PRIVATE(name)) { |
- continue; |
- } |
- } else { |
- if (filter & PROPERTY_ATTRIBUTES_STRING) continue; |
- name = TO_STRING(name); |
- } |
- if (seenKeys[name]) continue; |
- seenKeys[name] = true; |
- propertyNames[j++] = name; |
- } |
- propertyNames.length = j; |
- } |
- |
- return propertyNames; |
-} |
- |
- |
// ES6 section 9.1.12 / 9.5.12 |
function OwnPropertyKeys(obj) { |
- if (%_IsJSProxy(obj)) { |
- var handler = %GetHandler(obj); |
- // TODO(caitp): Proxy.[[OwnPropertyKeys]] can not be implemented to spec |
- // without an implementation of Direct Proxies. |
- var names = CallTrap0(handler, "ownKeys", UNDEFINED); |
- return ToNameArray(names, "getOwnPropertyNames", false); |
- } |
- return ObjectGetOwnPropertyKeys(obj, PROPERTY_ATTRIBUTES_PRIVATE_SYMBOL); |
+ return %GetOwnPropertyKeys(obj, PROPERTY_FILTER_NONE); |
} |
// ES5 section 15.2.3.4. |
function ObjectGetOwnPropertyNames(obj) { |
obj = TO_OBJECT(obj); |
- // Special handling for proxies. |
- if (%_IsJSProxy(obj)) { |
- var handler = %GetHandler(obj); |
- var names = CallTrap0(handler, "getOwnPropertyNames", UNDEFINED); |
- return ToNameArray(names, "getOwnPropertyNames", false); |
- } |
- |
- return ObjectGetOwnPropertyKeys(obj, PROPERTY_ATTRIBUTES_SYMBOLIC); |
+ return %GetOwnPropertyKeys(obj, PROPERTY_FILTER_SKIP_SYMBOLS); |
} |
@@ -1004,24 +899,7 @@ function ObjectDefineProperty(obj, p, attributes) { |
function GetOwnEnumerablePropertyNames(object) { |
- var names = new InternalArray(); |
- for (var key in object) { |
- if (%HasOwnProperty(object, key)) { |
- names.push(key); |
- } |
- } |
- |
- var filter = PROPERTY_ATTRIBUTES_STRING | PROPERTY_ATTRIBUTES_PRIVATE_SYMBOL; |
- var symbols = %GetOwnPropertyNames(object, filter); |
- for (var i = 0; i < symbols.length; ++i) { |
- var symbol = symbols[i]; |
- if (IS_SYMBOL(symbol)) { |
- var desc = ObjectGetOwnPropertyDescriptor(object, symbol); |
- if (desc.enumerable) names.push(symbol); |
- } |
- } |
- |
- return names; |
+ return %GetOwnPropertyKeys(object, PROPERTY_FILTER_ONLY_ENUMERABLE); |
} |
@@ -1730,12 +1608,10 @@ utils.Export(function(to) { |
to.ObjectDefineProperties = ObjectDefineProperties; |
to.ObjectDefineProperty = ObjectDefineProperty; |
to.ObjectFreeze = ObjectFreezeJS; |
- to.ObjectGetOwnPropertyKeys = ObjectGetOwnPropertyKeys; |
to.ObjectHasOwnProperty = ObjectHasOwnProperty; |
to.ObjectIsFrozen = ObjectIsFrozen; |
to.ObjectIsSealed = ObjectIsSealed; |
to.ObjectToString = ObjectToString; |
- to.ToNameArray = ToNameArray; |
}); |
%InstallToContext([ |