rv = LockedUnassert(aOldSource, aProperty, aTarget); if (NS_FAILED(rv)) return rv;
InMemoryDataSource::Move(nsIRDFResource* aOldSource,                         nsIRDFResource* aNewSource,                         nsIRDFResource* aProperty,                         nsIRDFNode* aTarget){    NS_PRECONDITION(aOldSource != nsnull, "null ptr");    if (! aOldSource)        return NS_ERROR_NULL_POINTER;    NS_PRECONDITION(aNewSource != nsnull, "null ptr");    if (! aNewSource)        return NS_ERROR_NULL_POINTER;    NS_PRECONDITION(aProperty != nsnull, "null ptr");    if (! aProperty)        return NS_ERROR_NULL_POINTER;    NS_PRECONDITION(aTarget != nsnull, "null ptr");    if (! aTarget)        return NS_ERROR_NULL_POINTER;    nsresult rv;    {        NS_AUTOLOCK(mLock);        // XXX We can implement LockedMove() if we decide that this        // is a performance bottleneck.        rv = LockedUnassert(aOldSource, aProperty, aTarget);        if (NS_FAILED(rv)) return rv;        rv = LockedAssert(aNewSource, aProperty, aTarget, PR_TRUE);        if (NS_FAILED(rv)) return rv;    }    // Notify the world    for (PRInt32 i = PRInt32(mNumObservers) - 1; mPropagateChanges && i >= 0; --i) {        nsIRDFObserver* obs = mObservers[i];        // XXX this should never happen, but it does, and we can't figure out why.        NS_ASSERTION(obs, "observer array corrupted!");        if (! obs)          continue;        obs->OnMove(this, aOldSource, aNewSource, aProperty, aTarget);        // XXX ignore return value?    }    return NS_RDF_ASSERTION_ACCEPTED;}