summaryrefslogtreecommitdiff
path: root/Lib/java
diff options
context:
space:
mode:
authorWilliam S Fulton <wsf@fultondesigns.co.uk>2014-09-27 13:56:11 +0100
committerWilliam S Fulton <wsf@fultondesigns.co.uk>2014-09-27 13:56:11 +0100
commit2f5bf397ae5235129efed25cefbb8dbcb277eaf0 (patch)
tree4c74a2f4bd0c588f75ea63d929cdc167d6395a2d /Lib/java
parentf38f6371a34a153531a7f8d5351de15621ed0387 (diff)
downloadswig-2f5bf397ae5235129efed25cefbb8dbcb277eaf0.tar.gz
Make more use of LocalRefGuard in Java
Diffstat (limited to 'Lib/java')
-rw-r--r--Lib/java/director.swg30
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_); }
- };
}