Commit 6147e9d0 by Bryce McKinlay Committed by Bryce McKinlay

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
parent 867e24ad
2000-12-28 Bryce McKinlay <bryce@albatross.co.nz>
* 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 <pere@hungry.com> 2000-12-26 Petter Reinholdtsen <pere@hungry.com>
* java/sql/SQLWarning.java: Fixed typo in comment. * java/sql/SQLWarning.java: Fixed typo in comment.
......
...@@ -47,6 +47,7 @@ details. */ ...@@ -47,6 +47,7 @@ details. */
#include <ffi.h> #include <ffi.h>
// FIXME: remove these. // FIXME: remove these.
#define BooleanClass java::lang::Boolean::class$
#define VoidClass java::lang::Void::class$ #define VoidClass java::lang::Void::class$
#define ByteClass java::lang::Byte::class$ #define ByteClass java::lang::Byte::class$
#define ShortClass java::lang::Short::class$ #define ShortClass java::lang::Short::class$
...@@ -66,8 +67,8 @@ struct cpair ...@@ -66,8 +67,8 @@ struct cpair
// allowed. // allowed.
static cpair primitives[] = static cpair primitives[] =
{ {
#define VOID 0 #define BOOLEAN 0
{ JvPrimClass (void), &VoidClass }, { JvPrimClass (boolean), &BooleanClass },
{ JvPrimClass (byte), &ByteClass }, { JvPrimClass (byte), &ByteClass },
#define SHORT 2 #define SHORT 2
{ JvPrimClass (short), &ShortClass }, { JvPrimClass (short), &ShortClass },
...@@ -80,7 +81,7 @@ static cpair primitives[] = ...@@ -80,7 +81,7 @@ static cpair primitives[] =
{ NULL, NULL } { NULL, NULL }
}; };
static jboolean static inline jboolean
can_widen (jclass from, jclass to) can_widen (jclass from, jclass to)
{ {
int fromx = -1, tox = -1; int fromx = -1, tox = -1;
...@@ -96,17 +97,17 @@ can_widen (jclass from, jclass to) ...@@ -96,17 +97,17 @@ can_widen (jclass from, jclass to)
// Can't handle a miss. // Can't handle a miss.
if (fromx == -1 || tox == -1) if (fromx == -1 || tox == -1)
return false; return false;
// Can't handle Void arguments. // Boolean arguments may not be widened.
if (fromx == VOID || tox == VOID) if (fromx == BOOLEAN && tox != BOOLEAN)
return false; return false;
// Special-case short/char conversions. // Special-case short->char conversions.
if ((fromx == SHORT && tox == CHAR) || (fromx == CHAR && tox == SHORT)) if (fromx == SHORT && tox == CHAR)
return false; return false;
return fromx <= tox; return fromx <= tox;
} }
static ffi_type * static inline ffi_type *
get_ffi_type (jclass klass) get_ffi_type (jclass klass)
{ {
// A special case. // A special case.
...@@ -469,37 +470,36 @@ _Jv_CallAnyMethodA (jobject obj, ...@@ -469,37 +470,36 @@ _Jv_CallAnyMethodA (jobject obj,
|| ! k || ! k
|| ! can_widen (k, paramelts[i])) || ! can_widen (k, paramelts[i]))
JvThrow (new java::lang::IllegalArgumentException); 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 else
{ {
if (argelts[i] && ! paramelts[i]->isAssignableFrom (k)) if (argelts[i] && ! paramelts[i]->isAssignableFrom (k))
JvThrow (new java::lang::IllegalArgumentException); 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); COPY (&argvals[i], argelts[i], jobject);
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment