Browse Source

JNI-142: "Mem-mgmt: Defined behaviour of Message.close()"

* close() method is now idempotent
* Access to Message obj after close() results in IllegalStateException (Not SEGV anymore)
JNI-149 Release_2.1.12
heck 4 years ago
parent
commit
d9e782faff
  1. 56
      src/codegen/gen_cpp_Message.ysl2
  2. 1
      src/codegen/gen_java_Message.ysl2

56
src/codegen/gen_cpp_Message.ysl2

@ -28,14 +28,17 @@ tstylesheet {
namespace JNIAdapter { namespace JNIAdapter {
static ::«@name» *«@name»_ptr(JNIEnv *env, jobject me) { static ::«@name» *«@name»_ptr(JNIEnv *env, jobject me) {
jfieldID handle; jfieldID handle;
handle = getFieldID(env, "foundation/pEp/jniadapter/«$jname»", "handle", "J");
if(!handle) {
throw runtime_error("field not found: handle");
}
try { long handle_val = static_cast<long>(env->GetLongField(me, handle));
handle = getFieldID(env, "foundation/pEp/jniadapter/«$jname»", "handle", "J"); if(!handle_val) {
} catch (std::exception& ex) { throw runtime_error("invalid handle (0)");
assert(0);
return NULL;
} }
return reinterpret_cast<::«@name» *>(env->GetLongField(me, handle));
return reinterpret_cast<::«@name» *>(handle_val);
} }
}; };
@ -86,10 +89,19 @@ tstylesheet {
} }
JNIEXPORT jbyteArray JNICALL Java_foundation_pEp_jniadapter_«$jname»__1encodeMIME(JNIEnv *env, JNIEXPORT jbyteArray JNICALL Java_foundation_pEp_jniadapter_«$jname»__1encodeMIME(JNIEnv *env,
jobject msg) jobject obj)
{ {
pEpLog("called"); pEpLog("called");
«@name» *_obj = «@name»_ptr(env, msg); «@name»* _obj = nullptr;
try {
_obj = «@name»_ptr(env, obj);
} catch(...) {
jclass ex = env->FindClass("java/lang/IllegalStateException");
assert(ex);
env->ThrowNew(ex, nullptr);
return static_cast<jbyteArray>(NULL);
}
char *mime_text = nullptr; char *mime_text = nullptr;
PEP_STATUS status = ::mime_encode_«@name»(_obj, false, &mime_text, false); PEP_STATUS status = ::mime_encode_«@name»(_obj, false, &mime_text, false);
if (status) { if (status) {
@ -136,12 +148,24 @@ tstylesheet {
with "type", "$type"; with "type", "$type";
with "name", "concat('set', $jname)"; with "name", "concat('set', $jname)";
} }
const "type_ret" call "jni_type" with "type", "name(.)";
|| ||
JNIEXPORT `call "jni_type" with "type", "name(.)"` JNICALL «$getname»(JNIEnv *env, // CodeGen: Getter
JNIEXPORT «$type_ret» JNICALL «$getname»(JNIEnv *env,
jobject obj) jobject obj)
{ {
pEpLog("called"); pEpLog("called");
«$name» *_obj = «$name»_ptr(env, obj); «$name»* _obj = nullptr;
try {
_obj = «$name»_ptr(env, obj);
} catch(...) {
jclass ex = env->FindClass("java/lang/IllegalStateException");
assert(ex);
env->ThrowNew(ex, nullptr);
return static_cast<«$type_ret»>(NULL);
}
|| ||
choose { choose {
when "../enum[@name=$type]" when "../enum[@name=$type]"
@ -151,14 +175,22 @@ tstylesheet {
} }
|| ||
} }
// CodeGen: Setter
JNIEXPORT void JNICALL «$setname»(JNIEnv *env, JNIEXPORT void JNICALL «$setname»(JNIEnv *env,
jobject obj, jobject obj,
`call "jni_type" with "type", "name(.)"` `call "jni_type" with "type", "name(.)"`
value) value)
{ {
pEpLog("called"); pEpLog("called");
«$name» *_obj = «$name»_ptr(env, obj); «$name»* _obj = nullptr;
try {
_obj = «$name»_ptr(env, obj);
} catch(...) {
jclass ex = env->FindClass("java/lang/IllegalStateException");
assert(ex);
env->ThrowNew(ex, nullptr);
return;
}
|| ||
choose { choose {
when "../enum[@name=$type]" when "../enum[@name=$type]"

1
src/codegen/gen_java_Message.ysl2

@ -66,6 +66,7 @@ tstylesheet {
public final void close() { public final void close() {
release(handle); release(handle);
handle = 0;
} }
final protected long getHandle() { final protected long getHandle() {

Loading…
Cancel
Save