From 381d88b9019df22c01e538590ea0cca785de6e89 Mon Sep 17 00:00:00 2001 From: Phil Ringnalda Date: Tue, 4 Feb 2014 21:01:19 -0800 Subject: [PATCH] Backed out 9 changesets (bug 965920, bug 966765, bug 966766) CLOSED TREE Backed out changeset 6c2bba06ed58 (bug 965920) Backed out changeset e01c94498760 (bug 966766) Backed out changeset e2585386f84e (bug 966766) Backed out changeset d1db5d2a417f (bug 966766) Backed out changeset f114c97660c6 (bug 966766) Backed out changeset 2dd7d47a1e8c (bug 966765) Backed out changeset 0f26c4b3eab7 (bug 965920) Backed out changeset ca0b05e7155f (bug 965920) Backed out changeset 55dcd2a5362e (bug 965920) --- js/xpconnect/src/XPCCallContext.cpp | 20 ++++++++------ js/xpconnect/src/XPCComponents.cpp | 3 +-- js/xpconnect/src/XPCConvert.cpp | 14 +++++----- js/xpconnect/src/XPCJSID.cpp | 10 +++---- js/xpconnect/src/XPCShellImpl.cpp | 6 ++--- js/xpconnect/src/XPCVariant.cpp | 13 +++++---- js/xpconnect/src/XPCWrappedJS.cpp | 7 +++-- js/xpconnect/src/XPCWrappedJSClass.cpp | 27 ++++++++++--------- js/xpconnect/src/XPCWrappedNative.cpp | 14 +++++----- js/xpconnect/src/nsXPConnect.cpp | 37 +++++++++++++++++++------- js/xpconnect/src/xpcprivate.h | 5 ++-- 11 files changed, 91 insertions(+), 65 deletions(-) diff --git a/js/xpconnect/src/XPCCallContext.cpp b/js/xpconnect/src/XPCCallContext.cpp index 426ee9a7e75b..6bc2fea9d215 100644 --- a/js/xpconnect/src/XPCCallContext.cpp +++ b/js/xpconnect/src/XPCCallContext.cpp @@ -246,8 +246,9 @@ XPCCallContext::~XPCCallContext() NS_IMETHODIMP XPCCallContext::GetCallee(nsISupports * *aCallee) { - nsCOMPtr rval = mWrapper ? mWrapper->GetIdentityObject() : nullptr; - rval.forget(aCallee); + nsISupports* temp = mWrapper ? mWrapper->GetIdentityObject() : nullptr; + NS_IF_ADDREF(temp); + *aCallee = temp; return NS_OK; } @@ -263,8 +264,9 @@ XPCCallContext::GetCalleeMethodIndex(uint16_t *aCalleeMethodIndex) NS_IMETHODIMP XPCCallContext::GetCalleeWrapper(nsIXPConnectWrappedNative * *aCalleeWrapper) { - nsCOMPtr rval = mWrapper; - rval.forget(aCalleeWrapper); + nsIXPConnectWrappedNative* temp = mWrapper; + NS_IF_ADDREF(temp); + *aCalleeWrapper = temp; return NS_OK; } @@ -272,8 +274,9 @@ XPCCallContext::GetCalleeWrapper(nsIXPConnectWrappedNative * *aCalleeWrapper) NS_IMETHODIMP XPCCallContext::GetCalleeInterface(nsIInterfaceInfo * *aCalleeInterface) { - nsCOMPtr rval = mInterface->GetInterfaceInfo(); - rval.forget(aCalleeInterface); + nsIInterfaceInfo* temp = mInterface->GetInterfaceInfo(); + NS_IF_ADDREF(temp); + *aCalleeInterface = temp; return NS_OK; } @@ -281,8 +284,9 @@ XPCCallContext::GetCalleeInterface(nsIInterfaceInfo * *aCalleeInterface) NS_IMETHODIMP XPCCallContext::GetCalleeClassInfo(nsIClassInfo * *aCalleeClassInfo) { - nsCOMPtr rval = mWrapper ? mWrapper->GetClassInfo() : nullptr; - rval.forget(aCalleeClassInfo); + nsIClassInfo* temp = mWrapper ? mWrapper->GetClassInfo() : nullptr; + NS_IF_ADDREF(temp); + *aCalleeClassInfo = temp; return NS_OK; } diff --git a/js/xpconnect/src/XPCComponents.cpp b/js/xpconnect/src/XPCComponents.cpp index 7f01959a372a..d9815805d38c 100644 --- a/js/xpconnect/src/XPCComponents.cpp +++ b/js/xpconnect/src/XPCComponents.cpp @@ -2550,8 +2550,7 @@ nsXPCComponents_Utils::GetSandbox(nsIXPCComponents_utils_Sandbox **aSandbox) if (!mSandbox) mSandbox = NewSandboxConstructor(); - nsCOMPtr rval = mSandbox; - rval.forget(aSandbox); + NS_ADDREF(*aSandbox = mSandbox); return NS_OK; } diff --git a/js/xpconnect/src/XPCConvert.cpp b/js/xpconnect/src/XPCConvert.cpp index a2cb7dbf6cb2..71074c6fd289 100644 --- a/js/xpconnect/src/XPCConvert.cpp +++ b/js/xpconnect/src/XPCConvert.cpp @@ -721,11 +721,10 @@ XPCConvert::JSData2Native(void* d, HandleValue s, MOZ_ASSERT(iid,"can't do interface conversions without iid"); if (iid->Equals(NS_GET_IID(nsIVariant))) { - nsCOMPtr variant = XPCVariant::newVariant(cx, s); + XPCVariant* variant = XPCVariant::newVariant(cx, s); if (!variant) return false; - - variant.forget(static_cast(d)); + *((nsISupports**)d) = static_cast(variant); return true; } else if (iid->Equals(NS_GET_IID(nsIAtom)) && JSVAL_IS_STRING(s)) { @@ -772,11 +771,11 @@ CreateHolderIfNeeded(HandleObject obj, MutableHandleValue d, nsIXPConnectJSObjectHolder** dest) { if (dest) { - nsRefPtr objHolder = XPCJSObjectHolder::newHolder(obj); + XPCJSObjectHolder* objHolder = XPCJSObjectHolder::newHolder(obj); if (!objHolder) return false; - objHolder.forget(dest); + NS_ADDREF(*dest = objHolder); } d.setObjectOrNull(obj); @@ -1150,8 +1149,9 @@ XPCConvert::JSValToXPCException(MutableHandleValue s, nsCOMPtr iface = do_QueryInterface(supports); if (iface) { // just pass through the exception (with extra ref and all) - nsCOMPtr temp = iface; - temp.forget(exceptn); + nsIException* temp = iface; + NS_ADDREF(temp); + *exceptn = temp; return NS_OK; } else { // it is a wrapped native, but not an exception! diff --git a/js/xpconnect/src/XPCJSID.cpp b/js/xpconnect/src/XPCJSID.cpp index 22d076dae731..ec367198762b 100644 --- a/js/xpconnect/src/XPCJSID.cpp +++ b/js/xpconnect/src/XPCJSID.cpp @@ -10,7 +10,6 @@ #include "mozilla/dom/BindingUtils.h" #include "mozilla/Attributes.h" #include "JavaScriptParent.h" -#include "mozilla/StaticPtr.h" using namespace mozilla::dom; using namespace JS; @@ -224,13 +223,14 @@ NS_IMPL_RELEASE(SharedScriptableHelperForJSIID) nsIXPCScriptable::ALLOW_PROP_MODS_DURING_RESOLVE #include "xpc_map_end.h" /* This will #undef the above */ -static mozilla::StaticRefPtr gSharedScriptableHelperForJSIID; +static nsIXPCScriptable* gSharedScriptableHelperForJSIID; static bool gClassObjectsWereInited = false; static void EnsureClassObjectsInitialized() { if (!gClassObjectsWereInited) { gSharedScriptableHelperForJSIID = new SharedScriptableHelperForJSIID(); + NS_ADDREF(gSharedScriptableHelperForJSIID); gClassObjectsWereInited = true; } @@ -241,8 +241,8 @@ NS_METHOD GetSharedScriptableHelperForJSIID(uint32_t language, { EnsureClassObjectsInitialized(); if (language == nsIProgrammingLanguage::JAVASCRIPT) { - nsCOMPtr temp = gSharedScriptableHelperForJSIID.get(); - temp.forget(helper); + NS_IF_ADDREF(gSharedScriptableHelperForJSIID); + *helper = gSharedScriptableHelperForJSIID; } else *helper = nullptr; return NS_OK; @@ -268,7 +268,7 @@ void xpc_DestroyJSxIDClassObjects() if (gClassObjectsWereInited) { NS_IF_RELEASE(NS_CLASSINFO_NAME(nsJSIID)); NS_IF_RELEASE(NS_CLASSINFO_NAME(nsJSCID)); - gSharedScriptableHelperForJSIID = nullptr; + NS_IF_RELEASE(gSharedScriptableHelperForJSIID); gClassObjectsWereInited = false; } diff --git a/js/xpconnect/src/XPCShellImpl.cpp b/js/xpconnect/src/XPCShellImpl.cpp index d83b2175be46..e03c24eb92a2 100644 --- a/js/xpconnect/src/XPCShellImpl.cpp +++ b/js/xpconnect/src/XPCShellImpl.cpp @@ -1266,8 +1266,8 @@ NS_IMETHODIMP nsXPCFunctionThisTranslator::TranslateThis(nsISupports *aInitialThis, nsISupports **_retval) { - nsCOMPtr temp = aInitialThis; - temp.forget(_retval); + NS_IF_ADDREF(aInitialThis); + *_retval = aInitialThis; return NS_OK; } @@ -1687,7 +1687,7 @@ XPCShellDirProvider::GetFile(const char *prop, bool *persistent, NS_FAILED(file->AppendNative(NS_LITERAL_CSTRING("defaults"))) || NS_FAILED(file->AppendNative(NS_LITERAL_CSTRING("pref")))) return NS_ERROR_FAILURE; - file.forget(result); + NS_ADDREF(*result = file); return NS_OK; } diff --git a/js/xpconnect/src/XPCVariant.cpp b/js/xpconnect/src/XPCVariant.cpp index 86afcc117987..e65bfa7ecdc1 100644 --- a/js/xpconnect/src/XPCVariant.cpp +++ b/js/xpconnect/src/XPCVariant.cpp @@ -110,20 +110,23 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(XPCVariant) NS_IMPL_CYCLE_COLLECTION_UNLINK_END // static -already_AddRefed -XPCVariant::newVariant(JSContext* cx, jsval aJSVal) +XPCVariant* XPCVariant::newVariant(JSContext* cx, jsval aJSVal) { - nsRefPtr variant; + XPCVariant* variant; if (!JSVAL_IS_TRACEABLE(aJSVal)) variant = new XPCVariant(cx, aJSVal); else variant = new XPCTraceableVariant(cx, aJSVal); - if (!variant->InitializeData(cx)) + if (!variant) return nullptr; + NS_ADDREF(variant); - return variant.forget(); + if (!variant->InitializeData(cx)) + NS_RELEASE(variant); // Also sets variant to nullptr. + + return variant; } // Helper class to give us a namespace for the table based code below. diff --git a/js/xpconnect/src/XPCWrappedJS.cpp b/js/xpconnect/src/XPCWrappedJS.cpp index 578c8928119d..f51525bd7e78 100644 --- a/js/xpconnect/src/XPCWrappedJS.cpp +++ b/js/xpconnect/src/XPCWrappedJS.cpp @@ -491,7 +491,7 @@ nsXPCWrappedJS::FindInherited(REFNSIID aIID) } NS_IMETHODIMP -nsXPCWrappedJS::GetInterfaceInfo(nsIInterfaceInfo** infoResult) +nsXPCWrappedJS::GetInterfaceInfo(nsIInterfaceInfo** info) { MOZ_ASSERT(GetClass(), "wrapper without class"); MOZ_ASSERT(GetClass()->GetInterfaceInfo(), "wrapper class without interface"); @@ -499,10 +499,9 @@ nsXPCWrappedJS::GetInterfaceInfo(nsIInterfaceInfo** infoResult) // Since failing to get this info will crash some platforms(!), we keep // mClass valid at shutdown time. - nsCOMPtr info = GetClass()->GetInterfaceInfo(); - if (!info) + if (!(*info = GetClass()->GetInterfaceInfo())) return NS_ERROR_UNEXPECTED; - info.forget(infoResult); + NS_ADDREF(*info); return NS_OK; } diff --git a/js/xpconnect/src/XPCWrappedJSClass.cpp b/js/xpconnect/src/XPCWrappedJSClass.cpp index 9c097aeef9b1..d8198606d800 100644 --- a/js/xpconnect/src/XPCWrappedJSClass.cpp +++ b/js/xpconnect/src/XPCWrappedJSClass.cpp @@ -101,28 +101,30 @@ bool xpc_IsReportableErrorCode(nsresult code) // static nsresult nsXPCWrappedJSClass::GetNewOrUsed(JSContext* cx, REFNSIID aIID, - nsXPCWrappedJSClass** resultClasp) + nsXPCWrappedJSClass** resultClazz) { + nsXPCWrappedJSClass* clazz = nullptr; XPCJSRuntime* rt = nsXPConnect::GetRuntimeInstance(); - IID2WrappedJSClassMap* map = rt->GetWrappedJSClassMap(); - nsRefPtr clasp = map->Find(aIID); - if (!clasp) { + IID2WrappedJSClassMap* map = rt->GetWrappedJSClassMap(); + clazz = map->Find(aIID); + NS_IF_ADDREF(clazz); + + if (!clazz) { nsCOMPtr info; nsXPConnect::XPConnect()->GetInfoForIID(&aIID, getter_AddRefs(info)); if (info) { bool canScript, isBuiltin; if (NS_SUCCEEDED(info->IsScriptable(&canScript)) && canScript && NS_SUCCEEDED(info->IsBuiltinClass(&isBuiltin)) && !isBuiltin && - nsXPConnect::IsISupportsDescendant(info)) - { - clasp = new nsXPCWrappedJSClass(cx, aIID, info); - if (!clasp->mDescriptors) - clasp = nullptr; + nsXPConnect::IsISupportsDescendant(info)) { + clazz = new nsXPCWrappedJSClass(cx, aIID, info); + if (clazz && !clazz->mDescriptors) + NS_RELEASE(clazz); // sets clazz to nullptr } } } - clasp.forget(resultClasp); + *resultClazz = clazz; return NS_OK; } @@ -134,6 +136,8 @@ nsXPCWrappedJSClass::nsXPCWrappedJSClass(JSContext* cx, REFNSIID aIID, mIID(aIID), mDescriptors(nullptr) { + NS_ADDREF_THIS(); + mRuntime->GetWrappedJSClassMap()->Add(this); uint16_t methodCount; @@ -416,8 +420,7 @@ NS_IMETHODIMP xpcProperty::GetName(nsAString & aName) /* readonly attribute nsIVariant value; */ NS_IMETHODIMP xpcProperty::GetValue(nsIVariant * *aValue) { - nsCOMPtr rval = mValue; - rval.forget(aValue); + NS_ADDREF(*aValue = mValue); return NS_OK; } diff --git a/js/xpconnect/src/XPCWrappedNative.cpp b/js/xpconnect/src/XPCWrappedNative.cpp index d286dc25c1b1..ecfc0beca1ff 100644 --- a/js/xpconnect/src/XPCWrappedNative.cpp +++ b/js/xpconnect/src/XPCWrappedNative.cpp @@ -2404,8 +2404,8 @@ NS_IMETHODIMP XPCWrappedNative::GetNative(nsISupports * *aNative) { // No need to QI here, we already have the correct nsISupports // vtable. - nsCOMPtr rval = mIdentity; - rval.forget(aNative); + *aNative = mIdentity; + NS_ADDREF(*aNative); return NS_OK; } @@ -2446,8 +2446,9 @@ NS_IMETHODIMP XPCWrappedNative::FindInterfaceWithMember(HandleId name, XPCNativeMember* member; if (GetSet()->FindMember(name, &member, &iface) && iface) { - nsCOMPtr temp = iface->GetInterfaceInfo(); - temp.forget(_retval); + nsIInterfaceInfo* temp = iface->GetInterfaceInfo(); + NS_IF_ADDREF(temp); + *_retval = temp; } else *_retval = nullptr; return NS_OK; @@ -2459,8 +2460,9 @@ NS_IMETHODIMP XPCWrappedNative::FindInterfaceWithName(HandleId name, { XPCNativeInterface* iface = GetSet()->FindNamedInterface(name); if (iface) { - nsCOMPtr temp = iface->GetInterfaceInfo(); - temp.forget(_retval); + nsIInterfaceInfo* temp = iface->GetInterfaceInfo(); + NS_IF_ADDREF(temp); + *_retval = temp; } else *_retval = nullptr; return NS_OK; diff --git a/js/xpconnect/src/nsXPConnect.cpp b/js/xpconnect/src/nsXPConnect.cpp index 7c5a5d460516..5dcdfc534f83 100644 --- a/js/xpconnect/src/nsXPConnect.cpp +++ b/js/xpconnect/src/nsXPConnect.cpp @@ -159,6 +159,25 @@ nsXPConnect::ReleaseXPConnectSingleton() if (xpc) { nsThread::SetMainThreadObserver(nullptr); +#ifdef DEBUG + // force a dump of the JavaScript gc heap if JS is still alive + // if requested through XPC_SHUTDOWN_HEAP_DUMP environment variable + { + const char* dumpName = getenv("XPC_SHUTDOWN_HEAP_DUMP"); + if (dumpName) { + FILE* dumpFile = (*dumpName == '\0' || + strcmp(dumpName, "stdout") == 0) + ? stdout + : fopen(dumpName, "w"); + if (dumpFile) { + JS_DumpHeap(xpc->GetRuntime()->Runtime(), dumpFile, nullptr, + JSTRACE_OBJECT, nullptr, static_cast(-1), nullptr); + if (dumpFile != stdout) + fclose(dumpFile); + } + } + } +#endif nsrefcnt cnt; NS_RELEASE2(xpc, cnt); } @@ -599,8 +618,7 @@ nsXPConnect::JSValToVariant(JSContext *cx, { NS_PRECONDITION(aResult, "bad param"); - nsRefPtr variant = XPCVariant::newVariant(cx, aJSVal); - variant.forget(aResult); + *aResult = XPCVariant::newVariant(cx, aJSVal); NS_ENSURE_TRUE(*aResult, NS_ERROR_OUT_OF_MEMORY); return NS_OK; @@ -641,14 +659,14 @@ nsXPConnect::GetWrappedNativeOfJSObject(JSContext * aJSContext, RootedObject aJSObj(aJSContext, aJSObjArg); aJSObj = js::CheckedUnwrap(aJSObj, /* stopAtOuter = */ false); - if (!aJSObj || !IS_WN_REFLECTOR(aJSObj)) { - *_retval = nullptr; - return NS_ERROR_FAILURE; + if (aJSObj && IS_WN_REFLECTOR(aJSObj)) { + NS_IF_ADDREF(*_retval = XPCWrappedNative::Get(aJSObj)); + return NS_OK; } - nsRefPtr temp = XPCWrappedNative::Get(aJSObj); - temp.forget(_retval); - return NS_OK; + // else... + *_retval = nullptr; + return NS_ERROR_FAILURE; } /* nsISupports getNativeOfWrapper(in JSContextPtr aJSContext, in JSObjectPtr aJSObj); */ @@ -1055,8 +1073,7 @@ nsXPConnect::JSToVariant(JSContext* ctx, HandleValue value, nsIVariant** _retval NS_PRECONDITION(ctx, "bad param"); NS_PRECONDITION(_retval, "bad param"); - nsRefPtr variant = XPCVariant::newVariant(ctx, value); - variant.forget(_retval); + *_retval = XPCVariant::newVariant(ctx, value); if (!(*_retval)) return NS_ERROR_FAILURE; diff --git a/js/xpconnect/src/xpcprivate.h b/js/xpconnect/src/xpcprivate.h index d87eb16b262b..1759857096c2 100644 --- a/js/xpconnect/src/xpcprivate.h +++ b/js/xpconnect/src/xpcprivate.h @@ -3215,7 +3215,7 @@ public: // if a given nsIVariant is in fact an XPCVariant. NS_DECLARE_STATIC_IID_ACCESSOR(XPCVARIANT_IID) - static already_AddRefed newVariant(JSContext* cx, jsval aJSVal); + static XPCVariant* newVariant(JSContext* cx, jsval aJSVal); /** * This getter clears the gray bit before handing out the jsval if the jsval @@ -3558,8 +3558,7 @@ public: } bool GetLocationURI(LocationHint aLocationHint, nsIURI **aURI) { if (locationURI) { - nsCOMPtr rval = locationURI; - rval.forget(aURI); + NS_IF_ADDREF(*aURI = locationURI); return true; } return TryParseLocationURI(aLocationHint, aURI);