diff options
author | Bryce McKinlay <bryce@albatross.co.nz> | 2000-12-28 04:34:33 +0000 |
---|---|---|
committer | Bryce McKinlay <bryce@gcc.gnu.org> | 2000-12-28 04:34:33 +0000 |
commit | 6147e9d0c9a0f329bb278c73321400525c0066ae (patch) | |
tree | e2e74608e77b55df5cf68f5e3403d53821775e72 /libjava/java | |
parent | 867e24ad3d3190a4b7b54bc8665d1066907d4079 (diff) | |
download | gcc-6147e9d0c9a0f329bb278c73321400525c0066ae.zip gcc-6147e9d0c9a0f329bb278c73321400525c0066ae.tar.gz gcc-6147e9d0c9a0f329bb278c73321400525c0066ae.tar.bz2 |
re PR libgcj/1516 (Method.invoke won't accept boolean parameters)
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.
From-SVN: r38506
Diffstat (limited to 'libjava/java')
-rw-r--r-- | libjava/java/lang/reflect/natMethod.cc | 68 |
1 files changed, 34 insertions, 34 deletions
diff --git a/libjava/java/lang/reflect/natMethod.cc b/libjava/java/lang/reflect/natMethod.cc index d5f860a..26886e9b 100644 --- a/libjava/java/lang/reflect/natMethod.cc +++ b/libjava/java/lang/reflect/natMethod.cc @@ -47,6 +47,7 @@ details. */ #include <ffi.h> // 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); } } |