aboutsummaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>2000-01-05 17:23:34 +0000
committertromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>2000-01-05 17:23:34 +0000
commit623d09666e6fca1dcd8e419558c83110f8e8719a (patch)
tree30e3bb54b112b657fa09ac2a74cb664fa19f6867 /libjava
parentb3ca2511df594241fba47f4aadc7d381aafad5fb (diff)
* java/lang/reflect/natMethod.cc (get_ffi_type): Test size of
jboolean and select correct ffi type on that basis. (_Jv_CallNonvirtualMethodA): Handle `void' return type. Constructor call always has `void' return type. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@31242 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava')
-rw-r--r--libjava/ChangeLog7
-rw-r--r--libjava/java/lang/reflect/natMethod.cc21
2 files changed, 24 insertions, 4 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index bd316c808b3..2683e1ada5e 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,10 @@
+2000-01-05 Tom Tromey <tromey@cygnus.com>
+
+ * java/lang/reflect/natMethod.cc (get_ffi_type): Test size of
+ jboolean and select correct ffi type on that basis.
+ (_Jv_CallNonvirtualMethodA): Handle `void' return type.
+ Constructor call always has `void' return type.
+
2000-01-04 Tom Tromey <tromey@cygnus.com>
* java/lang/Class.h (getSignature): Updated.
diff --git a/libjava/java/lang/reflect/natMethod.cc b/libjava/java/lang/reflect/natMethod.cc
index 5635b9fe33d..62f0ab9f22d 100644
--- a/libjava/java/lang/reflect/natMethod.cc
+++ b/libjava/java/lang/reflect/natMethod.cc
@@ -131,8 +131,14 @@ get_ffi_type (jclass klass)
r = &ffi_type_double;
else if (klass == JvPrimClass (boolean))
{
- // FIXME.
- r = &ffi_type_sint8;
+ // On some platforms a bool is a byte, on others an int.
+ if (sizeof (jboolean) == sizeof (jbyte))
+ r = &ffi_type_sint8;
+ else
+ {
+ JvAssert (sizeof (jboolean) == sizeof (jint));
+ r = &ffi_type_sint32;
+ }
}
else if (klass == JvPrimClass (char))
r = &ffi_type_uint16;
@@ -333,7 +339,12 @@ _Jv_CallNonvirtualMethodA (jobject obj,
if (needs_this)
++param_count;
- ffi_type *rtype = get_ffi_type (return_type);
+ ffi_type *rtype;
+ // A constructor itself always returns void.
+ if (is_constructor || return_type == JvPrimClass (void))
+ rtype = &ffi_type_void;
+ else
+ rtype = get_ffi_type (return_type);
ffi_type **argtypes = (ffi_type **) alloca (param_count
* sizeof (ffi_type *));
@@ -451,7 +462,9 @@ _Jv_CallNonvirtualMethodA (jobject obj,
jobject r;
#define VAL(Wrapper, Type) (new Wrapper (* (Type *) &ret_value))
- if (return_type == JvPrimClass (byte))
+ if (is_constructor)
+ r = obj;
+ else if (return_type == JvPrimClass (byte))
r = VAL (java::lang::Byte, jbyte);
else if (return_type == JvPrimClass (short))
r = VAL (java::lang::Short, jshort);