NS_PRECONDITION(aSource != nsnull, "null ptr"); if (! aSource) return NS_ERROR_NULL_POINTER;  NS_PRECONDITION(aProperty != nsnull, "null ptr"); if (! aProperty) return NS_ERROR_NULL_POINTER;  NS_PRECONDITION(aOldTarget != nsnull, "null ptr"); if (! aOldTarget) return NS_ERROR_NULL_POINTER;  NS_PRECONDITION(aNewTarget != nsnull, "null ptr"); if (! aNewTarget) return NS_ERROR_NULL_POINTER;
InMemoryDataSource::Change(nsIRDFResource* aSource,                           nsIRDFResource* aProperty,                           nsIRDFNode* aOldTarget,                           nsIRDFNode* aNewTarget){    nsresult rv;    {        NS_AUTOLOCK(mLock);        // XXX We can implement LockedChange() if we decide that this        // is a performance bottleneck.        rv = LockedUnassert(aSource, aProperty, aOldTarget);        if (NS_FAILED(rv)) return rv;        rv = LockedAssert(aSource, aProperty, aNewTarget, PR_TRUE);        if (NS_FAILED(rv)) return rv;    }    // Notify the world    if (mObservers) {        PRUint32 count;        rv = mObservers->Count(&count);        if (NS_FAILED(rv)) return rv;        for (PRInt32 i = PRInt32(count) - 1; i >= 0; --i) {            nsIRDFObserver* obs = (nsIRDFObserver*) mObservers->ElementAt(i);            obs->OnChange(aSource, aProperty, aOldTarget, aNewTarget);            NS_RELEASE(obs);            // XXX ignore return value?        }    }    return NS_RDF_ASSERTION_ACCEPTED;}