From b7bef21f7f7d79210b2807afa95e6055942d2cc2 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Sun, 23 Jun 2013 09:15:42 +0200 Subject: [PATCH] Bug 884268 - Part b: Move nsContentUtils::PreserveWrapper to nsWrapperCache; r=smaug --- content/base/public/nsContentUtils.h | 26 ------------------ content/xbl/src/nsXBLProtoImpl.cpp | 2 +- dom/base/nsDOMClassInfo.cpp | 5 ++-- dom/base/nsWrapperCache.cpp | 11 ++++++++ dom/base/nsWrapperCache.h | 39 ++++++++++++++++++++++++--- dom/bindings/BindingUtils.cpp | 2 +- dom/bindings/Codegen.py | 12 +++------ dom/bindings/DOMJSProxyHandler.cpp | 2 +- js/xpconnect/src/XPCJSRuntime.cpp | 2 +- js/xpconnect/wrappers/XrayWrapper.cpp | 2 +- 10 files changed, 58 insertions(+), 45 deletions(-) diff --git a/content/base/public/nsContentUtils.h b/content/base/public/nsContentUtils.h index 19c4fa2f66eb..b8ccada3e314 100644 --- a/content/base/public/nsContentUtils.h +++ b/content/base/public/nsContentUtils.h @@ -1263,32 +1263,6 @@ public: static bool AreJSObjectsHeld(void* aScriptObjectHolder); #endif - static void PreserveWrapper(nsISupports* aScriptObjectHolder, - nsWrapperCache* aCache) - { - if (!aCache->PreservingWrapper()) { - nsISupports *ccISupports; - aScriptObjectHolder->QueryInterface(NS_GET_IID(nsCycleCollectionISupports), - reinterpret_cast(&ccISupports)); - MOZ_ASSERT(ccISupports); - nsXPCOMCycleCollectionParticipant* participant; - CallQueryInterface(ccISupports, &participant); - PreserveWrapper(ccISupports, aCache, participant); - } - } - static void PreserveWrapper(void* aScriptObjectHolder, - nsWrapperCache* aCache, - nsScriptObjectTracer* aTracer) - { - if (!aCache->PreservingWrapper()) { - HoldJSObjects(aScriptObjectHolder, aTracer); - aCache->SetPreservingWrapper(true); -#ifdef DEBUG - // Make sure the cycle collector will be able to traverse to the wrapper. - aCache->CheckCCWrapperTraversal(aScriptObjectHolder, aTracer); -#endif - } - } static void ReleaseWrapper(void* aScriptObjectHolder, nsWrapperCache* aCache); diff --git a/content/xbl/src/nsXBLProtoImpl.cpp b/content/xbl/src/nsXBLProtoImpl.cpp index 8413c3dafef1..0a8d4dade07f 100644 --- a/content/xbl/src/nsXBLProtoImpl.cpp +++ b/content/xbl/src/nsXBLProtoImpl.cpp @@ -194,7 +194,7 @@ nsXBLProtoImpl::InitTargetObjects(nsXBLPrototypeBinding* aBinding, return rv; } - nsContentUtils::PreserveWrapper(aBoundElement, aBoundElement); + aBoundElement->PreserveWrapper(aBoundElement); wrapper.swap(*aScriptObjectHolder); diff --git a/dom/base/nsDOMClassInfo.cpp b/dom/base/nsDOMClassInfo.cpp index 09ecf8959733..95fec8ac9fb5 100644 --- a/dom/base/nsDOMClassInfo.cpp +++ b/dom/base/nsDOMClassInfo.cpp @@ -5086,8 +5086,7 @@ nsNodeSH::GetFlags(uint32_t *aFlags) void nsNodeSH::PreserveWrapper(nsISupports *aNative) { - nsINode *node = static_cast(aNative); - nsContentUtils::PreserveWrapper(aNative, node); + static_cast(aNative)->PreserveWrapper(aNative); } // EventTarget helper @@ -5122,7 +5121,7 @@ nsEventTargetSH::PreserveWrapper(nsISupports *aNative) { nsDOMEventTargetHelper *target = nsDOMEventTargetHelper::FromSupports(aNative); - nsContentUtils::PreserveWrapper(aNative, target); + target->PreserveWrapper(aNative); } // IDBEventTarget helper diff --git a/dom/base/nsWrapperCache.cpp b/dom/base/nsWrapperCache.cpp index 094e75904365..44d80326210e 100644 --- a/dom/base/nsWrapperCache.cpp +++ b/dom/base/nsWrapperCache.cpp @@ -7,6 +7,17 @@ #include "nsWrapperCacheInlines.h" #include "nsCycleCollectionTraversalCallback.h" +#include "nsCycleCollector.h" + +using namespace mozilla; +using namespace mozilla::dom; + +/* static */ void +nsWrapperCache::HoldJSObjects(void* aScriptObjectHolder, + nsScriptObjectTracer* aTracer) +{ + cyclecollector::AddJSHolder(aScriptObjectHolder, aTracer); +} #ifdef DEBUG diff --git a/dom/base/nsWrapperCache.h b/dom/base/nsWrapperCache.h index 4f3b540618c8..fdc8d74a6358 100644 --- a/dom/base/nsWrapperCache.h +++ b/dom/base/nsWrapperCache.h @@ -214,10 +214,35 @@ public: mFlags &= ~aFlagsToUnset; } + void PreserveWrapper(nsISupports* aScriptObjectHolder) + { + if (PreservingWrapper()) { + return; + } + + nsISupports* ccISupports; + aScriptObjectHolder->QueryInterface(NS_GET_IID(nsCycleCollectionISupports), + reinterpret_cast(&ccISupports)); + MOZ_ASSERT(ccISupports); + + nsXPCOMCycleCollectionParticipant* participant; + CallQueryInterface(ccISupports, &participant); + PreserveWrapper(ccISupports, participant); + } + + void PreserveWrapper(void* aScriptObjectHolder, nsScriptObjectTracer* aTracer) + { + if (PreservingWrapper()) { + return; + } + + HoldJSObjects(aScriptObjectHolder, aTracer); + SetPreservingWrapper(true); #ifdef DEBUG - void CheckCCWrapperTraversal(void* aScriptObjectHolder, - nsScriptObjectTracer* aTracer); -#endif // DEBUG + // Make sure the cycle collector will be able to traverse to the wrapper. + CheckCCWrapperTraversal(aScriptObjectHolder, aTracer); +#endif + } private: JSObject *GetWrapperJSObject() const @@ -256,6 +281,14 @@ private: mFlags &= ~aFlagsToUnset; } + static void HoldJSObjects(void* aScriptObjectHolder, + nsScriptObjectTracer* aTracer); + +#ifdef DEBUG + void CheckCCWrapperTraversal(void* aScriptObjectHolder, + nsScriptObjectTracer* aTracer); +#endif // DEBUG + /** * If this bit is set then we're preserving the wrapper, which in effect ties * the lifetime of the JS object stored in the cache to the lifetime of the diff --git a/dom/bindings/BindingUtils.cpp b/dom/bindings/BindingUtils.cpp index e887cfb33985..9c3310758ccf 100644 --- a/dom/bindings/BindingUtils.cpp +++ b/dom/bindings/BindingUtils.cpp @@ -640,7 +640,7 @@ TryPreserveWrapper(JSObject* obj) nsWrapperCache* cache = nullptr; CallQueryInterface(native, &cache); if (cache) { - nsContentUtils::PreserveWrapper(native, cache); + cache->PreserveWrapper(native); } return true; } diff --git a/dom/bindings/Codegen.py b/dom/bindings/Codegen.py index aaac1243dcd9..3f716a55d06f 100644 --- a/dom/bindings/Codegen.py +++ b/dom/bindings/Codegen.py @@ -938,12 +938,12 @@ class CGAddPropertyHook(CGAbstractClassHook): def generate_code(self): assert not self.descriptor.workers and self.descriptor.wrapperCache if self.descriptor.nativeOwnership == 'nsisupports': - preserveArgs = "reinterpret_cast(self), self" + preserveArgs = "reinterpret_cast(self)" else: - preserveArgs = "self, self, NS_CYCLE_COLLECTION_PARTICIPANT(%s)" % self.descriptor.nativeType + preserveArgs = "self, NS_CYCLE_COLLECTION_PARTICIPANT(%s)" % self.descriptor.nativeType return (" // We don't want to preserve if we don't have a wrapper.\n" " if (self->GetWrapperPreserveColor()) {\n" - " nsContentUtils::PreserveWrapper(%s);\n" + " self->PreserveWrapper(%s);\n" " }\n" " return true;" % preserveArgs) @@ -8362,11 +8362,7 @@ class CGBindingRoot(CGThing): return any(m.getExtendedAttribute("Pref") for m in iface.members + [iface]); requiresPreferences = any(descriptorRequiresPreferences(d) for d in descriptors) hasOwnedDescriptors = any(d.nativeOwnership == 'owned' for d in descriptors) - def descriptorRequiresContentUtils(desc): - return ((desc.concrete and not desc.proxy and - not desc.workers and desc.wrapperCache) or - desc.interface.hasInterfaceObject()) - requiresContentUtils = any(descriptorRequiresContentUtils(d) for d in descriptors) + requiresContentUtils = any(d.interface.hasInterfaceObject() for d in descriptors) def descriptorHasChromeOnlyMembers(desc): return any(isChromeOnly(a) for a in desc.interface.members) hasChromeOnlyMembers = any(descriptorHasChromeOnlyMembers(d) for d in descriptors) diff --git a/dom/bindings/DOMJSProxyHandler.cpp b/dom/bindings/DOMJSProxyHandler.cpp index 683a2047bf0c..b185e6cf915b 100644 --- a/dom/bindings/DOMJSProxyHandler.cpp +++ b/dom/bindings/DOMJSProxyHandler.cpp @@ -132,7 +132,7 @@ DOMProxyHandler::EnsureExpandoObject(JSContext* cx, JS::Handle obj) nsWrapperCache* cache; CallQueryInterface(native, &cache); if (expandoAndGeneration) { - nsContentUtils::PreserveWrapper(native, cache); + cache->PreserveWrapper(native); expandoAndGeneration->expando.setObject(*expando); return expando; diff --git a/js/xpconnect/src/XPCJSRuntime.cpp b/js/xpconnect/src/XPCJSRuntime.cpp index 274b1ff14c27..f6a6dbc6fcfc 100644 --- a/js/xpconnect/src/XPCJSRuntime.cpp +++ b/js/xpconnect/src/XPCJSRuntime.cpp @@ -2532,7 +2532,7 @@ PreserveWrapper(JSContext *cx, JSObject *objArg) // For pre-Paris DOM bindings objects, we only support Node. if (nsCOMPtr node = do_QueryInterface(supports)) { - nsContentUtils::PreserveWrapper(supports, node); + node->PreserveWrapper(supports); return true; } return false; diff --git a/js/xpconnect/wrappers/XrayWrapper.cpp b/js/xpconnect/wrappers/XrayWrapper.cpp index 5efceda74bb5..4536d1fc6ea1 100644 --- a/js/xpconnect/wrappers/XrayWrapper.cpp +++ b/js/xpconnect/wrappers/XrayWrapper.cpp @@ -1282,7 +1282,7 @@ DOMXrayTraits::preserveWrapper(JSObject *target) nsWrapperCache* cache = nullptr; CallQueryInterface(identity, &cache); if (cache) - nsContentUtils::PreserveWrapper(identity, cache); + cache->PreserveWrapper(identity); } JSObject*