diff options
author | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-02-16 00:07:34 +0000 |
---|---|---|
committer | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-02-16 00:07:34 +0000 |
commit | a82244f012d6c61bc27634963b5e7c25c72a16ed (patch) | |
tree | fd8526541777f72d0a207a77149193b5171b7e75 /libjava/jni.cc | |
parent | 82eb11029e6a84cc342178e50b15827facb5f23f (diff) | |
download | gcc-a82244f012d6c61bc27634963b5e7c25c72a16ed.tar.gz |
* resolve.cc (ncode): Set args_raw_size. Compute jni_cif and
jni_arg_types.
(init_cif): Added `rtype_p' argument.
* include/java-interp.h (class _Jv_MethodBase): Added
args_raw_size.
(class _Jv_InterpMethod): Removed args_raw_size.
(class _Jv_JNIMethod): Added jni_cif and jni_arg_types fields.
* jni.cc (call): Pass JNIEnv and (for static methods only) the
class pointer as well as the ordinary arguments.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@31995 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/jni.cc')
-rw-r--r-- | libjava/jni.cc | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/libjava/jni.cc b/libjava/jni.cc index 0d78b32b0d3..26f3b049852 100644 --- a/libjava/jni.cc +++ b/libjava/jni.cc @@ -1323,7 +1323,7 @@ mangled_name (jclass klass, _Jv_Utf8Const *func_name, // This function is the stub which is used to turn an ordinary (CNI) // method call into a JNI call. void -_Jv_JNIMethod::call (ffi_cif *cif, void *ret, ffi_raw *args, void *__this) +_Jv_JNIMethod::call (ffi_cif *, void *ret, ffi_raw *args, void *__this) { _Jv_JNIMethod* _this = (_Jv_JNIMethod *) __this; @@ -1372,9 +1372,24 @@ _Jv_JNIMethod::call (ffi_cif *cif, void *ret, ffi_raw *args, void *__this) } } + JvAssert (_this->args_raw_size % sizeof (ffi_raw) == 0); + ffi_raw real_args[2 + _this->args_raw_size / sizeof (ffi_raw)]; + int offset = 0; + + // First argument is always the environment pointer. + real_args[offset++].ptr = &env; + + // For a static method, we pass in the Class. For non-static + // methods, the `this' argument is already handled. + if ((_this->self->accflags & java::lang::reflect::Modifier::STATIC)) + real_args[offset++].ptr = _this->defining_class; + + // Copy over passed-in arguments. + memcpy (&real_args[offset], args, _this->args_raw_size); + // The actual call to the JNI function. - // FIXME: if this is a static function we must include the class! - ffi_raw_call (cif, (void (*) (...)) _this->function, ret, args); + ffi_raw_call (&_this->jni_cif, (void (*) (...)) _this->function, + ret, real_args); do { |