diff options
author | William S Fulton <wsf@fultondesigns.co.uk> | 2014-09-27 13:56:11 +0100 |
---|---|---|
committer | William S Fulton <wsf@fultondesigns.co.uk> | 2014-09-27 13:56:11 +0100 |
commit | 2f5bf397ae5235129efed25cefbb8dbcb277eaf0 (patch) | |
tree | 4c74a2f4bd0c588f75ea63d929cdc167d6395a2d /Lib/java | |
parent | f38f6371a34a153531a7f8d5351de15621ed0387 (diff) | |
download | swig-2f5bf397ae5235129efed25cefbb8dbcb277eaf0.tar.gz |
Make more use of LocalRefGuard in Java
Diffstat (limited to 'Lib/java')
-rw-r--r-- | Lib/java/director.swg | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/Lib/java/director.swg b/Lib/java/director.swg index 24460676f..031cdf2a9 100644 --- a/Lib/java/director.swg +++ b/Lib/java/director.swg @@ -100,6 +100,22 @@ namespace Swig { bool weak_global_; }; + /* Local JNI reference deleter */ + class LocalRefGuard { + JNIEnv *jenv_; + jobject jobj_; + + // non-copyable + LocalRefGuard(const LocalRefGuard &); + LocalRefGuard &operator=(const LocalRefGuard &); + public: + LocalRefGuard(JNIEnv *jenv, jobject jobj): jenv_(jenv), jobj_(jobj) {} + ~LocalRefGuard() { + if (jobj_) + jenv_->DeleteLocalRef(jobj_); + } + }; + /* director base class */ class Director { /* pointer to Java virtual machine */ @@ -152,6 +168,7 @@ namespace Swig { JNIEnvWrapper jnienv(this) ; JNIEnv *jenv = jnienv.getJNIEnv() ; jobject jobj = swig_self_.get(jenv); + LocalRefGuard ref_deleter(jenv, jobj); #if defined(DEBUG_DIRECTOR_OWNED) std::cout << "Swig::Director::disconnect_director_self(" << jobj << ")" << std::endl; #endif @@ -164,7 +181,6 @@ namespace Swig { jenv->CallVoidMethod(jobj, disconn_meth); } } - jenv->DeleteLocalRef(jobj); } public: @@ -379,17 +395,5 @@ namespace Swig { } return matches; } - - class LocalRefGuard { - JNIEnv* jenv_; - jobject jobj_; - - // non-copyable - LocalRefGuard(const LocalRefGuard &); - LocalRefGuard &operator=(const LocalRefGuard &); - public: - LocalRefGuard(JNIEnv* jenv, jobject jobj): jenv_(jenv), jobj_(jobj) {} - ~LocalRefGuard() { if (jobj_) jenv_->DeleteLocalRef(jobj_); } - }; } |