From 09de524f1a737fb9a415f459a1697950111afb3d Mon Sep 17 00:00:00 2001 From: Terrence Cole Date: Tue, 30 Apr 2013 10:29:40 -0700 Subject: [PATCH] Bug 862115 - Use Rooted in favor of JSPropertyDescriptor::AutoRooter r=terrence r=smaug r=bholley --- dom/base/nsGlobalWindow.cpp | 18 +- dom/bindings/BindingUtils.cpp | 7 +- dom/bindings/BindingUtils.h | 6 +- dom/bindings/Codegen.py | 42 +-- dom/bindings/DOMJSClass.h | 2 +- dom/bindings/DOMJSProxyHandler.cpp | 14 +- dom/bindings/DOMJSProxyHandler.h | 23 +- js/ipc/JavaScriptChild.cpp | 14 +- js/ipc/JavaScriptParent.cpp | 23 +- js/ipc/JavaScriptParent.h | 6 +- js/ipc/JavaScriptShared.cpp | 58 ++-- js/ipc/JavaScriptShared.h | 5 +- js/src/builtin/Object.cpp | 12 +- js/src/jsapi.cpp | 56 ++- js/src/jsapi.h | 52 ++- js/src/jscompartment.cpp | 18 +- js/src/jscompartment.h | 2 +- js/src/jsfriendapi.cpp | 20 +- js/src/jsobj.cpp | 76 ++-- js/src/jsobj.h | 7 +- js/src/jsproxy.cpp | 328 +++++++++--------- js/src/jsproxy.h | 20 +- js/src/jswrapper.cpp | 18 +- js/src/jswrapper.h | 18 +- js/src/shell/js.cpp | 41 ++- js/src/vm/Debugger.cpp | 22 +- js/src/vm/ObjectImpl.h | 4 +- js/src/vm/ScopeObject.cpp | 34 +- js/xpconnect/src/XPCComponents.cpp | 30 +- js/xpconnect/wrappers/ChromeObjectWrapper.cpp | 23 +- js/xpconnect/wrappers/ChromeObjectWrapper.h | 3 +- js/xpconnect/wrappers/FilteringWrapper.cpp | 9 +- js/xpconnect/wrappers/FilteringWrapper.h | 6 +- js/xpconnect/wrappers/WaiveXrayWrapper.cpp | 22 +- js/xpconnect/wrappers/WaiveXrayWrapper.h | 5 +- js/xpconnect/wrappers/XrayWrapper.cpp | 203 +++++------ js/xpconnect/wrappers/XrayWrapper.h | 12 +- 37 files changed, 650 insertions(+), 609 deletions(-) diff --git a/dom/base/nsGlobalWindow.cpp b/dom/base/nsGlobalWindow.cpp index b79780601b05..8ac742df3d59 100644 --- a/dom/base/nsGlobalWindow.cpp +++ b/dom/base/nsGlobalWindow.cpp @@ -575,17 +575,17 @@ public: virtual bool getPropertyDescriptor(JSContext* cx, JS::Handle proxy, JS::Handle id, - JSPropertyDescriptor* desc, + JS::MutableHandle desc, unsigned flags) MOZ_OVERRIDE; virtual bool getOwnPropertyDescriptor(JSContext* cx, JS::Handle proxy, JS::Handle id, - JSPropertyDescriptor* desc, + JS::MutableHandle desc, unsigned flags) MOZ_OVERRIDE; virtual bool defineProperty(JSContext* cx, JS::Handle proxy, JS::Handle id, - JSPropertyDescriptor* desc) MOZ_OVERRIDE; + JS::MutableHandle desc) MOZ_OVERRIDE; virtual bool getOwnPropertyNames(JSContext *cx, JS::Handle proxy, JS::AutoIdVector &props) MOZ_OVERRIDE; @@ -688,18 +688,18 @@ bool nsOuterWindowProxy::getPropertyDescriptor(JSContext* cx, JS::Handle proxy, JS::Handle id, - JSPropertyDescriptor* desc, + JS::MutableHandle desc, unsigned flags) { // The only thing we can do differently from js::Wrapper is shadow stuff with // our indexed properties, so we can just try getOwnPropertyDescriptor and if // that gives us nothing call on through to js::Wrapper. - desc->obj = nullptr; + desc.object().set(nullptr); if (!getOwnPropertyDescriptor(cx, proxy, id, desc, flags)) { return false; } - if (desc->obj) { + if (desc.object()) { return true; } @@ -710,11 +710,11 @@ bool nsOuterWindowProxy::getOwnPropertyDescriptor(JSContext* cx, JS::Handle proxy, JS::Handle id, - JSPropertyDescriptor* desc, + JS::MutableHandle desc, unsigned flags) { bool found; - if (!GetSubframeWindow(cx, proxy, id, &desc->value, found)) { + if (!GetSubframeWindow(cx, proxy, id, desc.value().address(), found)) { return false; } if (found) { @@ -730,7 +730,7 @@ bool nsOuterWindowProxy::defineProperty(JSContext* cx, JS::Handle proxy, JS::Handle id, - JSPropertyDescriptor* desc) + JS::MutableHandle desc) { int32_t index = GetArrayIndexFromId(cx, id); if (IsArrayIndex(index)) { diff --git a/dom/bindings/BindingUtils.cpp b/dom/bindings/BindingUtils.cpp index 40b895927478..242c08166eea 100644 --- a/dom/bindings/BindingUtils.cpp +++ b/dom/bindings/BindingUtils.cpp @@ -815,15 +815,14 @@ GetNativePropertyHooks(JSContext *cx, JS::Handle obj, bool XrayResolveOwnProperty(JSContext* cx, JS::Handle wrapper, JS::Handle obj, JS::Handle id, - JSPropertyDescriptor* desc, unsigned flags) + JS::MutableHandle desc, unsigned flags) { DOMObjectType type; const NativePropertyHooks *nativePropertyHooks = GetNativePropertyHooks(cx, obj, type); return type != eInstance || !nativePropertyHooks->mResolveOwnProperty || - nativePropertyHooks->mResolveOwnProperty(cx, wrapper, obj, id, desc, - flags); + nativePropertyHooks->mResolveOwnProperty(cx, wrapper, obj, id, desc, flags); } static bool @@ -1088,7 +1087,7 @@ XrayResolveNativeProperty(JSContext* cx, JS::Handle wrapper, bool XrayDefineProperty(JSContext* cx, JS::Handle wrapper, JS::Handle obj, JS::Handle id, - JSPropertyDescriptor* desc, bool* defined) + JS::MutableHandle desc, bool* defined) { if (!js::IsProxy(obj)) return true; diff --git a/dom/bindings/BindingUtils.h b/dom/bindings/BindingUtils.h index fdb1ca4efc75..98a654e95e59 100644 --- a/dom/bindings/BindingUtils.h +++ b/dom/bindings/BindingUtils.h @@ -1901,7 +1901,7 @@ bool XrayResolveOwnProperty(JSContext* cx, JS::Handle wrapper, JS::Handle obj, JS::Handle id, - JSPropertyDescriptor* desc, unsigned flags); + JS::MutableHandle desc, unsigned flags); /** * This resolves operations, attributes and constants of the interfaces for obj. @@ -1924,9 +1924,9 @@ XrayResolveNativeProperty(JSContext* cx, JS::Handle wrapper, * defined will be set to true if a property was set as a result of this call. */ bool -XrayDefineProperty(JSContext* cx, JS::Handle wrapper, +XrayDefineProperty(JSContext* cx, JS::Handle wrapper, JS::Handle obj, JS::Handle id, - JSPropertyDescriptor* desc, bool* defined); + JS::MutableHandle desc, bool* defined); /** * This enumerates indexed or named properties of obj and operations, attributes diff --git a/dom/bindings/Codegen.py b/dom/bindings/Codegen.py index 74fd8d855b1b..192a55a14da3 100644 --- a/dom/bindings/Codegen.py +++ b/dom/bindings/Codegen.py @@ -6930,7 +6930,8 @@ class CGResolveOwnProperty(CGAbstractStaticMethod): Argument('JS::Handle', 'wrapper'), Argument('JS::Handle', 'obj'), Argument('JS::Handle', 'id'), - Argument('JSPropertyDescriptor*', 'desc'), Argument('unsigned', 'flags'), + Argument('JS::MutableHandle', 'desc'), + Argument('unsigned', 'flags'), ] CGAbstractStaticMethod.__init__(self, descriptor, "ResolveOwnProperty", "bool", args) @@ -6948,7 +6949,8 @@ class CGResolveOwnPropertyViaNewresolve(CGAbstractBindingMethod): Argument('JS::Handle', 'wrapper'), Argument('JS::Handle', 'obj'), Argument('JS::Handle', 'id'), - Argument('JSPropertyDescriptor*', 'desc'), Argument('unsigned', 'flags'), + Argument('JS::MutableHandle', 'desc'), + Argument('unsigned', 'flags'), ] CGAbstractBindingMethod.__init__(self, descriptor, "ResolveOwnPropertyViaNewresolve", @@ -7076,8 +7078,8 @@ class CGProxySpecialOperation(CGPerSignatureCall): templateValues = { "declName": argument.identifier.name, "holderName": argument.identifier.name + "_holder", - "val" : "JS::Handle::fromMarkedLocation(&desc->value)", - "mutableVal" : "JS::MutableHandle::fromMarkedLocation(&desc->value)", + "val": "desc.value()", + "mutableVal" : "desc.value()", "obj": "obj" } self.cgRoot.prepend(instantiateJSToNativeConversion(info, templateValues)) @@ -7282,7 +7284,8 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(ClassMethod): def __init__(self, descriptor): args = [Argument('JSContext*', 'cx'), Argument('JS::Handle', 'proxy'), Argument('JS::Handle', 'id'), - Argument('JSPropertyDescriptor*', 'desc'), Argument('unsigned', 'flags')] + Argument('JS::MutableHandle', 'desc'), + Argument('unsigned', 'flags')] ClassMethod.__init__(self, "getOwnPropertyDescriptor", "bool", args) self.descriptor = descriptor def getBody(self): @@ -7294,23 +7297,22 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(ClassMethod): setOrIndexedGet += "int32_t index = GetArrayIndexFromId(cx, id);\n" readonly = toStringBool(indexedSetter is None) fillDescriptor = "FillPropertyDescriptor(desc, proxy, %s);\nreturn true;" % readonly - templateValues = {'jsvalRef': 'JS::MutableHandle::fromMarkedLocation(&desc->value)', - 'jsvalHandle': 'JS::MutableHandle::fromMarkedLocation(&desc->value)', + templateValues = {'jsvalRef': 'desc.value()', 'jsvalHandle': 'desc.value()', 'obj': 'proxy', 'successCode': fillDescriptor} get = ("if (IsArrayIndex(index)) {\n" + CGIndenter(CGProxyIndexedGetter(self.descriptor, templateValues)).define() + "\n" + "}\n") % (self.descriptor.nativeType) if UseHolderForUnforgeable(self.descriptor): - getUnforgeable = """if (!JS_GetPropertyDescriptorById(cx, ${holder}, id, flags, desc)) { + getUnforgeable = """if (!JS_GetPropertyDescriptorById(cx, ${holder}, id, flags, desc.address())) { return false; } -MOZ_ASSERT_IF(desc->obj, desc->obj == ${holder});""" +MOZ_ASSERT_IF(desc.object(), desc.object() == ${holder});""" getUnforgeable = CallOnUnforgeableHolder(self.descriptor, getUnforgeable, "isXray") - getUnforgeable += """if (desc->obj) { - desc->obj = proxy; - return !isXray || JS_WrapPropertyDescriptor(cx, desc); + getUnforgeable += """if (desc.object()) { + desc.object().set(proxy); + return !isXray || JS_WrapPropertyDescriptor(cx, desc.address()); } """ @@ -7362,8 +7364,7 @@ MOZ_ASSERT_IF(desc->obj, desc->obj == ${holder});""" if self.descriptor.supportsNamedProperties(): readonly = toStringBool(self.descriptor.operations['NamedSetter'] is None) fillDescriptor = "FillPropertyDescriptor(desc, proxy, %s);\nreturn true;" % readonly - templateValues = {'jsvalRef': 'JS::MutableHandle::fromMarkedLocation(&desc->value)', - 'jsvalHandle': 'JS::MutableHandle::fromMarkedLocation(&desc->value)', + templateValues = {'jsvalRef': 'desc.value()', 'jsvalHandle': 'desc.value()', 'obj': 'proxy', 'successCode': fillDescriptor} condition = "!HasPropertyOnPrototype(cx, proxy, this, id)" if self.descriptor.interface.getExtendedAttribute('OverrideBuiltins'): @@ -7380,24 +7381,25 @@ MOZ_ASSERT_IF(desc->obj, desc->obj == ${holder});""" return setOrIndexedGet + """JS::Rooted expando(cx); if (!isXray && (expando = GetExpandoObject(proxy))) { - if (!JS_GetPropertyDescriptorById(cx, expando, id, flags, desc)) { + if (!JS_GetPropertyDescriptorById(cx, expando, id, flags, desc.address())) { return false; } - if (desc->obj) { + if (desc.object()) { // Pretend the property lives on the wrapper. - desc->obj = proxy; + desc.object().set(proxy); return true; } } """ + namedGet + """ -desc->obj = nullptr; +desc.object().set(nullptr); return true;""" class CGDOMJSProxyHandler_defineProperty(ClassMethod): def __init__(self, descriptor): args = [Argument('JSContext*', 'cx'), Argument('JS::Handle', 'proxy'), Argument('JS::Handle', 'id'), - Argument('JSPropertyDescriptor*', 'desc'), Argument('bool*', 'defined')] + Argument('JS::MutableHandle', 'desc'), + Argument('bool*', 'defined')] ClassMethod.__init__(self, "defineProperty", "bool", args, virtual=True, override=True) self.descriptor = descriptor def getBody(self): @@ -7429,7 +7431,7 @@ class CGDOMJSProxyHandler_defineProperty(ClassMethod): "if (hasUnforgeable) {\n" " *defined = true;" + " bool unused;\n" - " return js_DefineOwnProperty(cx, ${holder}, id, *desc, &unused);\n" + " return js_DefineOwnProperty(cx, ${holder}, id, desc, &unused);\n" "}\n") set += CallOnUnforgeableHolder(self.descriptor, defineOnUnforgeable, diff --git a/dom/bindings/DOMJSClass.h b/dom/bindings/DOMJSClass.h index 0d51f3e47e80..44caaad0363a 100644 --- a/dom/bindings/DOMJSClass.h +++ b/dom/bindings/DOMJSClass.h @@ -60,7 +60,7 @@ namespace dom { typedef bool (* ResolveOwnProperty)(JSContext* cx, JS::Handle wrapper, JS::Handle obj, JS::Handle id, - JSPropertyDescriptor* desc, unsigned flags); + JS::MutableHandle desc, unsigned flags); typedef bool (* EnumerateOwnProperties)(JSContext* cx, JS::Handle wrapper, diff --git a/dom/bindings/DOMJSProxyHandler.cpp b/dom/bindings/DOMJSProxyHandler.cpp index cdf5f7b8f440..4450fca3e2a1 100644 --- a/dom/bindings/DOMJSProxyHandler.cpp +++ b/dom/bindings/DOMJSProxyHandler.cpp @@ -161,12 +161,12 @@ DOMProxyHandler::preventExtensions(JSContext *cx, JS::Handle proxy) bool DOMProxyHandler::getPropertyDescriptor(JSContext* cx, JS::Handle proxy, JS::Handle id, - JSPropertyDescriptor* desc, unsigned flags) + MutableHandle desc, unsigned flags) { if (!getOwnPropertyDescriptor(cx, proxy, id, desc, flags)) { return false; } - if (desc->obj) { + if (desc.object()) { return true; } @@ -175,18 +175,18 @@ DOMProxyHandler::getPropertyDescriptor(JSContext* cx, JS::Handle prox return false; } if (!proto) { - desc->obj = NULL; + desc.object().set(nullptr); return true; } - return JS_GetPropertyDescriptorById(cx, proto, id, 0, desc); + return JS_GetPropertyDescriptorById(cx, proto, id, 0, desc.address()); } bool DOMProxyHandler::defineProperty(JSContext* cx, JS::Handle proxy, JS::Handle id, - JSPropertyDescriptor* desc, bool* defined) + MutableHandle desc, bool* defined) { - if ((desc->attrs & JSPROP_GETTER) && desc->setter == JS_StrictPropertyStub) { + if (desc.hasGetterObject() && desc.setter() == JS_StrictPropertyStub) { return JS_ReportErrorFlagsAndNumber(cx, JSREPORT_WARNING | JSREPORT_STRICT | JSREPORT_STRICT_MODE_ERROR, @@ -204,7 +204,7 @@ DOMProxyHandler::defineProperty(JSContext* cx, JS::Handle proxy, JS:: } bool dummy; - return js_DefineOwnProperty(cx, expando, id, *desc, &dummy); + return js_DefineOwnProperty(cx, expando, id, desc, &dummy); } bool diff --git a/dom/bindings/DOMJSProxyHandler.h b/dom/bindings/DOMJSProxyHandler.h index 8fd6179843cd..a29726b84344 100644 --- a/dom/bindings/DOMJSProxyHandler.h +++ b/dom/bindings/DOMJSProxyHandler.h @@ -38,15 +38,15 @@ public: bool preventExtensions(JSContext *cx, JS::Handle proxy) MOZ_OVERRIDE; bool getPropertyDescriptor(JSContext* cx, JS::Handle proxy, JS::Handle id, - JSPropertyDescriptor* desc, unsigned flags) MOZ_OVERRIDE; + JS::MutableHandle desc, unsigned flags) MOZ_OVERRIDE; bool defineProperty(JSContext* cx, JS::Handle proxy, JS::Handle id, - JSPropertyDescriptor* desc) MOZ_OVERRIDE + JS::MutableHandle desc) MOZ_OVERRIDE { bool unused; return defineProperty(cx, proxy, id, desc, &unused); } virtual bool defineProperty(JSContext* cx, JS::Handle proxy, JS::Handle id, - JSPropertyDescriptor* desc, bool* defined); + JS::MutableHandle desc, bool* defined); bool delete_(JSContext* cx, JS::Handle proxy, JS::Handle id, bool* bp) MOZ_OVERRIDE; bool enumerate(JSContext* cx, JS::Handle proxy, JS::AutoIdVector& props) MOZ_OVERRIDE; @@ -123,19 +123,20 @@ IsArrayIndex(int32_t index) } inline void -FillPropertyDescriptor(JSPropertyDescriptor* desc, JSObject* obj, bool readonly) +FillPropertyDescriptor(JS::MutableHandle desc, JSObject* obj, bool readonly) { - desc->obj = obj; - desc->attrs = (readonly ? JSPROP_READONLY : 0) | JSPROP_ENUMERATE; - desc->getter = NULL; - desc->setter = NULL; - desc->shortid = 0; + desc.object().set(obj); + desc.setAttributes((readonly ? JSPROP_READONLY : 0) | JSPROP_ENUMERATE); + desc.setGetter(nullptr); + desc.setSetter(nullptr); + desc.setShortId(0); } inline void -FillPropertyDescriptor(JSPropertyDescriptor* desc, JSObject* obj, JS::Value v, bool readonly) +FillPropertyDescriptor(JS::MutableHandle desc, JSObject* obj, JS::Value v, + bool readonly) { - desc->value = v; + desc.value().set(v); FillPropertyDescriptor(desc, obj, readonly); } diff --git a/js/ipc/JavaScriptChild.cpp b/js/ipc/JavaScriptChild.cpp index 972de7e3b7a7..f87e0fa0c2f7 100644 --- a/js/ipc/JavaScriptChild.cpp +++ b/js/ipc/JavaScriptChild.cpp @@ -188,11 +188,11 @@ JavaScriptChild::AnswerGetPropertyDescriptor(const ObjectId &objId, const nsStri if (!convertGeckoStringToId(cx, id, &internedId)) return fail(cx, rs); - JSPropertyDescriptor desc; - if (!JS_GetPropertyDescriptorById(cx, obj, internedId, flags, &desc)) + Rooted desc(cx); + if (!JS_GetPropertyDescriptorById(cx, obj, internedId, flags, desc.address())) return fail(cx, rs); - if (!desc.obj) + if (!desc.object()) return ok(rs); if (!fromDescriptor(cx, desc, out)) @@ -221,11 +221,11 @@ JavaScriptChild::AnswerGetOwnPropertyDescriptor(const ObjectId &objId, const nsS if (!convertGeckoStringToId(cx, id, &internedId)) return fail(cx, rs); - JSPropertyDescriptor desc; - if (!JS_GetPropertyDescriptorById(cx, obj, internedId, flags, &desc)) + Rooted desc(cx); + if (!JS_GetPropertyDescriptorById(cx, obj, internedId, flags, desc.address())) return fail(cx, rs); - if (desc.obj != obj) + if (desc.object() != obj) return ok(rs); if (!fromDescriptor(cx, desc, out)) @@ -252,7 +252,7 @@ JavaScriptChild::AnswerDefineProperty(const ObjectId &objId, const nsString &id, return fail(cx, rs); Rooted desc(cx); - if (!toDescriptor(cx, descriptor, desc.address())) + if (!toDescriptor(cx, descriptor, &desc)) return false; if (!js::CheckDefineProperty(cx, obj, internedId, desc.value(), desc.getter(), diff --git a/js/ipc/JavaScriptParent.cpp b/js/ipc/JavaScriptParent.cpp index c9e810bfe140..ebfb1003037c 100644 --- a/js/ipc/JavaScriptParent.cpp +++ b/js/ipc/JavaScriptParent.cpp @@ -62,11 +62,13 @@ class CPOWProxyHandler : public BaseProxyHandler virtual bool preventExtensions(JSContext *cx, HandleObject proxy) MOZ_OVERRIDE; virtual bool getPropertyDescriptor(JSContext *cx, HandleObject proxy, HandleId id, - PropertyDescriptor *desc, unsigned flags) MOZ_OVERRIDE; + MutableHandle desc, + unsigned flags) MOZ_OVERRIDE; virtual bool getOwnPropertyDescriptor(JSContext *cx, HandleObject proxy, - HandleId id, PropertyDescriptor *desc, unsigned flags) MOZ_OVERRIDE; + HandleId id, MutableHandle desc, + unsigned flags) MOZ_OVERRIDE; virtual bool defineProperty(JSContext *cx, HandleObject proxy, HandleId id, - PropertyDescriptor *desc) MOZ_OVERRIDE; + MutableHandle desc) MOZ_OVERRIDE; virtual bool getOwnPropertyNames(JSContext *cx, HandleObject proxy, AutoIdVector &props) MOZ_OVERRIDE; virtual bool delete_(JSContext *cx, HandleObject proxy, HandleId id, bool *bp) MOZ_OVERRIDE; @@ -111,14 +113,14 @@ JavaScriptParent::preventExtensions(JSContext *cx, HandleObject proxy) bool CPOWProxyHandler::getPropertyDescriptor(JSContext *cx, HandleObject proxy, HandleId id, - PropertyDescriptor *desc, unsigned flags) + MutableHandle desc, unsigned flags) { return ParentOf(proxy)->getPropertyDescriptor(cx, proxy, id, desc, flags); } bool JavaScriptParent::getPropertyDescriptor(JSContext *cx, HandleObject proxy, HandleId id, - PropertyDescriptor *desc, unsigned flags) + MutableHandle desc, unsigned flags) { ObjectId objId = idOf(proxy); @@ -138,14 +140,15 @@ JavaScriptParent::getPropertyDescriptor(JSContext *cx, HandleObject proxy, Handl bool CPOWProxyHandler::getOwnPropertyDescriptor(JSContext *cx, HandleObject proxy, - HandleId id, PropertyDescriptor *desc, unsigned flags) + HandleId id, MutableHandle desc, + unsigned flags) { return ParentOf(proxy)->getOwnPropertyDescriptor(cx, proxy, id, desc, flags); } bool JavaScriptParent::getOwnPropertyDescriptor(JSContext *cx, HandleObject proxy, HandleId id, - PropertyDescriptor *desc, unsigned flags) + MutableHandle desc, unsigned flags) { ObjectId objId = idOf(proxy); @@ -165,14 +168,14 @@ JavaScriptParent::getOwnPropertyDescriptor(JSContext *cx, HandleObject proxy, Ha bool CPOWProxyHandler::defineProperty(JSContext *cx, HandleObject proxy, HandleId id, - PropertyDescriptor *desc) + MutableHandle desc) { return ParentOf(proxy)->defineProperty(cx, proxy, id, desc); } bool JavaScriptParent::defineProperty(JSContext *cx, HandleObject proxy, HandleId id, - PropertyDescriptor *desc) + MutableHandle desc) { ObjectId objId = idOf(proxy); @@ -181,7 +184,7 @@ JavaScriptParent::defineProperty(JSContext *cx, HandleObject proxy, HandleId id, return false; PPropertyDescriptor descriptor; - if (!fromDescriptor(cx, *desc, &descriptor)) + if (!fromDescriptor(cx, desc, &descriptor)) return false; ReturnStatus status; diff --git a/js/ipc/JavaScriptParent.h b/js/ipc/JavaScriptParent.h index 233a2575564f..afd18b6652e5 100644 --- a/js/ipc/JavaScriptParent.h +++ b/js/ipc/JavaScriptParent.h @@ -34,11 +34,11 @@ class JavaScriptParent // (The traps should be in the same order like js/src/jsproxy.h) bool preventExtensions(JSContext *cx, JS::HandleObject proxy); bool getPropertyDescriptor(JSContext *cx, JS::HandleObject proxy, JS::HandleId id, - JSPropertyDescriptor *desc, unsigned flags); + JS::MutableHandle desc, unsigned flags); bool getOwnPropertyDescriptor(JSContext *cx, JS::HandleObject proxy, JS::HandleId id, - JSPropertyDescriptor *desc, unsigned flags); + JS::MutableHandle desc, unsigned flags); bool defineProperty(JSContext *cx, JS::HandleObject proxy, JS::HandleId id, - JSPropertyDescriptor *desc); + JS::MutableHandle desc); bool getOwnPropertyNames(JSContext *cx, JS::HandleObject proxy, js::AutoIdVector &props); bool delete_(JSContext *cx, JS::HandleObject proxy, JS::HandleId id, bool *bp); bool enumerate(JSContext *cx, JS::HandleObject proxy, js::AutoIdVector &props); diff --git a/js/ipc/JavaScriptShared.cpp b/js/ipc/JavaScriptShared.cpp index 1036435f14b5..b986c5dd243f 100644 --- a/js/ipc/JavaScriptShared.cpp +++ b/js/ipc/JavaScriptShared.cpp @@ -313,39 +313,40 @@ static const uint32_t GetterOnlyPropertyStub = 2; static const uint32_t UnknownPropertyOp = 3; bool -JavaScriptShared::fromDescriptor(JSContext *cx, const JSPropertyDescriptor &desc, PPropertyDescriptor *out) +JavaScriptShared::fromDescriptor(JSContext *cx, Handle desc, + PPropertyDescriptor *out) { - out->attrs() = desc.attrs; - out->shortid() = desc.shortid; - if (!toVariant(cx, desc.value, &out->value())) + out->attrs() = desc.attributes(); + out->shortid() = desc.shortid(); + if (!toVariant(cx, desc.value(), &out->value())) return false; - if (!makeId(cx, desc.obj, &out->objId())) + if (!makeId(cx, desc.object(), &out->objId())) return false; - if (!desc.getter) { + if (!desc.getter()) { out->getter() = 0; - } else if (desc.attrs & JSPROP_GETTER) { - JSObject *getter = JS_FUNC_TO_DATA_PTR(JSObject *, desc.getter); + } else if (desc.hasGetterObject()) { + JSObject *getter = desc.getterObject(); if (!makeId(cx, getter, &out->getter())) return false; } else { - if (desc.getter == JS_PropertyStub) + if (desc.getter() == JS_PropertyStub) out->getter() = DefaultPropertyOp; else out->getter() = UnknownPropertyOp; } - if (!desc.setter) { + if (!desc.setter()) { out->setter() = 0; - } else if (desc.attrs & JSPROP_SETTER) { - JSObject *setter = JS_FUNC_TO_DATA_PTR(JSObject *, desc.setter); + } else if (desc.hasSetterObject()) { + JSObject *setter = desc.setterObject(); if (!makeId(cx, setter, &out->setter())) return false; } else { - if (desc.setter == JS_StrictPropertyStub) + if (desc.setter() == JS_StrictPropertyStub) out->setter() = DefaultPropertyOp; - else if (desc.setter == js_GetterOnlyPropertyStub) + else if (desc.setter() == js_GetterOnlyPropertyStub) out->setter() = GetterOnlyPropertyStub; else out->setter() = UnknownPropertyOp; @@ -369,45 +370,46 @@ UnknownStrictPropertyStub(JSContext *cx, HandleObject obj, HandleId id, bool str } bool -JavaScriptShared::toDescriptor(JSContext *cx, const PPropertyDescriptor &in, JSPropertyDescriptor *out) +JavaScriptShared::toDescriptor(JSContext *cx, const PPropertyDescriptor &in, + MutableHandle out) { - out->attrs = in.attrs(); - out->shortid = in.shortid(); - if (!toValue(cx, in.value(), &out->value)) + out.setAttributes(in.attrs()); + out.setShortId(in.shortid()); + if (!toValue(cx, in.value(), out.value())) return false; Rooted obj(cx); if (!unwrap(cx, in.objId(), &obj)) return false; - out->obj = obj; + out.object().set(obj); if (!in.getter()) { - out->getter = NULL; + out.setGetter(nullptr); } else if (in.attrs() & JSPROP_GETTER) { Rooted getter(cx); if (!unwrap(cx, in.getter(), &getter)) return false; - out->getter = JS_DATA_TO_FUNC_PTR(JSPropertyOp, getter.get()); + out.setGetter(JS_DATA_TO_FUNC_PTR(JSPropertyOp, getter.get())); } else { if (in.getter() == DefaultPropertyOp) - out->getter = JS_PropertyStub; + out.setGetter(JS_PropertyStub); else - out->getter = UnknownPropertyStub; + out.setGetter(UnknownPropertyStub); } if (!in.setter()) { - out->setter = NULL; + out.setSetter(nullptr); } else if (in.attrs() & JSPROP_SETTER) { Rooted setter(cx); if (!unwrap(cx, in.setter(), &setter)) return false; - out->setter = JS_DATA_TO_FUNC_PTR(JSStrictPropertyOp, setter.get()); + out.setSetter(JS_DATA_TO_FUNC_PTR(JSStrictPropertyOp, setter.get())); } else { if (in.setter() == DefaultPropertyOp) - out->setter = JS_StrictPropertyStub; + out.setSetter(JS_StrictPropertyStub); else if (in.setter() == GetterOnlyPropertyStub) - out->setter = js_GetterOnlyPropertyStub; + out.setSetter(js_GetterOnlyPropertyStub); else - out->setter = UnknownStrictPropertyStub; + out.setSetter(UnknownStrictPropertyStub); } return true; diff --git a/js/ipc/JavaScriptShared.h b/js/ipc/JavaScriptShared.h index 1685915179a6..14711d7a7f1a 100644 --- a/js/ipc/JavaScriptShared.h +++ b/js/ipc/JavaScriptShared.h @@ -96,8 +96,9 @@ class JavaScriptShared protected: bool toVariant(JSContext *cx, jsval from, JSVariant *to); bool toValue(JSContext *cx, const JSVariant &from, JS::MutableHandleValue to); - bool fromDescriptor(JSContext *cx, const JSPropertyDescriptor &desc, PPropertyDescriptor *out); - bool toDescriptor(JSContext *cx, const PPropertyDescriptor &in, JSPropertyDescriptor *out); + bool fromDescriptor(JSContext *cx, JS::Handle desc, PPropertyDescriptor *out); + bool toDescriptor(JSContext *cx, const PPropertyDescriptor &in, + JS::MutableHandle out); bool convertIdToGeckoString(JSContext *cx, JS::HandleId id, nsString *to); bool convertGeckoStringToId(JSContext *cx, const nsString &from, JS::MutableHandleId id); diff --git a/js/src/builtin/Object.cpp b/js/src/builtin/Object.cpp index 4809095530aa..48b2c5c95473 100644 --- a/js/src/builtin/Object.cpp +++ b/js/src/builtin/Object.cpp @@ -424,11 +424,11 @@ obj_lookupGetter(JSContext *cx, unsigned argc, Value *vp) // The vanilla getter lookup code below requires that the object is // native. Handle proxies separately. args.rval().setUndefined(); - AutoPropertyDescriptorRooter desc(cx); + Rooted desc(cx); if (!Proxy::getPropertyDescriptor(cx, obj, id, &desc, 0)) return false; - if (desc.obj && (desc.attrs & JSPROP_GETTER) && desc.getter) - args.rval().set(CastAsObjectJsval(desc.getter)); + if (desc.object() && desc.hasGetterObject() && desc.getterObject()) + args.rval().setObject(*desc.getterObject()); return true; } RootedObject pobj(cx); @@ -460,11 +460,11 @@ obj_lookupSetter(JSContext *cx, unsigned argc, Value *vp) // The vanilla setter lookup code below requires that the object is // native. Handle proxies separately. args.rval().setUndefined(); - AutoPropertyDescriptorRooter desc(cx); + Rooted desc(cx); if (!Proxy::getPropertyDescriptor(cx, obj, id, &desc, 0)) return false; - if (desc.obj && (desc.attrs & JSPROP_SETTER) && desc.setter) - args.rval().set(CastAsObjectJsval(desc.setter)); + if (desc.object() && desc.hasSetterObject() && desc.setterObject()) + args.rval().setObject(*desc.setterObject()); return true; } RootedObject pobj(cx); diff --git a/js/src/jsapi.cpp b/js/src/jsapi.cpp index 252984923d76..ccb028aea1e8 100644 --- a/js/src/jsapi.cpp +++ b/js/src/jsapi.cpp @@ -3117,11 +3117,11 @@ LookupResult(JSContext *cx, HandleObject obj, HandleObject obj2, HandleId id, if (!obj2->isNative()) { if (obj2->is()) { - AutoPropertyDescriptorRooter desc(cx); + Rooted desc(cx); if (!Proxy::getPropertyDescriptor(cx, obj2, id, &desc, 0)) return false; - if (!(desc.attrs & JSPROP_SHARED)) { - vp.set(desc.value); + if (!desc.isShared()) { + vp.set(desc.value()); return true; } } @@ -3595,7 +3595,7 @@ JS_DefineProperties(JSContext *cx, JSObject *objArg, const JSPropertySpec *ps) static bool GetPropertyDescriptorById(JSContext *cx, HandleObject obj, HandleId id, unsigned flags, - bool own, PropertyDescriptor *desc) + bool own, MutableHandle desc) { RootedObject obj2(cx); RootedShape shape(cx); @@ -3603,30 +3603,22 @@ GetPropertyDescriptorById(JSContext *cx, HandleObject obj, HandleId id, unsigned if (!LookupPropertyById(cx, obj, id, flags, &obj2, &shape)) return false; - if (!shape || (own && obj != obj2)) { - desc->obj = NULL; - desc->attrs = 0; - desc->getter = NULL; - desc->setter = NULL; - desc->value.setUndefined(); + JS_ASSERT(desc.isClear()); + if (!shape || (own && obj != obj2)) return true; - } - desc->obj = obj2; + desc.object().set(obj2); if (obj2->isNative()) { if (IsImplicitDenseElement(shape)) { - desc->attrs = JSPROP_ENUMERATE; - desc->getter = NULL; - desc->setter = NULL; - desc->value = obj2->getDenseElement(JSID_TO_INT(id)); + desc.setEnumerable(); + desc.value().set(obj2->getDenseElement(JSID_TO_INT(id))); } else { - desc->attrs = shape->attributes(); - desc->getter = shape->getter(); - desc->setter = shape->setter(); + desc.setAttributes(shape->attributes()); + desc.setGetter(shape->getter()); + desc.setSetter(shape->setter()); + JS_ASSERT(desc.value().isUndefined()); if (shape->hasSlot()) - desc->value = obj2->nativeGetSlot(shape->slot()); - else - desc->value.setUndefined(); + desc.value().set(obj2->nativeGetSlot(shape->slot())); } } else { if (obj2->is()) { @@ -3635,11 +3627,11 @@ GetPropertyDescriptorById(JSContext *cx, HandleObject obj, HandleId id, unsigned ? Proxy::getOwnPropertyDescriptor(cx, obj2, id, desc, 0) : Proxy::getPropertyDescriptor(cx, obj2, id, desc, 0); } - if (!JSObject::getGenericAttributes(cx, obj2, id, &desc->attrs)) + if (!JSObject::getGenericAttributes(cx, obj2, id, &desc.attributesRef())) return false; - desc->getter = NULL; - desc->setter = NULL; - desc->value.setUndefined(); + JS_ASSERT(desc.getter() == NULL); + JS_ASSERT(desc.setter() == NULL); + JS_ASSERT(desc.value().isUndefined()); } return true; } @@ -3650,7 +3642,7 @@ JS_GetPropertyDescriptorById(JSContext *cx, JSObject *objArg, jsid idArg, unsign { RootedObject obj(cx, objArg); RootedId id(cx, idArg); - AutoPropertyDescriptorRooter desc(cx); + Rooted desc(cx); if (!GetPropertyDescriptorById(cx, obj, id, flags, false, &desc)) return false; *desc_ = desc; @@ -3664,16 +3656,16 @@ JS_GetPropertyAttrsGetterAndSetterById(JSContext *cx, JSObject *objArg, jsid idA { RootedObject obj(cx, objArg); RootedId id(cx, idArg); - AutoPropertyDescriptorRooter desc(cx); + Rooted desc(cx); if (!GetPropertyDescriptorById(cx, obj, id, 0, false, &desc)) return false; - *attrsp = desc.attrs; - *foundp = (desc.obj != NULL); + *attrsp = desc.attributes(); + *foundp = !!desc.object(); if (getterp) - *getterp = desc.getter; + *getterp = desc.getter(); if (setterp) - *setterp = desc.setter; + *setterp = desc.setter(); return true; } diff --git a/js/src/jsapi.h b/js/src/jsapi.h index a53aee2adb49..b2fdfb78e599 100644 --- a/js/src/jsapi.h +++ b/js/src/jsapi.h @@ -3430,7 +3430,6 @@ template class PropertyDescriptorOperations { const JSPropertyDescriptor * desc() const { return static_cast(this)->extract(); } - JSPropertyDescriptor * desc() { return static_cast(this)->extract(); } public: bool isEnumerable() const { return desc()->attrs & JSPROP_ENUMERATE; } @@ -3439,19 +3438,17 @@ class PropertyDescriptorOperations bool hasNativeAccessors() const { return desc()->attrs & JSPROP_NATIVE_ACCESSORS; } bool hasGetterObject() const { return desc()->attrs & JSPROP_GETTER; } bool hasSetterObject() const { return desc()->attrs & JSPROP_SETTER; } + bool hasGetterOrSetterObject() const { return desc()->attrs & (JSPROP_GETTER | JSPROP_SETTER); } bool isShared() const { return desc()->attrs & JSPROP_SHARED; } bool isIndex() const { return desc()->attrs & JSPROP_INDEX; } bool hasShortId() const { return desc()->attrs & JSPROP_SHORTID; } bool hasAttributes(unsigned attrs) const { return desc()->attrs & attrs; } - JS::MutableHandle object() { - return JS::MutableHandle::fromMarkedLocation(&desc()->obj); + JS::Handle object() const { + return JS::Handle::fromMarkedLocation(&desc()->obj); } unsigned attributes() const { return desc()->attrs; } - unsigned shortid() const { - MOZ_ASSERT(hasShortId()); - return desc()->shortid; - } + unsigned shortid() const { return desc()->shortid; } JSPropertyOp getter() const { return desc()->getter; } JSStrictPropertyOp setter() const { return desc()->setter; } JS::Handle getterObject() const { @@ -3464,11 +3461,35 @@ class PropertyDescriptorOperations return JS::Handle::fromMarkedLocation( reinterpret_cast(&desc()->setter)); } + JS::Handle value() const { + return JS::Handle::fromMarkedLocation(&desc()->value); + } + + bool isClear() const { + return desc()->obj == NULL && desc()->attrs == 0 && desc()->getter == NULL && + desc()->setter == NULL && desc()->value.isUndefined(); + } +}; + +template +class MutablePropertyDescriptorOperations : public PropertyDescriptorOperations +{ + JSPropertyDescriptor * desc() { return static_cast(this)->extractMutable(); } + + public: + JS::MutableHandle object() { + return JS::MutableHandle::fromMarkedLocation(&desc()->obj); + } + unsigned &attributesRef() { return desc()->attrs; } + JSPropertyOp &getter() { return desc()->getter; } + JSStrictPropertyOp &setter() { return desc()->setter; } JS::MutableHandle value() { return JS::MutableHandle::fromMarkedLocation(&desc()->value); } + void setEnumerable() { desc()->attrs |= JSPROP_ENUMERATE; } void setAttributes(unsigned attrs) { desc()->attrs = attrs; } + void setShortId(unsigned id) { desc()->shortid = id; } void setGetter(JSPropertyOp op) { desc()->getter = op; } void setSetter(JSStrictPropertyOp op) { desc()->setter = op; } @@ -3494,13 +3515,14 @@ struct GCMethods { template <> class RootedBase - : public JS::PropertyDescriptorOperations > + : public JS::MutablePropertyDescriptorOperations > { friend class JS::PropertyDescriptorOperations >; + friend class JS::MutablePropertyDescriptorOperations >; const JSPropertyDescriptor *extract() const { return static_cast*>(this)->address(); } - JSPropertyDescriptor *extract() { + JSPropertyDescriptor *extractMutable() { return static_cast*>(this)->address(); } }; @@ -3513,24 +3535,18 @@ class HandleBase const JSPropertyDescriptor *extract() const { return static_cast*>(this)->address(); } - public: - JS::Handle value() const { - return JS::Handle::fromMarkedLocation(&extract()->value); - } - JS::Handle obj() const { - return JS::Handle::fromMarkedLocation(&extract()->obj); - } }; template <> class MutableHandleBase - : public JS::PropertyDescriptorOperations > + : public JS::MutablePropertyDescriptorOperations > { friend class JS::PropertyDescriptorOperations >; + friend class JS::MutablePropertyDescriptorOperations >; const JSPropertyDescriptor *extract() const { return static_cast*>(this)->address(); } - JSPropertyDescriptor *extract() { + JSPropertyDescriptor *extractMutable() { return static_cast*>(this)->address(); } }; diff --git a/js/src/jscompartment.cpp b/js/src/jscompartment.cpp index d64ebb07afc8..d82c3725aafc 100644 --- a/js/src/jscompartment.cpp +++ b/js/src/jscompartment.cpp @@ -418,25 +418,21 @@ JSCompartment::wrap(JSContext *cx, StrictPropertyOp *propp) } bool -JSCompartment::wrap(JSContext *cx, PropertyDescriptor *desc) +JSCompartment::wrap(JSContext *cx, MutableHandle desc) { - if (!wrap(cx, &desc->obj)) + if (!wrap(cx, desc.object().address())) return false; - if (desc->attrs & JSPROP_GETTER) { - if (!wrap(cx, &desc->getter)) + if (desc.hasGetterObject()) { + if (!wrap(cx, &desc.getter())) return false; } - if (desc->attrs & JSPROP_SETTER) { - if (!wrap(cx, &desc->setter)) + if (desc.hasSetterObject()) { + if (!wrap(cx, &desc.setter())) return false; } - RootedValue value(cx, desc->value); - if (!wrap(cx, &value)) - return false; - desc->value = value.get(); - return true; + return wrap(cx, desc.value()); } bool diff --git a/js/src/jscompartment.h b/js/src/jscompartment.h index d47e0a85bd53..f149ba8e2aab 100644 --- a/js/src/jscompartment.h +++ b/js/src/jscompartment.h @@ -295,7 +295,7 @@ struct JSCompartment bool wrapId(JSContext *cx, jsid *idp); bool wrap(JSContext *cx, js::PropertyOp *op); bool wrap(JSContext *cx, js::StrictPropertyOp *op); - bool wrap(JSContext *cx, js::PropertyDescriptor *desc); + bool wrap(JSContext *cx, JS::MutableHandle desc); bool wrap(JSContext *cx, js::AutoIdVector &props); bool putWrapper(const js::CrossCompartmentKey& wrapped, const js::Value& wrapper); diff --git a/js/src/jsfriendapi.cpp b/js/src/jsfriendapi.cpp index 252474b60010..a13975cf1170 100644 --- a/js/src/jsfriendapi.cpp +++ b/js/src/jsfriendapi.cpp @@ -243,9 +243,12 @@ JS_SetCompartmentPrincipals(JSCompartment *compartment, JSPrincipals *principals } JS_FRIEND_API(bool) -JS_WrapPropertyDescriptor(JSContext *cx, js::PropertyDescriptor *desc) +JS_WrapPropertyDescriptor(JSContext *cx, js::PropertyDescriptor *descArg) { - return cx->compartment()->wrap(cx, desc); + Rooted desc(cx, *descArg); + bool status = cx->compartment()->wrap(cx, &desc); + *descArg = desc; + return status; } JS_FRIEND_API(bool) @@ -1104,17 +1107,18 @@ js::GetObjectMetadata(JSObject *obj) JS_FRIEND_API(bool) js_DefineOwnProperty(JSContext *cx, JSObject *objArg, jsid idArg, - const js::PropertyDescriptor& descriptor, bool *bp) + const js::PropertyDescriptor& descriptorArg, bool *bp) { RootedObject obj(cx, objArg); RootedId id(cx, idArg); + Rooted descriptor(cx, descriptorArg); JS_ASSERT(cx->runtime()->heapState == js::Idle); CHECK_REQUEST(cx); - assertSameCompartment(cx, obj, id, descriptor.value); - if (descriptor.attrs & JSPROP_GETTER) - assertSameCompartment(cx, CastAsObjectJsval(descriptor.getter)); - if (descriptor.attrs & JSPROP_SETTER) - assertSameCompartment(cx, CastAsObjectJsval(descriptor.setter)); + assertSameCompartment(cx, obj, id, descriptor.value()); + if (descriptor.hasGetterObject()) + assertSameCompartment(cx, descriptor.getterObject()); + if (descriptor.hasSetterObject()) + assertSameCompartment(cx, descriptor.setterObject()); return DefineOwnProperty(cx, HandleObject(obj), id, descriptor, bp); } diff --git a/js/src/jsobj.cpp b/js/src/jsobj.cpp index 9d5a1b463e70..e9435ee8a710 100644 --- a/js/src/jsobj.cpp +++ b/js/src/jsobj.cpp @@ -185,10 +185,10 @@ js::HasOwnProperty(JSContext *cx, LookupGenericOp lookup, FakeMutableHandle objp, FakeMutableHandle propp); bool -js::NewPropertyDescriptorObject(JSContext *cx, const PropertyDescriptor *desc, +js::NewPropertyDescriptorObject(JSContext *cx, Handle desc, MutableHandleValue vp) { - if (!desc->obj) { + if (!desc.object()) { vp.setUndefined(); return true; } @@ -196,7 +196,7 @@ js::NewPropertyDescriptorObject(JSContext *cx, const PropertyDescriptor *desc, /* We have our own property, so start creating the descriptor. */ AutoPropDescRooter d(cx); - d.initFromPropertyDescriptor(*desc); + d.initFromPropertyDescriptor(desc); if (!d.makeObject(cx)) return false; vp.set(d.pd()); @@ -204,20 +204,20 @@ js::NewPropertyDescriptorObject(JSContext *cx, const PropertyDescriptor *desc, } void -PropDesc::initFromPropertyDescriptor(const PropertyDescriptor &desc) +PropDesc::initFromPropertyDescriptor(Handle desc) { isUndefined_ = false; pd_.setUndefined(); - attrs = uint8_t(desc.attrs); + attrs = uint8_t(desc.attributes()); JS_ASSERT_IF(attrs & JSPROP_READONLY, !(attrs & (JSPROP_GETTER | JSPROP_SETTER))); - if (desc.attrs & (JSPROP_GETTER | JSPROP_SETTER)) { + if (desc.hasGetterOrSetterObject()) { hasGet_ = true; - get_ = ((desc.attrs & JSPROP_GETTER) && desc.getter) - ? CastAsObjectJsval(desc.getter) + get_ = desc.hasGetterObject() && desc.getterObject() + ? ObjectValue(*desc.getterObject()) : UndefinedValue(); hasSet_ = true; - set_ = ((desc.attrs & JSPROP_SETTER) && desc.setter) - ? CastAsObjectJsval(desc.setter) + set_ = desc.hasSetterObject() && desc.setterObject() + ? ObjectValue(*desc.setterObject()) : UndefinedValue(); hasValue_ = false; value_.setUndefined(); @@ -228,7 +228,7 @@ PropDesc::initFromPropertyDescriptor(const PropertyDescriptor &desc) hasSet_ = false; set_.setUndefined(); hasValue_ = true; - value_ = desc.value; + value_ = desc.value(); hasWritable_ = true; } hasEnumerable_ = true; @@ -270,7 +270,7 @@ PropDesc::makeObject(JSContext *cx) bool js::GetOwnPropertyDescriptor(JSContext *cx, HandleObject obj, HandleId id, - PropertyDescriptor *desc) + MutableHandle desc) { // FIXME: Call TrapGetOwnProperty directly once ScriptedIndirectProxies is removed if (obj->is()) @@ -281,22 +281,22 @@ js::GetOwnPropertyDescriptor(JSContext *cx, HandleObject obj, HandleId id, if (!HasOwnProperty(cx, obj->getOps()->lookupGeneric, obj, id, &pobj, &shape)) return false; if (!shape) { - desc->obj = NULL; + desc.object().set(NULL); return true; } bool doGet = true; if (pobj->isNative()) { - desc->attrs = GetShapeAttributes(shape); - if (desc->attrs & (JSPROP_GETTER | JSPROP_SETTER)) { + desc.setAttributes(GetShapeAttributes(shape)); + if (desc.hasGetterOrSetterObject()) { doGet = false; - if (desc->attrs & JSPROP_GETTER) - desc->getter = CastAsPropertyOp(shape->getterObject()); - if (desc->attrs & JSPROP_SETTER) - desc->setter = CastAsStrictPropertyOp(shape->setterObject()); + if (desc.hasGetterObject()) + desc.setGetterObject(shape->getterObject()); + if (desc.hasSetterObject()) + desc.setSetterObject(shape->setterObject()); } } else { - if (!JSObject::getGenericAttributes(cx, pobj, id, &desc->attrs)) + if (!JSObject::getGenericAttributes(cx, pobj, id, &desc.attributesRef())) return false; } @@ -304,17 +304,17 @@ js::GetOwnPropertyDescriptor(JSContext *cx, HandleObject obj, HandleId id, if (doGet && !JSObject::getGeneric(cx, obj, obj, id, &value)) return false; - desc->value = value; - desc->obj = obj; + desc.value().set(value); + desc.object().set(obj); return true; } bool js::GetOwnPropertyDescriptor(JSContext *cx, HandleObject obj, HandleId id, MutableHandleValue vp) { - AutoPropertyDescriptorRooter desc(cx); + Rooted desc(cx); return GetOwnPropertyDescriptor(cx, obj, id, &desc) && - NewPropertyDescriptorObject(cx, &desc, vp); + NewPropertyDescriptorObject(cx, desc, vp); } bool @@ -568,29 +568,29 @@ js::CheckDefineProperty(JSContext *cx, HandleObject obj, HandleId id, HandleValu // ES5 8.12.9 Step 1. Even though we know obj is native, we use generic // APIs for shorter, more readable code. - AutoPropertyDescriptorRooter desc(cx); + Rooted desc(cx); if (!GetOwnPropertyDescriptor(cx, obj, id, &desc)) return false; // This does not have to check obj's extensibility when !desc.obj (steps // 2-3) because the low-level methods JSObject::{add,put}Property check // for that. - if (desc.obj && (desc.attrs & JSPROP_PERMANENT)) { + if (desc.object() && desc.isPermanent()) { // Steps 6-11, skipping step 10.a.ii. Prohibit redefining a permanent // property with different metadata, except to make a writable property // non-writable. - if (getter != desc.getter || - setter != desc.setter || - (attrs != desc.attrs && attrs != (desc.attrs | JSPROP_READONLY))) + if (getter != desc.getter() || + setter != desc.setter() || + (attrs != desc.attributes() && attrs != (desc.attributes() | JSPROP_READONLY))) { return Throw(cx, id, JSMSG_CANT_REDEFINE_PROP); } // Step 10.a.ii. Prohibit changing the value of a non-configurable, // non-writable data property. - if ((desc.attrs & (JSPROP_GETTER | JSPROP_SETTER | JSPROP_READONLY)) == JSPROP_READONLY) { + if ((desc.attributes() & (JSPROP_GETTER | JSPROP_SETTER | JSPROP_READONLY)) == JSPROP_READONLY) { bool same; - if (!SameValue(cx, value, desc.value, &same)) + if (!SameValue(cx, value, desc.value(), &same)) return false; if (!same) return JSObject::reportReadOnly(cx, id); @@ -1024,7 +1024,7 @@ js::DefineOwnProperty(JSContext *cx, HandleObject obj, HandleId id, HandleValue bool js::DefineOwnProperty(JSContext *cx, HandleObject obj, HandleId id, - const PropertyDescriptor &descriptor, bool *bp) + Handle descriptor, bool *bp) { AutoPropDescArrayRooter descs(cx); PropDesc *desc = descs.append(); @@ -4548,17 +4548,17 @@ baseops::SetPropertyHelper(JSContext *cx, HandleObject obj, HandleObject receive if (shape) { if (!pobj->isNative()) { if (pobj->is()) { - AutoPropertyDescriptorRooter pd(cx); + Rooted pd(cx); if (!Proxy::getPropertyDescriptor(cx, pobj, id, &pd, JSRESOLVE_ASSIGNING)) return false; - if ((pd.attrs & (JSPROP_SHARED | JSPROP_SHADOWABLE)) == JSPROP_SHARED) { - return !pd.setter || - CallSetter(cx, receiver, id, pd.setter, pd.attrs, pd.shortid, strict, - vp); + if ((pd.attributes() & (JSPROP_SHARED | JSPROP_SHADOWABLE)) == JSPROP_SHARED) { + return !pd.setter() || + CallSetter(cx, receiver, id, pd.setter(), pd.attributes(), + pd.shortid(), strict, vp); } - if (pd.attrs & JSPROP_READONLY) { + if (pd.isReadonly()) { if (strict) return JSObject::reportReadOnly(cx, id, JSREPORT_ERROR); if (cx->hasExtraWarningsOption()) diff --git a/js/src/jsobj.h b/js/src/jsobj.h index b8c5c680799b..d2a2a58920ea 100644 --- a/js/src/jsobj.h +++ b/js/src/jsobj.h @@ -1168,7 +1168,7 @@ DefineOwnProperty(JSContext *cx, JS::HandleObject obj, JS::HandleId id, extern bool DefineOwnProperty(JSContext *cx, JS::HandleObject obj, JS::HandleId id, - const js::PropertyDescriptor &descriptor, bool *bp); + JS::Handle descriptor, bool *bp); /* * The NewObjectKind allows an allocation site to specify the type properties @@ -1343,13 +1343,14 @@ GetPropertyPure(ThreadSafeContext *cx, JSObject *obj, PropertyName *name, Value } bool -GetOwnPropertyDescriptor(JSContext *cx, HandleObject obj, HandleId id, PropertyDescriptor *desc); +GetOwnPropertyDescriptor(JSContext *cx, HandleObject obj, HandleId id, + MutableHandle desc); bool GetOwnPropertyDescriptor(JSContext *cx, HandleObject obj, HandleId id, MutableHandleValue vp); bool -NewPropertyDescriptorObject(JSContext *cx, const PropertyDescriptor *desc, MutableHandleValue vp); +NewPropertyDescriptorObject(JSContext *cx, Handle desc, MutableHandleValue vp); /* * If obj has an already-resolved data property for id, return true and diff --git a/js/src/jsproxy.cpp b/js/src/jsproxy.cpp index 9a7d84996559..b31123435493 100644 --- a/js/src/jsproxy.cpp +++ b/js/src/jsproxy.cpp @@ -95,10 +95,10 @@ bool BaseProxyHandler::has(JSContext *cx, HandleObject proxy, HandleId id, bool *bp) { assertEnteredPolicy(cx, proxy, id); - AutoPropertyDescriptorRooter desc(cx); + Rooted desc(cx); if (!getPropertyDescriptor(cx, proxy, id, &desc, 0)) return false; - *bp = !!desc.obj; + *bp = !!desc.object(); return true; } @@ -106,10 +106,10 @@ bool BaseProxyHandler::hasOwn(JSContext *cx, HandleObject proxy, HandleId id, bool *bp) { assertEnteredPolicy(cx, proxy, id); - AutoPropertyDescriptorRooter desc(cx); + Rooted desc(cx); if (!getOwnPropertyDescriptor(cx, proxy, id, &desc, 0)) return false; - *bp = !!desc.obj; + *bp = !!desc.object(); return true; } @@ -119,30 +119,31 @@ BaseProxyHandler::get(JSContext *cx, HandleObject proxy, HandleObject receiver, { assertEnteredPolicy(cx, proxy, id); - AutoPropertyDescriptorRooter desc(cx); + Rooted desc(cx); if (!getPropertyDescriptor(cx, proxy, id, &desc, 0)) return false; - if (!desc.obj) { + if (!desc.object()) { vp.setUndefined(); return true; } - if (!desc.getter || - (!(desc.attrs & JSPROP_GETTER) && desc.getter == JS_PropertyStub)) { - vp.set(desc.value); + if (!desc.getter() || + (!desc.hasGetterObject() && desc.getter() == JS_PropertyStub)) + { + vp.set(desc.value()); return true; } - if (desc.attrs & JSPROP_GETTER) - return InvokeGetterOrSetter(cx, receiver, CastAsObjectJsval(desc.getter), 0, NULL, vp); - if (!(desc.attrs & JSPROP_SHARED)) - vp.set(desc.value); + if (desc.hasGetterObject()) + return InvokeGetterOrSetter(cx, receiver, ObjectValue(*desc.getterObject()), 0, NULL, vp); + if (!desc.isShared()) + vp.set(desc.value()); else vp.setUndefined(); - if (desc.attrs & JSPROP_SHORTID) { - RootedId id(cx, INT_TO_JSID(desc.shortid)); - return CallJSPropertyOp(cx, desc.getter, receiver, id, vp); + if (desc.hasShortId()) { + RootedId id(cx, INT_TO_JSID(desc.shortid())); + return CallJSPropertyOp(cx, desc.getter(), receiver, id, vp); } - return CallJSPropertyOp(cx, desc.getter, receiver, id, vp); + return CallJSPropertyOp(cx, desc.getter(), receiver, id, vp); } bool @@ -172,69 +173,69 @@ BaseProxyHandler::set(JSContext *cx, HandleObject proxy, HandleObject receiver, { assertEnteredPolicy(cx, proxy, id); - AutoPropertyDescriptorRooter desc(cx); + Rooted desc(cx); if (!getOwnPropertyDescriptor(cx, proxy, id, &desc, JSRESOLVE_ASSIGNING)) return false; /* The control-flow here differs from ::get() because of the fall-through case below. */ - if (desc.obj) { + if (desc.object()) { // Check for read-only properties. - if (desc.attrs & JSPROP_READONLY) + if (desc.isReadonly()) return strict ? Throw(cx, id, JSMSG_CANT_REDEFINE_PROP) : true; - if (!desc.setter) { + if (!desc.setter()) { // Be wary of the odd explicit undefined setter case possible through // Object.defineProperty. - if (!(desc.attrs & JSPROP_SETTER)) - desc.setter = JS_StrictPropertyStub; - } else if ((desc.attrs & JSPROP_SETTER) || desc.setter != JS_StrictPropertyStub) { - if (!CallSetter(cx, receiver, id, desc.setter, desc.attrs, desc.shortid, strict, vp)) + if (!desc.hasSetterObject()) + desc.setSetter(JS_StrictPropertyStub); + } else if (desc.hasSetterObject() || desc.setter() != JS_StrictPropertyStub) { + if (!CallSetter(cx, receiver, id, desc.setter(), desc.attributes(), desc.shortid(), strict, vp)) return false; if (!proxy->is() || proxy->as().handler() != this) return true; - if (desc.attrs & JSPROP_SHARED) + if (desc.isShared()) return true; } - if (!desc.getter) { + if (!desc.getter()) { // Same as above for the null setter case. - if (!(desc.attrs & JSPROP_GETTER)) - desc.getter = JS_PropertyStub; + if (!desc.hasGetterObject()) + desc.setGetter(JS_PropertyStub); } - desc.value = vp.get(); + desc.value().set(vp.get()); return defineProperty(cx, receiver, id, &desc); } if (!getPropertyDescriptor(cx, proxy, id, &desc, JSRESOLVE_ASSIGNING)) return false; - if (desc.obj) { + if (desc.object()) { // Check for read-only properties. - if (desc.attrs & JSPROP_READONLY) + if (desc.isReadonly()) return strict ? Throw(cx, id, JSMSG_CANT_REDEFINE_PROP) : true; - if (!desc.setter) { + if (!desc.setter()) { // Be wary of the odd explicit undefined setter case possible through // Object.defineProperty. - if (!(desc.attrs & JSPROP_SETTER)) - desc.setter = JS_StrictPropertyStub; - } else if ((desc.attrs & JSPROP_SETTER) || desc.setter != JS_StrictPropertyStub) { - if (!CallSetter(cx, receiver, id, desc.setter, desc.attrs, desc.shortid, strict, vp)) + if (!desc.hasSetterObject()) + desc.setSetter(JS_StrictPropertyStub); + } else if (desc.hasSetterObject() || desc.setter() != JS_StrictPropertyStub) { + if (!CallSetter(cx, receiver, id, desc.setter(), desc.attributes(), desc.shortid(), strict, vp)) return false; if (!proxy->is() || proxy->as().handler() != this) return true; - if (desc.attrs & JSPROP_SHARED) + if (desc.isShared()) return true; } - if (!desc.getter) { + if (!desc.getter()) { // Same as above for the null setter case. - if (!(desc.attrs & JSPROP_GETTER)) - desc.getter = JS_PropertyStub; + if (!desc.hasGetterObject()) + desc.setGetter(JS_PropertyStub); } - desc.value = vp.get(); + desc.value().set(vp.get()); return defineProperty(cx, receiver, id, &desc); } - desc.obj = receiver; - desc.value = vp.get(); - desc.attrs = JSPROP_ENUMERATE; - desc.shortid = 0; - desc.getter = NULL; - desc.setter = NULL; // Pick up the class getter/setter. + desc.object().set(receiver); + desc.value().set(vp.get()); + desc.setAttributes(JSPROP_ENUMERATE); + desc.setShortId(0); + desc.setGetter(NULL); + desc.setSetter(NULL); // Pick up the class getter/setter. return defineProperty(cx, receiver, id, &desc); } @@ -248,7 +249,7 @@ BaseProxyHandler::keys(JSContext *cx, HandleObject proxy, AutoIdVector &props) return false; /* Select only the enumerable properties through in-place iteration. */ - AutoPropertyDescriptorRooter desc(cx); + Rooted desc(cx); RootedId id(cx); size_t i = 0; for (size_t j = 0, len = props.length(); j < len; j++) { @@ -257,7 +258,7 @@ BaseProxyHandler::keys(JSContext *cx, HandleObject proxy, AutoIdVector &props) AutoWaivePolicy policy(cx, proxy, id); if (!getOwnPropertyDescriptor(cx, proxy, id, &desc, 0)) return false; - if (desc.obj && (desc.attrs & JSPROP_ENUMERATE)) + if (desc.object() && desc.isEnumerable()) props[i++] = id; } @@ -365,33 +366,34 @@ BaseProxyHandler::getPrototypeOf(JSContext *cx, HandleObject proxy, MutableHandl bool DirectProxyHandler::getPropertyDescriptor(JSContext *cx, HandleObject proxy, HandleId id, - PropertyDescriptor *desc, unsigned flags) + MutableHandle desc, unsigned flags) { assertEnteredPolicy(cx, proxy, id); JS_ASSERT(!hasPrototype()); // Should never be called if there's a prototype. RootedObject target(cx, proxy->as().target()); - return JS_GetPropertyDescriptorById(cx, target, id, 0, desc); + return JS_GetPropertyDescriptorById(cx, target, id, 0, desc.address()); } static bool GetOwnPropertyDescriptor(JSContext *cx, HandleObject obj, HandleId id, unsigned flags, - JSPropertyDescriptor *desc) + MutableHandle desc) { // If obj is a proxy, we can do better than just guessing. This is // important for certain types of wrappers that wrap other wrappers. if (obj->is()) return Proxy::getOwnPropertyDescriptor(cx, obj, id, desc, flags); - if (!JS_GetPropertyDescriptorById(cx, obj, id, flags, desc)) + if (!JS_GetPropertyDescriptorById(cx, obj, id, flags, desc.address())) return false; - if (desc->obj != obj) - desc->obj = NULL; + if (desc.object() != obj) + desc.object().set(NULL); return true; } bool DirectProxyHandler::getOwnPropertyDescriptor(JSContext *cx, HandleObject proxy, - HandleId id, PropertyDescriptor *desc, unsigned flags) + HandleId id, MutableHandle desc, + unsigned flags) { assertEnteredPolicy(cx, proxy, id); RootedObject target(cx, proxy->as().target()); @@ -400,13 +402,13 @@ DirectProxyHandler::getOwnPropertyDescriptor(JSContext *cx, HandleObject proxy, bool DirectProxyHandler::defineProperty(JSContext *cx, HandleObject proxy, HandleId id, - PropertyDescriptor *desc) + MutableHandle desc) { assertEnteredPolicy(cx, proxy, id); RootedObject target(cx, proxy->as().target()); - RootedValue v(cx, desc->value); - return CheckDefineProperty(cx, target, id, v, desc->getter, desc->setter, desc->attrs) && - JS_DefinePropertyById(cx, target, id, v, desc->getter, desc->setter, desc->attrs); + RootedValue v(cx, desc.value()); + return CheckDefineProperty(cx, target, id, v, desc.getter(), desc.setter(), desc.attributes()) && + JS_DefinePropertyById(cx, target, id, v, desc.getter(), desc.setter(), desc.attributes()); } bool @@ -551,10 +553,10 @@ DirectProxyHandler::hasOwn(JSContext *cx, HandleObject proxy, HandleId id, bool { assertEnteredPolicy(cx, proxy, id); RootedObject target(cx, proxy->as().target()); - AutoPropertyDescriptorRooter desc(cx); - if (!JS_GetPropertyDescriptorById(cx, target, id, 0, &desc)) + Rooted desc(cx); + if (!JS_GetPropertyDescriptorById(cx, target, id, 0, desc.address())) return false; - *bp = (desc.obj == target); + *bp = (desc.object() == target); return true; } @@ -666,7 +668,7 @@ Trap2(JSContext *cx, HandleObject handler, HandleValue fval, HandleId id, Value static bool ParsePropertyDescriptorObject(JSContext *cx, HandleObject obj, const Value &v, - PropertyDescriptor *desc, bool complete = false) + MutableHandle desc, bool complete = false) { AutoPropDescArrayRooter descs(cx); PropDesc *d = descs.append(); @@ -674,20 +676,20 @@ ParsePropertyDescriptorObject(JSContext *cx, HandleObject obj, const Value &v, return false; if (complete) d->complete(); - desc->obj = obj; - desc->value = d->hasValue() ? d->value() : UndefinedValue(); + desc.object().set(obj); + desc.value().set(d->hasValue() ? d->value() : UndefinedValue()); JS_ASSERT(!(d->attributes() & JSPROP_SHORTID)); - desc->attrs = d->attributes(); - desc->getter = d->getter(); - desc->setter = d->setter(); - desc->shortid = 0; + desc.setAttributes(d->attributes()); + desc.setGetter(d->getter()); + desc.setSetter(d->setter()); + desc.setShortId(0); return true; } static bool -IndicatePropertyNotFound(PropertyDescriptor *desc) +IndicatePropertyNotFound(MutableHandle desc) { - desc->obj = NULL; + desc.object().set(NULL); return true; } @@ -752,11 +754,13 @@ class ScriptedIndirectProxyHandler : public BaseProxyHandler /* ES5 Harmony fundamental proxy traps. */ virtual bool preventExtensions(JSContext *cx, HandleObject proxy) MOZ_OVERRIDE; virtual bool getPropertyDescriptor(JSContext *cx, HandleObject proxy, HandleId id, - PropertyDescriptor *desc, unsigned flags) MOZ_OVERRIDE; + MutableHandle desc, + unsigned flags) MOZ_OVERRIDE; virtual bool getOwnPropertyDescriptor(JSContext *cx, HandleObject proxy, HandleId id, - PropertyDescriptor *desc, unsigned flags) MOZ_OVERRIDE; + MutableHandle desc, + unsigned flags) MOZ_OVERRIDE; virtual bool defineProperty(JSContext *cx, HandleObject proxy, HandleId id, - PropertyDescriptor *desc) MOZ_OVERRIDE; + MutableHandle desc) MOZ_OVERRIDE; virtual bool getOwnPropertyNames(JSContext *cx, HandleObject proxy, AutoIdVector &props); virtual bool delete_(JSContext *cx, HandleObject proxy, HandleId id, bool *bp) MOZ_OVERRIDE; virtual bool enumerate(JSContext *cx, HandleObject proxy, AutoIdVector &props) MOZ_OVERRIDE; @@ -835,7 +839,8 @@ GetIndirectProxyHandlerObject(JSObject *proxy) bool ScriptedIndirectProxyHandler::getPropertyDescriptor(JSContext *cx, HandleObject proxy, HandleId id, - PropertyDescriptor *desc, unsigned flags) + MutableHandle desc, + unsigned flags) { RootedObject handler(cx, GetIndirectProxyHandlerObject(proxy)); RootedValue fval(cx), value(cx); @@ -848,7 +853,8 @@ ScriptedIndirectProxyHandler::getPropertyDescriptor(JSContext *cx, HandleObject bool ScriptedIndirectProxyHandler::getOwnPropertyDescriptor(JSContext *cx, HandleObject proxy, HandleId id, - PropertyDescriptor *desc, unsigned flags) + MutableHandle desc, + unsigned flags) { RootedObject handler(cx, GetIndirectProxyHandlerObject(proxy)); RootedValue fval(cx), value(cx); @@ -861,7 +867,7 @@ ScriptedIndirectProxyHandler::getOwnPropertyDescriptor(JSContext *cx, HandleObje bool ScriptedIndirectProxyHandler::defineProperty(JSContext *cx, HandleObject proxy, HandleId id, - PropertyDescriptor *desc) + MutableHandle desc) { RootedObject handler(cx, GetIndirectProxyHandlerObject(proxy)); RootedValue fval(cx), value(cx); @@ -1063,11 +1069,13 @@ class ScriptedDirectProxyHandler : public DirectProxyHandler { /* ES5 Harmony fundamental proxy traps. */ virtual bool preventExtensions(JSContext *cx, HandleObject proxy) MOZ_OVERRIDE; virtual bool getPropertyDescriptor(JSContext *cx, HandleObject proxy, HandleId id, - PropertyDescriptor *desc, unsigned flags) MOZ_OVERRIDE; + MutableHandle desc, + unsigned flags) MOZ_OVERRIDE; virtual bool getOwnPropertyDescriptor(JSContext *cx, HandleObject proxy, HandleId id, - PropertyDescriptor *desc, unsigned flags) MOZ_OVERRIDE; + MutableHandle desc, + unsigned flags) MOZ_OVERRIDE; virtual bool defineProperty(JSContext *cx, HandleObject proxy, HandleId id, - PropertyDescriptor *desc) MOZ_OVERRIDE; + MutableHandle desc) MOZ_OVERRIDE; virtual bool getOwnPropertyNames(JSContext *cx, HandleObject proxy, AutoIdVector &props); virtual bool delete_(JSContext *cx, HandleObject proxy, HandleId id, bool *bp) MOZ_OVERRIDE; virtual bool enumerate(JSContext *cx, HandleObject proxy, AutoIdVector &props) MOZ_OVERRIDE; @@ -1198,7 +1206,7 @@ static bool ValidateProperty(JSContext *cx, HandleObject obj, HandleId id, PropDesc *desc, bool *bp) { // step 1 - AutoPropertyDescriptorRooter current(cx); + Rooted current(cx); if (!GetOwnPropertyDescriptor(cx, obj, id, 0, ¤t)) return false; @@ -1206,7 +1214,7 @@ ValidateProperty(JSContext *cx, HandleObject obj, HandleId id, PropDesc *desc, b * steps 2-4 are redundant since ValidateProperty is never called unless * target.[[HasOwn]](P) is true */ - JS_ASSERT(current.obj); + JS_ASSERT(current.object()); // step 5 if (!desc->hasValue() && !desc->hasWritable() && !desc->hasGet() && !desc->hasSet() && @@ -1217,18 +1225,18 @@ ValidateProperty(JSContext *cx, HandleObject obj, HandleId id, PropDesc *desc, b } // step 6 - if ((!desc->hasWritable() || desc->writable() == !(current.attrs & JSPROP_READONLY)) && - (!desc->hasGet() || desc->getter() == current.getter) && - (!desc->hasSet() || desc->setter() == current.setter) && - (!desc->hasEnumerable() || desc->enumerable() == bool(current.attrs & JSPROP_ENUMERATE)) && - (!desc->hasConfigurable() || desc->configurable() == !(current.attrs & JSPROP_PERMANENT))) + if ((!desc->hasWritable() || desc->writable() == !current.isReadonly()) && + (!desc->hasGet() || desc->getter() == current.getter()) && + (!desc->hasSet() || desc->setter() == current.setter()) && + (!desc->hasEnumerable() || desc->enumerable() == current.isEnumerable()) && + (!desc->hasConfigurable() || desc->configurable() == !current.isPermanent())) { if (!desc->hasValue()) { *bp = true; return true; } bool same = false; - if (!SameValue(cx, desc->value(), current.value, &same)) + if (!SameValue(cx, desc->value(), current.value(), &same)) return false; if (same) { *bp = true; @@ -1237,14 +1245,14 @@ ValidateProperty(JSContext *cx, HandleObject obj, HandleId id, PropDesc *desc, b } // step 7 - if (current.attrs & JSPROP_PERMANENT) { + if (current.isPermanent()) { if (desc->hasConfigurable() && desc->configurable()) { *bp = false; return true; } if (desc->hasEnumerable() && - desc->enumerable() != bool(current.attrs & JSPROP_ENUMERATE)) + desc->enumerable() != current.isEnumerable()) { *bp = false; return true; @@ -1259,14 +1267,14 @@ ValidateProperty(JSContext *cx, HandleObject obj, HandleId id, PropDesc *desc, b // step 9 if (IsDataDescriptor(current) != desc->isDataDescriptor()) { - *bp = !(current.attrs & JSPROP_PERMANENT); + *bp = !current.isPermanent(); return true; } // step 10 if (IsDataDescriptor(current)) { JS_ASSERT(desc->isDataDescriptor()); // by step 9 - if ((current.attrs & JSPROP_PERMANENT) && (current.attrs & JSPROP_READONLY)) { + if (current.isPermanent() && current.isReadonly()) { if (desc->hasWritable() && desc->writable()) { *bp = false; return true; @@ -1274,7 +1282,7 @@ ValidateProperty(JSContext *cx, HandleObject obj, HandleId id, PropDesc *desc, b if (desc->hasValue()) { bool same; - if (!SameValue(cx, desc->value(), current.value, &same)) + if (!SameValue(cx, desc->value(), current.value(), &same)) return false; if (!same) { *bp = false; @@ -1290,9 +1298,9 @@ ValidateProperty(JSContext *cx, HandleObject obj, HandleId id, PropDesc *desc, b // steps 11-12 JS_ASSERT(IsAccessorDescriptor(current)); // by step 10 JS_ASSERT(desc->isAccessorDescriptor()); // by step 9 - *bp = (!(current.attrs & JSPROP_PERMANENT) || - ((!desc->hasSet() || desc->setter() == current.setter) && - (!desc->hasGet() || desc->getter() == current.getter))); + *bp = (!current.isPermanent() || + ((!desc->hasSet() || desc->setter() == current.setter()) && + (!desc->hasGet() || desc->getter() == current.getter()))); return true; } @@ -1301,22 +1309,22 @@ static bool IsSealed(JSContext* cx, HandleObject obj, HandleId id, bool *bp) { // step 1 - AutoPropertyDescriptorRooter desc(cx); + Rooted desc(cx); if (!GetOwnPropertyDescriptor(cx, obj, id, 0, &desc)) return false; // steps 2-3 - *bp = desc.obj && (desc.attrs & JSPROP_PERMANENT); + *bp = desc.object() && desc.isPermanent(); return true; } static bool HasOwn(JSContext *cx, HandleObject obj, HandleId id, bool *bp) { - AutoPropertyDescriptorRooter desc(cx); - if (!JS_GetPropertyDescriptorById(cx, obj, id, 0, &desc)) + Rooted desc(cx); + if (!JS_GetPropertyDescriptorById(cx, obj, id, 0, desc.address())) return false; - *bp = (desc.obj == obj); + *bp = (desc.object() == obj); return true; } @@ -1348,10 +1356,10 @@ TrapGetOwnProperty(JSContext *cx, HandleObject proxy, HandleId id, MutableHandle // step 4 if (trap.isUndefined()) { - AutoPropertyDescriptorRooter desc(cx); + Rooted desc(cx); if (!GetOwnPropertyDescriptor(cx, target, id, &desc)) return false; - return NewPropertyDescriptorObject(cx, &desc, rval); + return NewPropertyDescriptorObject(cx, desc, rval); } // step 5 @@ -1456,11 +1464,11 @@ TrapDefineOwnProperty(JSContext *cx, HandleObject proxy, HandleId id, MutableHan // step 4 if (trap.isUndefined()) { - AutoPropertyDescriptorRooter desc(cx); + Rooted desc(cx); if (!ParsePropertyDescriptorObject(cx, proxy, vp, &desc)) return false; - return JS_DefinePropertyById(cx, target, id, desc.value, desc.getter, desc.setter, - desc.attrs); + return JS_DefinePropertyById(cx, target, id, desc.value(), desc.getter(), desc.setter(), + desc.attributes()); } // step 5 @@ -1693,27 +1701,29 @@ ScriptedDirectProxyHandler::preventExtensions(JSContext *cx, HandleObject proxy) // FIXME: Move to Proxy::getPropertyDescriptor once ScriptedIndirectProxy is removed bool ScriptedDirectProxyHandler::getPropertyDescriptor(JSContext *cx, HandleObject proxy, HandleId id, - PropertyDescriptor *desc, unsigned flags) + MutableHandle desc, + unsigned flags) { JS_CHECK_RECURSION(cx, return false); if (!GetOwnPropertyDescriptor(cx, proxy, id, desc)) return false; - if (desc->obj) + if (desc.object()) return true; RootedObject proto(cx); if (!JSObject::getProto(cx, proxy, &proto)) return false; if (!proto) { - JS_ASSERT(!desc->obj); + JS_ASSERT(!desc.object()); return true; } - return JS_GetPropertyDescriptorById(cx, proto, id, 0, desc); + return JS_GetPropertyDescriptorById(cx, proto, id, 0, desc.address()); } bool ScriptedDirectProxyHandler::getOwnPropertyDescriptor(JSContext *cx, HandleObject proxy, HandleId id, - PropertyDescriptor *desc, unsigned flags) + MutableHandle desc, + unsigned flags) { // step 1 RootedValue v(cx); @@ -1722,7 +1732,7 @@ ScriptedDirectProxyHandler::getOwnPropertyDescriptor(JSContext *cx, HandleObject // step 2 if (v.isUndefined()) { - desc->obj = NULL; + desc.object().set(NULL); return true; } @@ -1732,12 +1742,12 @@ ScriptedDirectProxyHandler::getOwnPropertyDescriptor(JSContext *cx, HandleObject bool ScriptedDirectProxyHandler::defineProperty(JSContext *cx, HandleObject proxy, HandleId id, - PropertyDescriptor *desc) + MutableHandle desc) { // step 1 AutoPropDescArrayRooter descs(cx); PropDesc *d = descs.append(); - d->initFromPropertyDescriptor(*desc); + d->initFromPropertyDescriptor(desc); RootedValue v(cx); if (!FromGenericPropertyDescriptor(cx, d, &v)) return false; @@ -2052,18 +2062,15 @@ ScriptedDirectProxyHandler::get(JSContext *cx, HandleObject proxy, HandleObject return false; // step 6 - AutoPropertyDescriptorRooter desc(cx); + Rooted desc(cx); if (!GetOwnPropertyDescriptor(cx, target, id, &desc)) return false; // step 7 - if (desc.obj) { - if (IsDataDescriptor(desc) && - (desc.attrs & JSPROP_PERMANENT) && - (desc.attrs & JSPROP_READONLY)) - { + if (desc.object()) { + if (IsDataDescriptor(desc) && desc.isPermanent() && desc.isReadonly()) { bool same; - if (!SameValue(cx, vp, desc.value, &same)) + if (!SameValue(cx, vp, desc.value(), &same)) return false; if (!same) { JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_MUST_REPORT_SAME_VALUE); @@ -2071,10 +2078,7 @@ ScriptedDirectProxyHandler::get(JSContext *cx, HandleObject proxy, HandleObject } } - if (IsAccessorDescriptor(desc) && - (desc.attrs & JSPROP_PERMANENT) && - !(desc.attrs & JSPROP_GETTER)) - { + if (IsAccessorDescriptor(desc) && desc.isPermanent() && !desc.hasGetterObject()) { if (!trapResult.isUndefined()) { JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_MUST_REPORT_UNDEFINED); return false; @@ -2126,15 +2130,14 @@ ScriptedDirectProxyHandler::set(JSContext *cx, HandleObject proxy, HandleObject // step 7 if (success) { - AutoPropertyDescriptorRooter desc(cx); + Rooted desc(cx); if (!GetOwnPropertyDescriptor(cx, target, id, &desc)) return false; - if (desc.obj) { - if (IsDataDescriptor(desc) && (desc.attrs & JSPROP_PERMANENT) && - (desc.attrs & JSPROP_READONLY)) { + if (desc.object()) { + if (IsDataDescriptor(desc) && desc.isPermanent() && desc.isReadonly()) { bool same; - if (!SameValue(cx, vp, desc.value, &same)) + if (!SameValue(cx, vp, desc.value(), &same)) return false; if (!same) { JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_CANT_SET_NW_NC); @@ -2142,11 +2145,9 @@ ScriptedDirectProxyHandler::set(JSContext *cx, HandleObject proxy, HandleObject } } - if (IsAccessorDescriptor(desc) && (desc.attrs & JSPROP_PERMANENT)) { - if (!(desc.attrs & JSPROP_SETTER)) { - JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_CANT_SET_WO_SETTER); - return false; - } + if (IsAccessorDescriptor(desc) && desc.isPermanent() && !desc.hasSetterObject()) { + JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_CANT_SET_WO_SETTER); + return false; } } } @@ -2296,11 +2297,11 @@ ScriptedDirectProxyHandler ScriptedDirectProxyHandler::singleton; bool Proxy::getPropertyDescriptor(JSContext *cx, HandleObject proxy, HandleId id, - PropertyDescriptor *desc, unsigned flags) + MutableHandle desc, unsigned flags) { JS_CHECK_RECURSION(cx, return false); BaseProxyHandler *handler = proxy->as().handler(); - desc->obj = NULL; // default result if we refuse to perform this action + desc.object().set(NULL); // default result if we refuse to perform this action AutoEnterPolicy policy(cx, handler, proxy, id, BaseProxyHandler::GET, true); if (!policy.allowed()) return policy.returnValue(); @@ -2308,10 +2309,10 @@ Proxy::getPropertyDescriptor(JSContext *cx, HandleObject proxy, HandleId id, return handler->getPropertyDescriptor(cx, proxy, id, desc, flags); if (!handler->getOwnPropertyDescriptor(cx, proxy, id, desc, flags)) return false; - if (desc->obj) + if (desc.object()) return true; INVOKE_ON_PROTOTYPE(cx, handler, proxy, - JS_GetPropertyDescriptorById(cx, proto, id, 0, desc)); + JS_GetPropertyDescriptorById(cx, proto, id, 0, desc.address())); } bool @@ -2320,20 +2321,20 @@ Proxy::getPropertyDescriptor(JSContext *cx, HandleObject proxy, unsigned flags, { JS_CHECK_RECURSION(cx, return false); - AutoPropertyDescriptorRooter desc(cx); + Rooted desc(cx); if (!Proxy::getPropertyDescriptor(cx, proxy, id, &desc, flags)) return false; - return NewPropertyDescriptorObject(cx, &desc, vp); + return NewPropertyDescriptorObject(cx, desc, vp); } bool Proxy::getOwnPropertyDescriptor(JSContext *cx, HandleObject proxy, HandleId id, - PropertyDescriptor *desc, unsigned flags) + MutableHandle desc, unsigned flags) { JS_CHECK_RECURSION(cx, return false); BaseProxyHandler *handler = proxy->as().handler(); - desc->obj = NULL; // default result if we refuse to perform this action + desc.object().set(NULL); // default result if we refuse to perform this action AutoEnterPolicy policy(cx, handler, proxy, id, BaseProxyHandler::GET, true); if (!policy.allowed()) return policy.returnValue(); @@ -2346,14 +2347,15 @@ Proxy::getOwnPropertyDescriptor(JSContext *cx, HandleObject proxy, unsigned flag { JS_CHECK_RECURSION(cx, return false); - AutoPropertyDescriptorRooter desc(cx); + Rooted desc(cx); if (!Proxy::getOwnPropertyDescriptor(cx, proxy, id, &desc, flags)) return false; - return NewPropertyDescriptorObject(cx, &desc, vp); + return NewPropertyDescriptorObject(cx, desc, vp); } bool -Proxy::defineProperty(JSContext *cx, HandleObject proxy, HandleId id, PropertyDescriptor *desc) +Proxy::defineProperty(JSContext *cx, HandleObject proxy, HandleId id, + MutableHandle desc) { JS_CHECK_RECURSION(cx, return false); BaseProxyHandler *handler = proxy->as().handler(); @@ -2367,7 +2369,7 @@ bool Proxy::defineProperty(JSContext *cx, HandleObject proxy, HandleId id, HandleValue v) { JS_CHECK_RECURSION(cx, return false); - AutoPropertyDescriptorRooter desc(cx); + Rooted desc(cx); return ParsePropertyDescriptorObject(cx, proxy, v, &desc) && Proxy::defineProperty(cx, proxy, id, &desc); } @@ -2542,10 +2544,10 @@ Proxy::set(JSContext *cx, HandleObject proxy, HandleObject receiver, HandleId id if (!handler->getPrototypeOf(cx, proxy, &proto)) return false; if (proto) { - AutoPropertyDescriptorRooter desc(cx); - if (!JS_GetPropertyDescriptorById(cx, proto, id, 0, &desc)) + Rooted desc(cx); + if (!JS_GetPropertyDescriptorById(cx, proto, id, 0, desc.address())) return false; - if (desc.obj && desc.setter) + if (desc.object() && desc.setter()) return JSObject::setGeneric(cx, proto, receiver, id, vp, strict); } } @@ -2788,13 +2790,13 @@ static bool proxy_DefineGeneric(JSContext *cx, HandleObject obj, HandleId id, HandleValue value, PropertyOp getter, StrictPropertyOp setter, unsigned attrs) { - AutoPropertyDescriptorRooter desc(cx); - desc.obj = obj; - desc.value = value; - desc.attrs = (attrs & (~JSPROP_SHORTID)); - desc.getter = getter; - desc.setter = setter; - desc.shortid = 0; + Rooted desc(cx); + desc.object().set(obj); + desc.value().set(value); + desc.setAttributes(attrs & (~JSPROP_SHORTID)); + desc.setGetter(getter); + desc.setSetter(setter); + desc.setShortId(0); return Proxy::defineProperty(cx, obj, id, &desc); } @@ -2900,10 +2902,10 @@ proxy_SetSpecial(JSContext *cx, HandleObject obj, HandleSpecialId sid, static bool proxy_GetGenericAttributes(JSContext *cx, HandleObject obj, HandleId id, unsigned *attrsp) { - AutoPropertyDescriptorRooter desc(cx); + Rooted desc(cx); if (!Proxy::getOwnPropertyDescriptor(cx, obj, id, &desc, 0)) return false; - *attrsp = desc.attrs; + *attrsp = desc.attributes(); return true; } @@ -2934,10 +2936,10 @@ static bool proxy_SetGenericAttributes(JSContext *cx, HandleObject obj, HandleId id, unsigned *attrsp) { /* Lookup the current property descriptor so we have setter/getter/value. */ - AutoPropertyDescriptorRooter desc(cx); + Rooted desc(cx); if (!Proxy::getOwnPropertyDescriptor(cx, obj, id, &desc, JSRESOLVE_ASSIGNING)) return false; - desc.attrs = (*attrsp & (~JSPROP_SHORTID)); + desc.setAttributes(*attrsp & (~JSPROP_SHORTID)); return Proxy::defineProperty(cx, obj, id, &desc); } diff --git a/js/src/jsproxy.h b/js/src/jsproxy.h index 56868a05c3ce..d2780bbfa0db 100644 --- a/js/src/jsproxy.h +++ b/js/src/jsproxy.h @@ -106,12 +106,13 @@ class JS_FRIEND_API(BaseProxyHandler) /* ES5 Harmony fundamental proxy traps. */ virtual bool preventExtensions(JSContext *cx, HandleObject proxy) = 0; virtual bool getPropertyDescriptor(JSContext *cx, HandleObject proxy, HandleId id, - PropertyDescriptor *desc, unsigned flags) = 0; + MutableHandle desc, + unsigned flags) = 0; virtual bool getOwnPropertyDescriptor(JSContext *cx, HandleObject proxy, - HandleId id, PropertyDescriptor *desc, + HandleId id, MutableHandle desc, unsigned flags) = 0; virtual bool defineProperty(JSContext *cx, HandleObject proxy, HandleId id, - PropertyDescriptor *desc) = 0; + MutableHandle desc) = 0; virtual bool getOwnPropertyNames(JSContext *cx, HandleObject proxy, AutoIdVector &props) = 0; virtual bool delete_(JSContext *cx, HandleObject proxy, HandleId id, bool *bp) = 0; @@ -162,12 +163,12 @@ class JS_PUBLIC_API(DirectProxyHandler) : public BaseProxyHandler /* ES5 Harmony fundamental proxy traps. */ virtual bool preventExtensions(JSContext *cx, HandleObject proxy) MOZ_OVERRIDE; virtual bool getPropertyDescriptor(JSContext *cx, HandleObject proxy, HandleId id, - PropertyDescriptor *desc, unsigned flags) MOZ_OVERRIDE; + MutableHandle desc, unsigned flags) MOZ_OVERRIDE; virtual bool getOwnPropertyDescriptor(JSContext *cx, HandleObject proxy, - HandleId id, PropertyDescriptor *desc, + HandleId id, MutableHandle desc, unsigned flags) MOZ_OVERRIDE; virtual bool defineProperty(JSContext *cx, HandleObject proxy, HandleId id, - PropertyDescriptor *desc) MOZ_OVERRIDE; + MutableHandle desc) MOZ_OVERRIDE; virtual bool getOwnPropertyNames(JSContext *cx, HandleObject proxy, AutoIdVector &props) MOZ_OVERRIDE; virtual bool delete_(JSContext *cx, HandleObject proxy, HandleId id, @@ -216,14 +217,15 @@ class Proxy /* ES5 Harmony fundamental proxy traps. */ static bool preventExtensions(JSContext *cx, HandleObject proxy); static bool getPropertyDescriptor(JSContext *cx, HandleObject proxy, HandleId id, - PropertyDescriptor *desc, unsigned flags); + MutableHandle desc, unsigned flags); static bool getPropertyDescriptor(JSContext *cx, HandleObject proxy, unsigned flags, HandleId id, MutableHandleValue vp); static bool getOwnPropertyDescriptor(JSContext *cx, HandleObject proxy, HandleId id, - PropertyDescriptor *desc, unsigned flags); + MutableHandle desc, unsigned flags); static bool getOwnPropertyDescriptor(JSContext *cx, HandleObject proxy, unsigned flags, HandleId id, MutableHandleValue vp); - static bool defineProperty(JSContext *cx, HandleObject proxy, HandleId id, PropertyDescriptor *desc); + static bool defineProperty(JSContext *cx, HandleObject proxy, HandleId id, + MutableHandle desc); static bool defineProperty(JSContext *cx, HandleObject proxy, HandleId id, HandleValue v); static bool getOwnPropertyNames(JSContext *cx, HandleObject proxy, AutoIdVector &props); static bool delete_(JSContext *cx, HandleObject proxy, HandleId id, bool *bp); diff --git a/js/src/jswrapper.cpp b/js/src/jswrapper.cpp index 986d7d17597b..f86f4c50349c 100644 --- a/js/src/jswrapper.cpp +++ b/js/src/jswrapper.cpp @@ -203,7 +203,7 @@ CrossCompartmentWrapper::preventExtensions(JSContext *cx, HandleObject wrapper) bool CrossCompartmentWrapper::getPropertyDescriptor(JSContext *cx, HandleObject wrapper, HandleId id, - PropertyDescriptor *desc, unsigned flags) + MutableHandle desc, unsigned flags) { RootedId idCopy(cx, id); PIERCE(cx, wrapper, @@ -214,7 +214,7 @@ CrossCompartmentWrapper::getPropertyDescriptor(JSContext *cx, HandleObject wrapp bool CrossCompartmentWrapper::getOwnPropertyDescriptor(JSContext *cx, HandleObject wrapper, - HandleId id, PropertyDescriptor *desc, + HandleId id, MutableHandle desc, unsigned flags) { RootedId idCopy(cx, id); @@ -226,10 +226,10 @@ CrossCompartmentWrapper::getOwnPropertyDescriptor(JSContext *cx, HandleObject wr bool CrossCompartmentWrapper::defineProperty(JSContext *cx, HandleObject wrapper, HandleId id, - PropertyDescriptor *desc) + MutableHandle desc) { RootedId idCopy(cx, id); - AutoPropertyDescriptorRooter desc2(cx, desc); + Rooted desc2(cx, desc); PIERCE(cx, wrapper, cx->compartment()->wrapId(cx, idCopy.address()) && cx->compartment()->wrap(cx, &desc2), Wrapper::defineProperty(cx, wrapper, idCopy, &desc2), @@ -657,9 +657,9 @@ SecurityWrapper::regexp_toShared(JSContext *cx, HandleObject obj, RegExpGu template bool SecurityWrapper::defineProperty(JSContext *cx, HandleObject wrapper, - HandleId id, PropertyDescriptor *desc) + HandleId id, MutableHandle desc) { - if (desc->getter || desc->setter) { + if (desc.getter() || desc.setter()) { JSString *str = IdToString(cx, id); const jschar *prop = str ? str->getCharsZ(cx) : NULL; JS_ReportErrorNumberUC(cx, js_GetErrorMessage, NULL, @@ -696,7 +696,7 @@ DeadObjectProxy::preventExtensions(JSContext *cx, HandleObject proxy) bool DeadObjectProxy::getPropertyDescriptor(JSContext *cx, HandleObject wrapper, HandleId id, - PropertyDescriptor *desc, unsigned flags) + MutableHandle desc, unsigned flags) { JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_DEAD_OBJECT); return false; @@ -704,7 +704,7 @@ DeadObjectProxy::getPropertyDescriptor(JSContext *cx, HandleObject wrapper, Hand bool DeadObjectProxy::getOwnPropertyDescriptor(JSContext *cx, HandleObject wrapper, HandleId id, - PropertyDescriptor *desc, unsigned flags) + MutableHandle desc, unsigned flags) { JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_DEAD_OBJECT); return false; @@ -712,7 +712,7 @@ DeadObjectProxy::getOwnPropertyDescriptor(JSContext *cx, HandleObject wrapper, H bool DeadObjectProxy::defineProperty(JSContext *cx, HandleObject wrapper, HandleId id, - PropertyDescriptor *desc) + MutableHandle desc) { JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_DEAD_OBJECT); return false; diff --git a/js/src/jswrapper.h b/js/src/jswrapper.h index f78df7db60f3..3efdb01a20a0 100644 --- a/js/src/jswrapper.h +++ b/js/src/jswrapper.h @@ -81,11 +81,13 @@ class JS_FRIEND_API(CrossCompartmentWrapper) : public Wrapper /* ES5 Harmony fundamental wrapper traps. */ virtual bool preventExtensions(JSContext *cx, HandleObject wrapper) MOZ_OVERRIDE; virtual bool getPropertyDescriptor(JSContext *cx, HandleObject wrapper, HandleId id, - PropertyDescriptor *desc, unsigned flags) MOZ_OVERRIDE; + MutableHandle desc, + unsigned flags) MOZ_OVERRIDE; virtual bool getOwnPropertyDescriptor(JSContext *cx, HandleObject wrapper, HandleId id, - PropertyDescriptor *desc, unsigned flags) MOZ_OVERRIDE; + MutableHandle desc, + unsigned flags) MOZ_OVERRIDE; virtual bool defineProperty(JSContext *cx, HandleObject wrapper, HandleId id, - PropertyDescriptor *desc) MOZ_OVERRIDE; + MutableHandle desc) MOZ_OVERRIDE; virtual bool getOwnPropertyNames(JSContext *cx, HandleObject wrapper, AutoIdVector &props) MOZ_OVERRIDE; virtual bool delete_(JSContext *cx, HandleObject wrapper, HandleId id, bool *bp) MOZ_OVERRIDE; @@ -149,7 +151,7 @@ class JS_FRIEND_API(SecurityWrapper) : public Base JSContext *cx) MOZ_OVERRIDE; virtual bool regexp_toShared(JSContext *cx, HandleObject proxy, RegExpGuard *g) MOZ_OVERRIDE; virtual bool defineProperty(JSContext *cx, HandleObject wrapper, HandleId id, - PropertyDescriptor *desc) MOZ_OVERRIDE; + MutableHandle desc) MOZ_OVERRIDE; /* * Allow our subclasses to select the superclass behavior they want without @@ -172,11 +174,13 @@ class JS_FRIEND_API(DeadObjectProxy) : public BaseProxyHandler /* ES5 Harmony fundamental wrapper traps. */ virtual bool preventExtensions(JSContext *cx, HandleObject proxy) MOZ_OVERRIDE; virtual bool getPropertyDescriptor(JSContext *cx, HandleObject wrapper, HandleId id, - PropertyDescriptor *desc, unsigned flags) MOZ_OVERRIDE; + MutableHandle desc, + unsigned flags) MOZ_OVERRIDE; virtual bool getOwnPropertyDescriptor(JSContext *cx, HandleObject wrapper, HandleId id, - PropertyDescriptor *desc, unsigned flags) MOZ_OVERRIDE; + MutableHandle desc, + unsigned flags) MOZ_OVERRIDE; virtual bool defineProperty(JSContext *cx, HandleObject wrapper, HandleId id, - PropertyDescriptor *desc) MOZ_OVERRIDE; + MutableHandle desc) MOZ_OVERRIDE; virtual bool getOwnPropertyNames(JSContext *cx, HandleObject wrapper, AutoIdVector &props) MOZ_OVERRIDE; virtual bool delete_(JSContext *cx, HandleObject wrapper, HandleId id, bool *bp) MOZ_OVERRIDE; diff --git a/js/src/shell/js.cpp b/js/src/shell/js.cpp index 12808d9ffdb3..b95f7d0e243d 100644 --- a/js/src/shell/js.cpp +++ b/js/src/shell/js.cpp @@ -2679,7 +2679,7 @@ CopyProperty(JSContext *cx, HandleObject obj, HandleObject referent, HandleId id unsigned lookupFlags, MutableHandleObject objp) { RootedShape shape(cx); - AutoPropertyDescriptorRooter desc(cx); + Rooted desc(cx); unsigned propFlags = 0; RootedObject obj2(cx); @@ -2691,24 +2691,24 @@ CopyProperty(JSContext *cx, HandleObject obj, HandleObject referent, HandleId id return true; if (shape->hasSlot()) { - desc.value = referent->nativeGetSlot(shape->slot()); + desc.value().set(referent->nativeGetSlot(shape->slot())); } else { - desc.value.setUndefined(); + desc.value().setUndefined(); } - desc.attrs = shape->attributes(); - desc.getter = shape->getter(); - if (!desc.getter && !(desc.attrs & JSPROP_GETTER)) - desc.getter = JS_PropertyStub; - desc.setter = shape->setter(); - if (!desc.setter && !(desc.attrs & JSPROP_SETTER)) - desc.setter = JS_StrictPropertyStub; - desc.shortid = shape->shortid(); + desc.setAttributes(shape->attributes()); + desc.setGetter(shape->getter()); + if (!desc.getter() && !desc.hasGetterObject()) + desc.setGetter(JS_PropertyStub); + desc.setSetter(shape->setter()); + if (!desc.setter() && !desc.hasSetterObject()) + desc.setSetter(JS_StrictPropertyStub); + desc.setShortId(shape->shortid()); propFlags = shape->getFlags(); } else if (referent->is()) { if (!Proxy::getOwnPropertyDescriptor(cx, referent, id, &desc, 0)) return false; - if (!desc.obj) + if (!desc.object()) return true; } else { if (!JSObject::lookupGeneric(cx, referent, id, objp, &shape)) @@ -2717,21 +2717,20 @@ CopyProperty(JSContext *cx, HandleObject obj, HandleObject referent, HandleId id return true; RootedValue value(cx); if (!JSObject::getGeneric(cx, referent, referent, id, &value) || - !JSObject::getGenericAttributes(cx, referent, id, &desc.attrs)) + !JSObject::getGenericAttributes(cx, referent, id, &desc.attributesRef())) { return false; } - desc.value = value; - desc.attrs &= JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_PERMANENT; - desc.getter = JS_PropertyStub; - desc.setter = JS_StrictPropertyStub; - desc.shortid = 0; + desc.value().set(value); + desc.attributesRef() &= JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_PERMANENT; + desc.setGetter(JS_PropertyStub); + desc.setSetter(JS_StrictPropertyStub); + desc.setShortId(0); } - RootedValue value(cx, desc.value); objp.set(obj); - return DefineNativeProperty(cx, obj, id, value, desc.getter, desc.setter, - desc.attrs, propFlags, desc.shortid); + return DefineNativeProperty(cx, obj, id, desc.value(), desc.getter(), desc.setter(), + desc.attributes(), propFlags, desc.shortid()); } static bool diff --git a/js/src/vm/Debugger.cpp b/js/src/vm/Debugger.cpp index 8752f38033aa..e4c542420aca 100644 --- a/js/src/vm/Debugger.cpp +++ b/js/src/vm/Debugger.cpp @@ -4631,7 +4631,7 @@ DebuggerObject_getOwnPropertyDescriptor(JSContext *cx, unsigned argc, Value *vp) return false; /* Bug: This can cause the debuggee to run! */ - AutoPropertyDescriptorRooter desc(cx); + Rooted desc(cx); { Maybe ac; ac.construct(cx, obj); @@ -4643,28 +4643,26 @@ DebuggerObject_getOwnPropertyDescriptor(JSContext *cx, unsigned argc, Value *vp) return false; } - if (desc.obj) { + if (desc.object()) { /* Rewrap the debuggee values in desc for the debugger. */ - RootedValue value(cx, desc.value); - if (!dbg->wrapDebuggeeValue(cx, &value)) + if (!dbg->wrapDebuggeeValue(cx, desc.value())) return false; - desc.value = value; - if (desc.attrs & JSPROP_GETTER) { - RootedValue get(cx, ObjectOrNullValue(CastAsObject(desc.getter))); + if (desc.hasGetterObject()) { + RootedValue get(cx, ObjectOrNullValue(desc.getterObject())); if (!dbg->wrapDebuggeeValue(cx, &get)) return false; - desc.getter = CastAsPropertyOp(get.toObjectOrNull()); + desc.setGetterObject(get.toObjectOrNull()); } - if (desc.attrs & JSPROP_SETTER) { - RootedValue set(cx, ObjectOrNullValue(CastAsObject(desc.setter))); + if (desc.hasSetterObject()) { + RootedValue set(cx, ObjectOrNullValue(desc.setterObject())); if (!dbg->wrapDebuggeeValue(cx, &set)) return false; - desc.setter = CastAsStrictPropertyOp(set.toObjectOrNull()); + desc.setSetterObject(set.toObjectOrNull()); } } - return NewPropertyDescriptorObject(cx, &desc, args.rval()); + return NewPropertyDescriptorObject(cx, desc, args.rval()); } static bool diff --git a/js/src/vm/ObjectImpl.h b/js/src/vm/ObjectImpl.h index 697ab3c50215..bb10680b49a1 100644 --- a/js/src/vm/ObjectImpl.h +++ b/js/src/vm/ObjectImpl.h @@ -238,7 +238,7 @@ struct PropDesc { * makeObject populates pd based on the other fields of *this, creating a * new property descriptor JSObject and defining properties on it. */ - void initFromPropertyDescriptor(const PropertyDescriptor &desc); + void initFromPropertyDescriptor(Handle desc); bool makeObject(JSContext *cx); void setUndefined() { isUndefined_ = true; } @@ -355,7 +355,7 @@ class AutoPropDescRooter : private JS::CustomAutoRooter PropDesc& getPropDesc() { return propDesc; } - void initFromPropertyDescriptor(const PropertyDescriptor &desc) { + void initFromPropertyDescriptor(Handle desc) { propDesc.initFromPropertyDescriptor(desc); } diff --git a/js/src/vm/ScopeObject.cpp b/js/src/vm/ScopeObject.cpp index 2375eb8722f6..d8d969c4eb4f 100644 --- a/js/src/vm/ScopeObject.cpp +++ b/js/src/vm/ScopeObject.cpp @@ -1374,14 +1374,16 @@ class DebugScopeProxy : public BaseProxyHandler return false; } - bool getPropertyDescriptor(JSContext *cx, HandleObject proxy, HandleId id, PropertyDescriptor *desc, + bool getPropertyDescriptor(JSContext *cx, HandleObject proxy, HandleId id, + MutableHandle desc, unsigned flags) MOZ_OVERRIDE { return getOwnPropertyDescriptor(cx, proxy, id, desc, flags); } bool getOwnPropertyDescriptor(JSContext *cx, HandleObject proxy, HandleId id, - PropertyDescriptor *desc, unsigned flags) MOZ_OVERRIDE + MutableHandle desc, + unsigned flags) MOZ_OVERRIDE { Rooted debugScope(cx, &proxy->as()); Rooted scope(cx, &debugScope->scope()); @@ -1391,23 +1393,27 @@ class DebugScopeProxy : public BaseProxyHandler return false; if (maybeArgsObj) { - PodZero(desc); - desc->obj = debugScope; - desc->attrs = JSPROP_READONLY | JSPROP_ENUMERATE | JSPROP_PERMANENT; - desc->value = ObjectValue(*maybeArgsObj); + desc.object().set(debugScope); + desc.setAttributes(JSPROP_READONLY | JSPROP_ENUMERATE | JSPROP_PERMANENT); + desc.value().setObject(*maybeArgsObj); + desc.setShortId(0); + desc.setGetter(NULL); + desc.setSetter(NULL); return true; } RootedValue v(cx); if (handleUnaliasedAccess(cx, debugScope, scope, id, GET, &v)) { - PodZero(desc); - desc->obj = debugScope; - desc->attrs = JSPROP_READONLY | JSPROP_ENUMERATE | JSPROP_PERMANENT; - desc->value = v; + desc.object().set(debugScope); + desc.setAttributes(JSPROP_READONLY | JSPROP_ENUMERATE | JSPROP_PERMANENT); + desc.value().set(v); + desc.setShortId(0); + desc.setGetter(NULL); + desc.setSetter(NULL); return true; } - return JS_GetPropertyDescriptorById(cx, scope, id, 0, desc); + return JS_GetPropertyDescriptorById(cx, scope, id, 0, desc.address()); } bool get(JSContext *cx, HandleObject proxy, HandleObject receiver, HandleId id, @@ -1442,7 +1448,7 @@ class DebugScopeProxy : public BaseProxyHandler } bool defineProperty(JSContext *cx, HandleObject proxy, HandleId id, - PropertyDescriptor *desc) MOZ_OVERRIDE + MutableHandle desc) MOZ_OVERRIDE { Rooted scope(cx, &proxy->as().scope()); @@ -1452,8 +1458,8 @@ class DebugScopeProxy : public BaseProxyHandler if (found) return Throw(cx, id, JSMSG_CANT_REDEFINE_PROP); - return JS_DefinePropertyById(cx, scope, id, desc->value, desc->getter, desc->setter, - desc->attrs); + return JS_DefinePropertyById(cx, scope, id, desc.value(), desc.getter(), desc.setter(), + desc.attributes()); } bool getScopePropertyNames(JSContext *cx, HandleObject proxy, AutoIdVector &props, diff --git a/js/xpconnect/src/XPCComponents.cpp b/js/xpconnect/src/XPCComponents.cpp index d179413f2833..0e10ef4c7f84 100644 --- a/js/xpconnect/src/XPCComponents.cpp +++ b/js/xpconnect/src/XPCComponents.cpp @@ -3134,17 +3134,17 @@ bool xpc::SandboxProxyHandler::getPropertyDescriptor(JSContext *cx, JS::Handle proxy, JS::Handle id, - PropertyDescriptor *desc, + JS::MutableHandle desc, unsigned flags) { JS::RootedObject obj(cx, wrappedObject(proxy)); MOZ_ASSERT(js::GetObjectCompartment(obj) == js::GetObjectCompartment(proxy)); if (!JS_GetPropertyDescriptorById(cx, obj, id, - flags, desc)) + flags, desc.address())) return false; - if (!desc->obj) + if (!desc.object()) return true; // No property, nothing to do // Now fix up the getter/setter/value as needed to be bound to desc->obj @@ -3157,21 +3157,21 @@ xpc::SandboxProxyHandler::getPropertyDescriptor(JSContext *cx, // Similarly, don't mess with XPC_WN_Helper_GetProperty and // XPC_WN_Helper_SetProperty, for the same reasons: that could confuse our // access to expandos when we're not doing Xrays. - if (desc->getter != xpc::holder_get && - desc->getter != XPC_WN_Helper_GetProperty && - !BindPropertyOp(cx, desc->getter, desc, id, JSPROP_GETTER, proxy)) + if (desc.getter() != xpc::holder_get && + desc.getter() != XPC_WN_Helper_GetProperty && + !BindPropertyOp(cx, desc.getter(), desc.address(), id, JSPROP_GETTER, proxy)) return false; - if (desc->setter != xpc::holder_set && - desc->setter != XPC_WN_Helper_SetProperty && - !BindPropertyOp(cx, desc->setter, desc, id, JSPROP_SETTER, proxy)) + if (desc.setter() != xpc::holder_set && + desc.setter() != XPC_WN_Helper_SetProperty && + !BindPropertyOp(cx, desc.setter(), desc.address(), id, JSPROP_SETTER, proxy)) return false; - if (desc->value.isObject()) { - JSObject* val = &desc->value.toObject(); + if (desc.value().isObject()) { + JSObject* val = &desc.value().toObject(); if (JS_ObjectIsCallable(cx, val)) { val = WrapCallable(cx, val, proxy); if (!val) return false; - desc->value = ObjectValue(*val); + desc.value().setObject(*val); } } @@ -3182,14 +3182,14 @@ bool xpc::SandboxProxyHandler::getOwnPropertyDescriptor(JSContext *cx, JS::Handle proxy, JS::Handle id, - PropertyDescriptor *desc, + JS::MutableHandle desc, unsigned flags) { if (!getPropertyDescriptor(cx, proxy, id, desc, flags)) return false; - if (desc->obj != wrappedObject(proxy)) - desc->obj = nullptr; + if (desc.object() != wrappedObject(proxy)) + desc.object().set(nullptr); return true; } diff --git a/js/xpconnect/wrappers/ChromeObjectWrapper.cpp b/js/xpconnect/wrappers/ChromeObjectWrapper.cpp index b4e22c5c1c08..8a1775dfd565 100644 --- a/js/xpconnect/wrappers/ChromeObjectWrapper.cpp +++ b/js/xpconnect/wrappers/ChromeObjectWrapper.cpp @@ -30,10 +30,10 @@ AllowedByBase(JSContext *cx, HandleObject wrapper, HandleId id, } static bool -PropIsFromStandardPrototype(JSContext *cx, JSPropertyDescriptor *desc) +PropIsFromStandardPrototype(JSContext *cx, JS::MutableHandle desc) { - MOZ_ASSERT(desc->obj); - RootedObject unwrapped(cx, js::UncheckedUnwrap(desc->obj)); + MOZ_ASSERT(desc.object()); + RootedObject unwrapped(cx, js::UncheckedUnwrap(desc.object())); JSAutoCompartment ac(cx, unwrapped); return JS_IdentifyClassPrototype(cx, unwrapped) != JSProto_Null; } @@ -51,24 +51,24 @@ PropIsFromStandardPrototype(JSContext *cx, HandleObject wrapper, Rooted desc(cx); ChromeObjectWrapper *handler = &ChromeObjectWrapper::singleton; if (!handler->ChromeObjectWrapperBase::getPropertyDescriptor(cx, wrapper, id, - desc.address(), 0) || + &desc, 0) || !desc.object()) { return false; } - return PropIsFromStandardPrototype(cx, desc.address()); + return PropIsFromStandardPrototype(cx, &desc); } bool ChromeObjectWrapper::getPropertyDescriptor(JSContext *cx, HandleObject wrapper, HandleId id, - js::PropertyDescriptor *desc, + JS::MutableHandle desc, unsigned flags) { assertEnteredPolicy(cx, wrapper, id); // First, try a lookup on the base wrapper if permitted. - desc->obj = NULL; + desc.object().set(NULL); if (AllowedByBase(cx, wrapper, id, Wrapper::GET) && !ChromeObjectWrapperBase::getPropertyDescriptor(cx, wrapper, id, desc, flags)) { @@ -78,19 +78,19 @@ ChromeObjectWrapper::getPropertyDescriptor(JSContext *cx, // If the property is something that can be found on a standard prototype, // prefer the one we'll get via the prototype chain in the content // compartment. - if (desc->obj && PropIsFromStandardPrototype(cx, desc)) - desc->obj = NULL; + if (desc.object() && PropIsFromStandardPrototype(cx, desc)) + desc.object().set(NULL); // If we found something or have no proto, we're done. RootedObject wrapperProto(cx); if (!JS_GetPrototype(cx, wrapper, &wrapperProto)) return false; - if (desc->obj || !wrapperProto) + if (desc.object() || !wrapperProto) return true; // If not, try doing the lookup on the prototype. MOZ_ASSERT(js::IsObjectInContextCompartment(wrapper, cx)); - return JS_GetPropertyDescriptorById(cx, wrapperProto, id, 0, desc); + return JS_GetPropertyDescriptorById(cx, wrapperProto, id, 0, desc.address()); } bool @@ -128,7 +128,6 @@ ChromeObjectWrapper::get(JSContext *cx, HandleObject wrapper, { assertEnteredPolicy(cx, wrapper, id); vp.setUndefined(); - JSPropertyDescriptor desc; // Only call through to the get trap on the underlying object if we're // allowed to see the property, and if what we'll find is not on a standard // prototype. diff --git a/js/xpconnect/wrappers/ChromeObjectWrapper.h b/js/xpconnect/wrappers/ChromeObjectWrapper.h index 4e45b79bd5c6..7e682b4bd31e 100644 --- a/js/xpconnect/wrappers/ChromeObjectWrapper.h +++ b/js/xpconnect/wrappers/ChromeObjectWrapper.h @@ -30,7 +30,8 @@ class ChromeObjectWrapper : public ChromeObjectWrapperBase /* Custom traps. */ virtual bool getPropertyDescriptor(JSContext *cx, JS::Handle wrapper, - JS::Handle id, js::PropertyDescriptor *desc, + JS::Handle id, + JS::MutableHandle desc, unsigned flags) MOZ_OVERRIDE; virtual bool has(JSContext *cx, JS::Handle wrapper, JS::Handle id, bool *bp) MOZ_OVERRIDE; diff --git a/js/xpconnect/wrappers/FilteringWrapper.cpp b/js/xpconnect/wrappers/FilteringWrapper.cpp index d649231b4397..698e926bd543 100644 --- a/js/xpconnect/wrappers/FilteringWrapper.cpp +++ b/js/xpconnect/wrappers/FilteringWrapper.cpp @@ -48,13 +48,13 @@ Filter(JSContext *cx, HandleObject wrapper, AutoIdVector &props) template static bool -FilterSetter(JSContext *cx, JSObject *wrapper, jsid id, js::PropertyDescriptor *desc) +FilterSetter(JSContext *cx, JSObject *wrapper, jsid id, JS::MutableHandle desc) { bool setAllowed = Policy::check(cx, wrapper, id, Wrapper::SET); if (!setAllowed) { if (JS_IsExceptionPending(cx)) return false; - desc->setter = nullptr; + desc.setSetter(nullptr); } return true; } @@ -63,7 +63,8 @@ template bool FilteringWrapper::getPropertyDescriptor(JSContext *cx, HandleObject wrapper, HandleId id, - js::PropertyDescriptor *desc, unsigned flags) + JS::MutableHandle desc, + unsigned flags) { assertEnteredPolicy(cx, wrapper, id); if (!Base::getPropertyDescriptor(cx, wrapper, id, desc, flags)) @@ -75,7 +76,7 @@ template bool FilteringWrapper::getOwnPropertyDescriptor(JSContext *cx, HandleObject wrapper, HandleId id, - js::PropertyDescriptor *desc, + JS::MutableHandle desc, unsigned flags) { assertEnteredPolicy(cx, wrapper, id); diff --git a/js/xpconnect/wrappers/FilteringWrapper.h b/js/xpconnect/wrappers/FilteringWrapper.h index b9df92ddfac0..c67e6a02a779 100644 --- a/js/xpconnect/wrappers/FilteringWrapper.h +++ b/js/xpconnect/wrappers/FilteringWrapper.h @@ -20,10 +20,12 @@ class FilteringWrapper : public Base { virtual ~FilteringWrapper(); virtual bool getPropertyDescriptor(JSContext *cx, JS::Handle wrapper, - JS::Handle id, js::PropertyDescriptor *desc, + JS::Handle id, + JS::MutableHandle desc, unsigned flags) MOZ_OVERRIDE; virtual bool getOwnPropertyDescriptor(JSContext *cx, JS::Handle wrapper, - JS::Handle id, js::PropertyDescriptor *desc, + JS::Handle id, + JS::MutableHandle desc, unsigned flags) MOZ_OVERRIDE; virtual bool getOwnPropertyNames(JSContext *cx, JS::Handle wrapper, js::AutoIdVector &props) MOZ_OVERRIDE; diff --git a/js/xpconnect/wrappers/WaiveXrayWrapper.cpp b/js/xpconnect/wrappers/WaiveXrayWrapper.cpp index ef1a7ab9f321..a2dbb6a2ac84 100644 --- a/js/xpconnect/wrappers/WaiveXrayWrapper.cpp +++ b/js/xpconnect/wrappers/WaiveXrayWrapper.cpp @@ -18,20 +18,20 @@ using namespace JS; namespace xpc { static bool -WaiveAccessors(JSContext *cx, js::PropertyDescriptor *desc) +WaiveAccessors(JSContext *cx, JS::MutableHandle desc) { - if ((desc->attrs & JSPROP_GETTER) && desc->getter) { - RootedValue v(cx, JS::ObjectValue(*JS_FUNC_TO_DATA_PTR(JSObject *, desc->getter))); + if (desc.hasGetterObject() && desc.getterObject()) { + RootedValue v(cx, JS::ObjectValue(*desc.getterObject())); if (!WrapperFactory::WaiveXrayAndWrap(cx, v.address())) return false; - desc->getter = js::CastAsJSPropertyOp(&v.toObject()); + desc.setGetterObject(&v.toObject()); } - if ((desc->attrs & JSPROP_SETTER) && desc->setter) { - RootedValue v(cx, JS::ObjectValue(*JS_FUNC_TO_DATA_PTR(JSObject *, desc->setter))); + if (desc.hasSetterObject() && desc.setterObject()) { + RootedValue v(cx, JS::ObjectValue(*desc.setterObject())); if (!WrapperFactory::WaiveXrayAndWrap(cx, v.address())) return false; - desc->setter = js::CastAsJSStrictPropertyOp(&v.toObject()); + desc.setSetterObject(&v.toObject()); } return true; } @@ -46,20 +46,20 @@ WaiveXrayWrapper::~WaiveXrayWrapper() bool WaiveXrayWrapper::getPropertyDescriptor(JSContext *cx, HandleObject wrapper, - HandleId id, js::PropertyDescriptor *desc, + HandleId id, JS::MutableHandle desc, unsigned flags) { return CrossCompartmentWrapper::getPropertyDescriptor(cx, wrapper, id, desc, flags) && - WrapperFactory::WaiveXrayAndWrap(cx, &desc->value) && WaiveAccessors(cx, desc); + WrapperFactory::WaiveXrayAndWrap(cx, desc.value().address()) && WaiveAccessors(cx, desc); } bool WaiveXrayWrapper::getOwnPropertyDescriptor(JSContext *cx, HandleObject wrapper, - HandleId id, js::PropertyDescriptor *desc, + HandleId id, JS::MutableHandle desc, unsigned flags) { return CrossCompartmentWrapper::getOwnPropertyDescriptor(cx, wrapper, id, desc, flags) && - WrapperFactory::WaiveXrayAndWrap(cx, &desc->value) && WaiveAccessors(cx, desc); + WrapperFactory::WaiveXrayAndWrap(cx, desc.value().address()) && WaiveAccessors(cx, desc); } bool diff --git a/js/xpconnect/wrappers/WaiveXrayWrapper.h b/js/xpconnect/wrappers/WaiveXrayWrapper.h index f3de7da8ecc8..d7e2c11d29b9 100644 --- a/js/xpconnect/wrappers/WaiveXrayWrapper.h +++ b/js/xpconnect/wrappers/WaiveXrayWrapper.h @@ -21,11 +21,12 @@ class WaiveXrayWrapper : public js::CrossCompartmentWrapper { virtual ~WaiveXrayWrapper(); virtual bool getPropertyDescriptor(JSContext *cx, JS::Handle wrapper, - JS::Handle id, js::PropertyDescriptor *desc, + JS::Handle id, + JS::MutableHandle desc, unsigned flags) MOZ_OVERRIDE; virtual bool getOwnPropertyDescriptor(JSContext *cx, JS::Handle wrapper, JS::Handle id, - js::PropertyDescriptor *desc, + JS::MutableHandle desc, unsigned flags) MOZ_OVERRIDE; virtual bool get(JSContext *cx, JS::Handle wrapper, JS::Handle receiver, JS::Handle id, JS::MutableHandle vp) MOZ_OVERRIDE; diff --git a/js/xpconnect/wrappers/XrayWrapper.cpp b/js/xpconnect/wrappers/XrayWrapper.cpp index 413c491407f9..df1a8b5cc1ea 100644 --- a/js/xpconnect/wrappers/XrayWrapper.cpp +++ b/js/xpconnect/wrappers/XrayWrapper.cpp @@ -134,14 +134,16 @@ public: virtual bool resolveNativeProperty(JSContext *cx, HandleObject wrapper, HandleObject holder, HandleId id, - JSPropertyDescriptor *desc, unsigned flags) = 0; + MutableHandle desc, + unsigned flags) = 0; // NB: resolveOwnProperty may decide whether or not to cache what it finds // on the holder. If the result is not cached, the lookup will happen afresh // for each access, which is the right thing for things like dynamic NodeList // properties. virtual bool resolveOwnProperty(JSContext *cx, Wrapper &jsWrapper, HandleObject wrapper, HandleObject holder, - HandleId id, JSPropertyDescriptor *desc, unsigned flags); + HandleId id, MutableHandle desc, + unsigned flags); static bool call(JSContext *cx, HandleObject wrapper, const JS::CallArgs &args, js::Wrapper& baseInstance) @@ -188,12 +190,12 @@ public: virtual bool resolveNativeProperty(JSContext *cx, HandleObject wrapper, HandleObject holder, HandleId id, - JSPropertyDescriptor *desc, unsigned flags); + MutableHandle desc, unsigned flags); virtual bool resolveOwnProperty(JSContext *cx, Wrapper &jsWrapper, HandleObject wrapper, HandleObject holder, HandleId id, - JSPropertyDescriptor *desc, unsigned flags); + MutableHandle desc, unsigned flags); static bool defineProperty(JSContext *cx, HandleObject wrapper, HandleId id, - PropertyDescriptor *desc, + MutableHandle desc, Handle existingDesc, bool *defined); static bool enumerateNames(JSContext *cx, HandleObject wrapper, unsigned flags, AutoIdVector &props); @@ -234,12 +236,12 @@ public: virtual bool resolveNativeProperty(JSContext *cx, HandleObject wrapper, HandleObject holder, HandleId id, - JSPropertyDescriptor *desc, unsigned flags); + MutableHandle desc, unsigned flags); virtual bool resolveOwnProperty(JSContext *cx, Wrapper &jsWrapper, HandleObject wrapper, HandleObject holder, HandleId id, - JSPropertyDescriptor *desc, unsigned flags); + MutableHandle desc, unsigned flags); static bool defineProperty(JSContext *cx, HandleObject wrapper, HandleId id, - PropertyDescriptor *desc, + MutableHandle desc, Handle existingDesc, bool *defined); static bool enumerateNames(JSContext *cx, HandleObject wrapper, unsigned flags, AutoIdVector &props); @@ -692,11 +694,11 @@ XPCWrappedNativeXrayTraits::preserveWrapper(JSObject *target) bool XPCWrappedNativeXrayTraits::resolveNativeProperty(JSContext *cx, HandleObject wrapper, HandleObject holder, HandleId id, - JSPropertyDescriptor *desc, unsigned flags) + MutableHandle desc, unsigned flags) { MOZ_ASSERT(js::GetObjectJSClass(holder) == &HolderClass); - desc->obj = NULL; + desc.object().set(NULL); // This will do verification and the method lookup for us. RootedObject target(cx, getTargetObject(wrapper)); @@ -708,7 +710,7 @@ XPCWrappedNativeXrayTraits::resolveNativeProperty(JSContext *cx, HandleObject wr // check for those. if (!JSID_IS_STRING(id)) { /* Not found */ - return resolveDOMCollectionProperty(cx, wrapper, holder, id, desc, flags); + return resolveDOMCollectionProperty(cx, wrapper, holder, id, desc.address(), flags); } XPCNativeInterface *iface; @@ -722,19 +724,19 @@ XPCWrappedNativeXrayTraits::resolveNativeProperty(JSContext *cx, HandleObject wr } else if (!(iface = ccx.GetInterface()) || !(member = ccx.GetMember())) { /* Not found */ - return resolveDOMCollectionProperty(cx, wrapper, holder, id, desc, flags); + return resolveDOMCollectionProperty(cx, wrapper, holder, id, desc.address(), flags); } - desc->obj = holder; - desc->attrs = JSPROP_ENUMERATE; - desc->getter = NULL; - desc->setter = NULL; - desc->shortid = 0; - desc->value = JSVAL_VOID; + desc.object().set(holder); + desc.setAttributes(JSPROP_ENUMERATE); + desc.setGetter(NULL); + desc.setSetter(NULL); + desc.setShortId(0); + desc.value().set(JSVAL_VOID); RootedValue fval(cx, JSVAL_VOID); if (member->IsConstant()) { - if (!member->GetConstantValue(ccx, iface, &desc->value)) { + if (!member->GetConstantValue(ccx, iface, desc.value().address())) { JS_ReportError(cx, "Failed to convert constant native property to JS value"); return false; } @@ -745,16 +747,18 @@ XPCWrappedNativeXrayTraits::resolveNativeProperty(JSContext *cx, HandleObject wr return false; } - desc->attrs |= JSPROP_GETTER; + unsigned attrs = desc.attributes(); + attrs |= JSPROP_GETTER; if (member->IsWritableAttribute()) - desc->attrs |= JSPROP_SETTER; + attrs |= JSPROP_SETTER; // Make the property shared on the holder so no slot is allocated // for it. This avoids keeping garbage alive through that slot. - desc->attrs |= JSPROP_SHARED; + attrs |= JSPROP_SHARED; + desc.setAttributes(attrs); } else { // This is a method. Clone a function for it. - if (!member->NewFunctionObject(ccx, iface, wrapper, &desc->value)) { + if (!member->NewFunctionObject(ccx, iface, wrapper, desc.value().address())) { JS_ReportError(cx, "Failed to clone function object for native function"); return false; } @@ -763,21 +767,21 @@ XPCWrappedNativeXrayTraits::resolveNativeProperty(JSContext *cx, HandleObject wr // don't have one, we have to avoid calling the scriptable helper's // GetProperty method for this property, so stub out the getter and // setter here explicitly. - desc->getter = JS_PropertyStub; - desc->setter = JS_StrictPropertyStub; + desc.setGetter(JS_PropertyStub); + desc.setSetter(JS_StrictPropertyStub); } - if (!JS_WrapValue(cx, &desc->value) || !JS_WrapValue(cx, fval.address())) + if (!JS_WrapValue(cx, desc.value().address()) || !JS_WrapValue(cx, fval.address())) return false; - if (desc->attrs & JSPROP_GETTER) - desc->getter = js::CastAsJSPropertyOp(JSVAL_TO_OBJECT(fval)); - if (desc->attrs & JSPROP_SETTER) - desc->setter = js::CastAsJSStrictPropertyOp(JSVAL_TO_OBJECT(fval)); + if (desc.hasGetterObject()) + desc.setGetterObject(&fval.toObject()); + if (desc.hasSetterObject()) + desc.setSetterObject(&fval.toObject()); // Define the property. - return JS_DefinePropertyById(cx, holder, id, desc->value, - desc->getter, desc->setter, desc->attrs); + return JS_DefinePropertyById(cx, holder, id, desc.value(), + desc.getter(), desc.setter(), desc.attributes()); } static bool @@ -796,9 +800,9 @@ wrappedJSObject_getter(JSContext *cx, HandleObject wrapper, HandleId id, Mutable bool XrayTraits::resolveOwnProperty(JSContext *cx, Wrapper &jsWrapper, HandleObject wrapper, HandleObject holder, HandleId id, - PropertyDescriptor *desc, unsigned flags) + MutableHandle desc, unsigned flags) { - desc->obj = NULL; + desc.object().set(NULL); RootedObject target(cx, getTargetObject(wrapper)); RootedObject expando(cx, getExpandoObject(cx, target, wrapper)); @@ -806,14 +810,14 @@ XrayTraits::resolveOwnProperty(JSContext *cx, Wrapper &jsWrapper, // in the target compartment. if (expando) { JSAutoCompartment ac(cx, expando); - if (!JS_GetPropertyDescriptorById(cx, expando, id, 0, desc)) + if (!JS_GetPropertyDescriptorById(cx, expando, id, 0, desc.address())) return false; } - if (desc->obj) { - if (!JS_WrapPropertyDescriptor(cx, desc)) + if (desc.object()) { + if (!JS_WrapPropertyDescriptor(cx, desc.address())) return false; // Pretend the property lives on the wrapper. - desc->obj = wrapper; + desc.object().set(wrapper); return true; } return true; @@ -822,12 +826,13 @@ XrayTraits::resolveOwnProperty(JSContext *cx, Wrapper &jsWrapper, bool XPCWrappedNativeXrayTraits::resolveOwnProperty(JSContext *cx, Wrapper &jsWrapper, HandleObject wrapper, HandleObject holder, - HandleId id, PropertyDescriptor *desc, unsigned flags) + HandleId id, MutableHandle desc, + unsigned flags) { // Call the common code. bool ok = XrayTraits::resolveOwnProperty(cx, jsWrapper, wrapper, holder, id, desc, flags); - if (!ok || desc->obj) + if (!ok || desc.object()) return ok; // Check for indexed access on a window. @@ -847,9 +852,9 @@ XPCWrappedNativeXrayTraits::resolveOwnProperty(JSContext *cx, Wrapper &jsWrapper // It's gone? return xpc::Throw(cx, NS_ERROR_FAILURE); } - desc->value = ObjectValue(*obj); + desc.value().setObject(*obj); mozilla::dom::FillPropertyDescriptor(desc, wrapper, true); - return JS_WrapPropertyDescriptor(cx, desc); + return JS_WrapPropertyDescriptor(cx, desc.address()); } } } @@ -897,27 +902,27 @@ XPCWrappedNativeXrayTraits::resolveOwnProperty(JSContext *cx, Wrapper &jsWrapper // return non-|own| properties from Object.getOwnPropertyDescriptor if // lookups are performed in a certain order, but we can probably live with // that until XPCWN Xrays go away with the new DOM bindings. - return JS_GetPropertyDescriptorById(cx, holder, id, 0, desc); + return JS_GetPropertyDescriptorById(cx, holder, id, 0, desc.address()); } bool XPCWrappedNativeXrayTraits::defineProperty(JSContext *cx, HandleObject wrapper, HandleId id, - PropertyDescriptor *desc, + MutableHandle desc, Handle existingDesc, bool *defined) { *defined = false; JSObject *holder = singleton.ensureHolder(cx, wrapper); if (isResolving(cx, holder, id)) { - if (!(desc->attrs & (JSPROP_GETTER | JSPROP_SETTER))) { - if (!desc->getter) - desc->getter = holder_get; - if (!desc->setter) - desc->setter = holder_set; + if (!desc.hasAttributes(JSPROP_GETTER | JSPROP_SETTER)) { + if (!desc.getter()) + desc.setGetter(holder_get); + if (!desc.setter()) + desc.setSetter(holder_set); } *defined = true; - return JS_DefinePropertyById(cx, holder, id, desc->value, desc->getter, desc->setter, - desc->attrs); + return JS_DefinePropertyById(cx, holder, id, desc.value(), desc.getter(), desc.setter(), + desc.attributes()); } // Check for an indexed property on a Window. If that's happening, do @@ -1024,13 +1029,13 @@ XPCWrappedNativeXrayTraits::construct(JSContext *cx, HandleObject wrapper, bool DOMXrayTraits::resolveNativeProperty(JSContext *cx, HandleObject wrapper, HandleObject holder, HandleId id, - JSPropertyDescriptor *desc, unsigned flags) + MutableHandle desc, unsigned flags) { RootedObject obj(cx, getTargetObject(wrapper)); - if (!XrayResolveNativeProperty(cx, wrapper, obj, id, desc)) + if (!XrayResolveNativeProperty(cx, wrapper, obj, id, desc.address())) return false; - NS_ASSERTION(!desc->obj || desc->obj == wrapper, + NS_ASSERTION(!desc.object() || desc.object() == wrapper, "What did we resolve this on?"); return true; @@ -1039,19 +1044,19 @@ DOMXrayTraits::resolveNativeProperty(JSContext *cx, HandleObject wrapper, bool DOMXrayTraits::resolveOwnProperty(JSContext *cx, Wrapper &jsWrapper, HandleObject wrapper, HandleObject holder, HandleId id, - JSPropertyDescriptor *desc, unsigned flags) + MutableHandle desc, unsigned flags) { // Call the common code. bool ok = XrayTraits::resolveOwnProperty(cx, jsWrapper, wrapper, holder, id, desc, flags); - if (!ok || desc->obj) + if (!ok || desc.object()) return ok; RootedObject obj(cx, getTargetObject(wrapper)); if (!XrayResolveOwnProperty(cx, wrapper, obj, id, desc, flags)) return false; - NS_ASSERTION(!desc->obj || desc->obj == wrapper, + NS_ASSERTION(!desc.object() || desc.object() == wrapper, "What did we resolve this on?"); return true; @@ -1059,10 +1064,10 @@ DOMXrayTraits::resolveOwnProperty(JSContext *cx, Wrapper &jsWrapper, HandleObjec bool DOMXrayTraits::defineProperty(JSContext *cx, HandleObject wrapper, HandleId id, - PropertyDescriptor *desc, + MutableHandle desc, Handle existingDesc, bool *defined) { - if (!existingDesc.obj()) + if (!existingDesc.object()) return true; JS::Rooted obj(cx, getTargetObject(wrapper)); @@ -1202,7 +1207,7 @@ HasNativeProperty(JSContext *cx, HandleObject wrapper, HandleId id, bool *hasPro Maybe resolvingId; if (traits == &XPCWrappedNativeXrayTraits::singleton) resolvingId.construct(cx, wrapper, id); - if (!traits->resolveOwnProperty(cx, *handler, wrapper, holder, id, desc.address(), 0)) + if (!traits->resolveOwnProperty(cx, *handler, wrapper, holder, id, &desc, 0)) return false; if (desc.object()) { *hasProp = true; @@ -1219,7 +1224,7 @@ HasNativeProperty(JSContext *cx, HandleObject wrapper, HandleId id, bool *hasPro } // Try resolveNativeProperty. - if (!traits->resolveNativeProperty(cx, wrapper, holder, id, desc.address(), 0)) + if (!traits->resolveNativeProperty(cx, wrapper, holder, id, &desc, 0)) return false; *hasProp = !!desc.object(); return true; @@ -1335,12 +1340,13 @@ XrayWrapper::preventExtensions(JSContext *cx, HandleObject wrapper template bool XrayWrapper::getPropertyDescriptor(JSContext *cx, HandleObject wrapper, HandleId id, - PropertyDescriptor *desc, unsigned flags) + JS::MutableHandle desc, + unsigned flags) { assertEnteredPolicy(cx, wrapper, id); RootedObject holder(cx, Traits::singleton.ensureHolder(cx, wrapper)); if (Traits::isResolving(cx, holder, id)) { - desc->obj = NULL; + desc.object().set(NULL); return true; } @@ -1355,12 +1361,12 @@ XrayWrapper::getPropertyDescriptor(JSContext *cx, HandleObject wra XPCJSRuntime* rt = nsXPConnect::GetRuntimeInstance(); if (AccessCheck::wrapperSubsumes(wrapper) && id == rt->GetStringID(XPCJSRuntime::IDX_WRAPPED_JSOBJECT)) { - desc->obj = wrapper; - desc->attrs = JSPROP_ENUMERATE|JSPROP_SHARED; - desc->getter = wrappedJSObject_getter; - desc->setter = NULL; - desc->shortid = 0; - desc->value = JSVAL_VOID; + desc.object().set(wrapper); + desc.setAttributes(JSPROP_ENUMERATE|JSPROP_SHARED); + desc.setGetter(wrappedJSObject_getter); + desc.setSetter(NULL); + desc.setShortId(0); + desc.value().set(JSVAL_VOID); return true; } @@ -1388,10 +1394,10 @@ XrayWrapper::getPropertyDescriptor(JSContext *cx, HandleObject wra return false; // Check the holder. - if (!desc->obj && !JS_GetPropertyDescriptorById(cx, holder, id, 0, desc)) + if (!desc.object() && !JS_GetPropertyDescriptorById(cx, holder, id, 0, desc.address())) return false; - if (desc->obj) { - desc->obj = wrapper; + if (desc.object()) { + desc.object().set(wrapper); return true; } @@ -1406,7 +1412,7 @@ XrayWrapper::getPropertyDescriptor(JSContext *cx, HandleObject wra // resolveNativeProperty, which we don't want for something dynamic like // named access. So we just handle it separately here. nsGlobalWindow *win; - if (!desc->obj && Traits::Type == XrayForWrappedNative && JSID_IS_STRING(id) && + if (!desc.object() && Traits::Type == XrayForWrappedNative && JSID_IS_STRING(id) && (win = static_cast(As(wrapper)))) { nsDependentJSString name(id); @@ -1419,11 +1425,11 @@ XrayWrapper::getPropertyDescriptor(JSContext *cx, HandleObject wra mozilla::dom::FillPropertyDescriptor(desc, wrapper, ObjectValue(*childObj), /* readOnly = */ true); - return JS_WrapPropertyDescriptor(cx, desc); + return JS_WrapPropertyDescriptor(cx, desc.address()); } } - if (!desc->obj && + if (!desc.object() && id == nsXPConnect::GetRuntimeInstance()->GetStringID(XPCJSRuntime::IDX_TO_STRING)) { @@ -1431,12 +1437,12 @@ XrayWrapper::getPropertyDescriptor(JSContext *cx, HandleObject wra if (!toString) return false; - desc->obj = wrapper; - desc->attrs = 0; - desc->getter = NULL; - desc->setter = NULL; - desc->shortid = 0; - desc->value.setObject(*JS_GetFunctionObject(toString)); + desc.object().set(wrapper); + desc.setAttributes(0); + desc.setGetter(NULL); + desc.setSetter(NULL); + desc.setShortId(0); + desc.value().setObject(*JS_GetFunctionObject(toString)); } // If we're a special scope for in-content XBL, our script expects to see @@ -1454,39 +1460,40 @@ XrayWrapper::getPropertyDescriptor(JSContext *cx, HandleObject wra // // Make sure to assert this. nsCOMPtr content; - if (!desc->obj && + if (!desc.object() && EnsureCompartmentPrivate(wrapper)->scope->IsXBLScope() && (content = do_QueryInterfaceNative(cx, wrapper))) { - if (!nsContentUtils::LookupBindingMember(cx, content, id, desc)) + if (!nsContentUtils::LookupBindingMember(cx, content, id, desc.address())) return false; - DEBUG_CheckXBLLookup(cx, desc); + DEBUG_CheckXBLLookup(cx, desc.address()); } // If we still have nothing, we're done. - if (!desc->obj) + if (!desc.object()) return true; - if (!JS_DefinePropertyById(cx, holder, id, desc->value, desc->getter, - desc->setter, desc->attrs) || - !JS_GetPropertyDescriptorById(cx, holder, id, flags, desc)) + if (!JS_DefinePropertyById(cx, holder, id, desc.value(), desc.getter(), + desc.setter(), desc.attributes()) || + !JS_GetPropertyDescriptorById(cx, holder, id, flags, desc.address())) { return false; } - MOZ_ASSERT(desc->obj); - desc->obj = wrapper; + MOZ_ASSERT(desc.object()); + desc.object().set(wrapper); return true; } template bool XrayWrapper::getOwnPropertyDescriptor(JSContext *cx, HandleObject wrapper, HandleId id, - PropertyDescriptor *desc, unsigned flags) + JS::MutableHandle desc, + unsigned flags) { assertEnteredPolicy(cx, wrapper, id); RootedObject holder(cx, Traits::singleton.ensureHolder(cx, wrapper)); if (Traits::isResolving(cx, holder, id)) { - desc->obj = NULL; + desc.object().set(NULL); return true; } @@ -1497,8 +1504,8 @@ XrayWrapper::getOwnPropertyDescriptor(JSContext *cx, HandleObject if (!Traits::singleton.resolveOwnProperty(cx, *this, wrapper, holder, id, desc, flags)) return false; - if (desc->obj) - desc->obj = wrapper; + if (desc.object()) + desc.object().set(wrapper); return true; } @@ -1562,14 +1569,14 @@ RecreateLostWaivers(JSContext *cx, PropertyDescriptor *orig, template bool XrayWrapper::defineProperty(JSContext *cx, HandleObject wrapper, - HandleId id, PropertyDescriptor *desc) + HandleId id, MutableHandle desc) { assertEnteredPolicy(cx, wrapper, id); // NB: We still need JSRESOLVE_ASSIGNING here for the time being, because it // tells things like nodelists whether they should create the property or not. Rooted existing_desc(cx); - if (!getOwnPropertyDescriptor(cx, wrapper, id, existing_desc.address(), JSRESOLVE_ASSIGNING)) + if (!getOwnPropertyDescriptor(cx, wrapper, id, &existing_desc, JSRESOLVE_ASSIGNING)) return false; if (existing_desc.object() && existing_desc.isPermanent()) @@ -1593,12 +1600,12 @@ XrayWrapper::defineProperty(JSContext *cx, HandleObject wrapper, return false; // Wrap the property descriptor for the target compartment. - Rooted wrappedDesc(cx, *desc); + Rooted wrappedDesc(cx, desc); if (!JS_WrapPropertyDescriptor(cx, wrappedDesc.address())) return false; // Fix up Xray waivers. - if (!RecreateLostWaivers(cx, desc, &wrappedDesc)) + if (!RecreateLostWaivers(cx, desc.address(), &wrappedDesc)) return false; return JS_DefinePropertyById(cx, expandoObject, id, wrappedDesc.value(), diff --git a/js/xpconnect/wrappers/XrayWrapper.h b/js/xpconnect/wrappers/XrayWrapper.h index e5a6ab1261ae..856df525bc38 100644 --- a/js/xpconnect/wrappers/XrayWrapper.h +++ b/js/xpconnect/wrappers/XrayWrapper.h @@ -73,12 +73,12 @@ class XrayWrapper : public Base { virtual bool isExtensible(JSContext *cx, JS::Handle wrapper, bool *extensible) MOZ_OVERRIDE; virtual bool preventExtensions(JSContext *cx, JS::Handle wrapper) MOZ_OVERRIDE; virtual bool getPropertyDescriptor(JSContext *cx, JS::Handle wrapper, JS::Handle id, - js::PropertyDescriptor *desc, unsigned flags); + JS::MutableHandle desc, unsigned flags); virtual bool getOwnPropertyDescriptor(JSContext *cx, JS::Handle wrapper, JS::Handle id, - js::PropertyDescriptor *desc, + JS::MutableHandle desc, unsigned flags); virtual bool defineProperty(JSContext *cx, JS::Handle wrapper, JS::Handle id, - js::PropertyDescriptor *desc); + JS::MutableHandle desc); virtual bool getOwnPropertyNames(JSContext *cx, JS::Handle wrapper, js::AutoIdVector &props); virtual bool delete_(JSContext *cx, JS::Handle wrapper, @@ -130,10 +130,12 @@ public: } virtual bool getPropertyDescriptor(JSContext *cx, JS::Handle proxy, - JS::Handle id, js::PropertyDescriptor *desc, + JS::Handle id, + JS::MutableHandle desc, unsigned flags) MOZ_OVERRIDE; virtual bool getOwnPropertyDescriptor(JSContext *cx, JS::Handle proxy, - JS::Handle id, js::PropertyDescriptor *desc, + JS::Handle id, + JS::MutableHandle desc, unsigned flags) MOZ_OVERRIDE; // We just forward the derived traps to the BaseProxyHandler versions which