bug#16742 Fixing delete on nsISupports. Thanks for patch from <heikki@citec.fi> Plus using IMPL_ and DECL_ macros and removing operating on refcnt directly. r=dp

This commit is contained in:
dp%netscape.com 1999-10-23 17:33:29 +00:00
parent 9b01e1026a
commit 038812ce67
9 changed files with 36 additions and 57 deletions

View File

@ -19,6 +19,7 @@
#include "nscore.h"
#include "nsISupports.h"
#include "nsIFactory.h"
#include "nsCOMPtr.h"
#include "nsCollationUnix.h"
#include "nsIScriptableDateFormat.h"
#include "nsDateTimeFormatCID.h"
@ -33,11 +34,9 @@ NS_DEFINE_IID(kICollationIID, NS_ICOLLATION_IID);
NS_DEFINE_IID(kIDateTimeFormatIID, NS_IDATETIMEFORMAT_IID);
NS_DEFINE_CID(kScriptableDateFormatCID, NS_SCRIPTABLEDATEFORMAT_CID);
nsLocaleUnixFactory::nsLocaleUnixFactory(const nsCID &aClass)
{
mRefCnt = 0;
NS_INIT_ISUPPORTS();
mClassID = aClass;
}
@ -45,32 +44,7 @@ nsLocaleUnixFactory::~nsLocaleUnixFactory()
{
}
nsresult nsLocaleUnixFactory::QueryInterface(const nsIID &aIID,
void **aResult)
{
if (aResult == NULL) {
return NS_ERROR_NULL_POINTER;
}
// Always NULL result, in case of failure
*aResult = NULL;
if (aIID.Equals(kISupportsIID)) {
*aResult = (void *)(nsISupports*)this;
} else if (aIID.Equals(kIFactoryIID)) {
*aResult = (void *)(nsIFactory*)this;
}
if (*aResult == NULL) {
return NS_NOINTERFACE;
}
NS_ADDREF_THIS(); // Increase reference count for caller
return NS_OK;
}
NS_IMPL_ADDREF(nsLocaleUnixFactory);
NS_IMPL_RELEASE(nsLocaleUnixFactory);
NS_IMPL_ISUPPORTS(nsLocaleUnixFactory, NS_GET_IID(nsIFactory));
nsresult nsLocaleUnixFactory::CreateInstance(nsISupports *aOuter,
const nsIID &aIID,
@ -108,13 +82,10 @@ nsresult nsLocaleUnixFactory::CreateInstance(nsISupports *aOuter,
return NS_ERROR_OUT_OF_MEMORY;
}
nsresult res = inst->QueryInterface(aIID, aResult);
if(NS_FAILED(res)) {
delete inst;
}
return res;
NS_ADDREF(inst);
nsresult ret = inst->QueryInterface(aIID, aResult);
NS_RELEASE(inst);
return ret;
}
nsresult nsLocaleUnixFactory::LockFactory(PRBool aLock)

View File

@ -27,23 +27,13 @@
class nsLocaleUnixFactory : public nsIFactory
{
public:
// nsISupports methods
NS_IMETHOD QueryInterface(const nsIID &aIID,
void **aResult);
NS_IMETHOD_(nsrefcnt) AddRef(void);
NS_IMETHOD_(nsrefcnt) Release(void);
NS_DECL_ISUPPORTS
// nsIFactory methods
NS_IMETHOD CreateInstance(nsISupports *aOuter,
const nsIID &aIID,
void **aResult);
NS_IMETHOD LockFactory(PRBool aLock);
NS_DECL_NSIFACTORY
nsLocaleUnixFactory(const nsCID &aClass);
virtual ~nsLocaleUnixFactory();
private:
nsrefcnt mRefCnt;
nsCID mClassID;
};

View File

@ -107,11 +107,11 @@ nsresult nsLocaleWinFactory::CreateInstance(nsISupports *aOuter,
return NS_ERROR_OUT_OF_MEMORY;
}
NS_ADDREF(inst); // Stabilize
nsresult res = inst->QueryInterface(aIID, aResult);
if(NS_FAILED(res)) {
delete inst;
}
NS_RELEASE(inst); // Destabilize and avoid leaks. Avoid calling delete <interface pointer>
return res;
}

View File

@ -255,8 +255,11 @@ NS_IMETHODIMP nsConverterFactory::CreateInstance(nsISupports *aDelegate,
mData->CreateInstance(&t);
if (t == NULL) return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(t); // Stabilize
nsresult res = t->QueryInterface(aIID, aResult);
if (NS_FAILED(res)) delete t;
NS_RELEASE(t); // Destabilize and avoid leaks. Avoid calling delete <interface pointer>
return res;
}

View File

@ -289,8 +289,11 @@ NS_IMETHODIMP nsConverterFactory::CreateInstance(nsISupports *aDelegate,
mData->CreateInstance(&t);
if (t == NULL) return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(t); // Stabilize
nsresult res = t->QueryInterface(aIID, aResult);
if (NS_FAILED(res)) delete t;
NS_RELEASE(t); // Destabilize and avoid leaks. Avoid calling delete <interface pointer>
return res;
}

View File

@ -223,8 +223,11 @@ NS_IMETHODIMP nsConverterFactory::CreateInstance(nsISupports *aDelegate,
mData->CreateInstance(&t);
if (t == NULL) return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(t); // Stabilize
nsresult res = t->QueryInterface(aIID, aResult);
if (NS_FAILED(res)) delete t;
NS_RELEASE(t); // Destabilize and avoid leaks. Avoid calling delete <interface pointer>
return res;
}

View File

@ -918,8 +918,11 @@ NS_IMETHODIMP nsConverterFactory::CreateInstance(nsISupports *aDelegate,
mData->CreateInstance(&t);
if (t == NULL) return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(t); // Stabilize
nsresult res = t->QueryInterface(aIID, aResult);
if (NS_FAILED(res)) delete t;
NS_RELEASE(t); // Destabilize and avoid leaks. Avoid calling delete <interface pointer>
return res;
}

View File

@ -213,8 +213,11 @@ NS_IMETHODIMP nsConverterFactory::CreateInstance(nsISupports *aDelegate,
mData->CreateInstance(&t);
if (t == NULL) return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(t); // Stabilize
nsresult res = t->QueryInterface(aIID, aResult);
if (NS_FAILED(res)) delete t;
NS_RELEASE(t); // Destabilize and avoid leaks. Avoid calling delete <interface pointer>
return res;
}

View File

@ -303,8 +303,11 @@ NS_IMETHODIMP nsConverterFactory::CreateInstance(nsISupports *aDelegate,
mData->CreateInstance(&t);
if (t == NULL) return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(t); // Stabilize
nsresult res = t->QueryInterface(aIID, aResult);
if (NS_FAILED(res)) delete t;
NS_RELEASE(t); // Destabilize and avoid leaks. Avoid calling delete <interface pointer>
return res;
}