OSDN Git Service

2003-08-20 Graydon Hoare <graydon@redhat.com>
authorgraydon <graydon@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 20 Aug 2003 19:37:21 +0000 (19:37 +0000)
committergraydon <graydon@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 20 Aug 2003 19:37:21 +0000 (19:37 +0000)
* jni.cc: Replace "cheating" pointer-casting code with
extract_from_jvalue<> template.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@70613 138bc75d-0d04-0410-961f-82ee72b054a4

libjava/ChangeLog
libjava/jni.cc

index 892e2c1..2ce2121 100644 (file)
@@ -1,3 +1,8 @@
+2003-08-20  Graydon Hoare  <graydon@redhat.com>
+
+       * jni.cc: Replace "cheating" pointer-casting code with
+       extract_from_jvalue<> template.
+
 2003-08-20  Andrew Haley  <aph@redhat.com>
 
        * gnu/gcj/runtime/StackTrace.java (getClass): New method.
index 47017dc..4977907 100644 (file)
@@ -418,6 +418,18 @@ _Jv_JNI_PopSystemFrame (JNIEnv *env)
     }
 }
 
+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 @@ wrap_value (JNIEnv *, T value)
 
 // 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 @@ static T
                          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 @@ static T
                          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)
     {