From 1a140d64e8ffc6e1d6983f6cccac90cb6029c6a4 Mon Sep 17 00:00:00 2001 From: bryce Date: Thu, 28 Dec 2000 04:34:33 +0000 Subject: [PATCH] Fix for PR libgcj/1516: * java/lang/reflect/natMethod.cc (primitives): Remove void entry. Add boolean entry. (can_widen): Declared inline. Remove redundant checks for void arguments and char->short conversion. Add special case for boolean conversions. (ffi_type): Declared inline. (_Jv_CallAnyMethodA): Move unwrapping logic inside isPrimitive() block. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@38506 138bc75d-0d04-0410-961f-82ee72b054a4 --- libjava/ChangeLog | 14 ++++++ libjava/java/lang/reflect/natMethod.cc | 68 +++++++++++++------------- 2 files changed, 48 insertions(+), 34 deletions(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 6ea4e137e81cc..84b0124deebd8 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,17 @@ +2000-12-28 Bryce McKinlay + + * java/lang/natClass.cc (_Jv_IsAssignableFrom): Primitive TYPEs can + not be assigned to Object. + + Fix for PR libgcj/1516: + * java/lang/reflect/natMethod.cc (primitives): Remove void entry. + Add boolean entry. + (can_widen): Declared inline. Remove redundant checks for void + arguments and char->short conversion. Add special case for boolean + conversions. + (ffi_type): Declared inline. + (_Jv_CallAnyMethodA): Move unwrapping logic inside isPrimitive() block. + 2000-12-26 Petter Reinholdtsen * java/sql/SQLWarning.java: Fixed typo in comment. diff --git a/libjava/java/lang/reflect/natMethod.cc b/libjava/java/lang/reflect/natMethod.cc index d5f860adbaae4..26886e9bd8525 100644 --- a/libjava/java/lang/reflect/natMethod.cc +++ b/libjava/java/lang/reflect/natMethod.cc @@ -47,6 +47,7 @@ details. */ #include // FIXME: remove these. +#define BooleanClass java::lang::Boolean::class$ #define VoidClass java::lang::Void::class$ #define ByteClass java::lang::Byte::class$ #define ShortClass java::lang::Short::class$ @@ -66,8 +67,8 @@ struct cpair // allowed. static cpair primitives[] = { -#define VOID 0 - { JvPrimClass (void), &VoidClass }, +#define BOOLEAN 0 + { JvPrimClass (boolean), &BooleanClass }, { JvPrimClass (byte), &ByteClass }, #define SHORT 2 { JvPrimClass (short), &ShortClass }, @@ -80,7 +81,7 @@ static cpair primitives[] = { NULL, NULL } }; -static jboolean +static inline jboolean can_widen (jclass from, jclass to) { int fromx = -1, tox = -1; @@ -96,17 +97,17 @@ can_widen (jclass from, jclass to) // Can't handle a miss. if (fromx == -1 || tox == -1) return false; - // Can't handle Void arguments. - if (fromx == VOID || tox == VOID) + // Boolean arguments may not be widened. + if (fromx == BOOLEAN && tox != BOOLEAN) return false; - // Special-case short/char conversions. - if ((fromx == SHORT && tox == CHAR) || (fromx == CHAR && tox == SHORT)) + // Special-case short->char conversions. + if (fromx == SHORT && tox == CHAR) return false; return fromx <= tox; } -static ffi_type * +static inline ffi_type * get_ffi_type (jclass klass) { // A special case. @@ -469,37 +470,36 @@ _Jv_CallAnyMethodA (jobject obj, || ! k || ! can_widen (k, paramelts[i])) JvThrow (new java::lang::IllegalArgumentException); + + if (paramelts[i] == JvPrimClass (boolean)) + COPY (&argvals[i], + ((java::lang::Boolean *) argelts[i])->booleanValue(), + jboolean); + else if (paramelts[i] == JvPrimClass (char)) + COPY (&argvals[i], + ((java::lang::Character *) argelts[i])->charValue(), + jchar); + else + { + java::lang::Number *num = (java::lang::Number *) argelts[i]; + if (paramelts[i] == JvPrimClass (byte)) + COPY (&argvals[i], num->byteValue(), jbyte); + else if (paramelts[i] == JvPrimClass (short)) + COPY (&argvals[i], num->shortValue(), jshort); + else if (paramelts[i] == JvPrimClass (int)) + COPY (&argvals[i], num->intValue(), jint); + else if (paramelts[i] == JvPrimClass (long)) + COPY (&argvals[i], num->longValue(), jlong); + else if (paramelts[i] == JvPrimClass (float)) + COPY (&argvals[i], num->floatValue(), jfloat); + else if (paramelts[i] == JvPrimClass (double)) + COPY (&argvals[i], num->doubleValue(), jdouble); + } } else { if (argelts[i] && ! paramelts[i]->isAssignableFrom (k)) JvThrow (new java::lang::IllegalArgumentException); - } - - java::lang::Number *num = (java::lang::Number *) argelts[i]; - if (paramelts[i] == JvPrimClass (byte)) - COPY (&argvals[i], num->byteValue(), jbyte); - else if (paramelts[i] == JvPrimClass (short)) - COPY (&argvals[i], num->shortValue(), jshort); - else if (paramelts[i] == JvPrimClass (int)) - COPY (&argvals[i], num->intValue(), jint); - else if (paramelts[i] == JvPrimClass (long)) - COPY (&argvals[i], num->longValue(), jlong); - else if (paramelts[i] == JvPrimClass (float)) - COPY (&argvals[i], num->floatValue(), jfloat); - else if (paramelts[i] == JvPrimClass (double)) - COPY (&argvals[i], num->doubleValue(), jdouble); - else if (paramelts[i] == JvPrimClass (boolean)) - COPY (&argvals[i], - ((java::lang::Boolean *) argelts[i])->booleanValue(), - jboolean); - else if (paramelts[i] == JvPrimClass (char)) - COPY (&argvals[i], - ((java::lang::Character *) argelts[i])->charValue(), - jchar); - else - { - JvAssert (! paramelts[i]->isPrimitive()); COPY (&argvals[i], argelts[i], jobject); } }