From 5dab1948f62612e83c7b6128fe1e1f4fe89bfe0b Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Wed, 5 Jan 2000 17:23:34 +0000 Subject: [PATCH] natMethod.cc (get_ffi_type): Test size of jboolean and select correct ffi type on that basis. * 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. From-SVN: r31242 --- libjava/ChangeLog | 7 +++++++ libjava/java/lang/reflect/natMethod.cc | 21 +++++++++++++++++---- 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 + + * 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 * 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); -- 2.30.2