From 325ff720b9bfcc6762072bb76eedfcc89f4f7b5d Mon Sep 17 00:00:00 2001 From: "pedemont%us.ibm.com" Date: Fri, 21 Jan 2005 22:21:47 +0000 Subject: [PATCH] Make sure everything is still init'd in FinalizeStub git-svn-id: svn://10.0.0.236/trunk@168160 18797224-902f-48f8-a5cc-f745e15eee43 --- .../java/xpcom/nsJavaInterfaces.cpp | 19 ++++++++++++++----- .../java/xpcom/nsJavaXPCOMBindingUtils.cpp | 9 ++++----- .../java/xpcom/nsJavaXPCOMBindingUtils.h | 1 + 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/mozilla/extensions/java/xpcom/nsJavaInterfaces.cpp b/mozilla/extensions/java/xpcom/nsJavaInterfaces.cpp index c847278aa9f..96962dfe9b1 100644 --- a/mozilla/extensions/java/xpcom/nsJavaInterfaces.cpp +++ b/mozilla/extensions/java/xpcom/nsJavaInterfaces.cpp @@ -481,10 +481,19 @@ XPCOMPRIVATE_NATIVE(FinalizeStub) (JNIEnv *env, jclass that, env->ReleaseStringUTFChars(name, javaObjectName); #endif - void* obj = gBindings->GetXPCOMObject(env, aJavaObject); - NS_ASSERTION(!IsXPTCStub(obj), - "Expecting JavaXPCOMInstance, got nsJavaXPTCStub"); - gBindings->RemoveBinding(env, aJavaObject, nsnull); - delete (JavaXPCOMInstance*) obj; + // Due to Java's garbage collection, this finalize statement may get called + // after FreeJavaGlobals(). So check to make sure that everything is still + // initialized. + if (gJavaXPCOMInitialized) { + void* obj = gBindings->GetXPCOMObject(env, aJavaObject); + NS_ASSERTION(obj != nsnull, "No matching XPCOM obj in FinalizeStub"); + + if (obj) { + NS_ASSERTION(!IsXPTCStub(obj), + "Expecting JavaXPCOMInstance, got nsJavaXPTCStub"); + gBindings->RemoveBinding(env, aJavaObject, nsnull); + delete (JavaXPCOMInstance*) obj; + } + } } diff --git a/mozilla/extensions/java/xpcom/nsJavaXPCOMBindingUtils.cpp b/mozilla/extensions/java/xpcom/nsJavaXPCOMBindingUtils.cpp index e1895f28796..561b9699887 100644 --- a/mozilla/extensions/java/xpcom/nsJavaXPCOMBindingUtils.cpp +++ b/mozilla/extensions/java/xpcom/nsJavaXPCOMBindingUtils.cpp @@ -66,6 +66,7 @@ jmethodID getNameMID = nsnull; #endif nsJavaXPCOMBindings* gBindings = nsnull; +PRBool gJavaXPCOMInitialized = PR_FALSE; /************************************** @@ -344,12 +345,10 @@ nsJavaXPCOMBindings::GetJavaObject(JNIEnv* env, void* aXPCOMObject, /****************************** * InitializeJavaGlobals ******************************/ -PRBool gInitialized = PR_FALSE; - PRBool InitializeJavaGlobals(JNIEnv *env) { - if (gInitialized) + if (gJavaXPCOMInitialized) return PR_TRUE; jclass clazz; @@ -438,7 +437,7 @@ InitializeJavaGlobals(JNIEnv *env) goto init_error; } - gInitialized = PR_TRUE; + gJavaXPCOMInitialized = PR_TRUE; return PR_TRUE; init_error: @@ -472,7 +471,7 @@ FreeJavaGlobals(JNIEnv* env) gBindings = nsnull; } - gInitialized = PR_FALSE; + gJavaXPCOMInitialized = PR_FALSE; } diff --git a/mozilla/extensions/java/xpcom/nsJavaXPCOMBindingUtils.h b/mozilla/extensions/java/xpcom/nsJavaXPCOMBindingUtils.h index f6f558140c7..4e3129fa1b8 100644 --- a/mozilla/extensions/java/xpcom/nsJavaXPCOMBindingUtils.h +++ b/mozilla/extensions/java/xpcom/nsJavaXPCOMBindingUtils.h @@ -81,6 +81,7 @@ extern jmethodID getNameMID; class nsJavaXPCOMBindings; extern nsJavaXPCOMBindings* gBindings; +extern PRBool gJavaXPCOMInitialized; PRBool InitializeJavaGlobals(JNIEnv *env); void FreeJavaGlobals(JNIEnv* env);