natClass.cc (getMethod): Compute offset relative to klass's methods table, not this's table.

* java/lang/natClass.cc (getMethod): Compute offset relative to
	`klass's methods table, not `this's table.

	* java/lang/reflect/natMethod.cc (_Jv_CallNonvirtualMethodA):
	In unwrapping/widening case, check whether `k' is null, not
	whether it is primitive.  Initialize `num' from `argelts', not
	`paramelts'.  Correct create and pass arguments to ffi_call.
	Don't let presence of `this' argument affect index used to look in
	argument arrays.
	(COPY): Set appropriate element in `values' vector.

From-SVN: r31253
This commit is contained in:
Tom Tromey 2000-01-06 00:56:21 +00:00 committed by Tom Tromey
parent fe5a581031
commit 41ecf9300e
3 changed files with 38 additions and 25 deletions

View file

@ -1,5 +1,16 @@
2000-01-05 Tom Tromey <tromey@cygnus.com> 2000-01-05 Tom Tromey <tromey@cygnus.com>
* java/lang/natClass.cc (getMethod): Compute offset relative to
`klass's methods table, not `this's table.
* java/lang/reflect/natMethod.cc (_Jv_CallNonvirtualMethodA):
In unwrapping/widening case, check whether `k' is null, not
whether it is primitive. Initialize `num' from `argelts', not
`paramelts'. Correct create and pass arguments to ffi_call.
Don't let presence of `this' argument affect index used to look in
argument arrays.
(COPY): Set appropriate element in `values' vector.
* java/lang/natClass.cc: Include <gcj/method.h>. * java/lang/natClass.cc: Include <gcj/method.h>.
* java/lang/Class.h (_getMethods): Correctly declare as private, * java/lang/Class.h (_getMethods): Correctly declare as private,

View file

@ -477,7 +477,8 @@ java::lang::Class::getMethod (jstring name, JArray<jclass> *param_types)
break; break;
Method *rmethod = new Method (); Method *rmethod = new Method ();
rmethod->offset = (char*) (&klass->methods[i]) - (char*) methods; rmethod->offset = ((char *) (&klass->methods[i])
- (char *) klass->methods);
rmethod->declaringClass = klass; rmethod->declaringClass = klass;
return rmethod; return rmethod;
} }

View file

@ -374,21 +374,21 @@ _Jv_CallNonvirtualMethodA (jobject obj,
size += sizeof (jobject); size += sizeof (jobject);
} }
for (; i < param_count; ++i) for (int arg = 0; i < param_count; ++i, ++arg)
{ {
jclass k = argelts[i] ? argelts[i]->getClass() : NULL; jclass k = argelts[arg] ? argelts[arg]->getClass() : NULL;
argtypes[i] = get_ffi_type (k); argtypes[i] = get_ffi_type (k);
if (paramelts[i]->isPrimitive()) if (paramelts[arg]->isPrimitive())
{ {
if (! argelts[i] if (! argelts[arg]
|| ! k->isPrimitive () || ! k
|| ! can_widen (k, paramelts[i])) || ! can_widen (k, paramelts[arg]))
JvThrow (new java::lang::IllegalArgumentException); JvThrow (new java::lang::IllegalArgumentException);
size += paramelts[i]->size(); size += paramelts[arg]->size();
} }
else else
{ {
if (argelts[i] && ! paramelts[i]->isAssignableFrom (k)) if (argelts[arg] && ! paramelts[arg]->isAssignableFrom (k))
JvThrow (new java::lang::IllegalArgumentException); JvThrow (new java::lang::IllegalArgumentException);
size += sizeof (jobject); size += sizeof (jobject);
} }
@ -401,13 +401,14 @@ _Jv_CallNonvirtualMethodA (jobject obj,
// FIXME: throw some kind of VirtualMachineError here. // FIXME: throw some kind of VirtualMachineError here.
} }
char *values = (char *) alloca (size); char *p = (char *) alloca (size);
char *p = values; void **values = (void **) alloca (param_count * sizeof (void *));
#define COPY(Where, What, Type) \ #define COPY(Where, What, Type) \
do { \ do { \
Type val = (What); \ Type val = (What); \
memcpy ((Where), &val, sizeof (Type)); \ memcpy ((Where), &val, sizeof (Type)); \
values[i] = (Where); \
Where += sizeof (Type); \ Where += sizeof (Type); \
} while (0) } while (0)
@ -418,30 +419,30 @@ _Jv_CallNonvirtualMethodA (jobject obj,
++i; ++i;
} }
for (; i < param_count; ++i) for (int arg = 0; i < param_count; ++i, ++arg)
{ {
java::lang::Number *num = (java::lang::Number *) paramelts[i]; java::lang::Number *num = (java::lang::Number *) argelts[arg];
if (paramelts[i] == JvPrimClass (byte)) if (paramelts[arg] == JvPrimClass (byte))
COPY (p, num->byteValue(), jbyte); COPY (p, num->byteValue(), jbyte);
else if (paramelts[i] == JvPrimClass (short)) else if (paramelts[arg] == JvPrimClass (short))
COPY (p, num->shortValue(), jshort); COPY (p, num->shortValue(), jshort);
else if (paramelts[i] == JvPrimClass (int)) else if (paramelts[arg] == JvPrimClass (int))
COPY (p, num->intValue(), jint); COPY (p, num->intValue(), jint);
else if (paramelts[i] == JvPrimClass (long)) else if (paramelts[arg] == JvPrimClass (long))
COPY (p, num->longValue(), jlong); COPY (p, num->longValue(), jlong);
else if (paramelts[i] == JvPrimClass (float)) else if (paramelts[arg] == JvPrimClass (float))
COPY (p, num->floatValue(), jfloat); COPY (p, num->floatValue(), jfloat);
else if (paramelts[i] == JvPrimClass (double)) else if (paramelts[arg] == JvPrimClass (double))
COPY (p, num->doubleValue(), jdouble); COPY (p, num->doubleValue(), jdouble);
else if (paramelts[i] == JvPrimClass (boolean)) else if (paramelts[arg] == JvPrimClass (boolean))
COPY (p, ((java::lang::Boolean *) argelts[i])->booleanValue(), COPY (p, ((java::lang::Boolean *) argelts[arg])->booleanValue(),
jboolean); jboolean);
else if (paramelts[i] == JvPrimClass (char)) else if (paramelts[arg] == JvPrimClass (char))
COPY (p, ((java::lang::Character *) argelts[i])->charValue(), jchar); COPY (p, ((java::lang::Character *) argelts[arg])->charValue(), jchar);
else else
{ {
JvAssert (! paramelts[i]->isPrimitive()); JvAssert (! paramelts[arg]->isPrimitive());
COPY (p, argelts[i], jobject); COPY (p, argelts[arg], jobject);
} }
} }