This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
[patch] fyi: minor typesafety fix to jni.cc
- From: graydon hoare <graydon at redhat dot com>
- To: java-patches at gcc dot gnu dot org
- Date: 20 Aug 2003 17:27:49 -0400
- Subject: [patch] fyi: minor typesafety fix to jni.cc
hi,
I just added this, which fixes a not-terribly-safe union downcast in
jni.cc; sorry for not getting approval from the list first, tromey and
I were discussing it privately and I forgot to post here. is it ok?
-graydon
2003-08-20 Graydon Hoare <graydon@redhat.com>
* jni.cc: Replace "cheating" pointer-casting code with
extract_from_jvalue<> template.
--- jni.cc 18 Aug 2003 14:36:06 -0000 1.74
+++ jni.cc 20 Aug 2003 19:37:05 -0000
@@ -418,6 +418,18 @@
}
}
+template<typename T> T extract_from_jvalue(jvalue const & t);
+template<> jboolean extract_from_jvalue(jvalue const & jv) { return jv.z; }
+template<> jbyte extract_from_jvalue(jvalue const & jv) { return jv.b; }
+template<> jchar extract_from_jvalue(jvalue const & jv) { return jv.c; }
+template<> jshort extract_from_jvalue(jvalue const & jv) { return jv.s; }
+template<> jint extract_from_jvalue(jvalue const & jv) { return jv.i; }
+template<> jlong extract_from_jvalue(jvalue const & jv) { return jv.j; }
+template<> jfloat extract_from_jvalue(jvalue const & jv) { return jv.f; }
+template<> jdouble extract_from_jvalue(jvalue const & jv) { return jv.d; }
+template<> jobject extract_from_jvalue(jvalue const & jv) { return jv.l; }
+
+
// This function is used from other template functions. It wraps the
// return value appropriately; we specialize it so that object returns
// are turned into local references.
@@ -430,7 +442,7 @@
// This specialization is used for jobject, jclass, jstring, jarray,
// etc.
-template<typename T>
+template<typename R, typename T>
static T *
wrap_value (JNIEnv *env, T *value)
{
@@ -781,8 +793,7 @@
style == constructor,
arg_types, args, &result);
- // We cheat a little here. FIXME.
- return wrap_value (env, * (T *) &result);
+ return wrap_value (env, extract_from_jvalue<T>(result));
}
catch (jthrowable t)
{
@@ -848,8 +859,7 @@
style == constructor,
arg_types, arg_copy, &result);
- // We cheat a little here. FIXME.
- return wrap_value (env, * (T *) &result);
+ return wrap_value (env, extract_from_jvalue<T>(result));
}
catch (jthrowable t)
{