Bug 339947 - Java XPCOM proxies can get used (resurrected) after having been garbage collected causing VM crash. XULRunner only. patch by ttudor/jhpedemonte, r=jhpedemonte.

git-svn-id: svn://10.0.0.236/trunk@199133 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
pedemont%us.ibm.com
2006-06-06 17:13:18 +00:00
parent 2c9f2758e7
commit a81f3bfade
6 changed files with 67 additions and 22 deletions

View File

@@ -53,7 +53,9 @@ nsJavaXPTCStub::nsJavaXPTCStub(jobject aJavaObject, nsIInterfaceInfo *aIInfo)
, mWeakRefCnt(0)
{
JNIEnv* env = GetJNIEnv();
mJavaWeakRef = env->NewWeakGlobalRef(aJavaObject);
jobject weakref = env->NewObject(weakReferenceClass,
weakReferenceConstructorMID, aJavaObject);
mJavaWeakRef = env->NewGlobalRef(weakref);
#ifdef DEBUG_JAVAXPCOM
nsIID* iid;
@@ -77,7 +79,11 @@ nsJavaXPTCStub::AddRefInternal()
// If this is the first AddRef call, we create a strong global ref to the
// Java object to keep it from being garbage collected.
if (mRefCnt == 0) {
mJavaStrongRef = GetJNIEnv()->NewGlobalRef(mJavaWeakRef);
JNIEnv* env = GetJNIEnv();
jobject referent = env->CallObjectMethod(mJavaWeakRef, getReferentMID);
if (!env->IsSameObject(referent, NULL)) {
mJavaStrongRef = env->NewGlobalRef(referent);
}
NS_ASSERTION(mJavaStrongRef != nsnull, "Failed to acquire strong ref");
}
@@ -179,7 +185,8 @@ nsJavaXPTCStub::Destroy()
}
}
env->DeleteWeakGlobalRef(mJavaWeakRef);
env->CallVoidMethod(mJavaWeakRef, clearReferentMID);
env->DeleteGlobalRef(mJavaWeakRef);
}
void
@@ -255,7 +262,7 @@ nsJavaXPTCStub::QueryInterface(const nsID &aIID, void **aInstancePtr)
// Query Java object
LOG(("\tCalling Java object queryInterface\n"));
jobject javaObject = env->NewLocalRef(mJavaWeakRef);
jobject javaObject = env->CallObjectMethod(mJavaWeakRef, getReferentMID);
jmethodID qiMID = 0;
jclass clazz = env->GetObjectClass(javaObject);
@@ -390,7 +397,7 @@ nsJavaXPTCStub::CallMethod(PRUint16 aMethodIndex,
nsresult rv = NS_OK;
JNIEnv* env = GetJNIEnv();
jobject javaObject = env->NewLocalRef(mJavaWeakRef);
jobject javaObject = env->CallObjectMethod(mJavaWeakRef, getReferentMID);
nsCAutoString methodSig("(");
@@ -1682,7 +1689,8 @@ nsJavaXPTCStub::GetWeakReference(nsIWeakReference** aInstancePtr)
if (!aInstancePtr)
return NS_ERROR_NULL_POINTER;
jobject javaObject = GetJNIEnv()->NewLocalRef(mJavaWeakRef);
jobject javaObject = GetJNIEnv()->CallObjectMethod(mJavaWeakRef,
getReferentMID);
nsJavaXPTCStubWeakRef* weakref;
weakref = new nsJavaXPTCStubWeakRef(javaObject, this);
if (!weakref)
@@ -1699,7 +1707,7 @@ jobject
nsJavaXPTCStub::GetJavaObject()
{
JNIEnv* env = GetJNIEnv();
jobject javaObject = env->NewLocalRef(mJavaWeakRef);
jobject javaObject = env->CallObjectMethod(mJavaWeakRef, getReferentMID);
#ifdef DEBUG_JAVAXPCOM
nsIID* iid;