Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(52)

Unified Diff: src/v8natives.js

Issue 108083005: ES6: Add Object.getOwnPropertySymbols (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: reitveld error Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/v8natives.js
diff --git a/src/v8natives.js b/src/v8natives.js
index b715e8923ff26184b43d2f5f432e9e5a3cf778d3..73cf49350df8e73bd7f58959b84c0487b9210103 100644
--- a/src/v8natives.js
+++ b/src/v8natives.js
@@ -1038,6 +1038,77 @@ function ToNameArray(obj, trap, includeSymbols) {
}
+function GetSymbolsInArray(propertyKeys) {
rossberg 2013/12/10 10:39:53 Nit: perhaps call this FilterPublicSymbols?
arv (Not doing code reviews) 2013/12/11 00:16:26 Done.
+ var symbols = new InternalArray();
+ var j = 0;
+ for (var i = 0; i < propertyKeys.length; i++) {
+ if (IS_SYMBOL(propertyKeys[i]) && !%SymbolIsPrivate(propertyKeys[i])) {
rossberg 2013/12/10 10:39:53 It might make sense to introduce an IS_PRIVATE mac
arv (Not doing code reviews) 2013/12/11 00:16:26 Done.
+ symbols[j++] = propertyKeys[i];
+ }
+ }
+ return symbols;
+}
+
+
+// ES6 19.1.2.8
+function ObjectGetOwnPropertySymbols(obj) {
+ if (!IS_SPEC_OBJECT(obj)) {
+ throw MakeTypeError("called_on_non_object",
+ ["Object.getOwnPropertySymbols"]);
+ }
+
+ // FIXME: Proxies use a shared trap for String and Symbol keys.
rossberg 2013/12/10 10:39:53 Please use TODO(arv); same below
arv (Not doing code reviews) 2013/12/11 00:16:26 Done.
+
+ var nameArrays = new InternalArray();
+
+ // Find all the indexed properties.
+
+ // Get names for indexed interceptor properties.
+ var interceptorInfo = %GetInterceptorInfo(obj);
+
+ // Find all the named properties.
+
+ // Get the local property symbols.
+ // FIXME: Have the runtime do the filtering.
rossberg 2013/12/10 10:39:53 Yeah, I would very much prefer to have this implem
+ nameArrays.push(GetSymbolsInArray(%GetLocalPropertyNames(obj, true)));
+
+ // Get names for named interceptor properties if any.
+ if ((interceptorInfo & 2) != 0) {
+ // FIXME: Have the runtime do the filtering.
+ var namedInterceptorNames = %GetNamedInterceptorPropertyNames(obj);
+ if (!IS_UNDEFINED(namedInterceptorNames)) {
+ nameArrays.push(GetSymbolsInArray(namedInterceptorSymbols));
+ }
+ }
+
+ var propertySymbols =
+ %Apply(InternalArray.prototype.concat,
+ nameArrays[0], nameArrays, 1, nameArrays.length - 1);
+
+ // Property names are expected to be unique,
+ // but interceptors can interfere with that assumption.
+ if (interceptorInfo != 0) {
+ var propertySet = { __proto__: null };
+ var j = 0;
+ for (var i = 0; i < propertySymbols.length; ++i) {
+ var symbol = propertySymbols[i];
+ if (!IS_SYMBOL(symbol) || %SymbolIsPrivate(symbol)) continue;
+
+ // We need to check for the exact property value since for intrinsic
+ // properties like toString if(propertySet["toString"]) will always
+ // succeed.
+ if (propertySet[symbol] === true) {
rossberg 2013/12/10 10:39:53 Could combine this with the previous if.
arv (Not doing code reviews) 2013/12/11 00:16:26 I also don't think this comment is correct. proper
+ continue;
+ }
+ propertySet[symbol] = true;
+ propertySymbols[j++] = symbol;
+ }
+ propertySymbols.length = j;
+ }
+
+ return propertySymbols;
+}
+
// ES5 section 15.2.3.4.
function ObjectGetOwnPropertyNames(obj) {
if (!IS_SPEC_OBJECT(obj)) {
@@ -1420,6 +1491,7 @@ function SetUpObject() {
"getPrototypeOf", ObjectGetPrototypeOf,
"getOwnPropertyDescriptor", ObjectGetOwnPropertyDescriptor,
"getOwnPropertyNames", ObjectGetOwnPropertyNames,
+ // getOwnPropertySymbols is added in symbol.js
rossberg 2013/12/10 10:39:53 Good to have that comment here. While you're at it
arv (Not doing code reviews) 2013/12/11 00:16:26 Done.
"is", ObjectIs,
"isExtensible", ObjectIsExtensible,
"isFrozen", ObjectIsFrozen,
« no previous file with comments | « src/symbol.js ('k') | test/mjsunit/harmony/symbols.js » ('j') | test/mjsunit/harmony/symbols.js » ('J')

Powered by Google App Engine
This is Rietveld 408576698