From f7c03f3fa4c17b75babd0a1a43941effd600385e Mon Sep 17 00:00:00 2001 From: Nathan Toone Date: Fri, 7 Mar 2014 23:44:20 -0700 Subject: [PATCH] Clean up refs once deleted --- core/cpp/src/main/native/c++/JClassImpl.cpp | 2 +- core/cpp/src/main/native/c++/Jace.cpp | 18 +++++------ .../cpp/src/main/native/c++/proxy/JObject.cpp | 4 +-- .../main/native/c++/runtime/NativeProxy.cpp | 30 +++++++++---------- .../main/native/include/jace/ElementProxy.h | 2 +- .../cpp/src/main/native/include/jace/JArray.h | 24 +++++++-------- .../src/main/native/include/jace/JEnlister.h | 2 +- .../cpp/src/main/native/include/jace/JField.h | 4 +-- .../main/native/include/jace/JFieldProxy.h | 4 +-- .../src/main/native/include/jace/JMethod.h | 4 +-- core/cpp/src/main/native/include/jace/Jace.h | 10 +++---- .../java/org/jace/proxy/ProxyGenerator.java | 10 +++---- 12 files changed, 57 insertions(+), 57 deletions(-) diff --git a/core/cpp/src/main/native/c++/JClassImpl.cpp b/core/cpp/src/main/native/c++/JClassImpl.cpp index 3804668..70e009e 100644 --- a/core/cpp/src/main/native/c++/JClassImpl.cpp +++ b/core/cpp/src/main/native/c++/JClassImpl.cpp @@ -45,7 +45,7 @@ jclass JClassImpl::getClass() const { } theClass = static_cast(env->NewGlobalRef(localClass)); - env->DeleteLocalRef(localClass); + env->DeleteLocalRef(localClass), localClass = 0; } return theClass; } diff --git a/core/cpp/src/main/native/c++/Jace.cpp b/core/cpp/src/main/native/c++/Jace.cpp index 7210ab4..a4e8f02 100644 --- a/core/cpp/src/main/native/c++/Jace.cpp +++ b/core/cpp/src/main/native/c++/Jace.cpp @@ -271,7 +271,7 @@ jobject newLocalRef(jobject ref) { void deleteLocalRef(jobject localRef) { try { JNIEnv* env = attach(); - env->DeleteLocalRef(localRef); + env->DeleteLocalRef(localRef), localRef = 0; } catch (...) {} } @@ -291,7 +291,7 @@ jobject newGlobalRef(jobject ref) { void deleteGlobalRef(jobject globalRef) { try { JNIEnv* env = attach(); - env->DeleteGlobalRef(globalRef); + env->DeleteGlobalRef(globalRef), globalRef = 0; } catch (...) {} } @@ -336,7 +336,7 @@ void catchAndThrow() { throw JNIException(msg); } - env->DeleteLocalRef(throwableClass); + env->DeleteLocalRef(throwableClass), throwableClass = 0; jmethodID classGetName = env->GetMethodID(classClass, "getName", "()Ljava/lang/String;"); if (!classGetName) { string msg = "Assert failed: Unable to find the method, Class.getName()."; @@ -349,7 +349,7 @@ void catchAndThrow() { throw JNIException(msg); } - env->DeleteLocalRef(classClass); + env->DeleteLocalRef(classClass), classClass = 0; jobject exceptionClass = env->CallObjectMethod(jexception, throwableGetClass); if (env->ExceptionOccurred()) { env->ExceptionDescribe(); @@ -390,8 +390,8 @@ void catchAndThrow() { break; } - env->DeleteLocalRef(exceptionClass); - env->DeleteLocalRef(exceptionType); + env->DeleteLocalRef(exceptionClass), exceptionClass = 0; + env->DeleteLocalRef(exceptionType), exceptionType = 0; exceptionClass = superClass; exceptionType = static_cast(env->CallObjectMethod(exceptionClass, classGetName)); @@ -459,8 +459,8 @@ string toString(jobject obj) { env->ReleaseStringUTFChars(javaStr, strBuf); - env->DeleteLocalRef(javaStr); - env->DeleteLocalRef(objectClass); + env->DeleteLocalRef(javaStr), javaStr = 0; + env->DeleteLocalRef(objectClass), objectClass = 0; return value; } @@ -473,7 +473,7 @@ void java_throw(const std::string& internalName, const std::string& message) { THROW_JNI_EXCEPTION("Could not find class " + internalName); } env->ThrowNew(exClass, message.c_str()); - env->DeleteLocalRef(exClass); + env->DeleteLocalRef(exClass), exClass = 0; } diff --git a/core/cpp/src/main/native/c++/proxy/JObject.cpp b/core/cpp/src/main/native/c++/proxy/JObject.cpp index 4cbe79b..0e5f003 100644 --- a/core/cpp/src/main/native/c++/proxy/JObject.cpp +++ b/core/cpp/src/main/native/c++/proxy/JObject.cpp @@ -63,7 +63,7 @@ JObject::~JObject() throw () { jobject ref = *this; if (ref) { - deleteGlobalRef(ref); + deleteGlobalRef(ref), ref = 0; } } catch (VirtualMachineShutdownError&) @@ -159,7 +159,7 @@ void JObject::setJavaJniValue(jvalue newValue) { // Delete the old value if (oldValue) { - env->DeleteGlobalRef(oldValue); + env->DeleteGlobalRef(oldValue), oldValue = 0; } JValue::setJavaJniValue(ourCopy); } diff --git a/core/cpp/src/main/native/c++/runtime/NativeProxy.cpp b/core/cpp/src/main/native/c++/runtime/NativeProxy.cpp index 457e36c..188e29a 100644 --- a/core/cpp/src/main/native/c++/runtime/NativeProxy.cpp +++ b/core/cpp/src/main/native/c++/runtime/NativeProxy.cpp @@ -47,11 +47,11 @@ static void registerInvokeNativeHook() { }; int methods_size = sizeof(methods) / sizeof(methods[0]); if (env->RegisterNatives(hookClass, methods, methods_size) != JNI_OK) { - env->DeleteLocalRef(hookClass); + env->DeleteLocalRef(hookClass), hookClass = 0; THROW_JNI_EXCEPTION("Unable to register native callback for invokeNative()."); } registered = true; - env->DeleteLocalRef(hookClass); + env->DeleteLocalRef(hookClass), hookClass = 0; } /** @@ -68,43 +68,43 @@ Builder::Builder(const std::string& className) { m_registerCallbackMethod = env->GetMethodID(instClass, "registerNative", "(Ljava/lang/String;JI)V"); if (!m_registerCallbackMethod) { - env->DeleteLocalRef(instClass); + env->DeleteLocalRef(instClass), instClass = 0; THROW_JNI_EXCEPTION("Assert failed: Unable to find the method, NativeInvocation.registerNative()."); } m_createProxyMethod = env->GetMethodID(instClass, "createProxy", "()Ljava/lang/Object;"); if (!m_createProxyMethod) { - env->DeleteLocalRef(instClass); + env->DeleteLocalRef(instClass), instClass = 0; THROW_JNI_EXCEPTION("Assert failed: Unable to find the method, NativeInvocation.createProxy()."); } jmethodID constructor = env->GetMethodID(instClass, "", "(Ljava/lang/String;)V"); if (!constructor) { - env->DeleteLocalRef(instClass); + env->DeleteLocalRef(instClass), instClass = 0; THROW_JNI_EXCEPTION("Assert failed: Unable to find the constructor, NativeInvocation()."); } jstring javaString = env->NewStringUTF(className.c_str()); if (!javaString) { - env->DeleteLocalRef(instClass); + env->DeleteLocalRef(instClass), instClass = 0; THROW_JNI_EXCEPTION("Assert failed: Error creating java string."); } jobject instance = env->NewObject(instClass, constructor, javaString); - env->DeleteLocalRef(javaString); + env->DeleteLocalRef(javaString), javaString = 0; if (!instance) { - env->DeleteLocalRef(instClass); + env->DeleteLocalRef(instClass), instClass = 0; THROW_JNI_EXCEPTION("Assert failed: Error instantiating object."); } m_instance = env->NewGlobalRef(instance); - env->DeleteLocalRef(instance); + env->DeleteLocalRef(instance), instance = 0; m_classRef = static_cast(env->NewGlobalRef(instClass)); - env->DeleteLocalRef(instClass); + env->DeleteLocalRef(instClass), instClass = 0; } Builder::~Builder() { - deleteGlobalRef(m_classRef); - deleteGlobalRef(m_instance); + deleteGlobalRef(m_classRef), m_classRef = 0; + deleteGlobalRef(m_instance), m_instance = 0; } void Builder::registerCallback(const std::string& name, const Callback& callback) { @@ -122,11 +122,11 @@ void Builder::registerCallback(const std::string& name, const Callback& callback (jint) m_callbacks.size()); string msg = "Exception thrown invoking NativeInvocation.registerNative()\n"; if (messageException(msg)) { - env->DeleteLocalRef(javaString); + env->DeleteLocalRef(javaString), javaString = 0; throw JNIException(msg); } m_callbacks.push_back(callback); - env->DeleteLocalRef(javaString); + env->DeleteLocalRef(javaString), javaString = 0; } ::jace::proxy::JObject Builder::instantiate() { @@ -137,7 +137,7 @@ ::jace::proxy::JObject Builder::instantiate() { } ::jace::proxy::JObject returnVal(obj); - env->DeleteLocalRef(obj); + env->DeleteLocalRef(obj), obj = 0; return returnVal; } diff --git a/core/cpp/src/main/native/include/jace/ElementProxy.h b/core/cpp/src/main/native/include/jace/ElementProxy.h index 4c4bf07..c440dcf 100644 --- a/core/cpp/src/main/native/include/jace/ElementProxy.h +++ b/core/cpp/src/main/native/include/jace/ElementProxy.h @@ -79,7 +79,7 @@ template class ElementProxy: public virtual ::jace::proxy::J ~ElementProxy() throw () { - deleteGlobalRef(parent); + deleteGlobalRef(parent), parent = 0; } private: diff --git a/core/cpp/src/main/native/include/jace/JArray.h b/core/cpp/src/main/native/include/jace/JArray.h index adf917d..9a35825 100644 --- a/core/cpp/src/main/native/include/jace/JArray.h +++ b/core/cpp/src/main/native/include/jace/JArray.h @@ -83,7 +83,7 @@ template class JArray: public ::jace::proxy::JObject { jobject localRef = ::jace::JArrayHelper::newArray(size, ElementType::staticGetJavaJniClass()); this->setJavaJniObject(localRef); - deleteLocalRef(localRef); + deleteLocalRef(localRef), localRef = 0; _length = size; } @@ -113,7 +113,7 @@ template class JArray: public ::jace::proxy::JObject catchAndThrow(); } _length = values.size(); - env->DeleteLocalRef(localArray); + env->DeleteLocalRef(localArray), localArray = 0; } JArray(const JArray& array): JObject(0) @@ -168,7 +168,7 @@ template class JArray: public ::jace::proxy::JObject jvalue localElementRef = ::jace::JArrayHelper::getElement(static_cast(*this), index); ElementProxy element(this->getJavaJniArray(), localElementRef, index); - deleteLocalRef(localElementRef.l); + deleteLocalRef(localElementRef.l), localElementRef.l = 0; return element; } @@ -190,7 +190,7 @@ template class JArray: public ::jace::proxy::JObject jvalue localElementRef = ::jace::JArrayHelper::getElement(static_cast(*this), index); ElementProxy element(this->getJavaJniArray(), localElementRef, index); - deleteLocalRef(localElementRef.l); + deleteLocalRef(localElementRef.l), localElementRef.l = 0; return element; } @@ -531,7 +531,7 @@ JArray< ::jace::proxy::types::JBoolean >::JArray(int size) } setJavaJniObject(array); - env->DeleteLocalRef(array); + env->DeleteLocalRef(array), array = 0; this->_length = -1; } @@ -597,7 +597,7 @@ JArray< ::jace::proxy::types::JByte >::JArray(int size) } setJavaJniObject(array); - env->DeleteLocalRef(array); + env->DeleteLocalRef(array), array = 0; this->_length = -1; } @@ -662,7 +662,7 @@ JArray< ::jace::proxy::types::JChar >::JArray(int size) } setJavaJniObject(array); - env->DeleteLocalRef(array); + env->DeleteLocalRef(array), array = 0; this->_length = -1; } @@ -728,7 +728,7 @@ JArray< ::jace::proxy::types::JDouble >::JArray(int size) } setJavaJniObject(array); - env->DeleteLocalRef(array); + env->DeleteLocalRef(array), array = 0; this->_length = -1; } @@ -794,7 +794,7 @@ JArray< ::jace::proxy::types::JFloat >::JArray(int size) } setJavaJniObject(array); - env->DeleteLocalRef(array); + env->DeleteLocalRef(array), array = 0; this->_length = -1; } @@ -860,7 +860,7 @@ JArray< ::jace::proxy::types::JInt >::JArray(int size) } setJavaJniObject(array); - env->DeleteLocalRef(array); + env->DeleteLocalRef(array), array = 0; this->_length = -1; } @@ -926,7 +926,7 @@ JArray< ::jace::proxy::types::JLong >::JArray(int size) } setJavaJniObject(array); - env->DeleteLocalRef(array); + env->DeleteLocalRef(array), array = 0; this->_length = -1; } @@ -992,7 +992,7 @@ JArray< ::jace::proxy::types::JShort >::JArray(int size) } setJavaJniObject(array); - env->DeleteLocalRef(array); + env->DeleteLocalRef(array), array = 0; this->_length = -1; } diff --git a/core/cpp/src/main/native/include/jace/JEnlister.h b/core/cpp/src/main/native/include/jace/JEnlister.h index ade95a8..9053537 100644 --- a/core/cpp/src/main/native/include/jace/JEnlister.h +++ b/core/cpp/src/main/native/include/jace/JEnlister.h @@ -53,7 +53,7 @@ template class JEnlister : public ::jace::JFactory { T t(val); // We know that val is a jobject, because you can only throw exceptions. - deleteLocalRef(val.l); + deleteLocalRef(val.l), val.l = 0; throw t; } diff --git a/core/cpp/src/main/native/include/jace/JField.h b/core/cpp/src/main/native/include/jace/JField.h index ab688fb..171b0d5 100644 --- a/core/cpp/src/main/native/include/jace/JField.h +++ b/core/cpp/src/main/native/include/jace/JField.h @@ -47,7 +47,7 @@ template class JField { jvalue value = helper.getField(object); JFieldProxy fieldProxy(helper.getFieldID(), value, object); - deleteLocalRef(value.l); + deleteLocalRef(value.l), value.l = 0; return fieldProxy; } @@ -61,7 +61,7 @@ template class JField { jvalue value = helper.getField(jClass); JFieldProxy fieldProxy(helper.getFieldID(), value, jClass.getClass()); - deleteLocalRef(value.l); + deleteLocalRef(value.l), value.l = 0; return fieldProxy; } diff --git a/core/cpp/src/main/native/include/jace/JFieldProxy.h b/core/cpp/src/main/native/include/jace/JFieldProxy.h index 85173f3..5b0937f 100644 --- a/core/cpp/src/main/native/include/jace/JFieldProxy.h +++ b/core/cpp/src/main/native/include/jace/JFieldProxy.h @@ -103,12 +103,12 @@ template class JFieldProxy: public FieldType virtual ~JFieldProxy() throw () { if (parent) { - deleteGlobalRef(parent); + deleteGlobalRef(parent), parent = 0; } if (parentClass) { - deleteGlobalRef(parentClass); + deleteGlobalRef(parentClass), parentClass = 0; } } diff --git a/core/cpp/src/main/native/include/jace/JMethod.h b/core/cpp/src/main/native/include/jace/JMethod.h index 3505131..ae9dcde 100644 --- a/core/cpp/src/main/native/include/jace/JMethod.h +++ b/core/cpp/src/main/native/include/jace/JMethod.h @@ -79,7 +79,7 @@ template class JMethod catchAndThrow(); ResultType result(resultRef); - env->DeleteLocalRef(resultRef); + env->DeleteLocalRef(resultRef), resultRef = 0; return result; } @@ -110,7 +110,7 @@ template class JMethod catchAndThrow(); ResultType result(resultRef); - env->DeleteLocalRef(resultRef); + env->DeleteLocalRef(resultRef), resultRef = 0; return result; } diff --git a/core/cpp/src/main/native/include/jace/Jace.h b/core/cpp/src/main/native/include/jace/Jace.h index 55e230f..ddd798e 100644 --- a/core/cpp/src/main/native/include/jace/Jace.h +++ b/core/cpp/src/main/native/include/jace/Jace.h @@ -368,7 +368,7 @@ T java_cast(const ::jace::proxy::JObject& obj) { const ::jace::JClass& resultClass = T::staticGetJavaJniClass(); bool isValid = env->IsAssignableFrom(argClass, resultClass.getClass()); - env->DeleteLocalRef(argClass); + env->DeleteLocalRef(argClass), argClass = 0; if (isValid) return T(static_cast(obj)); @@ -399,17 +399,17 @@ jobject java_box(T val) { std::string sig = std::string("(") + T::staticGetJavaJniClass().getSignature() + ")L" + className + ";"; jmethodID valueOf = env->GetStaticMethodID(boxClass, "valueOf", sig.c_str()); if (!valueOf) { - env->DeleteLocalRef(boxClass); + env->DeleteLocalRef(boxClass), boxClass = 0; THROW_JNI_EXCEPTION("Could not get valueOf function"); } jobject ret = env->CallStaticObjectMethod(boxClass, valueOf, static_cast(val)); std::string msg = "Exception thrown invoking valueOf()\n"; if (messageException(msg)) { - env->DeleteLocalRef(boxClass); + env->DeleteLocalRef(boxClass), boxClass = 0; throw JNIException(msg); } - env->DeleteLocalRef(boxClass); + env->DeleteLocalRef(boxClass), boxClass = 0; return ret; } @@ -445,7 +445,7 @@ bool instanceof(const ::jace::proxy::JObject& object) { const ::jace::JClass& resultClass = T::staticGetJavaJniClass(); bool isValid = env->IsAssignableFrom(argClass, resultClass.getClass()); - env->DeleteLocalRef(argClass); + env->DeleteLocalRef(argClass), argClass = 0; return isValid; } diff --git a/core/java/src/main/java/org/jace/proxy/ProxyGenerator.java b/core/java/src/main/java/org/jace/proxy/ProxyGenerator.java index 0860544..73acb8b 100644 --- a/core/java/src/main/java/org/jace/proxy/ProxyGenerator.java +++ b/core/java/src/main/java/org/jace/proxy/ProxyGenerator.java @@ -348,7 +348,7 @@ public String toString(TypeName typeName) output.write(" jobject localRef = newObject(" + className + "::staticGetJavaJniClass(), arguments);" + newLine); output.write(" " + className + " result = " + className + "(localRef);" + newLine); - output.write(" deleteLocalRef(localRef);" + newLine); + output.write(" deleteLocalRef(localRef), localRef = 0;" + newLine); output.write(" return result;" + newLine); } else @@ -439,7 +439,7 @@ else if (fullyQualifiedName.equals("java.lang.String")) output.write("{" + newLine); output.write(" jstring strRef = createString(str);" + newLine); output.write(" setJavaJniObject(strRef);" + newLine); - output.write(" deleteLocalRef(strRef);" + newLine); + output.write(" deleteLocalRef(strRef), strRef = 0;" + newLine); output.write("}" + newLine); output.write(newLine); @@ -447,7 +447,7 @@ else if (fullyQualifiedName.equals("java.lang.String")) output.write("{" + newLine); output.write(" jstring strRef = createString(str);" + newLine); output.write(" setJavaJniObject(strRef);" + newLine); - output.write(" deleteLocalRef(strRef);" + newLine); + output.write(" deleteLocalRef(strRef), strRef = 0;" + newLine); output.write("}" + newLine); output.write(newLine); @@ -489,7 +489,7 @@ else if (fullyQualifiedName.equals("java.lang.String")) output.write(newLine); output.write(" std::string str((char*) byteArray, (char*) byteArray + arraySize);" + newLine); output.write(" env->ReleaseByteArrayElements(array, byteArray, JNI_ABORT);" + newLine); - output.write(" env->DeleteLocalRef(array);" + newLine); + output.write(" env->DeleteLocalRef(array), array = 0;" + newLine); output.write(" return str;" + newLine); output.write("}" + newLine); output.write(newLine); @@ -531,7 +531,7 @@ else if (fullyQualifiedName.equals("java.lang.String")) + newLine); output.write(" }" + newLine); output.write(newLine); - output.write(" env->DeleteLocalRef(jbuf);" + newLine); + output.write(" env->DeleteLocalRef(jbuf), jbuf = 0;" + newLine); output.write(" return jstr;" + newLine); output.write("}" + newLine); output.write(newLine);