author | Peter Van der Beken <peterv@propagandism.org> |
Mon, 08 Nov 2010 16:02:49 +0100 | |
changeset 67680 | 92c7b48558d51624e4c9b077100197b45be2d911 |
parent 67679 | 630f16c6e6f449c7f61364da36d84b26334297f1 |
child 67681 | 8ad9f3559f4383d66ce72c71a37d7e831acac0f5 |
push id | 1 |
push user | root |
push date | Tue, 26 Apr 2011 22:38:44 +0000 |
treeherder | mozilla-beta@bfdb6e623a36 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | bent |
bugs | 584048 |
milestone | 2.2a1pre |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/content/base/public/nsDOMEventTargetWrapperCache.h +++ b/content/base/public/nsDOMEventTargetWrapperCache.h @@ -49,25 +49,18 @@ // EventSource and WebSocket. class nsDOMEventTargetWrapperCache : public nsDOMEventTargetHelper, public nsWrapperCache { public: NS_DECL_ISUPPORTS_INHERITED - class NS_CYCLE_COLLECTION_INNERCLASS - : public NS_CYCLE_COLLECTION_CLASSNAME(nsDOMEventTargetHelper) - { - NS_IMETHOD RootAndUnlinkJSObjects(void *p); - NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED_BODY_NO_UNLINK(nsDOMEventTargetWrapperCache, - nsDOMEventTargetHelper) - NS_IMETHOD_(void) Trace(void *p, TraceCallback cb, void *closure); - }; - NS_CYCLE_COLLECTION_PARTICIPANT_INSTANCE + NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(nsDOMEventTargetWrapperCache, + nsDOMEventTargetHelper) void GetParentObject(nsIScriptGlobalObject **aParentObject) { if (mOwner) { CallQueryInterface(mOwner, aParentObject); } else { *aParentObject = nsnull;
--- a/content/base/src/nsDOMAttribute.cpp +++ b/content/base/src/nsDOMAttribute.cpp @@ -95,20 +95,16 @@ nsDOMAttribute::~nsDOMAttribute() nsIContent* content = GetContentInternal(); if (content) { content->RemoveMutationObserver(this); } } NS_IMPL_CYCLE_COLLECTION_CLASS(nsDOMAttribute) -NS_IMPL_CYCLE_COLLECTION_ROOT_BEGIN(nsDOMAttribute) - NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER -NS_IMPL_CYCLE_COLLECTION_ROOT_END - NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsDOMAttribute) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mNodeInfo) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_RAWPTR(mChild) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_LISTENERMANAGER NS_IMPL_CYCLE_COLLECTION_TRAVERSE_USERDATA NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END @@ -117,16 +113,17 @@ NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(nsD NS_IMPL_CYCLE_COLLECTION_TRACE_END NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsDOMAttribute) if (tmp->mChild) { static_cast<nsTextNode*>(tmp->mChild)->UnbindFromAttribute(); NS_RELEASE(tmp->mChild); tmp->mFirstChild = nsnull; } + NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER NS_IMPL_CYCLE_COLLECTION_UNLINK_LISTENERMANAGER NS_IMPL_CYCLE_COLLECTION_UNLINK_USERDATA NS_IMPL_CYCLE_COLLECTION_UNLINK_END DOMCI_NODE_DATA(Attr, nsDOMAttribute) // QueryInterface implementation for nsDOMAttribute NS_INTERFACE_TABLE_HEAD(nsDOMAttribute)
--- a/content/base/src/nsDOMEventTargetWrapperCache.cpp +++ b/content/base/src/nsDOMEventTargetWrapperCache.cpp @@ -53,18 +53,18 @@ NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(nsD NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER NS_IMPL_CYCLE_COLLECTION_TRACE_END NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(nsDOMEventTargetWrapperCache, nsDOMEventTargetHelper) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END -NS_IMPL_CYCLE_COLLECTION_ROOT_BEGIN(nsDOMEventTargetWrapperCache) +NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsDOMEventTargetWrapperCache) NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER -NS_IMPL_CYCLE_COLLECTION_ROOT_END +NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(nsDOMEventTargetWrapperCache) NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY NS_INTERFACE_MAP_END_INHERITING(nsDOMEventTargetHelper) NS_IMPL_ADDREF_INHERITED(nsDOMEventTargetWrapperCache, nsDOMEventTargetHelper) NS_IMPL_RELEASE_INHERITED(nsDOMEventTargetWrapperCache, nsDOMEventTargetHelper)
--- a/content/base/src/nsDocument.cpp +++ b/content/base/src/nsDocument.cpp @@ -1759,20 +1759,16 @@ NS_INTERFACE_TABLE_HEAD(nsDocument) NS_INTERFACE_MAP_END NS_IMPL_CYCLE_COLLECTING_ADDREF_AMBIGUOUS(nsDocument, nsIDocument) NS_IMPL_CYCLE_COLLECTING_RELEASE_AMBIGUOUS_WITH_DESTROY(nsDocument, nsIDocument, nsNodeUtils::LastRelease(this)) -NS_IMPL_CYCLE_COLLECTION_ROOT_BEGIN(nsDocument) - NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER -NS_IMPL_CYCLE_COLLECTION_ROOT_END - static PLDHashOperator SubDocTraverser(PLDHashTable *table, PLDHashEntryHdr *hdr, PRUint32 number, void *arg) { SubDocMapEntry *entry = static_cast<SubDocMapEntry*>(hdr); nsCycleCollectionTraversalCallback *cb = static_cast<nsCycleCollectionTraversalCallback*>(arg); @@ -1962,16 +1958,17 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(ns NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mCachedRootElement) NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mDisplayDocument) NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mFirstBaseNodeWithHref) NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mDOMImplementation) NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mOriginalDocument) NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mCachedEncoder) + NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER NS_IMPL_CYCLE_COLLECTION_UNLINK_USERDATA tmp->mParentDocument = nsnull; NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMARRAY(mPreloadingImages) if (tmp->mBoxObjectTable) {
--- a/content/base/src/nsGenericDOMDataNode.cpp +++ b/content/base/src/nsGenericDOMDataNode.cpp @@ -103,21 +103,18 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN( if (ownerDoc) { ownerDoc->BindingManager()->Traverse(tmp, cb); } NS_IMPL_CYCLE_COLLECTION_TRAVERSE_LISTENERMANAGER NS_IMPL_CYCLE_COLLECTION_TRAVERSE_USERDATA NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END -NS_IMPL_CYCLE_COLLECTION_ROOT_BEGIN(nsGenericDOMDataNode) +NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsGenericDOMDataNode) NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER -NS_IMPL_CYCLE_COLLECTION_ROOT_END - -NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsGenericDOMDataNode) NS_IMPL_CYCLE_COLLECTION_UNLINK_LISTENERMANAGER NS_IMPL_CYCLE_COLLECTION_UNLINK_USERDATA NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_INTERFACE_MAP_BEGIN(nsGenericDOMDataNode) NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY NS_INTERFACE_MAP_ENTRIES_CYCLE_COLLECTION(nsGenericDOMDataNode) NS_INTERFACE_MAP_ENTRY(nsIContent)
--- a/content/base/src/nsGenericElement.cpp +++ b/content/base/src/nsGenericElement.cpp @@ -4302,21 +4302,18 @@ nsINode::ReplaceOrInsertBefore(PRBool aR } //---------------------------------------------------------------------- // nsISupports implementation NS_IMPL_CYCLE_COLLECTION_CLASS(nsGenericElement) -NS_IMPL_CYCLE_COLLECTION_ROOT_BEGIN(nsGenericElement) +NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsGenericElement) NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER -NS_IMPL_CYCLE_COLLECTION_ROOT_END - -NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsGenericElement) NS_IMPL_CYCLE_COLLECTION_UNLINK_LISTENERMANAGER NS_IMPL_CYCLE_COLLECTION_UNLINK_USERDATA if (tmp->HasProperties() && tmp->IsXUL()) { tmp->DeleteProperty(nsGkAtoms::contextmenulistener); tmp->DeleteProperty(nsGkAtoms::popuplistener); }
--- a/content/events/src/nsDOMNotifyAudioAvailableEvent.cpp +++ b/content/events/src/nsDOMNotifyAudioAvailableEvent.cpp @@ -61,24 +61,21 @@ nsDOMNotifyAudioAvailableEvent::nsDOMNot DOMCI_DATA(NotifyAudioAvailableEvent, nsDOMNotifyAudioAvailableEvent) NS_IMPL_CYCLE_COLLECTION_CLASS(nsDOMNotifyAudioAvailableEvent) NS_IMPL_ADDREF_INHERITED(nsDOMNotifyAudioAvailableEvent, nsDOMEvent) NS_IMPL_RELEASE_INHERITED(nsDOMNotifyAudioAvailableEvent, nsDOMEvent) -NS_IMPL_CYCLE_COLLECTION_ROOT_BEGIN(nsDOMNotifyAudioAvailableEvent) +NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(nsDOMNotifyAudioAvailableEvent, nsDOMEvent) if (tmp->mCachedArray) { NS_DROP_JS_OBJECTS(tmp, nsDOMNotifyAudioAvailableEvent); tmp->mCachedArray = nsnull; } -NS_IMPL_CYCLE_COLLECTION_ROOT_END - -NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(nsDOMNotifyAudioAvailableEvent, nsDOMEvent) NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(nsDOMNotifyAudioAvailableEvent, nsDOMEvent) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(nsDOMNotifyAudioAvailableEvent) NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mCachedArray)
--- a/content/xbl/src/nsXBLDocumentInfo.cpp +++ b/content/xbl/src/nsXBLDocumentInfo.cpp @@ -461,22 +461,20 @@ TraceProtos(nsHashKey *aKey, void *aData { ProtoTracer* closure = static_cast<ProtoTracer*>(aClosure); nsXBLPrototypeBinding *proto = static_cast<nsXBLPrototypeBinding*>(aData); proto->Trace(closure->mCallback, closure->mClosure); return kHashEnumerateNext; } NS_IMPL_CYCLE_COLLECTION_CLASS(nsXBLDocumentInfo) -NS_IMPL_CYCLE_COLLECTION_ROOT_BEGIN(nsXBLDocumentInfo) +NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsXBLDocumentInfo) if (tmp->mBindingTable) { tmp->mBindingTable->Enumerate(UnlinkProtoJSObjects, nsnull); } -NS_IMPL_CYCLE_COLLECTION_ROOT_END -NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsXBLDocumentInfo) NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mDocument) NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mGlobalObject) NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsXBLDocumentInfo) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mDocument) if (tmp->mBindingTable) { tmp->mBindingTable->Enumerate(TraverseProtos, &cb); }
--- a/content/xul/content/src/nsXULElement.cpp +++ b/content/xul/content/src/nsXULElement.cpp @@ -2555,16 +2555,19 @@ nsXULElement::RecompileScriptEventListen } } NS_IMPL_CYCLE_COLLECTION_CLASS(nsXULPrototypeNode) NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_NATIVE(nsXULPrototypeNode) if (tmp->mType == nsXULPrototypeNode::eType_Element) { static_cast<nsXULPrototypeElement*>(tmp)->Unlink(); } + else if (tmp->mType == nsXULPrototypeNode::eType_Script) { + static_cast<nsXULPrototypeScript*>(tmp)->UnlinkJSObjects(); + } NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NATIVE_BEGIN(nsXULPrototypeNode) if (tmp->mType == nsXULPrototypeNode::eType_Element) { nsXULPrototypeElement *elem = static_cast<nsXULPrototypeElement*>(tmp); cb.NoteXPCOMChild(elem->mNodeInfo); PRUint32 i; for (i = 0; i < elem->mNumAttributes; ++i) { @@ -2595,25 +2598,17 @@ NS_IMPL_CYCLE_COLLECTION_TRACE_NATIVE_BE } else if (tmp->mType == nsXULPrototypeNode::eType_Script) { nsXULPrototypeScript *script = static_cast<nsXULPrototypeScript*>(tmp); NS_IMPL_CYCLE_COLLECTION_TRACE_CALLBACK(script->mScriptObject.mLangID, script->mScriptObject.mObject) } NS_IMPL_CYCLE_COLLECTION_TRACE_END -NS_IMPL_CYCLE_COLLECTION_ROOT_BEGIN_NATIVE(nsXULPrototypeNode, AddRef) - if (tmp->mType == nsXULPrototypeNode::eType_Element) { - static_cast<nsXULPrototypeElement*>(tmp)->UnlinkJSObjects(); - } - else if (tmp->mType == nsXULPrototypeNode::eType_Script) { - static_cast<nsXULPrototypeScript*>(tmp)->UnlinkJSObjects(); - } -NS_IMPL_CYCLE_COLLECTION_ROOT_END -//NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(nsXULPrototypeNode, AddRef) +NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(nsXULPrototypeNode, AddRef) NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(nsXULPrototypeNode, Release) //---------------------------------------------------------------------- // // nsXULPrototypeAttribute // nsXULPrototypeAttribute::~nsXULPrototypeAttribute() @@ -2899,28 +2894,23 @@ nsXULPrototypeElement::SetAttrAt(PRUint3 } mAttributes[aPos].mValue.ParseStringOrAtom(aValue); return NS_OK; } void -nsXULPrototypeElement::UnlinkJSObjects() +nsXULPrototypeElement::Unlink() { if (mHoldsScriptObject) { nsContentUtils::DropScriptObjects(mScriptTypeID, this, &NS_CYCLE_COLLECTION_NAME(nsXULPrototypeNode)); mHoldsScriptObject = PR_FALSE; } -} - -void -nsXULPrototypeElement::Unlink() -{ mNumAttributes = 0; delete[] mAttributes; mAttributes = nsnull; } //---------------------------------------------------------------------- // // nsXULPrototypeScript
--- a/content/xul/content/src/nsXULElement.h +++ b/content/xul/content/src/nsXULElement.h @@ -252,17 +252,16 @@ public: mHasStyleAttribute(PR_FALSE), mHoldsScriptObject(PR_FALSE), mScriptTypeID(nsIProgrammingLanguage::UNKNOWN) { } virtual ~nsXULPrototypeElement() { - UnlinkJSObjects(); Unlink(); } #ifdef NS_BUILD_REFCNT_LOGGING virtual const char* ClassName() { return "nsXULPrototypeElement"; } virtual PRUint32 ClassSize() { return sizeof(*this); } #endif @@ -281,17 +280,16 @@ public: const nsCOMArray<nsINodeInfo> *aNodeInfos); virtual nsresult Deserialize(nsIObjectInputStream* aStream, nsIScriptGlobalObject* aGlobal, nsIURI* aDocumentURI, const nsCOMArray<nsINodeInfo> *aNodeInfos); nsresult SetAttrAt(PRUint32 aPos, const nsAString& aValue, nsIURI* aDocumentURI); - void UnlinkJSObjects(); void Unlink(); nsPrototypeArray mChildren; nsCOMPtr<nsINodeInfo> mNodeInfo; // [OWNER] PRUint32 mNumAttributes; nsXULPrototypeAttribute* mAttributes; // [OWNER]
--- a/dom/base/nsGlobalWindow.cpp +++ b/dom/base/nsGlobalWindow.cpp @@ -1385,16 +1385,18 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN( NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mFocusedNode) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMARRAY(mPendingStorageEvents) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsGlobalWindow) + nsGlobalWindow::CleanupCachedXBLHandlers(tmp); + NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mContext) NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mControllers) NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mArguments) NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mArgumentsLast) NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mInnerWindowHolder) NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mOuterWindow) @@ -1442,20 +1444,16 @@ TraceXBLHandlers(const void* aKey, void* NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(nsGlobalWindow) if (tmp->mCachedXBLPrototypeHandlers.IsInitialized()) { TraceData data(aCallback, aClosure); tmp->mCachedXBLPrototypeHandlers.EnumerateRead(TraceXBLHandlers, &data); } NS_IMPL_CYCLE_COLLECTION_TRACE_END -NS_IMPL_CYCLE_COLLECTION_ROOT_BEGIN(nsGlobalWindow) - nsGlobalWindow::CleanupCachedXBLHandlers(tmp); -NS_IMPL_CYCLE_COLLECTION_ROOT_END - //***************************************************************************** // nsGlobalWindow::nsIScriptGlobalObject //***************************************************************************** nsresult nsGlobalWindow::SetScriptContext(PRUint32 lang_id, nsIScriptContext *aScriptContext) { NS_ASSERTION(lang_id == nsIProgrammingLanguage::JAVASCRIPT,
--- a/dom/base/nsJSEnvironment.cpp +++ b/dom/base/nsJSEnvironment.cpp @@ -1107,26 +1107,24 @@ nsJSContext::DestroyJSContext() } else { ::JS_DestroyContextNoGC(mContext); } mContext = nsnull; } // QueryInterface implementation for nsJSContext NS_IMPL_CYCLE_COLLECTION_CLASS(nsJSContext) -NS_IMPL_CYCLE_COLLECTION_ROOT_BEGIN(nsJSContext) +NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(nsJSContext) +NS_IMPL_CYCLE_COLLECTION_TRACE_END +NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsJSContext) NS_ASSERTION(!tmp->mContext || tmp->mContext->outstandingRequests == 0, "Trying to unlink a context with outstanding requests."); tmp->mIsInitialized = PR_FALSE; tmp->mGCOnDestruction = PR_FALSE; tmp->DestroyJSContext(); -NS_IMPL_CYCLE_COLLECTION_ROOT_END -NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(nsJSContext) -NS_IMPL_CYCLE_COLLECTION_TRACE_END -NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsJSContext) NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mGlobalObjectRef) NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INTERNAL(nsJSContext) NS_IMPL_CYCLE_COLLECTION_DESCRIBE(nsJSContext, tmp->GetCCRefcnt()) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mGlobalObjectRef) NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "mContext"); nsContentUtils::XPConnect()->NoteJSContext(tmp->mContext, cb); NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END @@ -3979,20 +3977,19 @@ nsJSArgArray::ReleaseJSObjects() if (mArgv) { PR_DELETE(mArgv); } mArgc = 0; } // QueryInterface implementation for nsJSArgArray NS_IMPL_CYCLE_COLLECTION_CLASS(nsJSArgArray) -NS_IMPL_CYCLE_COLLECTION_ROOT_BEGIN(nsJSArgArray) +NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsJSArgArray) tmp->ReleaseJSObjects(); -NS_IMPL_CYCLE_COLLECTION_ROOT_END -NS_IMPL_CYCLE_COLLECTION_UNLINK_0(nsJSArgArray) +NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsJSArgArray) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(nsJSArgArray) jsval *argv = tmp->mArgv; if (argv) { jsval *end;
--- a/dom/base/nsJSTimeoutHandler.cpp +++ b/dom/base/nsJSTimeoutHandler.cpp @@ -109,20 +109,19 @@ private: JSFlatString *mExpr; JSObject *mFunObj; }; // nsJSScriptTimeoutHandler // QueryInterface implementation for nsJSScriptTimeoutHandler NS_IMPL_CYCLE_COLLECTION_CLASS(nsJSScriptTimeoutHandler) -NS_IMPL_CYCLE_COLLECTION_ROOT_BEGIN(nsJSScriptTimeoutHandler) +NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsJSScriptTimeoutHandler) tmp->ReleaseJSObjects(); -NS_IMPL_CYCLE_COLLECTION_ROOT_END -NS_IMPL_CYCLE_COLLECTION_UNLINK_0(nsJSScriptTimeoutHandler) +NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INTERNAL(nsJSScriptTimeoutHandler) if (NS_UNLIKELY(cb.WantDebugInfo())) { nsCAutoString foo("nsJSScriptTimeoutHandler"); if (tmp->mExpr) { foo.AppendLiteral(" ["); foo.Append(tmp->mFileName); foo.AppendLiteral(":"); foo.AppendInt(tmp->mLineNo);
--- a/dom/indexedDB/IDBCursor.cpp +++ b/dom/indexedDB/IDBCursor.cpp @@ -305,28 +305,16 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN( NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR_AMBIGUOUS(mTransaction, nsPIDOMEventTarget) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mObjectStore) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mIndex) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mOwner) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mScriptContext) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END -NS_IMPL_CYCLE_COLLECTION_ROOT_BEGIN(IDBCursor) - if (tmp->mRooted) { - NS_DROP_JS_OBJECTS(tmp, IDBCursor); - tmp->mCachedPrimaryKey = JSVAL_VOID; - tmp->mCachedValue = JSVAL_VOID; - tmp->mHaveCachedPrimaryKey = false; - tmp->mHaveCachedValue = false; - tmp->mRooted = false; - tmp->mHaveValue = false; - } -NS_IMPL_CYCLE_COLLECTION_ROOT_END - NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(IDBCursor) NS_ASSERTION(tmp->mHaveCachedPrimaryKey || JSVAL_IS_VOID(tmp->mCachedPrimaryKey), "Should have a cached primary key"); NS_ASSERTION(tmp->mHaveCachedValue || JSVAL_IS_VOID(tmp->mCachedValue), "Should have a cached value"); if (JSVAL_IS_GCTHING(tmp->mCachedValue)) { void *gcThing = JSVAL_TO_GCTHING(tmp->mCachedValue); @@ -335,16 +323,25 @@ NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(IDB if (JSVAL_IS_GCTHING(tmp->mCachedPrimaryKey)) { void *gcThing = JSVAL_TO_GCTHING(tmp->mCachedPrimaryKey); NS_IMPL_CYCLE_COLLECTION_TRACE_JS_CALLBACK(gcThing) } NS_IMPL_CYCLE_COLLECTION_TRACE_END NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(IDBCursor) // Don't unlink mObjectStore, mIndex, or mTransaction! + if (tmp->mRooted) { + NS_DROP_JS_OBJECTS(tmp, IDBCursor); + tmp->mCachedPrimaryKey = JSVAL_VOID; + tmp->mCachedValue = JSVAL_VOID; + tmp->mHaveCachedPrimaryKey = false; + tmp->mHaveCachedValue = false; + tmp->mRooted = false; + tmp->mHaveValue = false; + } NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mRequest) NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mOwner) NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mScriptContext) NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(IDBCursor) NS_INTERFACE_MAP_ENTRY(nsIIDBCursor) NS_INTERFACE_MAP_ENTRY_CONDITIONAL(nsIIDBCursorWithValue, mType != INDEXKEY)
--- a/dom/indexedDB/IDBRequest.cpp +++ b/dom/indexedDB/IDBRequest.cpp @@ -299,35 +299,32 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mOnSuccessListener) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mOnErrorListener) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mSource) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(IDBRequest, nsDOMEventTargetHelper) + if (tmp->mResultValRooted) { + tmp->mResultVal = JSVAL_VOID; + tmp->UnrootResultVal(); + } NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mOnSuccessListener) NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mOnErrorListener) NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mSource) NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(IDBRequest) if (JSVAL_IS_GCTHING(tmp->mResultVal)) { void *gcThing = JSVAL_TO_GCTHING(tmp->mResultVal); NS_IMPL_CYCLE_COLLECTION_TRACE_JS_CALLBACK(gcThing) } NS_IMPL_CYCLE_COLLECTION_TRACE_END -NS_IMPL_CYCLE_COLLECTION_ROOT_BEGIN(IDBRequest) - if (tmp->mResultValRooted) { - tmp->mResultVal = JSVAL_VOID; - tmp->UnrootResultVal(); - } -NS_IMPL_CYCLE_COLLECTION_ROOT_END - NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(IDBRequest) NS_INTERFACE_MAP_ENTRY(nsIIDBRequest) NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(IDBRequest) NS_INTERFACE_MAP_END_INHERITING(nsDOMEventTargetHelper) NS_IMPL_ADDREF_INHERITED(IDBRequest, nsDOMEventTargetHelper) NS_IMPL_RELEASE_INHERITED(IDBRequest, nsDOMEventTargetHelper)
--- a/dom/src/events/nsJSEventListener.cpp +++ b/dom/src/events/nsJSEventListener.cpp @@ -90,31 +90,27 @@ nsJSEventListener::nsJSEventListener(nsI nsJSEventListener::~nsJSEventListener() { if (mContext) nsContentUtils::DropScriptObjects(mContext->GetScriptTypeID(), this, &NS_CYCLE_COLLECTION_NAME(nsJSEventListener)); } NS_IMPL_CYCLE_COLLECTION_CLASS(nsJSEventListener) -NS_IMPL_CYCLE_COLLECTION_ROOT_BEGIN(nsJSEventListener) - if (tmp->mContext && - tmp->mContext->GetScriptTypeID() == nsIProgrammingLanguage::JAVASCRIPT) { - NS_DROP_JS_OBJECTS(tmp, nsJSEventListener); - tmp->mScopeObject = nsnull; - } -NS_IMPL_CYCLE_COLLECTION_ROOT_END NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsJSEventListener) NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mTarget) if (tmp->mContext) { - if (tmp->mScopeObject) { + if (tmp->mContext->GetScriptTypeID() == nsIProgrammingLanguage::JAVASCRIPT) { + NS_DROP_JS_OBJECTS(tmp, nsJSEventListener); + } + else { nsContentUtils::DropScriptObjects(tmp->mContext->GetScriptTypeID(), tmp, &NS_CYCLE_COLLECTION_NAME(nsJSEventListener)); - tmp->mScopeObject = nsnull; } + tmp->mScopeObject = nsnull; NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mContext) } NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsJSEventListener) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mTarget) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mContext) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
--- a/js/src/xpconnect/src/nsXPConnect.cpp +++ b/js/src/xpconnect/src/nsXPConnect.cpp @@ -861,25 +861,23 @@ nsXPConnect::GetOutstandingRequests(JSCo return n; } class JSContextParticipant : public nsCycleCollectionParticipant { public: NS_IMETHOD RootAndUnlinkJSObjects(void *n) { - JSContext *cx = static_cast<JSContext*>(n); - NS_ASSERTION(cx->globalObject, "global object NULL before unlinking"); - cx->globalObject = nsnull; return NS_OK; } NS_IMETHOD Unlink(void *n) { - // We must not unlink a JSContext because Root/Unroot don't ensure that - // the pointer is still valid. + JSContext *cx = static_cast<JSContext*>(n); + NS_ASSERTION(cx->globalObject, "global object NULL before unlinking"); + cx->globalObject = nsnull; return NS_OK; } NS_IMETHOD Unroot(void *n) { return NS_OK; } NS_IMETHODIMP Traverse(void *n, nsCycleCollectionTraversalCallback &cb) {
--- a/js/src/xpconnect/src/xpcprivate.h +++ b/js/src/xpconnect/src/xpcprivate.h @@ -2440,27 +2440,27 @@ class XPCWrappedNative : public nsIXPCon public: NS_DECL_ISUPPORTS NS_DECL_NSIXPCONNECTJSOBJECTHOLDER NS_DECL_NSIXPCONNECTWRAPPEDNATIVE // No need to unlink the JS objects, if the XPCWrappedNative will be cycle // collected then its mFlatJSObject will be cycle collected too and // finalization of the mFlatJSObject will unlink the js objects (see // XPC_WN_NoHelper_Finalize and FlatJSObjectFinalized). - // We also rely on NS_DECL_CYCLE_COLLECTION_CLASS_NO_UNLINK having empty - // Root/Unroot methods, to avoid root/unrooting the JS objects from - // addrefing/releasing the XPCWrappedNative during unlinking, which would - // make the JS objects uncollectable to the JS GC. + // We also give XPCWrappedNative empty Root/Unroot methods, to avoid + // root/unrooting the JS objects from addrefing/releasing the + // XPCWrappedNative during unlinking, which would make the JS objects + // uncollectable to the JS GC. class NS_CYCLE_COLLECTION_INNERCLASS : public nsXPCOMCycleCollectionParticipant { NS_DECL_CYCLE_COLLECTION_CLASS_BODY_NO_UNLINK(XPCWrappedNative, XPCWrappedNative) - NS_IMETHOD RootAndUnlinkJSObjects(void *p); - NS_IMETHOD Unlink(void *p) { return NS_OK; } + NS_IMETHOD RootAndUnlinkJSObjects(void *p) { return NS_OK; } + NS_IMETHOD Unlink(void *p); NS_IMETHOD Unroot(void *p) { return NS_OK; } }; NS_CYCLE_COLLECTION_PARTICIPANT_INSTANCE NS_DECL_CYCLE_COLLECTION_UNMARK_PURPLE_STUB(XPCWrappedNative) #ifndef XPCONNECT_STANDALONE nsIPrincipal* GetObjectPrincipal() const; #endif @@ -2958,23 +2958,17 @@ class nsXPCWrappedJS : protected nsAutoX { public: NS_DECL_ISUPPORTS NS_DECL_NSIXPCONNECTJSOBJECTHOLDER NS_DECL_NSIXPCONNECTWRAPPEDJS NS_DECL_NSISUPPORTSWEAKREFERENCE NS_DECL_NSIPROPERTYBAG - class NS_CYCLE_COLLECTION_INNERCLASS - : public nsXPCOMCycleCollectionParticipant - { - NS_IMETHOD RootAndUnlinkJSObjects(void *p); - NS_DECL_CYCLE_COLLECTION_CLASS_BODY(nsXPCWrappedJS, nsIXPConnectWrappedJS) - }; - NS_CYCLE_COLLECTION_PARTICIPANT_INSTANCE + NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(nsXPCWrappedJS, nsIXPConnectWrappedJS) NS_DECL_CYCLE_COLLECTION_UNMARK_PURPLE_STUB(nsXPCWrappedJS) NS_IMETHOD CallMethod(PRUint16 methodIndex, const XPTMethodDescriptor *info, nsXPTCMiniVariant* params); /* * This is rarely called directly. Instead one usually calls
--- a/js/src/xpconnect/src/xpcwrappedjs.cpp +++ b/js/src/xpconnect/src/xpcwrappedjs.cpp @@ -89,41 +89,16 @@ NS_CYCLE_COLLECTION_CLASSNAME(nsXPCWrapp cb.NoteXPCOMChild(tmp->GetAggregatedNativeObject()); else // Non-root wrappers keep their root alive. cb.NoteXPCOMChild(static_cast<nsIXPConnectWrappedJS*>(root)); return NS_OK; } -NS_IMPL_CYCLE_COLLECTION_ROOT_BEGIN(nsXPCWrappedJS) - if(tmp->IsValid()) - { - XPCJSRuntime* rt = nsXPConnect::GetRuntimeInstance(); - if(rt) - { - if(tmp->mRoot == tmp) - { - // remove this root wrapper from the map - JSObject2WrappedJSMap* map = rt->GetWrappedJSMap(); - if(map) - { - XPCAutoLock lock(rt->GetMapLock()); - map->Remove(tmp); - } - } - - if(tmp->mRefCnt > 1) - tmp->RemoveFromRootSet(rt->GetMapLock()); - } - - tmp->mJSObj = nsnull; - } -NS_IMPL_CYCLE_COLLECTION_ROOT_END - NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsXPCWrappedJS) tmp->Unlink(); NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_IMETHODIMP nsXPCWrappedJS::AggregatedQueryInterface(REFNSIID aIID, void** aInstancePtr) { NS_ASSERTION(IsAggregatedToNative(), "bad AggregatedQueryInterface call"); @@ -474,16 +449,39 @@ nsXPCWrappedJS::~nsXPCWrappedJS() } } Unlink(); } void nsXPCWrappedJS::Unlink() { + if(IsValid()) + { + XPCJSRuntime* rt = nsXPConnect::GetRuntimeInstance(); + if(rt) + { + if(mRoot == this) + { + // remove this root wrapper from the map + JSObject2WrappedJSMap* map = rt->GetWrappedJSMap(); + if(map) + { + XPCAutoLock lock(rt->GetMapLock()); + map->Remove(this); + } + } + + if(mRefCnt > 1) + RemoveFromRootSet(rt->GetMapLock()); + } + + mJSObj = nsnull; + } + if(mRoot == this) { ClearWeakReferences(); } else if(mRoot) { // unlink this wrapper nsXPCWrappedJS* cur = mRoot;
--- a/js/src/xpconnect/src/xpcwrappednative.cpp +++ b/js/src/xpconnect/src/xpcwrappednative.cpp @@ -65,17 +65,17 @@ xpc_OkToHandOutWrapper(nsWrapperCache *c NeedsSOW(); } /***************************************************************************/ NS_IMPL_CYCLE_COLLECTION_CLASS(XPCWrappedNative) NS_IMETHODIMP -NS_CYCLE_COLLECTION_CLASSNAME(XPCWrappedNative)::RootAndUnlinkJSObjects(void *p) +NS_CYCLE_COLLECTION_CLASSNAME(XPCWrappedNative)::Unlink(void *p) { XPCWrappedNative *tmp = static_cast<XPCWrappedNative*>(p); tmp->ExpireWrapper(); return NS_OK; } struct TraverseExpandoObjectClosure {
--- a/xpcom/glue/nsCycleCollectionParticipant.h +++ b/xpcom/glue/nsCycleCollectionParticipant.h @@ -542,17 +542,16 @@ class NS_CYCLE_COLLECTION_INNERCLASS } \ }; \ NS_CYCLE_COLLECTION_PARTICIPANT_INSTANCE #define NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_AMBIGUOUS(_class, _base) \ class NS_CYCLE_COLLECTION_INNERCLASS \ : public nsXPCOMCycleCollectionParticipant \ { \ - NS_IMETHOD RootAndUnlinkJSObjects(void *p); \ NS_DECL_CYCLE_COLLECTION_CLASS_BODY(_class, _base) \ NS_IMETHOD_(void) Trace(void *p, TraceCallback cb, void *closure); \ }; \ NS_CYCLE_COLLECTION_PARTICIPANT_INSTANCE #define NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(_class) \ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_AMBIGUOUS(_class, _class) @@ -591,17 +590,16 @@ public: NS_CYCLE_COLLECTION_PARTICIPANT_INSTANCE #define NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(_class, \ _base_class) \ class NS_CYCLE_COLLECTION_INNERCLASS \ : public NS_CYCLE_COLLECTION_CLASSNAME(_base_class) \ { \ public: \ - NS_IMETHOD RootAndUnlinkJSObjects(void *p); \ NS_IMETHOD_(void) Trace(void *p, TraceCallback cb, void *closure); \ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED_BODY(_class, _base_class) \ }; \ NS_CYCLE_COLLECTION_PARTICIPANT_INSTANCE /** * This implements a stub UnmarkPurple function for classes that want to be * traversed but whose AddRef/Release functions don't add/remove them to/from