Bug 761707 part 2. Drop the vestigial jsclass argument to UnwrapDOMObject. r=bholley

This commit is contained in:
Boris Zbarsky 2012-06-06 15:59:46 -04:00
parent e90ba0af0f
commit 31ccf86cf9
11 changed files with 35 additions and 36 deletions

View File

@ -2442,9 +2442,9 @@ nsScriptSecurityManager::doGetObjectPrincipal(JSObject *aObj
if (!(~jsClass->flags & (JSCLASS_HAS_PRIVATE |
JSCLASS_PRIVATE_IS_NSISUPPORTS))) {
priv = (nsISupports *) js::GetObjectPrivate(aObj);
} else if ((jsClass->flags & JSCLASS_IS_DOMJSCLASS) &&
} else if (IsDOMClass(jsClass) &&
DOMJSClass::FromJSClass(jsClass)->mDOMObjectIsISupports) {
priv = UnwrapDOMObject<nsISupports>(aObj, jsClass);
priv = UnwrapDOMObject<nsISupports>(aObj);
} else {
priv = nsnull;
}

View File

@ -340,11 +340,12 @@ QueryInterface(JSContext* cx, unsigned argc, JS::Value* vp)
JSObject* obj = JSVAL_TO_OBJECT(thisv);
JSClass* clasp = js::GetObjectJSClass(obj);
if (!IsDOMClass(clasp)) {
if (!IsDOMClass(clasp) ||
!DOMJSClass::FromJSClass(clasp)->mDOMObjectIsISupports) {
return Throw<true>(cx, NS_ERROR_FAILURE);
}
nsISupports* native = UnwrapDOMObject<nsISupports>(obj, clasp);
nsISupports* native = UnwrapDOMObject<nsISupports>(obj);
if (argc < 1) {
return Throw<true>(cx, NS_ERROR_XPC_NOT_ENOUGH_ARGS);

View File

@ -60,9 +60,15 @@ IsDOMClass(const JSClass* clasp)
return clasp->flags & JSCLASS_IS_DOMJSCLASS;
}
inline bool
IsDOMClass(const js::Class* clasp)
{
return clasp->flags & JSCLASS_IS_DOMJSCLASS;
}
template <class T>
inline T*
UnwrapDOMObject(JSObject* obj, const JSClass* clasp)
UnwrapDOMObject(JSObject* obj)
{
JS::Value val = js::GetReservedSlot(obj, DOM_OBJECT_SLOT);
// XXXbz/khuey worker code tries to unwrap interface objects (which have
@ -76,13 +82,6 @@ UnwrapDOMObject(JSObject* obj, const JSClass* clasp)
return static_cast<T*>(val.toPrivate());
}
template <class T>
inline T*
UnwrapDOMObject(JSObject* obj, const js::Class* clasp)
{
return UnwrapDOMObject<T>(obj, Jsvalify(clasp));
}
// Some callers don't want to set an exception when unwrappin fails
// (for example, overload resolution uses unwrapping to tell what sort
// of thing it's looking at).
@ -120,7 +119,7 @@ UnwrapObject(JSContext* cx, JSObject* obj, U& value)
DOMJSClass* domClass = DOMJSClass::FromJSClass(clasp);
if (domClass->mInterfaceChain[PrototypeTraits<PrototypeID>::Depth] ==
PrototypeID) {
value = UnwrapDOMObject<T>(obj, clasp);
value = UnwrapDOMObject<T>(obj);
return NS_OK;
}

View File

@ -464,8 +464,7 @@ class CGAbstractClassHook(CGAbstractStaticMethod):
def definition_body_prologue(self):
return """
MOZ_ASSERT(js::GetObjectJSClass(obj) == Class.ToJSClass());
%s* self = UnwrapDOMObject<%s>(obj, Class.ToJSClass());
%s* self = UnwrapDOMObject<%s>(obj);
""" % (self.descriptor.nativeType, self.descriptor.nativeType)
def definition_body(self):

View File

@ -217,7 +217,7 @@ private:
Finalize(JSFreeOp* aFop, JSObject* aObj)
{
JS_ASSERT(JS_GetClass(aObj) == Class());
WorkerPrivate* worker = UnwrapDOMObject<WorkerPrivate>(aObj, Class());
WorkerPrivate* worker = UnwrapDOMObject<WorkerPrivate>(aObj);
if (worker) {
worker->_finalize(aFop);
}
@ -227,7 +227,7 @@ private:
Trace(JSTracer* aTrc, JSObject* aObj)
{
JS_ASSERT(JS_GetClass(aObj) == Class());
WorkerPrivate* worker = UnwrapDOMObject<WorkerPrivate>(aObj, Class());
WorkerPrivate* worker = UnwrapDOMObject<WorkerPrivate>(aObj);
if (worker) {
worker->_trace(aTrc);
}
@ -358,7 +358,7 @@ private:
if (aObj) {
JSClass* classPtr = JS_GetClass(aObj);
if (classPtr == Class()) {
return UnwrapDOMObject<WorkerPrivate>(aObj, Class());
return UnwrapDOMObject<WorkerPrivate>(aObj);
}
}
@ -375,7 +375,7 @@ private:
Finalize(JSFreeOp* aFop, JSObject* aObj)
{
JS_ASSERT(JS_GetClass(aObj) == Class());
WorkerPrivate* worker = UnwrapDOMObject<WorkerPrivate>(aObj, Class());
WorkerPrivate* worker = UnwrapDOMObject<WorkerPrivate>(aObj);
if (worker) {
worker->_finalize(aFop);
}
@ -385,7 +385,7 @@ private:
Trace(JSTracer* aTrc, JSObject* aObj)
{
JS_ASSERT(JS_GetClass(aObj) == Class());
WorkerPrivate* worker = UnwrapDOMObject<WorkerPrivate>(aObj, Class());
WorkerPrivate* worker = UnwrapDOMObject<WorkerPrivate>(aObj);
if (worker) {
worker->_trace(aTrc);
}
@ -414,7 +414,7 @@ Worker::GetInstancePrivate(JSContext* aCx, JSObject* aObj,
{
JSClass* classPtr = JS_GetClass(aObj);
if (classPtr == Class() || classPtr == ChromeWorker::Class()) {
return UnwrapDOMObject<WorkerPrivate>(aObj, classPtr);
return UnwrapDOMObject<WorkerPrivate>(aObj);
}
JS_ReportErrorNumber(aCx, js_GetErrorMessage, NULL, JSMSG_INCOMPATIBLE_PROTO,

View File

@ -768,7 +768,7 @@ private:
{
JSClass* classPtr = JS_GetClass(aObj);
if (classPtr == Class()) {
return UnwrapDOMObject<DedicatedWorkerGlobalScope>(aObj, classPtr);
return UnwrapDOMObject<DedicatedWorkerGlobalScope>(aObj);
}
JS_ReportErrorNumber(aCx, js_GetErrorMessage, NULL,
@ -803,7 +803,7 @@ private:
{
JS_ASSERT(JS_GetClass(aObj) == Class());
DedicatedWorkerGlobalScope* scope =
UnwrapDOMObject<DedicatedWorkerGlobalScope>(aObj, Class());
UnwrapDOMObject<DedicatedWorkerGlobalScope>(aObj);
if (scope) {
DestroyProtoOrIfaceCache(aObj);
scope->_finalize(aFop);
@ -815,7 +815,7 @@ private:
{
JS_ASSERT(JS_GetClass(aObj) == Class());
DedicatedWorkerGlobalScope* scope =
UnwrapDOMObject<DedicatedWorkerGlobalScope>(aObj, Class());
UnwrapDOMObject<DedicatedWorkerGlobalScope>(aObj);
if (scope) {
mozilla::dom::TraceProtoOrIfaceCache(aTrc, aObj);
scope->_trace(aTrc);
@ -888,7 +888,7 @@ WorkerGlobalScope::GetInstancePrivate(JSContext* aCx, JSObject* aObj,
JS_ASSERT(classPtr != Class());
if (classPtr == DedicatedWorkerGlobalScope::Class()) {
return UnwrapDOMObject<DedicatedWorkerGlobalScope>(aObj, classPtr);
return UnwrapDOMObject<DedicatedWorkerGlobalScope>(aObj);
}
JS_ReportErrorNumber(aCx, js_GetErrorMessage, NULL, JSMSG_INCOMPATIBLE_PROTO,

View File

@ -74,9 +74,9 @@ XPCConvert::GetISupportsFromJSObject(JSObject* obj, nsISupports** iface)
*iface = (nsISupports*) xpc_GetJSPrivate(obj);
return true;
}
if (jsclass && (jsclass->flags & JSCLASS_IS_DOMJSCLASS) &&
if (jsclass && IsDOMClass(jsclass) &&
DOMJSClass::FromJSClass(jsclass)->mDOMObjectIsISupports) {
*iface = UnwrapDOMObject<nsISupports>(obj, jsclass);
*iface = UnwrapDOMObject<nsISupports>(obj);
return true;
}
return false;

View File

@ -489,8 +489,7 @@ nsJSIID::HasInstance(nsIXPConnectWrappedNative *wrapper,
js::GetObjectJSClass(obj))->mDOMObjectIsISupports,
"This only works on nsISupports classes!");
identity =
mozilla::dom::UnwrapDOMObject<nsISupports>(obj,
js::GetObjectJSClass(obj));
mozilla::dom::UnwrapDOMObject<nsISupports>(obj);
} else {
identity = nsnull;
}

View File

@ -25,6 +25,7 @@
#include "jsfriendapi.h"
#include "js/MemoryMetrics.h"
#include "mozilla/dom/DOMJSClass.h"
#include "mozilla/dom/BindingUtils.h"
#include "nsJSPrincipals.h"
@ -460,14 +461,14 @@ SuspectDOMExpandos(nsPtrHashKey<JSObject> *key, void *arg)
JSObject* obj = key->GetKey();
nsISupports* native = nsnull;
if (js::IsProxy(obj)) {
NS_ASSERTION(mozilla::dom::binding::instanceIsProxy(obj),
NS_ASSERTION(dom::binding::instanceIsProxy(obj),
"Not a DOM proxy?");
native = static_cast<nsISupports*>(js::GetProxyPrivate(obj).toPrivate());
}
else {
NS_ASSERTION(mozilla::dom::DOMJSClass::FromJSClass(JS_GetClass(obj))->mDOMObjectIsISupports,
NS_ASSERTION(dom::DOMJSClass::FromJSClass(JS_GetClass(obj))->mDOMObjectIsISupports,
"Someone added a wrapper for a non-nsISupports native to DOMExpandos!");
native = static_cast<nsISupports*>(js::GetReservedSlot(obj, DOM_OBJECT_SLOT).toPrivate());
native = dom::UnwrapDOMObject<nsISupports>(obj);
}
closure->cb->NoteXPCOMRoot(native);
return PL_DHASH_NEXT;

View File

@ -223,9 +223,9 @@ XPCWrappedNativeScope::SetGlobal(XPCCallContext& ccx, JSObject* aGlobal,
// Our global has an nsISupports native pointer. Let's
// see whether it's what we want.
priv = static_cast<nsISupports*>(xpc_GetJSPrivate(aGlobal));
} else if ((jsClass->flags & JSCLASS_IS_DOMJSCLASS) &&
} else if (dom::IsDOMClass(jsClass) &&
dom::DOMJSClass::FromJSClass(jsClass)->mDOMObjectIsISupports) {
priv = dom::UnwrapDOMObject<nsISupports>(aGlobal, jsClass);
priv = dom::UnwrapDOMObject<nsISupports>(aGlobal);
} else {
priv = nsnull;
}

View File

@ -870,10 +870,10 @@ nsXPConnect::Traverse(void *p, nsCycleCollectionTraversalCallback &cb)
nsISupports *identity =
static_cast<nsISupports*>(js::GetProxyPrivate(obj).toPrivate());
cb.NoteXPCOMChild(identity);
} else if ((clazz->flags & JSCLASS_IS_DOMJSCLASS) &&
} else if (IsDOMClass(clazz) &&
DOMJSClass::FromJSClass(clazz)->mDOMObjectIsISupports) {
NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "UnwrapDOMObject(obj)");
nsISupports *identity = UnwrapDOMObject<nsISupports>(obj, clazz);
nsISupports *identity = UnwrapDOMObject<nsISupports>(obj);
cb.NoteXPCOMChild(identity);
}