diff --git a/js/xpconnect/src/XPCJSID.cpp b/js/xpconnect/src/XPCJSID.cpp index fba9f6a69d81..f2ad4b25e53b 100644 --- a/js/xpconnect/src/XPCJSID.cpp +++ b/js/xpconnect/src/XPCJSID.cpp @@ -260,10 +260,22 @@ NS_IMPL_THREADSAFE_RELEASE(SharedScriptableHelperForJSIID) #include "xpc_map_end.h" /* This will #undef the above */ static nsIXPCScriptable* gSharedScriptableHelperForJSIID; +static bool gClassObjectsWereInited = false; + +static void EnsureClassObjectsInitialized() +{ + if (!gClassObjectsWereInited) { + gSharedScriptableHelperForJSIID = new SharedScriptableHelperForJSIID(); + NS_ADDREF(gSharedScriptableHelperForJSIID); + + gClassObjectsWereInited = true; + } +} NS_METHOD GetSharedScriptableHelperForJSIID(PRUint32 language, nsISupports **helper) { + EnsureClassObjectsInitialized(); if (language == nsIProgrammingLanguage::JAVASCRIPT) { NS_IF_ADDREF(gSharedScriptableHelperForJSIID); *helper = gSharedScriptableHelperForJSIID; @@ -274,8 +286,6 @@ NS_METHOD GetSharedScriptableHelperForJSIID(PRUint32 language, /******************************************************/ -static JSBool gClassObjectsWereInited = false; - #define NULL_CID \ { 0x00000000, 0x0000, 0x0000, \ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } @@ -287,22 +297,15 @@ NS_IMPL_CLASSINFO(nsJSIID, GetSharedScriptableHelperForJSIID, NS_DECL_CI_INTERFACE_GETTER(nsJSCID) NS_IMPL_CLASSINFO(nsJSCID, NULL, nsIClassInfo::THREADSAFE, NULL_CID) -void xpc_InitJSxIDClassObjects() -{ - if (!gClassObjectsWereInited) { - gSharedScriptableHelperForJSIID = new SharedScriptableHelperForJSIID(); - NS_ADDREF(gSharedScriptableHelperForJSIID); - } - gClassObjectsWereInited = true; -} - void xpc_DestroyJSxIDClassObjects() { - NS_IF_RELEASE(NS_CLASSINFO_NAME(nsJSIID)); - NS_IF_RELEASE(NS_CLASSINFO_NAME(nsJSCID)); - NS_IF_RELEASE(gSharedScriptableHelperForJSIID); + if (gClassObjectsWereInited) { + NS_IF_RELEASE(NS_CLASSINFO_NAME(nsJSIID)); + NS_IF_RELEASE(NS_CLASSINFO_NAME(nsJSCID)); + NS_IF_RELEASE(gSharedScriptableHelperForJSIID); - gClassObjectsWereInited = false; + gClassObjectsWereInited = false; + } } /***************************************************************************/ diff --git a/js/xpconnect/src/nsXPConnect.cpp b/js/xpconnect/src/nsXPConnect.cpp index 950d94a8fe19..37bca850f790 100644 --- a/js/xpconnect/src/nsXPConnect.cpp +++ b/js/xpconnect/src/nsXPConnect.cpp @@ -1082,8 +1082,6 @@ nsXPConnect::InitClasses(JSContext * aJSContext, JSObject * aGlobalJSObj) if (!ac.enter(ccx, aGlobalJSObj)) return UnexpectedFailure(NS_ERROR_FAILURE); - xpc_InitJSxIDClassObjects(); - XPCWrappedNativeScope* scope = XPCWrappedNativeScope::GetNewOrUsed(ccx, aGlobalJSObj); diff --git a/js/xpconnect/src/xpcprivate.h b/js/xpconnect/src/xpcprivate.h index b75e79188ac4..2faf0dda3197 100644 --- a/js/xpconnect/src/xpcprivate.h +++ b/js/xpconnect/src/xpcprivate.h @@ -3493,10 +3493,10 @@ private: * member (as a hidden implementaion detail) to which they delegate many calls. */ -extern void xpc_InitJSxIDClassObjects(); +// Initialization is done on demand, and calling the destructor below is always +// safe. extern void xpc_DestroyJSxIDClassObjects(); - class nsJSID : public nsIJSID { public: