aboutsummaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
authorBryce McKinlay <bryce@albatross.co.nz>2000-12-28 04:34:33 +0000
committerBryce McKinlay <bryce@gcc.gnu.org>2000-12-28 04:34:33 +0000
commit6147e9d0c9a0f329bb278c73321400525c0066ae (patch)
treee2e74608e77b55df5cf68f5e3403d53821775e72 /libjava
parent867e24ad3d3190a4b7b54bc8665d1066907d4079 (diff)
downloadgcc-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')
-rw-r--r--libjava/ChangeLog14
-rw-r--r--libjava/java/lang/reflect/natMethod.cc68
2 files changed, 48 insertions, 34 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 6ea4e13..84b0124 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,17 @@
+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>
* 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 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);
}
}