From 17eaab9c517f886f55363e421218cb5ffbfd55ed Mon Sep 17 00:00:00 2001 From: Bobby Holley Date: Wed, 13 Feb 2013 00:22:27 +0100 Subject: [PATCH] Bug 834732 - Assert proper cx stack handling in WrapperFactory::Rewrap. r=mrbkap --- js/xpconnect/src/XPCWrappedJSClass.cpp | 1 + js/xpconnect/wrappers/WrapperFactory.cpp | 3 +++ 2 files changed, 4 insertions(+) diff --git a/js/xpconnect/src/XPCWrappedJSClass.cpp b/js/xpconnect/src/XPCWrappedJSClass.cpp index caa69a3a76c5..9ed1f5830f77 100644 --- a/js/xpconnect/src/XPCWrappedJSClass.cpp +++ b/js/xpconnect/src/XPCWrappedJSClass.cpp @@ -492,6 +492,7 @@ nsXPCWrappedJSClass::IsWrappedJS(nsISupports* aPtr) result == WrappedJSIdentity::GetSingleton(); } +// NB: This returns null unless there's nothing on the JSContext stack. static JSContext * GetContextFromObject(JSObject *obj) { diff --git a/js/xpconnect/wrappers/WrapperFactory.cpp b/js/xpconnect/wrappers/WrapperFactory.cpp index 627fc06b4797..2f01d9d7958c 100644 --- a/js/xpconnect/wrappers/WrapperFactory.cpp +++ b/js/xpconnect/wrappers/WrapperFactory.cpp @@ -341,6 +341,9 @@ WrapperFactory::Rewrap(JSContext *cx, JSObject *existing, JSObject *obj, "wrapped object passed to rewrap"); MOZ_ASSERT(JS_GetClass(obj) != &XrayUtils::HolderClass, "trying to wrap a holder"); MOZ_ASSERT(!js::IsInnerObject(obj)); + // We sometimes end up here after nsContentUtils has been shut down but before + // XPConnect has been shut down, so check the context stack the roundabout way. + MOZ_ASSERT(XPCJSRuntime::Get()->GetJSContextStack()->Peek() == cx); // Compute the information we need to select the right wrapper. JSCompartment *origin = js::GetObjectCompartment(obj);