Bug 884268 - Part b: Move nsContentUtils::PreserveWrapper to nsWrapperCache; r=smaug

This commit is contained in:
Ms2ger 2013-06-23 09:15:42 +02:00
parent 84041fd5c0
commit ff63d2149b
10 changed files with 58 additions and 45 deletions

View File

@ -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<void**>(&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);

View File

@ -194,7 +194,7 @@ nsXBLProtoImpl::InitTargetObjects(nsXBLPrototypeBinding* aBinding,
return rv;
}
nsContentUtils::PreserveWrapper(aBoundElement, aBoundElement);
aBoundElement->PreserveWrapper(aBoundElement);
wrapper.swap(*aScriptObjectHolder);

View File

@ -5086,8 +5086,7 @@ nsNodeSH::GetFlags(uint32_t *aFlags)
void
nsNodeSH::PreserveWrapper(nsISupports *aNative)
{
nsINode *node = static_cast<nsINode*>(aNative);
nsContentUtils::PreserveWrapper(aNative, node);
static_cast<nsINode*>(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

View File

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

View File

@ -214,10 +214,35 @@ public:
mFlags &= ~aFlagsToUnset;
}
void PreserveWrapper(nsISupports* aScriptObjectHolder)
{
if (PreservingWrapper()) {
return;
}
nsISupports* ccISupports;
aScriptObjectHolder->QueryInterface(NS_GET_IID(nsCycleCollectionISupports),
reinterpret_cast<void**>(&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

View File

@ -640,7 +640,7 @@ TryPreserveWrapper(JSObject* obj)
nsWrapperCache* cache = nullptr;
CallQueryInterface(native, &cache);
if (cache) {
nsContentUtils::PreserveWrapper(native, cache);
cache->PreserveWrapper(native);
}
return true;
}

View File

@ -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<nsISupports*>(self), self"
preserveArgs = "reinterpret_cast<nsISupports*>(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)

View File

@ -132,7 +132,7 @@ DOMProxyHandler::EnsureExpandoObject(JSContext* cx, JS::Handle<JSObject*> obj)
nsWrapperCache* cache;
CallQueryInterface(native, &cache);
if (expandoAndGeneration) {
nsContentUtils::PreserveWrapper(native, cache);
cache->PreserveWrapper(native);
expandoAndGeneration->expando.setObject(*expando);
return expando;

View File

@ -2532,7 +2532,7 @@ PreserveWrapper(JSContext *cx, JSObject *objArg)
// For pre-Paris DOM bindings objects, we only support Node.
if (nsCOMPtr<nsINode> node = do_QueryInterface(supports)) {
nsContentUtils::PreserveWrapper(supports, node);
node->PreserveWrapper(supports);
return true;
}
return false;

View File

@ -1282,7 +1282,7 @@ DOMXrayTraits::preserveWrapper(JSObject *target)
nsWrapperCache* cache = nullptr;
CallQueryInterface(identity, &cache);
if (cache)
nsContentUtils::PreserveWrapper(identity, cache);
cache->PreserveWrapper(identity);
}
JSObject*