Bug 720580 - Make JSID class initialization happen on demand. r=mrbkap

This commit is contained in:
Bobby Holley 2012-03-05 15:22:44 -08:00
Родитель 90e916fe1a
Коммит 6fa1a307cf
3 изменённых файлов: 20 добавлений и 19 удалений

Просмотреть файл

@ -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;
}
}
/***************************************************************************/

Просмотреть файл

@ -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);

Просмотреть файл

@ -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: