From 369af34f4af710f6691e991d7e6bed37b55c9f46 Mon Sep 17 00:00:00 2001 From: Tom Schuster Date: Wed, 10 Feb 2016 00:12:24 +0100 Subject: [PATCH] Bug 1246318 - Make the proxy enumerate trap non-standard. r=efaust --- dom/bindings/DOMJSProxyHandler.cpp | 7 ------- dom/bindings/DOMJSProxyHandler.h | 3 --- js/public/Proxy.h | 16 ++++------------ js/src/builtin/ModuleObject.cpp | 7 ------- js/src/builtin/ModuleObject.h | 1 - js/src/proxy/DeadObjectProxy.cpp | 7 ------- js/src/proxy/DeadObjectProxy.h | 2 +- js/src/vm/ScopeObject.cpp | 5 ----- 8 files changed, 5 insertions(+), 43 deletions(-) diff --git a/dom/bindings/DOMJSProxyHandler.cpp b/dom/bindings/DOMJSProxyHandler.cpp index 82afa323b4e..3e37df02b62 100644 --- a/dom/bindings/DOMJSProxyHandler.cpp +++ b/dom/bindings/DOMJSProxyHandler.cpp @@ -259,13 +259,6 @@ BaseDOMProxyHandler::getOwnEnumerablePropertyKeys(JSContext* cx, return ownPropNames(cx, proxy, JSITER_OWNONLY, props); } -bool -BaseDOMProxyHandler::enumerate(JSContext *cx, JS::Handle proxy, - JS::MutableHandle objp) const -{ - return BaseProxyHandler::enumerate(cx, proxy, objp); -} - bool DOMProxyHandler::has(JSContext* cx, JS::Handle proxy, JS::Handle id, bool* bp) const { diff --git a/dom/bindings/DOMJSProxyHandler.h b/dom/bindings/DOMJSProxyHandler.h index 93ba36e7ebd..32348f63e66 100644 --- a/dom/bindings/DOMJSProxyHandler.h +++ b/dom/bindings/DOMJSProxyHandler.h @@ -59,9 +59,6 @@ public: virtual bool ownPropertyKeys(JSContext* cx, JS::Handle proxy, JS::AutoIdVector &props) const override; - virtual bool enumerate(JSContext *cx, JS::Handle proxy, - JS::MutableHandle objp) const override; - // We override getOwnEnumerablePropertyKeys() and implement it directly // instead of using the default implementation, which would call // ownPropertyKeys and then filter out the non-enumerable ones. This avoids diff --git a/js/public/Proxy.h b/js/public/Proxy.h index 2ec8ce7378c..c7f839d0668 100644 --- a/js/public/Proxy.h +++ b/js/public/Proxy.h @@ -59,16 +59,15 @@ class JS_FRIEND_API(Wrapper); * * ### Proxies and internal methods * - * ES6 draft rev 27 (24 August 2014) specifies 14 internal methods. The runtime - * semantics of just about everything a script can do to an object is specified - * in terms of these internal methods. For example: + * ES2016 specifies 13 internal methods. The runtime semantics of just + * about everything a script can do to an object is specified in terms + * of these internal methods. For example: * * JS code ES6 internal method that gets called * --------------------------- -------------------------------- * obj.prop obj.[[Get]](obj, "prop") * "prop" in obj obj.[[HasProperty]]("prop") * new obj() obj.[[Construct]]() - * for (k in obj) {} obj.[[Enumerate]]() * * With regard to the implementation of these internal methods, there are three * very different kinds of object in SpiderMonkey. @@ -261,14 +260,6 @@ class JS_FRIEND_API(BaseProxyHandler) virtual bool delete_(JSContext* cx, HandleObject proxy, HandleId id, ObjectOpResult& result) const = 0; - /* - * Because [[Enumerate]] is one of the standard traps it should be overridden. - * However for convenience BaseProxyHandler includes a pure virtual implementation, - * that turns the properties returned by getOwnEnumerablePropertyKeys (and proto walking) - * into an Iterator object. - */ - virtual bool enumerate(JSContext* cx, HandleObject proxy, MutableHandleObject objp) const = 0; - /* * These methods are standard, but the engine does not normally call them. * They're opt-in. See "Proxy prototype chains" above. @@ -315,6 +306,7 @@ class JS_FRIEND_API(BaseProxyHandler) virtual bool construct(JSContext* cx, HandleObject proxy, const CallArgs& args) const; /* SpiderMonkey extensions. */ + virtual bool enumerate(JSContext* cx, HandleObject proxy, MutableHandleObject objp) const; virtual bool getPropertyDescriptor(JSContext* cx, HandleObject proxy, HandleId id, MutableHandle desc) const; virtual bool hasOwn(JSContext* cx, HandleObject proxy, HandleId id, bool* bp) const; diff --git a/js/src/builtin/ModuleObject.cpp b/js/src/builtin/ModuleObject.cpp index 9d425fc5094..3d72f5ce031 100644 --- a/js/src/builtin/ModuleObject.cpp +++ b/js/src/builtin/ModuleObject.cpp @@ -493,13 +493,6 @@ ModuleNamespaceObject::ProxyHandler::delete_(JSContext* cx, HandleObject proxy, return result.succeed(); } -bool -ModuleNamespaceObject::ProxyHandler::enumerate(JSContext* cx, HandleObject proxy, - MutableHandleObject objp) const -{ - return BaseProxyHandler::enumerate(cx, proxy, objp); -} - bool ModuleNamespaceObject::ProxyHandler::ownPropertyKeys(JSContext* cx, HandleObject proxy, AutoIdVector& props) const diff --git a/js/src/builtin/ModuleObject.h b/js/src/builtin/ModuleObject.h index 80c3088cb4d..10b4ae1f2d1 100644 --- a/js/src/builtin/ModuleObject.h +++ b/js/src/builtin/ModuleObject.h @@ -162,7 +162,6 @@ class ModuleNamespaceObject : public ProxyObject AutoIdVector& props) const override; bool delete_(JSContext* cx, HandleObject proxy, HandleId id, ObjectOpResult& result) const override; - bool enumerate(JSContext* cx, HandleObject proxy, MutableHandleObject objp) const override; bool getPrototype(JSContext* cx, HandleObject proxy, MutableHandleObject protop) const override; bool setPrototype(JSContext* cx, HandleObject proxy, HandleObject proto, diff --git a/js/src/proxy/DeadObjectProxy.cpp b/js/src/proxy/DeadObjectProxy.cpp index 62381fe1176..5d72062b348 100644 --- a/js/src/proxy/DeadObjectProxy.cpp +++ b/js/src/proxy/DeadObjectProxy.cpp @@ -53,13 +53,6 @@ DeadObjectProxy::delete_(JSContext* cx, HandleObject wrapper, HandleId id, return false; } -bool -DeadObjectProxy::enumerate(JSContext* cx, HandleObject wrapper, MutableHandleObject objp) const -{ - ReportDead(cx); - return false; -} - bool DeadObjectProxy::getPrototype(JSContext* cx, HandleObject proxy, MutableHandleObject protop) const { diff --git a/js/src/proxy/DeadObjectProxy.h b/js/src/proxy/DeadObjectProxy.h index 70c847f9b72..b071efc06ee 100644 --- a/js/src/proxy/DeadObjectProxy.h +++ b/js/src/proxy/DeadObjectProxy.h @@ -28,7 +28,6 @@ class DeadObjectProxy : public BaseProxyHandler AutoIdVector& props) const override; virtual bool delete_(JSContext* cx, HandleObject wrapper, HandleId id, ObjectOpResult& result) const override; - virtual bool enumerate(JSContext* cx, HandleObject wrapper, MutableHandleObject objp) const override; virtual bool getPrototype(JSContext* cx, HandleObject proxy, MutableHandleObject protop) const override; virtual bool preventExtensions(JSContext* cx, HandleObject proxy, @@ -39,6 +38,7 @@ class DeadObjectProxy : public BaseProxyHandler /* SpiderMonkey extensions. */ // BaseProxyHandler::getPropertyDescriptor will throw by calling getOwnPropertyDescriptor. + // BaseProxyHandler::enumerate will throw by calling ownKeys. virtual bool nativeCall(JSContext* cx, IsAcceptableThis test, NativeImpl impl, const CallArgs& args) const override; virtual bool hasInstance(JSContext* cx, HandleObject proxy, MutableHandleValue v, diff --git a/js/src/vm/ScopeObject.cpp b/js/src/vm/ScopeObject.cpp index ae13736c338..270d8c22b34 100644 --- a/js/src/vm/ScopeObject.cpp +++ b/js/src/vm/ScopeObject.cpp @@ -2333,11 +2333,6 @@ class DebugScopeProxy : public BaseProxyHandler return true; } - bool enumerate(JSContext* cx, HandleObject proxy, MutableHandleObject objp) const override - { - return BaseProxyHandler::enumerate(cx, proxy, objp); - } - bool has(JSContext* cx, HandleObject proxy, HandleId id_, bool* bp) const override { RootedId id(cx, id_);