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:
parent
fe5a581031
commit
41ecf9300e
3 changed files with 38 additions and 25 deletions
|
@ -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,
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue