natMethod.cc (_Jv_CallAnyMethodA): Allocate a full jvalue for each argument.

* java/lang/reflect/natMethod.cc (_Jv_CallAnyMethodA): Allocate a full
        jvalue for each argument. Simplify.
	* testsuite/libjava.jni/calls.c (docall),
	testsuite/libjava.jni/calls.java (longpb_f): check for argument
	misalignment.

From-SVN: r63563
This commit is contained in:
Hans Boehm 2003-02-28 17:26:29 +00:00 committed by Hans Boehm
parent b8c53e96ad
commit a6fdf2d3bf
4 changed files with 40 additions and 29 deletions

View file

@ -358,46 +358,30 @@ _Jv_CallAnyMethodA (jobject obj,
obj = JvAllocObject (return_type);
}
const int size_per_arg = sizeof(jvalue);
ffi_cif cif;
char *p = (char *) __builtin_alloca (param_count * size_per_arg);
// Overallocate to get correct alignment.
void **values = (void **)
__builtin_alloca (param_count * sizeof (void *));
int i = 0;
int size = 0;
if (needs_this)
{
// The `NULL' type is `Object'.
argtypes[i++] = get_ffi_type (NULL);
size += sizeof (jobject);
}
for (int arg = 0; i < param_count; ++i, ++arg)
{
argtypes[i] = get_ffi_type (paramelts[arg]);
if (paramelts[arg]->isPrimitive())
size += paramelts[arg]->size();
else
size += sizeof (jobject);
}
ffi_cif cif;
if (ffi_prep_cif (&cif, FFI_DEFAULT_ABI, param_count,
rtype, argtypes) != FFI_OK)
{
// FIXME: throw some kind of VirtualMachineError here.
}
char *p = (char *) __builtin_alloca (size);
void **values = (void **) __builtin_alloca (param_count * sizeof (void *));
i = 0;
if (needs_this)
{
argtypes[i] = get_ffi_type (NULL);
values[i] = p;
memcpy (p, &obj, sizeof (jobject));
p += sizeof (jobject);
p += size_per_arg;
++i;
}
for (int arg = 0; i < param_count; ++i, ++arg)
{
int tsize;
argtypes[i] = get_ffi_type (paramelts[arg]);
if (paramelts[arg]->isPrimitive())
tsize = paramelts[arg]->size();
else
@ -406,9 +390,16 @@ _Jv_CallAnyMethodA (jobject obj,
// Copy appropriate bits from the jvalue into the ffi array.
// FIXME: we could do this copying all in one loop, above, by
// over-allocating a bit.
// How do we do this without breaking big-endian platforms?
values[i] = p;
memcpy (p, &args[arg], tsize);
p += tsize;
p += size_per_arg;
}
if (ffi_prep_cif (&cif, FFI_DEFAULT_ABI, param_count,
rtype, argtypes) != FFI_OK)
{
// FIXME: throw some kind of VirtualMachineError here.
}
using namespace java::lang;