Merge branch 'pingany-director_local_jstring_leak'
* pingany-director_local_jstring_leak: Use more conventional naming for generated Java LocalRefGuard variables Make more use of LocalRefGuard in Java fixup! Patch of http://sourceforge.net/p/swig/mailman/message/29816385 Patch of http://sourceforge.net/p/swig/mailman/message/29816385
This commit is contained in:
commit
0d34a0f0bf
3 changed files with 25 additions and 5 deletions
|
|
@ -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,6 +395,5 @@ namespace Swig {
|
|||
}
|
||||
return matches;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -400,11 +400,13 @@ SWIGINTERN const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
|
|||
}
|
||||
|
||||
%typemap(directorin, descriptor="Ljava/lang/String;", noblock=1) char * {
|
||||
$input = 0;
|
||||
$input = 0;
|
||||
if ($1) {
|
||||
$input = JCALL1(NewStringUTF, jenv, (const char *)$1);
|
||||
if (!$input) return $null;
|
||||
}
|
||||
Swig::LocalRefGuard $1_refguard(jenv, $input);
|
||||
// boohoo
|
||||
}
|
||||
|
||||
%typemap(freearg, noblock=1) char * { if ($1) JCALL2(ReleaseStringUTFChars, jenv, $input, (const char *)$1); }
|
||||
|
|
@ -731,6 +733,7 @@ SWIGINTERN const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
|
|||
$input = JCALL1(NewStringUTF, jenv, (const char *)$1);
|
||||
if (!$input) return $null;
|
||||
}
|
||||
Swig::LocalRefGuard $1_refguard(jenv, $input);
|
||||
}
|
||||
|
||||
%typemap(argout) char[ANY], char[] ""
|
||||
|
|
|
|||
|
|
@ -49,7 +49,8 @@ class string;
|
|||
jenv->ReleaseStringUTFChars($input, $1_pstr); %}
|
||||
|
||||
%typemap(directorin,descriptor="Ljava/lang/String;") string
|
||||
%{ $input = jenv->NewStringUTF($1.c_str()); %}
|
||||
%{ $input = jenv->NewStringUTF($1.c_str());
|
||||
Swig::LocalRefGuard $1_refguard(jenv, $input); %}
|
||||
|
||||
%typemap(out) string
|
||||
%{ $result = jenv->NewStringUTF($1.c_str()); %}
|
||||
|
|
@ -98,7 +99,8 @@ class string;
|
|||
jenv->ReleaseStringUTFChars($input, $1_pstr); %}
|
||||
|
||||
%typemap(directorin,descriptor="Ljava/lang/String;") const string &
|
||||
%{ $input = jenv->NewStringUTF($1.c_str()); %}
|
||||
%{ $input = jenv->NewStringUTF($1.c_str());
|
||||
Swig::LocalRefGuard $1_refguard(jenv, $input); %}
|
||||
|
||||
%typemap(out) const string &
|
||||
%{ $result = jenv->NewStringUTF($1->c_str()); %}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue