X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fnative%2Fjni.c;h=162aebcb0d872f897b051029d9a7b1cae5d5297f;hb=58bac0a56dab7d6983a3cfbee7a9b7ffec5a4284;hp=96bf7c5c7c2038da7b74373ba1f43d05c610884b;hpb=98f01b1e6b31ff3b610dd6906cf108647bfa3dd9;p=cacao.git diff --git a/src/native/jni.c b/src/native/jni.c index 96bf7c5c7..162aebcb0 100644 --- a/src/native/jni.c +++ b/src/native/jni.c @@ -22,7 +22,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - $Id: jni.c 8245 2007-07-31 09:55:04Z michi $ + $Id: jni.c 8299 2007-08-13 08:41:18Z michi $ */ @@ -38,6 +38,7 @@ #include "mm/gc-common.h" #include "mm/memory.h" #include "native/jni.h" +#include "native/llni.h" #include "native/native.h" #if defined(ENABLE_JAVASE) @@ -102,6 +103,7 @@ #include "vm/exceptions.h" #include "vm/global.h" #include "vm/initialize.h" +#include "vm/primitive.h" #include "vm/resolve.h" #include "vm/stringlocal.h" #include "vm/vm.h" @@ -112,7 +114,6 @@ #include "vmcore/loader.h" #include "vmcore/options.h" -#include "vmcore/primitive.h" #include "vmcore/statistics.h" @@ -160,20 +161,13 @@ static methodinfo *dbbirw_init; #endif -/* local reference table ******************************************************/ - -#if !defined(ENABLE_THREADS) -localref_table *_no_threads_localref_table; -#endif - - /* accessing instance fields macros *******************************************/ #define SET_FIELD(o,type,f,value) \ - *((type *) ((ptrint) (o) + (ptrint) ((fieldinfo *) (f))->offset)) = (type) (value) + *((type *) (((intptr_t) (o)) + ((intptr_t) ((fieldinfo *) (f))->offset))) = (type) (value) #define GET_FIELD(o,type,f) \ - *((type *) ((ptrint) (o) + (ptrint) ((fieldinfo *) (f))->offset)) + *((type *) (((intptr_t) (o)) + ((intptr_t) ((fieldinfo *) (f))->offset))) /* some forward declarations **************************************************/ @@ -240,42 +234,6 @@ bool jni_init(void) } -/* jni_init_localref_table ***************************************************** - - Initializes the local references table of the current thread. - -*******************************************************************************/ - -bool jni_init_localref_table(void) -{ - localref_table *lrt; - -#if defined(ENABLE_GC_CACAO) - /* XXX this one will never get freed for the main thread; - call jni_free_localref_table() if you want to do it! */ - lrt = NEW(localref_table); -#else - lrt = GCNEW(localref_table); -#endif - - if (lrt == NULL) - return false; - - lrt->capacity = LOCALREFTABLE_CAPACITY; - lrt->used = 0; - lrt->localframes = 1; - lrt->prev = LOCALREFTABLE; - - /* clear the references array (memset is faster then a for-loop) */ - - MSET(lrt->refs, 0, java_objectheader*, LOCALREFTABLE_CAPACITY); - - LOCALREFTABLE = lrt; - - return true; -} - - /* jni_init_localref_table ***************************************************** Frees the local references table of the current thread. @@ -307,12 +265,12 @@ bool jni_free_localref_table(void) *******************************************************************************/ -static java_objectheader *_Jv_jni_CallObjectMethod(java_objectheader *o, - vftbl_t *vftbl, - methodinfo *m, va_list ap) +static java_handle_t *_Jv_jni_CallObjectMethod(java_handle_t *o, + vftbl_t *vftbl, + methodinfo *m, va_list ap) { - methodinfo *resm; - java_objectheader *ro; + methodinfo *resm; + java_handle_t *ro; STATISTICS(jniinvokation()); @@ -354,13 +312,13 @@ static java_objectheader *_Jv_jni_CallObjectMethod(java_objectheader *o, *******************************************************************************/ -static java_objectheader *_Jv_jni_CallObjectMethodA(java_objectheader *o, - vftbl_t *vftbl, - methodinfo *m, - const jvalue *args) +static java_handle_t *_Jv_jni_CallObjectMethodA(java_handle_t *o, + vftbl_t *vftbl, + methodinfo *m, + const jvalue *args) { - methodinfo *resm; - java_objectheader *ro; + methodinfo *resm; + java_handle_t *ro; STATISTICS(jniinvokation()); @@ -403,7 +361,7 @@ static java_objectheader *_Jv_jni_CallObjectMethodA(java_objectheader *o, *******************************************************************************/ -static jint _Jv_jni_CallIntMethod(java_objectheader *o, vftbl_t *vftbl, +static jint _Jv_jni_CallIntMethod(java_handle_t *o, vftbl_t *vftbl, methodinfo *m, va_list ap) { methodinfo *resm; @@ -450,7 +408,7 @@ static jint _Jv_jni_CallIntMethod(java_objectheader *o, vftbl_t *vftbl, *******************************************************************************/ -static jint _Jv_jni_CallIntMethodA(java_objectheader *o, vftbl_t *vftbl, +static jint _Jv_jni_CallIntMethodA(java_handle_t *o, vftbl_t *vftbl, methodinfo *m, const jvalue *args) { methodinfo *resm; @@ -496,7 +454,7 @@ static jint _Jv_jni_CallIntMethodA(java_objectheader *o, vftbl_t *vftbl, *******************************************************************************/ -static jlong _Jv_jni_CallLongMethod(java_objectheader *o, vftbl_t *vftbl, +static jlong _Jv_jni_CallLongMethod(java_handle_t *o, vftbl_t *vftbl, methodinfo *m, va_list ap) { methodinfo *resm; @@ -542,7 +500,7 @@ static jlong _Jv_jni_CallLongMethod(java_objectheader *o, vftbl_t *vftbl, *******************************************************************************/ -static jlong _Jv_jni_CallLongMethodA(java_objectheader *o, vftbl_t *vftbl, +static jlong _Jv_jni_CallLongMethodA(java_handle_t *o, vftbl_t *vftbl, methodinfo *m, const jvalue *args) { methodinfo *resm; @@ -588,7 +546,7 @@ static jlong _Jv_jni_CallLongMethodA(java_objectheader *o, vftbl_t *vftbl, *******************************************************************************/ -static jfloat _Jv_jni_CallFloatMethod(java_objectheader *o, vftbl_t *vftbl, +static jfloat _Jv_jni_CallFloatMethod(java_handle_t *o, vftbl_t *vftbl, methodinfo *m, va_list ap) { methodinfo *resm; @@ -627,7 +585,7 @@ static jfloat _Jv_jni_CallFloatMethod(java_objectheader *o, vftbl_t *vftbl, *******************************************************************************/ -static jfloat _Jv_jni_CallFloatMethodA(java_objectheader *o, vftbl_t *vftbl, +static jfloat _Jv_jni_CallFloatMethodA(java_handle_t *o, vftbl_t *vftbl, methodinfo *m, const jvalue *args) { methodinfo *resm; @@ -666,7 +624,7 @@ static jfloat _Jv_jni_CallFloatMethodA(java_objectheader *o, vftbl_t *vftbl, *******************************************************************************/ -static jdouble _Jv_jni_CallDoubleMethod(java_objectheader *o, vftbl_t *vftbl, +static jdouble _Jv_jni_CallDoubleMethod(java_handle_t *o, vftbl_t *vftbl, methodinfo *m, va_list ap) { methodinfo *resm; @@ -703,7 +661,7 @@ static jdouble _Jv_jni_CallDoubleMethod(java_objectheader *o, vftbl_t *vftbl, *******************************************************************************/ -static jdouble _Jv_jni_CallDoubleMethodA(java_objectheader *o, vftbl_t *vftbl, +static jdouble _Jv_jni_CallDoubleMethodA(java_handle_t *o, vftbl_t *vftbl, methodinfo *m, const jvalue *args) { methodinfo *resm; @@ -740,7 +698,7 @@ static jdouble _Jv_jni_CallDoubleMethodA(java_objectheader *o, vftbl_t *vftbl, *******************************************************************************/ -static void _Jv_jni_CallVoidMethod(java_objectheader *o, vftbl_t *vftbl, +static void _Jv_jni_CallVoidMethod(java_handle_t *o, vftbl_t *vftbl, methodinfo *m, va_list ap) { methodinfo *resm; @@ -781,7 +739,7 @@ static void _Jv_jni_CallVoidMethod(java_objectheader *o, vftbl_t *vftbl, *******************************************************************************/ -static void _Jv_jni_CallVoidMethodA(java_objectheader *o, vftbl_t *vftbl, +static void _Jv_jni_CallVoidMethodA(java_handle_t *o, vftbl_t *vftbl, methodinfo *m, const jvalue *args) { methodinfo *resm; @@ -827,241 +785,17 @@ static void _Jv_jni_CallVoidMethodA(java_objectheader *o, vftbl_t *vftbl, *******************************************************************************/ -#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__) && !defined(__ALPHA__) && !defined(__I386__) -java_objectheader *_Jv_jni_invokeNative(methodinfo *m, java_objectheader *o, - java_objectarray *params) -{ - methodinfo *resm; - vm_arg *vmargs; - java_objectheader *ro; - s4 argcount; - s4 paramcount; - java_objectheader *xptr; - - if (m == NULL) { - exceptions_throw_nullpointerexception(); - return NULL; - } - - argcount = m->parseddesc->paramcount; - paramcount = argcount; - - /* if method is non-static, remove the `this' pointer */ - - if (!(m->flags & ACC_STATIC)) - paramcount--; - - /* For instance methods the object has to be an instance of the - class the method belongs to. For static methods the obj - parameter is ignored. */ - - if (!(m->flags & ACC_STATIC) && o && (!builtin_instanceof(o, m->class))) { - exceptions_throw_illegalargumentexception(); - return NULL; - } - - /* check if we got the right number of arguments */ - - if (((params == NULL) && (paramcount != 0)) || - (params && (params->header.size != paramcount))) - { - exceptions_throw_illegalargumentexception(); - return NULL; - } - - /* for instance methods we need an object */ - - if (!(m->flags & ACC_STATIC) && (o == NULL)) { - /* XXX not sure if that is the correct exception */ - exceptions_throw_nullpointerexception(); - return NULL; - } - - /* for static methods, zero object to make subsequent code simpler */ - if (m->flags & ACC_STATIC) - o = NULL; - - if (o != NULL) { - /* for instance methods we must do a vftbl lookup */ - resm = method_vftbl_lookup(o->vftbl, m); - } - else { - /* for static methods, just for convenience */ - resm = m; - } - - vmargs = MNEW(vm_arg, argcount); - - if (!vm_vmargs_from_objectarray(resm, o, vmargs, params)) { - MFREE(vmargs, vm_arg, argcount); - return NULL; - } - - switch (resm->parseddesc->returntype.decltype) { - case TYPE_VOID: - (void) vm_call_method_vmarg(resm, argcount, vmargs); - - ro = NULL; - break; - - case PRIMITIVETYPE_BOOLEAN: { - s4 i; - java_lang_Boolean *bo; - - i = vm_call_method_int_vmarg(resm, argcount, vmargs); - - ro = builtin_new(class_java_lang_Boolean); - - /* setting the value of the object direct */ - - bo = (java_lang_Boolean *) ro; - bo->value = i; - } - break; - - case PRIMITIVETYPE_BYTE: { - s4 i; - java_lang_Byte *bo; - - i = vm_call_method_int_vmarg(resm, argcount, vmargs); - - ro = builtin_new(class_java_lang_Byte); - - /* setting the value of the object direct */ - - bo = (java_lang_Byte *) ro; - bo->value = i; - } - break; - - case PRIMITIVETYPE_CHAR: { - s4 i; - java_lang_Character *co; - - i = vm_call_method_int_vmarg(resm, argcount, vmargs); - - ro = builtin_new(class_java_lang_Character); - - /* setting the value of the object direct */ - - co = (java_lang_Character *) ro; - co->value = i; - } - break; - - case PRIMITIVETYPE_SHORT: { - s4 i; - java_lang_Short *so; - - i = vm_call_method_int_vmarg(resm, argcount, vmargs); - - ro = builtin_new(class_java_lang_Short); - - /* setting the value of the object direct */ - - so = (java_lang_Short *) ro; - so->value = i; - } - break; - - case PRIMITIVETYPE_INT: { - s4 i; - java_lang_Integer *io; - - i = vm_call_method_int_vmarg(resm, argcount, vmargs); - - ro = builtin_new(class_java_lang_Integer); - - /* setting the value of the object direct */ - - io = (java_lang_Integer *) ro; - io->value = i; - } - break; - - case PRIMITIVETYPE_LONG: { - s8 l; - java_lang_Long *lo; - - l = vm_call_method_long_vmarg(resm, argcount, vmargs); - - ro = builtin_new(class_java_lang_Long); - - /* setting the value of the object direct */ - - lo = (java_lang_Long *) ro; - lo->value = l; - } - break; - - case PRIMITIVETYPE_FLOAT: { - float f; - java_lang_Float *fo; - - f = vm_call_method_float_vmarg(resm, argcount, vmargs); - - ro = builtin_new(class_java_lang_Float); - - /* setting the value of the object direct */ - - fo = (java_lang_Float *) ro; - fo->value = f; - } - break; - - case PRIMITIVETYPE_DOUBLE: { - double d; - java_lang_Double *_do; - - d = vm_call_method_double_vmarg(resm, argcount, vmargs); - - ro = builtin_new(class_java_lang_Double); - - /* setting the value of the object direct */ - - _do = (java_lang_Double *) ro; - _do->value = d; - } - break; - - case TYPE_ADR: - ro = vm_call_method_vmarg(resm, argcount, vmargs); - break; - - default: - /* if this happens the exception has already been set by - fill_callblock_from_objectarray */ - - MFREE(vmargs, vm_arg, argcount); - - return NULL; - } - - MFREE(vmargs, vm_arg, argcount); - - xptr = exceptions_get_exception(); - - if (xptr != NULL) { - /* clear exception pointer, we are calling JIT code again */ - - exceptions_clear_exception(); - - exceptions_throw_invocationtargetexception(xptr); - } - - return ro; -} -#else -java_objectheader *_Jv_jni_invokeNative(methodinfo *m, java_objectheader *o, - java_objectarray *params) +java_handle_t *_Jv_jni_invokeNative(methodinfo *m, java_handle_t *o, + java_objectarray *params) { - methodinfo *resm; - java_objectheader *ro; - s4 argcount; - s4 paramcount; - java_objectheader *xptr; - int32_t dumpsize; - uint64_t *array; + methodinfo *resm; + java_handle_t *ro; + s4 argcount; + s4 paramcount; + java_handle_t *xptr; + int32_t dumpsize; + uint64_t *array; + imm_union value; if (m == NULL) { exceptions_throw_nullpointerexception(); @@ -1139,143 +873,39 @@ java_objectheader *_Jv_jni_invokeNative(methodinfo *m, java_objectheader *o, switch (resm->parseddesc->returntype.decltype) { case TYPE_VOID: (void) vm_call_array(resm, array); - ro = NULL; break; - case PRIMITIVETYPE_BOOLEAN: { - s4 i; - java_lang_Boolean *bo; - - i = vm_call_int_array(resm, array); - - ro = builtin_new(class_java_lang_Boolean); - - /* setting the value of the object direct */ - - bo = (java_lang_Boolean *) ro; - bo->value = i; - } - break; - - case PRIMITIVETYPE_BYTE: { - s4 i; - java_lang_Byte *bo; - - i = vm_call_int_array(resm, array); - - ro = builtin_new(class_java_lang_Byte); - - /* setting the value of the object direct */ - - bo = (java_lang_Byte *) ro; - bo->value = i; - } - break; - - case PRIMITIVETYPE_CHAR: { - s4 i; - java_lang_Character *co; - - i = vm_call_int_array(resm, array); - - ro = builtin_new(class_java_lang_Character); - - /* setting the value of the object direct */ - - co = (java_lang_Character *) ro; - co->value = i; - } - break; - - case PRIMITIVETYPE_SHORT: { - s4 i; - java_lang_Short *so; - - i = vm_call_int_array(resm, array); - - ro = builtin_new(class_java_lang_Short); - - /* setting the value of the object direct */ - - so = (java_lang_Short *) ro; - so->value = i; - } - break; - - case PRIMITIVETYPE_INT: { - s4 i; - java_lang_Integer *io; - - i = vm_call_int_array(resm, array); - - ro = builtin_new(class_java_lang_Integer); - - /* setting the value of the object direct */ - - io = (java_lang_Integer *) ro; - io->value = i; - } - break; - - case PRIMITIVETYPE_LONG: { - s8 l; - java_lang_Long *lo; - - l = vm_call_long_array(resm, array); - - ro = builtin_new(class_java_lang_Long); - - /* setting the value of the object direct */ - - lo = (java_lang_Long *) ro; - lo->value = l; - } - break; - - case PRIMITIVETYPE_FLOAT: { - float f; - java_lang_Float *fo; - - f = vm_call_float_array(resm, array); - - ro = builtin_new(class_java_lang_Float); - - /* setting the value of the object direct */ - - fo = (java_lang_Float *) ro; - fo->value = f; - } - break; - - case PRIMITIVETYPE_DOUBLE: { - double d; - java_lang_Double *_do; - - d = vm_call_double_array(resm, array); + case PRIMITIVETYPE_BOOLEAN: + case PRIMITIVETYPE_BYTE: + case PRIMITIVETYPE_CHAR: + case PRIMITIVETYPE_SHORT: + case PRIMITIVETYPE_INT: + value.i = vm_call_int_array(resm, array); + ro = primitive_box(resm->parseddesc->returntype.decltype, value); + break; - ro = builtin_new(class_java_lang_Double); + case PRIMITIVETYPE_LONG: + value.l = vm_call_long_array(resm, array); + ro = primitive_box(resm->parseddesc->returntype.decltype, value); + break; - /* setting the value of the object direct */ + case PRIMITIVETYPE_FLOAT: + value.f = vm_call_float_array(resm, array); + ro = primitive_box(resm->parseddesc->returntype.decltype, value); + break; - _do = (java_lang_Double *) ro; - _do->value = d; - } - break; + case PRIMITIVETYPE_DOUBLE: + value.d = vm_call_double_array(resm, array); + ro = primitive_box(resm->parseddesc->returntype.decltype, value); + break; case TYPE_ADR: ro = vm_call_array(resm, array); break; default: - /* if this happens the exception has already been set by - fill_callblock_from_objectarray */ - - /* release dump area */ - - dump_release(dumpsize); - - return NULL; + vm_abort("_Jv_jni_invokeNative: invalid return type %d", resm->parseddesc->returntype.decltype); } xptr = exceptions_get_exception(); @@ -1294,7 +924,6 @@ java_objectheader *_Jv_jni_invokeNative(methodinfo *m, java_objectheader *o, return ro; } -#endif /* GetVersion ****************************************************************** @@ -1328,14 +957,14 @@ jclass _Jv_JNI_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize bufLen) { #if defined(ENABLE_JAVASE) - utf *u; - java_objectheader *cl; - classinfo *c; + utf *u; + classloader *cl; + classinfo *c; TRACEJNICALLS("_Jv_JNI_DefineClass(env=%p, name=%s, loader=%p, buf=%p, bufLen=%d", env, name, loader, buf, bufLen); u = utf_new_char(name); - cl = (java_objectheader *) loader; + cl = (classloader *) loader; c = class_define(u, cl, bufLen, (const uint8_t *) buf); @@ -1461,11 +1090,11 @@ jboolean _Jv_JNI_IsAssignableFrom(JNIEnv *env, jclass sub, jclass sup) jint _Jv_JNI_Throw(JNIEnv *env, jthrowable obj) { - java_objectheader *o; + java_handle_t *o; STATISTICS(jniinvokation()); - o = (java_objectheader *) obj; + o = (java_handle_t *) obj; exceptions_set_exception(o); @@ -1483,9 +1112,9 @@ jint _Jv_JNI_Throw(JNIEnv *env, jthrowable obj) jint _Jv_JNI_ThrowNew(JNIEnv* env, jclass clazz, const char *msg) { - classinfo *c; - java_objectheader *o; - java_objectheader *s; + classinfo *c; + java_handle_t *o; + java_handle_t *s; STATISTICS(jniinvokation()); @@ -1517,7 +1146,7 @@ jint _Jv_JNI_ThrowNew(JNIEnv* env, jclass clazz, const char *msg) jthrowable _Jv_JNI_ExceptionOccurred(JNIEnv *env) { - java_objectheader *o; + java_handle_t *o; STATISTICS(jniinvokation()); @@ -1537,8 +1166,8 @@ jthrowable _Jv_JNI_ExceptionOccurred(JNIEnv *env) void _Jv_JNI_ExceptionDescribe(JNIEnv *env) { - java_objectheader *o; - methodinfo *m; + java_handle_t *o; + methodinfo *m; STATISTICS(jniinvokation()); @@ -1609,48 +1238,16 @@ void _Jv_JNI_FatalError(JNIEnv *env, const char *msg) jint _Jv_JNI_PushLocalFrame(JNIEnv* env, jint capacity) { - s4 additionalrefs; - localref_table *lrt; - localref_table *nlrt; - STATISTICS(jniinvokation()); if (capacity <= 0) return -1; - /* Allocate new local reference table on Java heap. Calculate the - additional memory we have to allocate. */ - - if (capacity > LOCALREFTABLE_CAPACITY) - additionalrefs = capacity - LOCALREFTABLE_CAPACITY; - else - additionalrefs = 0; - -#if defined(ENABLE_GC_CACAO) - nlrt = MNEW(u1, sizeof(localref_table) + additionalrefs * SIZEOF_VOID_P); -#else - nlrt = GCMNEW(u1, sizeof(localref_table) + additionalrefs * SIZEOF_VOID_P); -#endif + /* add new local reference frame to current table */ - if (nlrt == NULL) + if (!localref_frame_push(capacity)) return -1; - /* get current local reference table from thread */ - - lrt = LOCALREFTABLE; - - /* Set up the new local reference table and add it to the local - frames chain. */ - - nlrt->capacity = capacity; - nlrt->used = 0; - nlrt->localframes = lrt->localframes + 1; - nlrt->prev = lrt; - - /* store new local reference table in thread */ - - LOCALREFTABLE = nlrt; - return 0; } @@ -1665,59 +1262,11 @@ jint _Jv_JNI_PushLocalFrame(JNIEnv* env, jint capacity) jobject _Jv_JNI_PopLocalFrame(JNIEnv* env, jobject result) { - localref_table *lrt; - localref_table *plrt; - s4 localframes; - s4 additionalrefs; - STATISTICS(jniinvokation()); - /* get current local reference table from thread */ - - lrt = LOCALREFTABLE; - - localframes = lrt->localframes; - - /* Don't delete the top local frame, as this one is allocated in - the native stub on the stack and is freed automagically on - return. */ - - if (localframes == 1) - return _Jv_JNI_NewLocalRef(env, result); - /* release all current local frames */ - for (; localframes >= 1; localframes--) { - /* get previous frame */ - - plrt = lrt->prev; - - /* clear all reference entries */ - - MSET(&lrt->refs[0], 0, java_objectheader*, lrt->capacity); - - lrt->prev = NULL; - -#if defined(ENABLE_GC_CACAO) - /* for the exact GC local reference tables are not on the heap, - so we need to free them explicitly here. */ - - if (lrt->capacity > LOCALREFTABLE_CAPACITY) - additionalrefs = lrt->capacity - LOCALREFTABLE_CAPACITY; - else - additionalrefs = 0; - - MFREE(lrt, u1, sizeof(localref_table) + additionalrefs * SIZEOF_VOID_P); -#endif - - /* set new local references table */ - - lrt = plrt; - } - - /* store new local reference table in thread */ - - LOCALREFTABLE = lrt; + localref_frame_pop_all(); /* add local reference and return the value */ @@ -1733,13 +1282,13 @@ jobject _Jv_JNI_PopLocalFrame(JNIEnv* env, jobject result) void _Jv_JNI_DeleteLocalRef(JNIEnv *env, jobject localRef) { - java_objectheader *o; - localref_table *lrt; - s4 i; + java_handle_t *o; + localref_table *lrt; + s4 i; STATISTICS(jniinvokation()); - o = (java_objectheader *) localRef; + o = (java_handle_t *) localRef; /* get local reference table (thread specific) */ @@ -1823,7 +1372,7 @@ jobject _Jv_JNI_NewLocalRef(JNIEnv *env, jobject ref) for (i = 0; i < lrt->capacity; i++) { if (lrt->refs[i] == NULL) { - lrt->refs[i] = (java_objectheader *) ref; + lrt->refs[i] = (java_handle_t *) ref; lrt->used++; return ref; @@ -1875,8 +1424,8 @@ jint _Jv_JNI_EnsureLocalCapacity(JNIEnv* env, jint capacity) jobject _Jv_JNI_AllocObject(JNIEnv *env, jclass clazz) { - classinfo *c; - java_objectheader *o; + classinfo *c; + java_handle_t *o; STATISTICS(jniinvokation()); @@ -1904,10 +1453,10 @@ jobject _Jv_JNI_AllocObject(JNIEnv *env, jclass clazz) jobject _Jv_JNI_NewObject(JNIEnv *env, jclass clazz, jmethodID methodID, ...) { - java_objectheader *o; - classinfo *c; - methodinfo *m; - va_list ap; + java_handle_t *o; + classinfo *c; + methodinfo *m; + va_list ap; STATISTICS(jniinvokation()); @@ -1944,9 +1493,9 @@ jobject _Jv_JNI_NewObject(JNIEnv *env, jclass clazz, jmethodID methodID, ...) jobject _Jv_JNI_NewObjectV(JNIEnv* env, jclass clazz, jmethodID methodID, va_list args) { - java_objectheader *o; - classinfo *c; - methodinfo *m; + java_handle_t *o; + classinfo *c; + methodinfo *m; STATISTICS(jniinvokation()); @@ -1981,9 +1530,9 @@ jobject _Jv_JNI_NewObjectV(JNIEnv* env, jclass clazz, jmethodID methodID, jobject _Jv_JNI_NewObjectA(JNIEnv* env, jclass clazz, jmethodID methodID, const jvalue *args) { - java_objectheader *o; - classinfo *c; - methodinfo *m; + java_handle_t *o; + classinfo *c; + methodinfo *m; STATISTICS(jniinvokation()); @@ -2013,12 +1562,12 @@ jobject _Jv_JNI_NewObjectA(JNIEnv* env, jclass clazz, jmethodID methodID, jclass _Jv_JNI_GetObjectClass(JNIEnv *env, jobject obj) { - java_objectheader *o; - classinfo *c; + java_handle_t *o; + classinfo *c; STATISTICS(jniinvokation()); - o = (java_objectheader *) obj; + o = (java_handle_t *) obj; if ((o == NULL) || (o->vftbl == NULL)) return NULL; @@ -2061,14 +1610,14 @@ jboolean _Jv_JNI_IsInstanceOf(JNIEnv *env, jobject obj, jclass clazz) jmethodID _Jv_JNI_FromReflectedMethod(JNIEnv *env, jobject method) { #if defined(ENABLE_JAVASE) - java_objectheader *o; - classinfo *c; - methodinfo *m; - s4 slot; + java_handle_t *o; + classinfo *c; + methodinfo *m; + s4 slot; STATISTICS(jniinvokation()); - o = (java_objectheader *) method; + o = (java_handle_t *) method; if (o == NULL) return NULL; @@ -2077,15 +1626,15 @@ jmethodID _Jv_JNI_FromReflectedMethod(JNIEnv *env, jobject method) java_lang_reflect_Method *rm; rm = (java_lang_reflect_Method *) method; - c = (classinfo *) (rm->clazz); - slot = rm->slot; + LLNI_field_get_cls(rm, clazz, c); + LLNI_field_get_val(rm, slot , slot); } else if (builtin_instanceof(o, class_java_lang_reflect_Constructor)) { java_lang_reflect_Constructor *rc; rc = (java_lang_reflect_Constructor *) method; - c = (classinfo *) (rc->clazz); - slot = rc->slot; + LLNI_field_get_cls(rc, clazz, c); + LLNI_field_get_val(rc, slot , slot); } else return NULL; @@ -2115,6 +1664,7 @@ jfieldID _Jv_JNI_FromReflectedField(JNIEnv* env, jobject field) java_lang_reflect_Field *rf; classinfo *c; fieldinfo *f; + int32_t slot; STATISTICS(jniinvokation()); @@ -2123,8 +1673,9 @@ jfieldID _Jv_JNI_FromReflectedField(JNIEnv* env, jobject field) if (rf == NULL) return NULL; - c = (classinfo *) rf->clazz; - f = &(c->fields[rf->slot]); + LLNI_field_get_cls(rf, clazz, c); + LLNI_field_get_val(rf, slot , slot); + f = &(c->fields[slot]); return (jfieldID) f; #else @@ -2250,15 +1801,97 @@ jmethodID _Jv_JNI_GetMethodID(JNIEnv* env, jclass clazz, const char *name, /* JNI-functions for calling instance methods *********************************/ +#define JNI_CALL_VIRTUAL_METHOD(name, type, intern) \ +type _Jv_JNI_Call##name##Method(JNIEnv *env, jobject obj, \ + jmethodID methodID, ...) \ +{ \ + java_handle_t *o; \ + methodinfo *m; \ + va_list ap; \ + type ret; \ + \ + o = (java_handle_t *) obj; \ + m = (methodinfo *) methodID; \ + \ + va_start(ap, methodID); \ + ret = _Jv_jni_Call##intern##Method(o, o->vftbl, m, ap); \ + va_end(ap); \ + \ + return ret; \ +} + +JNI_CALL_VIRTUAL_METHOD(Boolean, jboolean, Int) +JNI_CALL_VIRTUAL_METHOD(Byte, jbyte, Int) +JNI_CALL_VIRTUAL_METHOD(Char, jchar, Int) +JNI_CALL_VIRTUAL_METHOD(Short, jshort, Int) +JNI_CALL_VIRTUAL_METHOD(Int, jint, Int) +JNI_CALL_VIRTUAL_METHOD(Long, jlong, Long) +JNI_CALL_VIRTUAL_METHOD(Float, jfloat, Float) +JNI_CALL_VIRTUAL_METHOD(Double, jdouble, Double) + + +#define JNI_CALL_VIRTUAL_METHOD_V(name, type, intern) \ +type _Jv_JNI_Call##name##MethodV(JNIEnv *env, jobject obj, \ + jmethodID methodID, va_list args) \ +{ \ + java_handle_t *o; \ + methodinfo *m; \ + type ret; \ + \ + o = (java_handle_t *) obj; \ + m = (methodinfo *) methodID; \ + \ + ret = _Jv_jni_Call##intern##Method(o, o->vftbl, m, args); \ + \ + return ret; \ +} + +JNI_CALL_VIRTUAL_METHOD_V(Boolean, jboolean, Int) +JNI_CALL_VIRTUAL_METHOD_V(Byte, jbyte, Int) +JNI_CALL_VIRTUAL_METHOD_V(Char, jchar, Int) +JNI_CALL_VIRTUAL_METHOD_V(Short, jshort, Int) +JNI_CALL_VIRTUAL_METHOD_V(Int, jint, Int) +JNI_CALL_VIRTUAL_METHOD_V(Long, jlong, Long) +JNI_CALL_VIRTUAL_METHOD_V(Float, jfloat, Float) +JNI_CALL_VIRTUAL_METHOD_V(Double, jdouble, Double) + + +#define JNI_CALL_VIRTUAL_METHOD_A(name, type, intern) \ +type _Jv_JNI_Call##name##MethodA(JNIEnv *env, jobject obj, \ + jmethodID methodID, \ + const jvalue *args) \ +{ \ + java_handle_t *o; \ + methodinfo *m; \ + type ret; \ + \ + o = (java_handle_t *) obj; \ + m = (methodinfo *) methodID; \ + \ + ret = _Jv_jni_Call##intern##MethodA(o, o->vftbl, m, args); \ + \ + return ret; \ +} + +JNI_CALL_VIRTUAL_METHOD_A(Boolean, jboolean, Int) +JNI_CALL_VIRTUAL_METHOD_A(Byte, jbyte, Int) +JNI_CALL_VIRTUAL_METHOD_A(Char, jchar, Int) +JNI_CALL_VIRTUAL_METHOD_A(Short, jshort, Int) +JNI_CALL_VIRTUAL_METHOD_A(Int, jint, Int) +JNI_CALL_VIRTUAL_METHOD_A(Long, jlong, Long) +JNI_CALL_VIRTUAL_METHOD_A(Float, jfloat, Float) +JNI_CALL_VIRTUAL_METHOD_A(Double, jdouble, Double) + + jobject _Jv_JNI_CallObjectMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...) { - java_objectheader *o; - methodinfo *m; - java_objectheader *ret; - va_list ap; + java_handle_t *o; + methodinfo *m; + java_handle_t *ret; + va_list ap; - o = (java_objectheader *) obj; + o = (java_handle_t *) obj; m = (methodinfo *) methodID; va_start(ap, methodID); @@ -2272,11 +1905,11 @@ jobject _Jv_JNI_CallObjectMethod(JNIEnv *env, jobject obj, jmethodID methodID, jobject _Jv_JNI_CallObjectMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args) { - java_objectheader *o; - methodinfo *m; - java_objectheader *ret; + java_handle_t *o; + methodinfo *m; + java_handle_t *ret; - o = (java_objectheader *) obj; + o = (java_handle_t *) obj; m = (methodinfo *) methodID; ret = _Jv_jni_CallObjectMethod(o, o->vftbl, m, args); @@ -2288,11 +1921,11 @@ jobject _Jv_JNI_CallObjectMethodV(JNIEnv *env, jobject obj, jmethodID methodID, jobject _Jv_JNI_CallObjectMethodA(JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args) { - java_objectheader *o; - methodinfo *m; - java_objectheader *ret; + java_handle_t *o; + methodinfo *m; + java_handle_t *ret; - o = (java_objectheader *) obj; + o = (java_handle_t *) obj; m = (methodinfo *) methodID; ret = _Jv_jni_CallObjectMethodA(o, o->vftbl, m, args); @@ -2301,3127 +1934,1205 @@ jobject _Jv_JNI_CallObjectMethodA(JNIEnv *env, jobject obj, jmethodID methodID, } -jboolean _Jv_JNI_CallBooleanMethod(JNIEnv *env, jobject obj, jmethodID methodID, - ...) + +void _Jv_JNI_CallVoidMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...) { - java_objectheader *o; - methodinfo *m; - va_list ap; - jboolean b; + java_handle_t *o; + methodinfo *m; + va_list ap; - o = (java_objectheader *) obj; + o = (java_handle_t *) obj; m = (methodinfo *) methodID; va_start(ap, methodID); - b = _Jv_jni_CallIntMethod(o, o->vftbl, m, ap); + _Jv_jni_CallVoidMethod(o, o->vftbl, m, ap); va_end(ap); - - return b; } -jboolean _Jv_JNI_CallBooleanMethodV(JNIEnv *env, jobject obj, - jmethodID methodID, va_list args) +void _Jv_JNI_CallVoidMethodV(JNIEnv *env, jobject obj, jmethodID methodID, + va_list args) { - java_objectheader *o; - methodinfo *m; - jboolean b; + java_handle_t *o; + methodinfo *m; - o = (java_objectheader *) obj; + o = (java_handle_t *) obj; m = (methodinfo *) methodID; - b = _Jv_jni_CallIntMethod(o, o->vftbl, m, args); - - return b; + _Jv_jni_CallVoidMethod(o, o->vftbl, m, args); } -jboolean _Jv_JNI_CallBooleanMethodA(JNIEnv *env, jobject obj, - jmethodID methodID, const jvalue *args) +void _Jv_JNI_CallVoidMethodA(JNIEnv *env, jobject obj, jmethodID methodID, + const jvalue *args) { - java_objectheader *o; - methodinfo *m; - jboolean b; + java_handle_t *o; + methodinfo *m; - o = (java_objectheader *) obj; + o = (java_handle_t *) obj; m = (methodinfo *) methodID; - b = _Jv_jni_CallIntMethodA(o, o->vftbl, m, args); - - return b; + _Jv_jni_CallVoidMethodA(o, o->vftbl, m, args); } -jbyte _Jv_JNI_CallByteMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...) + +#define JNI_CALL_NONVIRTUAL_METHOD(name, type, intern) \ +type _Jv_JNI_CallNonvirtual##name##Method(JNIEnv *env, jobject obj, \ + jclass clazz, jmethodID methodID, \ + ...) \ +{ \ + java_handle_t *o; \ + classinfo *c; \ + methodinfo *m; \ + va_list ap; \ + type ret; \ + \ + o = (java_handle_t *) obj; \ + c = (classinfo *) clazz; \ + m = (methodinfo *) methodID; \ + \ + va_start(ap, methodID); \ + ret = _Jv_jni_Call##intern##Method(o, c->vftbl, m, ap); \ + va_end(ap); \ + \ + return ret; \ +} + +JNI_CALL_NONVIRTUAL_METHOD(Boolean, jboolean, Int) +JNI_CALL_NONVIRTUAL_METHOD(Byte, jbyte, Int) +JNI_CALL_NONVIRTUAL_METHOD(Char, jchar, Int) +JNI_CALL_NONVIRTUAL_METHOD(Short, jshort, Int) +JNI_CALL_NONVIRTUAL_METHOD(Int, jint, Int) +JNI_CALL_NONVIRTUAL_METHOD(Long, jlong, Long) +JNI_CALL_NONVIRTUAL_METHOD(Float, jfloat, Float) +JNI_CALL_NONVIRTUAL_METHOD(Double, jdouble, Double) + + +#define JNI_CALL_NONVIRTUAL_METHOD_V(name, type, intern) \ +type _Jv_JNI_CallNonvirtual##name##MethodV(JNIEnv *env, jobject obj, \ + jclass clazz, jmethodID methodID, \ + va_list args) \ +{ \ + java_handle_t *o; \ + classinfo *c; \ + methodinfo *m; \ + type ret; \ + \ + o = (java_handle_t *) obj; \ + c = (classinfo *) clazz; \ + m = (methodinfo *) methodID; \ + \ + ret = _Jv_jni_CallIntMethod(o, c->vftbl, m, args); \ + \ + return ret; \ +} + +JNI_CALL_NONVIRTUAL_METHOD_V(Boolean, jboolean, Int) +JNI_CALL_NONVIRTUAL_METHOD_V(Byte, jbyte, Int) +JNI_CALL_NONVIRTUAL_METHOD_V(Char, jchar, Int) +JNI_CALL_NONVIRTUAL_METHOD_V(Short, jshort, Int) +JNI_CALL_NONVIRTUAL_METHOD_V(Int, jint, Int) +JNI_CALL_NONVIRTUAL_METHOD_V(Long, jlong, Long) +JNI_CALL_NONVIRTUAL_METHOD_V(Float, jfloat, Float) +JNI_CALL_NONVIRTUAL_METHOD_V(Double, jdouble, Double) + + +#define JNI_CALL_NONVIRTUAL_METHOD_A(name, type, intern) \ +type _Jv_JNI_CallNonvirtual##name##MethodA(JNIEnv *env, jobject obj, \ + jclass clazz, jmethodID methodID, \ + const jvalue *args) \ +{ \ + log_text("JNI-Call: CallNonvirtual##name##MethodA: IMPLEMENT ME!"); \ + \ + return 0; \ +} + +JNI_CALL_NONVIRTUAL_METHOD_A(Boolean, jboolean, Int) +JNI_CALL_NONVIRTUAL_METHOD_A(Byte, jbyte, Int) +JNI_CALL_NONVIRTUAL_METHOD_A(Char, jchar, Int) +JNI_CALL_NONVIRTUAL_METHOD_A(Short, jshort, Int) +JNI_CALL_NONVIRTUAL_METHOD_A(Int, jint, Int) +JNI_CALL_NONVIRTUAL_METHOD_A(Long, jlong, Long) +JNI_CALL_NONVIRTUAL_METHOD_A(Float, jfloat, Float) +JNI_CALL_NONVIRTUAL_METHOD_A(Double, jdouble, Double) + +jobject _Jv_JNI_CallNonvirtualObjectMethod(JNIEnv *env, jobject obj, + jclass clazz, jmethodID methodID, + ...) { - java_objectheader *o; - methodinfo *m; - va_list ap; - jbyte b; + java_handle_t *o; + classinfo *c; + methodinfo *m; + java_handle_t *r; + va_list ap; - o = (java_objectheader *) obj; + o = (java_handle_t *) obj; + c = (classinfo *) clazz; m = (methodinfo *) methodID; va_start(ap, methodID); - b = _Jv_jni_CallIntMethod(o, o->vftbl, m, ap); + r = _Jv_jni_CallObjectMethod(o, c->vftbl, m, ap); va_end(ap); - return b; - + return _Jv_JNI_NewLocalRef(env, (jobject) r); } -jbyte _Jv_JNI_CallByteMethodV(JNIEnv *env, jobject obj, jmethodID methodID, - va_list args) +jobject _Jv_JNI_CallNonvirtualObjectMethodV(JNIEnv *env, jobject obj, + jclass clazz, jmethodID methodID, + va_list args) { - java_objectheader *o; - methodinfo *m; - jbyte b; + java_handle_t *o; + classinfo *c; + methodinfo *m; + java_handle_t *r; - o = (java_objectheader *) obj; + o = (java_handle_t *) obj; + c = (classinfo *) clazz; m = (methodinfo *) methodID; - b = _Jv_jni_CallIntMethod(o, o->vftbl, m, args); + r = _Jv_jni_CallObjectMethod(o, c->vftbl, m, args); - return b; + return _Jv_JNI_NewLocalRef(env, (jobject) r); } -jbyte _Jv_JNI_CallByteMethodA(JNIEnv *env, jobject obj, jmethodID methodID, - const jvalue *args) +jobject _Jv_JNI_CallNonvirtualObjectMethodA(JNIEnv *env, jobject obj, + jclass clazz, jmethodID methodID, + const jvalue *args) { - log_text("JNI-Call: CallByteMethodA: IMPLEMENT ME!"); + log_text("JNI-Call: CallNonvirtualObjectMethodA: IMPLEMENT ME!"); - return 0; + return _Jv_JNI_NewLocalRef(env, NULL); } -jchar _Jv_JNI_CallCharMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...) +void _Jv_JNI_CallNonvirtualVoidMethod(JNIEnv *env, jobject obj, jclass clazz, + jmethodID methodID, ...) { - java_objectheader *o; - methodinfo *m; - va_list ap; - jchar c; + java_handle_t *o; + classinfo *c; + methodinfo *m; + va_list ap; - o = (java_objectheader *) obj; + o = (java_handle_t *) obj; + c = (classinfo *) clazz; m = (methodinfo *) methodID; va_start(ap, methodID); - c = _Jv_jni_CallIntMethod(o, o->vftbl, m, ap); + _Jv_jni_CallVoidMethod(o, c->vftbl, m, ap); va_end(ap); - - return c; } -jchar _Jv_JNI_CallCharMethodV(JNIEnv *env, jobject obj, jmethodID methodID, - va_list args) +void _Jv_JNI_CallNonvirtualVoidMethodV(JNIEnv *env, jobject obj, jclass clazz, + jmethodID methodID, va_list args) { - java_objectheader *o; - methodinfo *m; - jchar c; + java_handle_t *o; + classinfo *c; + methodinfo *m; - o = (java_objectheader *) obj; + o = (java_handle_t *) obj; + c = (classinfo *) clazz; m = (methodinfo *) methodID; - c = _Jv_jni_CallIntMethod(o, o->vftbl, m, args); - - return c; + _Jv_jni_CallVoidMethod(o, c->vftbl, m, args); } -jchar _Jv_JNI_CallCharMethodA(JNIEnv *env, jobject obj, jmethodID methodID, - const jvalue *args) -{ - log_text("JNI-Call: CallCharMethodA: IMPLEMENT ME!"); +void _Jv_JNI_CallNonvirtualVoidMethodA(JNIEnv *env, jobject obj, jclass clazz, + jmethodID methodID, const jvalue * args) +{ + java_handle_t *o; + classinfo *c; + methodinfo *m; - return 0; -} + o = (java_handle_t *) obj; + c = (classinfo *) clazz; + m = (methodinfo *) methodID; + _Jv_jni_CallVoidMethodA(o, c->vftbl, m, args); +} -jshort _Jv_JNI_CallShortMethod(JNIEnv *env, jobject obj, jmethodID methodID, - ...) -{ - java_objectheader *o; - methodinfo *m; - va_list ap; - jshort s; - o = (java_objectheader *) obj; - m = (methodinfo *) methodID; +/* Accessing Fields of Objects ************************************************/ - va_start(ap, methodID); - s = _Jv_jni_CallIntMethod(o, o->vftbl, m, ap); - va_end(ap); +/* GetFieldID ****************************************************************** - return s; -} + Returns the field ID for an instance (nonstatic) field of a + class. The field is specified by its name and signature. The + GetField and SetField families of accessor functions + use field IDs to retrieve object fields. +*******************************************************************************/ -jshort _Jv_JNI_CallShortMethodV(JNIEnv *env, jobject obj, jmethodID methodID, - va_list args) +jfieldID _Jv_JNI_GetFieldID(JNIEnv *env, jclass clazz, const char *name, + const char *sig) { - java_objectheader *o; - methodinfo *m; - jshort s; + classinfo *c; + fieldinfo *f; + utf *uname; + utf *udesc; - o = (java_objectheader *) obj; - m = (methodinfo *) methodID; + STATISTICS(jniinvokation()); - s = _Jv_jni_CallIntMethod(o, o->vftbl, m, args); + c = (classinfo *) clazz; - return s; -} + /* XXX NPE check? */ + uname = utf_new_char((char *) name); + udesc = utf_new_char((char *) sig); -jshort _Jv_JNI_CallShortMethodA(JNIEnv *env, jobject obj, jmethodID methodID, - const jvalue *args) -{ - log_text("JNI-Call: CallShortMethodA: IMPLEMENT ME!"); + f = class_findfield(c, uname, udesc); + + if (f == NULL) + exceptions_throw_nosuchfielderror(c, uname); - return 0; + return (jfieldID) f; } +/* GetField Routines ***************************************************** -jint _Jv_JNI_CallIntMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...) -{ - java_objectheader *o; - methodinfo *m; - va_list ap; - jint i; - - o = (java_objectheader *) obj; - m = (methodinfo *) methodID; + This family of accessor routines returns the value of an instance + (nonstatic) field of an object. The field to access is specified by + a field ID obtained by calling GetFieldID(). - va_start(ap, methodID); - i = _Jv_jni_CallIntMethod(o, o->vftbl, m, ap); - va_end(ap); +*******************************************************************************/ - return i; +#define JNI_GET_FIELD(name, type, intern) \ +type _Jv_JNI_Get##name##Field(JNIEnv *env, jobject obj, jfieldID fieldID) \ +{ \ + intern ret; \ + \ + STATISTICS(jniinvokation()); \ + \ + ret = GET_FIELD(obj, intern, fieldID); \ + \ + return (type) ret; \ } +JNI_GET_FIELD(Boolean, jboolean, s4) +JNI_GET_FIELD(Byte, jbyte, s4) +JNI_GET_FIELD(Char, jchar, s4) +JNI_GET_FIELD(Short, jshort, s4) +JNI_GET_FIELD(Int, jint, s4) +JNI_GET_FIELD(Long, jlong, s8) +JNI_GET_FIELD(Float, jfloat, float) +JNI_GET_FIELD(Double, jdouble, double) + -jint _Jv_JNI_CallIntMethodV(JNIEnv *env, jobject obj, jmethodID methodID, - va_list args) +jobject _Jv_JNI_GetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID) { - java_objectheader *o; - methodinfo *m; - jint i; + java_handle_t *o; - o = (java_objectheader *) obj; - m = (methodinfo *) methodID; + STATISTICS(jniinvokation()); - i = _Jv_jni_CallIntMethod(o, o->vftbl, m, args); +#warning this needs to be fixed + o = GET_FIELD(obj, java_handle_t*, fieldID); - return i; + return _Jv_JNI_NewLocalRef(env, (jobject) o); } -jint _Jv_JNI_CallIntMethodA(JNIEnv *env, jobject obj, jmethodID methodID, - const jvalue *args) -{ - log_text("JNI-Call: CallIntMethodA: IMPLEMENT ME!"); +/* SetField Routines ***************************************************** - return 0; -} + This family of accessor routines sets the value of an instance + (nonstatic) field of an object. The field to access is specified by + a field ID obtained by calling GetFieldID(). +*******************************************************************************/ +#define JNI_SET_FIELD(name, type, intern) \ +void _Jv_JNI_Set##name##Field(JNIEnv *env, jobject obj, jfieldID fieldID, \ + type value) \ +{ \ + STATISTICS(jniinvokation()); \ + \ + SET_FIELD(obj, intern, fieldID, value); \ +} -jlong _Jv_JNI_CallLongMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...) -{ - java_objectheader *o; - methodinfo *m; - va_list ap; - jlong l; +JNI_SET_FIELD(Boolean, jboolean, s4) +JNI_SET_FIELD(Byte, jbyte, s4) +JNI_SET_FIELD(Char, jchar, s4) +JNI_SET_FIELD(Short, jshort, s4) +JNI_SET_FIELD(Int, jint, s4) +JNI_SET_FIELD(Long, jlong, s8) +JNI_SET_FIELD(Float, jfloat, float) +JNI_SET_FIELD(Double, jdouble, double) - o = (java_objectheader *) obj; - m = (methodinfo *) methodID; - va_start(ap, methodID); - l = _Jv_jni_CallLongMethod(o, o->vftbl, m, ap); - va_end(ap); +void _Jv_JNI_SetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID, + jobject value) +{ + STATISTICS(jniinvokation()); - return l; +#warning this needs to be fixed + SET_FIELD(obj, java_handle_t*, fieldID, value); } -jlong _Jv_JNI_CallLongMethodV(JNIEnv *env, jobject obj, jmethodID methodID, - va_list args) -{ - java_objectheader *o; - methodinfo *m; - jlong l; +/* Calling Static Methods *****************************************************/ - o = (java_objectheader *) obj; - m = (methodinfo *) methodID; +/* GetStaticMethodID *********************************************************** - l = _Jv_jni_CallLongMethod(o, o->vftbl, m, args); + Returns the method ID for a static method of a class. The method is + specified by its name and signature. - return l; -} + GetStaticMethodID() causes an uninitialized class to be + initialized. +*******************************************************************************/ -jlong _Jv_JNI_CallLongMethodA(JNIEnv *env, jobject obj, jmethodID methodID, - const jvalue *args) +jmethodID _Jv_JNI_GetStaticMethodID(JNIEnv *env, jclass clazz, const char *name, + const char *sig) { - log_text("JNI-Call: CallLongMethodA: IMPLEMENT ME!"); - - return 0; -} - + classinfo *c; + utf *uname; + utf *udesc; + methodinfo *m; + STATISTICS(jniinvokation()); -jfloat _Jv_JNI_CallFloatMethod(JNIEnv *env, jobject obj, jmethodID methodID, - ...) -{ - java_objectheader *o; - methodinfo *m; - va_list ap; - jfloat f; + c = (classinfo *) clazz; - o = (java_objectheader *) obj; - m = (methodinfo *) methodID; + if (!c) + return NULL; - va_start(ap, methodID); - f = _Jv_jni_CallFloatMethod(o, o->vftbl, m, ap); - va_end(ap); + if (!(c->state & CLASS_INITIALIZED)) + if (!initialize_class(c)) + return NULL; - return f; -} + /* try to get the static method of the class */ + uname = utf_new_char((char *) name); + udesc = utf_new_char((char *) sig); -jfloat _Jv_JNI_CallFloatMethodV(JNIEnv *env, jobject obj, jmethodID methodID, - va_list args) -{ - java_objectheader *o; - methodinfo *m; - jfloat f; + m = class_resolvemethod(c, uname, udesc); - o = (java_objectheader *) obj; - m = (methodinfo *) methodID; + if ((m == NULL) || !(m->flags & ACC_STATIC)) { + exceptions_throw_nosuchmethoderror(c, uname, udesc); - f = _Jv_jni_CallFloatMethod(o, o->vftbl, m, args); + return NULL; + } - return f; + return (jmethodID) m; } -jfloat _Jv_JNI_CallFloatMethodA(JNIEnv *env, jobject obj, jmethodID methodID, - const jvalue *args) -{ - log_text("JNI-Call: CallFloatMethodA: IMPLEMENT ME!"); - - return 0; -} - +#define JNI_CALL_STATIC_METHOD(name, type, intern) \ +type _Jv_JNI_CallStatic##name##Method(JNIEnv *env, jclass clazz, \ + jmethodID methodID, ...) \ +{ \ + methodinfo *m; \ + va_list ap; \ + type res; \ + \ + m = (methodinfo *) methodID; \ + \ + va_start(ap, methodID); \ + res = _Jv_jni_Call##intern##Method(NULL, NULL, m, ap); \ + va_end(ap); \ + \ + return res; \ +} + +JNI_CALL_STATIC_METHOD(Boolean, jboolean, Int) +JNI_CALL_STATIC_METHOD(Byte, jbyte, Int) +JNI_CALL_STATIC_METHOD(Char, jchar, Int) +JNI_CALL_STATIC_METHOD(Short, jshort, Int) +JNI_CALL_STATIC_METHOD(Int, jint, Int) +JNI_CALL_STATIC_METHOD(Long, jlong, Long) +JNI_CALL_STATIC_METHOD(Float, jfloat, Float) +JNI_CALL_STATIC_METHOD(Double, jdouble, Double) + + +#define JNI_CALL_STATIC_METHOD_V(name, type, intern) \ +type _Jv_JNI_CallStatic##name##MethodV(JNIEnv *env, jclass clazz, \ + jmethodID methodID, va_list args) \ +{ \ + methodinfo *m; \ + type res; \ + \ + m = (methodinfo *) methodID; \ + \ + res = _Jv_jni_Call##intern##Method(NULL, NULL, m, args); \ + \ + return res; \ +} + +JNI_CALL_STATIC_METHOD_V(Boolean, jboolean, Int) +JNI_CALL_STATIC_METHOD_V(Byte, jbyte, Int) +JNI_CALL_STATIC_METHOD_V(Char, jchar, Int) +JNI_CALL_STATIC_METHOD_V(Short, jshort, Int) +JNI_CALL_STATIC_METHOD_V(Int, jint, Int) +JNI_CALL_STATIC_METHOD_V(Long, jlong, Long) +JNI_CALL_STATIC_METHOD_V(Float, jfloat, Float) +JNI_CALL_STATIC_METHOD_V(Double, jdouble, Double) + + +#define JNI_CALL_STATIC_METHOD_A(name, type, intern) \ +type _Jv_JNI_CallStatic##name##MethodA(JNIEnv *env, jclass clazz, \ + jmethodID methodID, const jvalue *args) \ +{ \ + methodinfo *m; \ + type res; \ + \ + m = (methodinfo *) methodID; \ + \ + res = _Jv_jni_Call##intern##MethodA(NULL, NULL, m, args); \ + \ + return res; \ +} + +JNI_CALL_STATIC_METHOD_A(Boolean, jboolean, Int) +JNI_CALL_STATIC_METHOD_A(Byte, jbyte, Int) +JNI_CALL_STATIC_METHOD_A(Char, jchar, Int) +JNI_CALL_STATIC_METHOD_A(Short, jshort, Int) +JNI_CALL_STATIC_METHOD_A(Int, jint, Int) +JNI_CALL_STATIC_METHOD_A(Long, jlong, Long) +JNI_CALL_STATIC_METHOD_A(Float, jfloat, Float) +JNI_CALL_STATIC_METHOD_A(Double, jdouble, Double) -jdouble _Jv_JNI_CallDoubleMethod(JNIEnv *env, jobject obj, jmethodID methodID, - ...) +jobject _Jv_JNI_CallStaticObjectMethod(JNIEnv *env, jclass clazz, + jmethodID methodID, ...) { - java_objectheader *o; - methodinfo *m; - va_list ap; - jdouble d; + methodinfo *m; + java_handle_t *o; + va_list ap; - o = (java_objectheader *) obj; m = (methodinfo *) methodID; va_start(ap, methodID); - d = _Jv_jni_CallDoubleMethod(o, o->vftbl, m, ap); + o = _Jv_jni_CallObjectMethod(NULL, NULL, m, ap); va_end(ap); - return d; + return _Jv_JNI_NewLocalRef(env, (jobject) o); } -jdouble _Jv_JNI_CallDoubleMethodV(JNIEnv *env, jobject obj, jmethodID methodID, - va_list args) +jobject _Jv_JNI_CallStaticObjectMethodV(JNIEnv *env, jclass clazz, + jmethodID methodID, va_list args) { - java_objectheader *o; - methodinfo *m; - jdouble d; + methodinfo *m; + java_handle_t *o; - o = (java_objectheader *) obj; m = (methodinfo *) methodID; - d = _Jv_jni_CallDoubleMethod(o, o->vftbl, m, args); + o = _Jv_jni_CallObjectMethod(NULL, NULL, m, args); - return d; + return _Jv_JNI_NewLocalRef(env, (jobject) o); } -jdouble _Jv_JNI_CallDoubleMethodA(JNIEnv *env, jobject obj, jmethodID methodID, - const jvalue *args) +jobject _Jv_JNI_CallStaticObjectMethodA(JNIEnv *env, jclass clazz, + jmethodID methodID, const jvalue *args) { - log_text("JNI-Call: CallDoubleMethodA: IMPLEMENT ME!"); + methodinfo *m; + java_handle_t *o; - return 0; -} + m = (methodinfo *) methodID; + o = _Jv_jni_CallObjectMethodA(NULL, NULL, m, args); + return _Jv_JNI_NewLocalRef(env, (jobject) o); +} -void _Jv_JNI_CallVoidMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...) + +void _Jv_JNI_CallStaticVoidMethod(JNIEnv *env, jclass clazz, + jmethodID methodID, ...) { - java_objectheader *o; - methodinfo *m; - va_list ap; + methodinfo *m; + va_list ap; - o = (java_objectheader *) obj; m = (methodinfo *) methodID; va_start(ap, methodID); - _Jv_jni_CallVoidMethod(o, o->vftbl, m, ap); + _Jv_jni_CallVoidMethod(NULL, NULL, m, ap); va_end(ap); } -void _Jv_JNI_CallVoidMethodV(JNIEnv *env, jobject obj, jmethodID methodID, - va_list args) +void _Jv_JNI_CallStaticVoidMethodV(JNIEnv *env, jclass clazz, + jmethodID methodID, va_list args) { - java_objectheader *o; - methodinfo *m; + methodinfo *m; - o = (java_objectheader *) obj; m = (methodinfo *) methodID; - _Jv_jni_CallVoidMethod(o, o->vftbl, m, args); + _Jv_jni_CallVoidMethod(NULL, NULL, m, args); } -void _Jv_JNI_CallVoidMethodA(JNIEnv *env, jobject obj, jmethodID methodID, - const jvalue *args) +void _Jv_JNI_CallStaticVoidMethodA(JNIEnv *env, jclass clazz, + jmethodID methodID, const jvalue * args) { - java_objectheader *o; - methodinfo *m; + methodinfo *m; - o = (java_objectheader *) obj; m = (methodinfo *) methodID; - _Jv_jni_CallVoidMethodA(o, o->vftbl, m, args); + _Jv_jni_CallVoidMethodA(NULL, NULL, m, args); } +/* Accessing Static Fields ****************************************************/ -jobject _Jv_JNI_CallNonvirtualObjectMethod(JNIEnv *env, jobject obj, - jclass clazz, jmethodID methodID, - ...) -{ - java_objectheader *o; - classinfo *c; - methodinfo *m; - java_objectheader *r; - va_list ap; - - o = (java_objectheader *) obj; - c = (classinfo *) clazz; - m = (methodinfo *) methodID; - - va_start(ap, methodID); - r = _Jv_jni_CallObjectMethod(o, c->vftbl, m, ap); - va_end(ap); +/* GetStaticFieldID ************************************************************ - return _Jv_JNI_NewLocalRef(env, (jobject) r); -} + Returns the field ID for a static field of a class. The field is + specified by its name and signature. The GetStaticField and + SetStaticField families of accessor functions use field IDs + to retrieve static fields. +*******************************************************************************/ -jobject _Jv_JNI_CallNonvirtualObjectMethodV(JNIEnv *env, jobject obj, - jclass clazz, jmethodID methodID, - va_list args) +jfieldID _Jv_JNI_GetStaticFieldID(JNIEnv *env, jclass clazz, const char *name, + const char *sig) { - java_objectheader *o; - classinfo *c; - methodinfo *m; - java_objectheader *r; - - o = (java_objectheader *) obj; - c = (classinfo *) clazz; - m = (methodinfo *) methodID; - - r = _Jv_jni_CallObjectMethod(o, c->vftbl, m, args); - - return _Jv_JNI_NewLocalRef(env, (jobject) r); -} - - -jobject _Jv_JNI_CallNonvirtualObjectMethodA(JNIEnv *env, jobject obj, - jclass clazz, jmethodID methodID, - const jvalue *args) -{ - log_text("JNI-Call: CallNonvirtualObjectMethodA: IMPLEMENT ME!"); - - return _Jv_JNI_NewLocalRef(env, NULL); -} - - - -jboolean _Jv_JNI_CallNonvirtualBooleanMethod(JNIEnv *env, jobject obj, - jclass clazz, jmethodID methodID, - ...) -{ - java_objectheader *o; - classinfo *c; - methodinfo *m; - va_list ap; - jboolean b; - - o = (java_objectheader *) obj; - c = (classinfo *) clazz; - m = (methodinfo *) methodID; - - va_start(ap, methodID); - b = _Jv_jni_CallIntMethod(o, c->vftbl, m, ap); - va_end(ap); - - return b; -} - - -jboolean _Jv_JNI_CallNonvirtualBooleanMethodV(JNIEnv *env, jobject obj, - jclass clazz, jmethodID methodID, - va_list args) -{ - java_objectheader *o; - classinfo *c; - methodinfo *m; - jboolean b; - - o = (java_objectheader *) obj; - c = (classinfo *) clazz; - m = (methodinfo *) methodID; - - b = _Jv_jni_CallIntMethod(o, c->vftbl, m, args); - - return b; -} - - -jboolean _Jv_JNI_CallNonvirtualBooleanMethodA(JNIEnv *env, jobject obj, - jclass clazz, jmethodID methodID, - const jvalue *args) -{ - log_text("JNI-Call: CallNonvirtualBooleanMethodA: IMPLEMENT ME!"); - - return 0; -} - - -jbyte _Jv_JNI_CallNonvirtualByteMethod(JNIEnv *env, jobject obj, jclass clazz, - jmethodID methodID, ...) -{ - java_objectheader *o; - classinfo *c; - methodinfo *m; - va_list ap; - jbyte b; - - o = (java_objectheader *) obj; - c = (classinfo *) clazz; - m = (methodinfo *) methodID; - - va_start(ap, methodID); - b = _Jv_jni_CallIntMethod(o, c->vftbl, m, ap); - va_end(ap); - - return b; -} - - -jbyte _Jv_JNI_CallNonvirtualByteMethodV(JNIEnv *env, jobject obj, jclass clazz, - jmethodID methodID, va_list args) -{ - java_objectheader *o; - classinfo *c; - methodinfo *m; - jbyte b; - - o = (java_objectheader *) obj; - c = (classinfo *) clazz; - m = (methodinfo *) methodID; - - b = _Jv_jni_CallIntMethod(o, c->vftbl, m, args); - - return b; -} - - -jbyte _Jv_JNI_CallNonvirtualByteMethodA(JNIEnv *env, jobject obj, jclass clazz, - jmethodID methodID, const jvalue *args) -{ - log_text("JNI-Call: CallNonvirtualByteMethodA: IMPLEMENT ME!"); - - return 0; -} - - - -jchar _Jv_JNI_CallNonvirtualCharMethod(JNIEnv *env, jobject obj, jclass clazz, - jmethodID methodID, ...) -{ - java_objectheader *o; - classinfo *c; - methodinfo *m; - va_list ap; - jchar ch; - - o = (java_objectheader *) obj; - c = (classinfo *) clazz; - m = (methodinfo *) methodID; - - va_start(ap, methodID); - ch = _Jv_jni_CallIntMethod(o, c->vftbl, m, ap); - va_end(ap); - - return ch; -} - - -jchar _Jv_JNI_CallNonvirtualCharMethodV(JNIEnv *env, jobject obj, jclass clazz, - jmethodID methodID, va_list args) -{ - java_objectheader *o; - classinfo *c; - methodinfo *m; - jchar ch; - - o = (java_objectheader *) obj; - c = (classinfo *) clazz; - m = (methodinfo *) methodID; - - ch = _Jv_jni_CallIntMethod(o, c->vftbl, m, args); - - return ch; -} - - -jchar _Jv_JNI_CallNonvirtualCharMethodA(JNIEnv *env, jobject obj, jclass clazz, - jmethodID methodID, const jvalue *args) -{ - log_text("JNI-Call: CallNonvirtualCharMethodA: IMPLEMENT ME!"); - - return 0; -} - - - -jshort _Jv_JNI_CallNonvirtualShortMethod(JNIEnv *env, jobject obj, - jclass clazz, jmethodID methodID, ...) -{ - java_objectheader *o; - classinfo *c; - methodinfo *m; - va_list ap; - jshort s; - - o = (java_objectheader *) obj; - c = (classinfo *) clazz; - m = (methodinfo *) methodID; - - va_start(ap, methodID); - s = _Jv_jni_CallIntMethod(o, c->vftbl, m, ap); - va_end(ap); - - return s; -} - - -jshort _Jv_JNI_CallNonvirtualShortMethodV(JNIEnv *env, jobject obj, - jclass clazz, jmethodID methodID, - va_list args) -{ - java_objectheader *o; - classinfo *c; - methodinfo *m; - jshort s; - - o = (java_objectheader *) obj; - c = (classinfo *) clazz; - m = (methodinfo *) methodID; - - s = _Jv_jni_CallIntMethod(o, c->vftbl, m, args); - - return s; -} - - -jshort _Jv_JNI_CallNonvirtualShortMethodA(JNIEnv *env, jobject obj, - jclass clazz, jmethodID methodID, - const jvalue *args) -{ - log_text("JNI-Call: CallNonvirtualShortMethodA: IMPLEMENT ME!"); - - return 0; -} - - - -jint _Jv_JNI_CallNonvirtualIntMethod(JNIEnv *env, jobject obj, jclass clazz, - jmethodID methodID, ...) -{ - java_objectheader *o; - classinfo *c; - methodinfo *m; - va_list ap; - jint i; - - o = (java_objectheader *) obj; - c = (classinfo *) clazz; - m = (methodinfo *) methodID; - - va_start(ap, methodID); - i = _Jv_jni_CallIntMethod(o, c->vftbl, m, ap); - va_end(ap); - - return i; -} - - -jint _Jv_JNI_CallNonvirtualIntMethodV(JNIEnv *env, jobject obj, jclass clazz, - jmethodID methodID, va_list args) -{ - java_objectheader *o; - classinfo *c; - methodinfo *m; - jint i; - - o = (java_objectheader *) obj; - c = (classinfo *) clazz; - m = (methodinfo *) methodID; - - i = _Jv_jni_CallIntMethod(o, c->vftbl, m, args); - - return i; -} - - -jint _Jv_JNI_CallNonvirtualIntMethodA(JNIEnv *env, jobject obj, jclass clazz, - jmethodID methodID, const jvalue *args) -{ - log_text("JNI-Call: CallNonvirtualIntMethodA: IMPLEMENT ME!"); - - return 0; -} - - - -jlong _Jv_JNI_CallNonvirtualLongMethod(JNIEnv *env, jobject obj, jclass clazz, - jmethodID methodID, ...) -{ - java_objectheader *o; - classinfo *c; - methodinfo *m; - va_list ap; - jlong l; - - o = (java_objectheader *) obj; - c = (classinfo *) clazz; - m = (methodinfo *) methodID; - - va_start(ap, methodID); - l = _Jv_jni_CallLongMethod(o, c->vftbl, m, ap); - va_end(ap); - - return l; -} - - -jlong _Jv_JNI_CallNonvirtualLongMethodV(JNIEnv *env, jobject obj, jclass clazz, - jmethodID methodID, va_list args) -{ - java_objectheader *o; - classinfo *c; - methodinfo *m; - jlong l; - - o = (java_objectheader *) obj; - c = (classinfo *) clazz; - m = (methodinfo *) methodID; - - l = _Jv_jni_CallLongMethod(o, c->vftbl, m, args); - - return l; -} - - -jlong _Jv_JNI_CallNonvirtualLongMethodA(JNIEnv *env, jobject obj, jclass clazz, - jmethodID methodID, const jvalue *args) -{ - log_text("JNI-Call: CallNonvirtualLongMethodA: IMPLEMENT ME!"); - - return 0; -} - - - -jfloat _Jv_JNI_CallNonvirtualFloatMethod(JNIEnv *env, jobject obj, - jclass clazz, jmethodID methodID, ...) -{ - java_objectheader *o; - classinfo *c; - methodinfo *m; - va_list ap; - jfloat f; - - o = (java_objectheader *) obj; - c = (classinfo *) clazz; - m = (methodinfo *) methodID; - - va_start(ap, methodID); - f = _Jv_jni_CallFloatMethod(o, c->vftbl, m, ap); - va_end(ap); - - return f; -} - - -jfloat _Jv_JNI_CallNonvirtualFloatMethodV(JNIEnv *env, jobject obj, - jclass clazz, jmethodID methodID, - va_list args) -{ - java_objectheader *o; - classinfo *c; - methodinfo *m; - jfloat f; - - o = (java_objectheader *) obj; - c = (classinfo *) clazz; - m = (methodinfo *) methodID; - - f = _Jv_jni_CallFloatMethod(o, c->vftbl, m, args); - - return f; -} - - -jfloat _Jv_JNI_CallNonvirtualFloatMethodA(JNIEnv *env, jobject obj, - jclass clazz, jmethodID methodID, - const jvalue *args) -{ - log_text("JNI-Call: CallNonvirtualFloatMethodA: IMPLEMENT ME!"); - - return 0; -} - - - -jdouble _Jv_JNI_CallNonvirtualDoubleMethod(JNIEnv *env, jobject obj, - jclass clazz, jmethodID methodID, - ...) -{ - java_objectheader *o; - classinfo *c; - methodinfo *m; - va_list ap; - jdouble d; - - o = (java_objectheader *) obj; - c = (classinfo *) clazz; - m = (methodinfo *) methodID; - - va_start(ap, methodID); - d = _Jv_jni_CallDoubleMethod(o, c->vftbl, m, ap); - va_end(ap); - - return d; -} - - -jdouble _Jv_JNI_CallNonvirtualDoubleMethodV(JNIEnv *env, jobject obj, - jclass clazz, jmethodID methodID, - va_list args) -{ - java_objectheader *o; - classinfo *c; - methodinfo *m; - jdouble d; - - o = (java_objectheader *) obj; - c = (classinfo *) clazz; - m = (methodinfo *) methodID; - - d = _Jv_jni_CallDoubleMethod(o, c->vftbl, m, args); - - return d; -} - - -jdouble _Jv_JNI_CallNonvirtualDoubleMethodA(JNIEnv *env, jobject obj, - jclass clazz, jmethodID methodID, - const jvalue *args) -{ - log_text("JNI-Call: CallNonvirtualDoubleMethodA: IMPLEMENT ME!"); - - return 0; -} - - - -void _Jv_JNI_CallNonvirtualVoidMethod(JNIEnv *env, jobject obj, jclass clazz, - jmethodID methodID, ...) -{ - java_objectheader *o; - classinfo *c; - methodinfo *m; - va_list ap; - - o = (java_objectheader *) obj; - c = (classinfo *) clazz; - m = (methodinfo *) methodID; - - va_start(ap, methodID); - _Jv_jni_CallVoidMethod(o, c->vftbl, m, ap); - va_end(ap); -} - - -void _Jv_JNI_CallNonvirtualVoidMethodV(JNIEnv *env, jobject obj, jclass clazz, - jmethodID methodID, va_list args) -{ - java_objectheader *o; - classinfo *c; - methodinfo *m; - - o = (java_objectheader *) obj; - c = (classinfo *) clazz; - m = (methodinfo *) methodID; - - _Jv_jni_CallVoidMethod(o, c->vftbl, m, args); -} - - -void _Jv_JNI_CallNonvirtualVoidMethodA(JNIEnv *env, jobject obj, jclass clazz, - jmethodID methodID, const jvalue * args) -{ - java_objectheader *o; - classinfo *c; - methodinfo *m; - - o = (java_objectheader *) obj; - c = (classinfo *) clazz; - m = (methodinfo *) methodID; - - _Jv_jni_CallVoidMethodA(o, c->vftbl, m, args); -} - - -/* Accessing Fields of Objects ************************************************/ - -/* GetFieldID ****************************************************************** - - Returns the field ID for an instance (nonstatic) field of a - class. The field is specified by its name and signature. The - GetField and SetField families of accessor functions - use field IDs to retrieve object fields. - -*******************************************************************************/ - -jfieldID _Jv_JNI_GetFieldID(JNIEnv *env, jclass clazz, const char *name, - const char *sig) -{ - classinfo *c; - fieldinfo *f; - utf *uname; - utf *udesc; - - STATISTICS(jniinvokation()); - - c = (classinfo *) clazz; - - /* XXX NPE check? */ - - uname = utf_new_char((char *) name); - udesc = utf_new_char((char *) sig); - - f = class_findfield(c, uname, udesc); - - if (f == NULL) - exceptions_throw_nosuchfielderror(c, uname); - - return (jfieldID) f; -} - - -/* GetField Routines ***************************************************** - - This family of accessor routines returns the value of an instance - (nonstatic) field of an object. The field to access is specified by - a field ID obtained by calling GetFieldID(). - -*******************************************************************************/ - -jobject _Jv_JNI_GetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID) -{ - java_objectheader *o; - - STATISTICS(jniinvokation()); - - o = GET_FIELD(obj, java_objectheader*, fieldID); - - return _Jv_JNI_NewLocalRef(env, (jobject) o); -} - - -jboolean _Jv_JNI_GetBooleanField(JNIEnv *env, jobject obj, jfieldID fieldID) -{ - s4 i; - - STATISTICS(jniinvokation()); - - i = GET_FIELD(obj, s4, fieldID); - - return (jboolean) i; -} - - -jbyte _Jv_JNI_GetByteField(JNIEnv *env, jobject obj, jfieldID fieldID) -{ - s4 i; - - STATISTICS(jniinvokation()); - - i = GET_FIELD(obj, s4, fieldID); - - return (jbyte) i; -} - - -jchar _Jv_JNI_GetCharField(JNIEnv *env, jobject obj, jfieldID fieldID) -{ - s4 i; - - STATISTICS(jniinvokation()); - - i = GET_FIELD(obj, s4, fieldID); - - return (jchar) i; -} - - -jshort _Jv_JNI_GetShortField(JNIEnv *env, jobject obj, jfieldID fieldID) -{ - s4 i; - - STATISTICS(jniinvokation()); - - i = GET_FIELD(obj, s4, fieldID); - - return (jshort) i; -} - - -jint _Jv_JNI_GetIntField(JNIEnv *env, jobject obj, jfieldID fieldID) -{ - java_objectheader *o; - fieldinfo *f; - s4 i; - - STATISTICS(jniinvokation()); - - o = (java_objectheader *) obj; - f = (fieldinfo *) fieldID; - - i = GET_FIELD(o, s4, f); - - return i; -} - - -jlong _Jv_JNI_GetLongField(JNIEnv *env, jobject obj, jfieldID fieldID) -{ - s8 l; - - STATISTICS(jniinvokation()); - - l = GET_FIELD(obj, s8, fieldID); - - return l; -} - - -jfloat _Jv_JNI_GetFloatField(JNIEnv *env, jobject obj, jfieldID fieldID) -{ - float f; - - STATISTICS(jniinvokation()); - - f = GET_FIELD(obj, float, fieldID); - - return f; -} - - -jdouble _Jv_JNI_GetDoubleField(JNIEnv *env, jobject obj, jfieldID fieldID) -{ - double d; - - STATISTICS(jniinvokation()); - - d = GET_FIELD(obj, double, fieldID); - - return d; -} - - -/* SetField Routines ***************************************************** - - This family of accessor routines sets the value of an instance - (nonstatic) field of an object. The field to access is specified by - a field ID obtained by calling GetFieldID(). - -*******************************************************************************/ - -void _Jv_JNI_SetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID, - jobject value) -{ - STATISTICS(jniinvokation()); - - SET_FIELD(obj, java_objectheader*, fieldID, value); -} - - -void _Jv_JNI_SetBooleanField(JNIEnv *env, jobject obj, jfieldID fieldID, - jboolean value) -{ - STATISTICS(jniinvokation()); - - SET_FIELD(obj, s4, fieldID, value); -} - - -void _Jv_JNI_SetByteField(JNIEnv *env, jobject obj, jfieldID fieldID, - jbyte value) -{ - STATISTICS(jniinvokation()); - - SET_FIELD(obj, s4, fieldID, value); -} - - -void _Jv_JNI_SetCharField(JNIEnv *env, jobject obj, jfieldID fieldID, - jchar value) -{ - STATISTICS(jniinvokation()); - - SET_FIELD(obj, s4, fieldID, value); -} - - -void _Jv_JNI_SetShortField(JNIEnv *env, jobject obj, jfieldID fieldID, - jshort value) -{ - STATISTICS(jniinvokation()); - - SET_FIELD(obj, s4, fieldID, value); -} - - -void _Jv_JNI_SetIntField(JNIEnv *env, jobject obj, jfieldID fieldID, jint value) -{ - STATISTICS(jniinvokation()); - - SET_FIELD(obj, s4, fieldID, value); -} - - -void _Jv_JNI_SetLongField(JNIEnv *env, jobject obj, jfieldID fieldID, - jlong value) -{ - STATISTICS(jniinvokation()); - - SET_FIELD(obj, s8, fieldID, value); -} - - -void _Jv_JNI_SetFloatField(JNIEnv *env, jobject obj, jfieldID fieldID, - jfloat value) -{ - STATISTICS(jniinvokation()); - - SET_FIELD(obj, float, fieldID, value); -} - - -void _Jv_JNI_SetDoubleField(JNIEnv *env, jobject obj, jfieldID fieldID, - jdouble value) -{ - STATISTICS(jniinvokation()); - - SET_FIELD(obj, double, fieldID, value); -} - - -/* Calling Static Methods *****************************************************/ - -/* GetStaticMethodID *********************************************************** - - Returns the method ID for a static method of a class. The method is - specified by its name and signature. - - GetStaticMethodID() causes an uninitialized class to be - initialized. - -*******************************************************************************/ - -jmethodID _Jv_JNI_GetStaticMethodID(JNIEnv *env, jclass clazz, const char *name, - const char *sig) -{ - classinfo *c; - utf *uname; - utf *udesc; - methodinfo *m; - - STATISTICS(jniinvokation()); - - c = (classinfo *) clazz; - - if (!c) - return NULL; - - if (!(c->state & CLASS_INITIALIZED)) - if (!initialize_class(c)) - return NULL; - - /* try to get the static method of the class */ - - uname = utf_new_char((char *) name); - udesc = utf_new_char((char *) sig); - - m = class_resolvemethod(c, uname, udesc); - - if ((m == NULL) || !(m->flags & ACC_STATIC)) { - exceptions_throw_nosuchmethoderror(c, uname, udesc); - - return NULL; - } - - return (jmethodID) m; -} - - -jobject _Jv_JNI_CallStaticObjectMethod(JNIEnv *env, jclass clazz, - jmethodID methodID, ...) -{ - methodinfo *m; - java_objectheader *o; - va_list ap; - - m = (methodinfo *) methodID; - - va_start(ap, methodID); - o = _Jv_jni_CallObjectMethod(NULL, NULL, m, ap); - va_end(ap); - - return _Jv_JNI_NewLocalRef(env, (jobject) o); -} - - -jobject _Jv_JNI_CallStaticObjectMethodV(JNIEnv *env, jclass clazz, - jmethodID methodID, va_list args) -{ - methodinfo *m; - java_objectheader *o; - - m = (methodinfo *) methodID; - - o = _Jv_jni_CallObjectMethod(NULL, NULL, m, args); - - return _Jv_JNI_NewLocalRef(env, (jobject) o); -} - - -jobject _Jv_JNI_CallStaticObjectMethodA(JNIEnv *env, jclass clazz, - jmethodID methodID, const jvalue *args) -{ - methodinfo *m; - java_objectheader *o; - - m = (methodinfo *) methodID; - - o = _Jv_jni_CallObjectMethodA(NULL, NULL, m, args); - - return _Jv_JNI_NewLocalRef(env, (jobject) o); -} - - -jboolean _Jv_JNI_CallStaticBooleanMethod(JNIEnv *env, jclass clazz, - jmethodID methodID, ...) -{ - methodinfo *m; - va_list ap; - jboolean b; - - m = (methodinfo *) methodID; - - va_start(ap, methodID); - b = _Jv_jni_CallIntMethod(NULL, NULL, m, ap); - va_end(ap); - - return b; -} - - -jboolean _Jv_JNI_CallStaticBooleanMethodV(JNIEnv *env, jclass clazz, - jmethodID methodID, va_list args) -{ - methodinfo *m; - jboolean b; - - m = (methodinfo *) methodID; - - b = _Jv_jni_CallIntMethod(NULL, NULL, m, args); - - return b; -} - - -jboolean _Jv_JNI_CallStaticBooleanMethodA(JNIEnv *env, jclass clazz, - jmethodID methodID, const jvalue *args) -{ - methodinfo *m; - jboolean b; - - m = (methodinfo *) methodID; - - b = _Jv_jni_CallIntMethodA(NULL, NULL, m, args); - - return b; -} - - -jbyte _Jv_JNI_CallStaticByteMethod(JNIEnv *env, jclass clazz, - jmethodID methodID, ...) -{ - methodinfo *m; - va_list ap; - jbyte b; - - m = (methodinfo *) methodID; - - va_start(ap, methodID); - b = _Jv_jni_CallIntMethod(NULL, NULL, m, ap); - va_end(ap); - - return b; -} - - -jbyte _Jv_JNI_CallStaticByteMethodV(JNIEnv *env, jclass clazz, - jmethodID methodID, va_list args) -{ - methodinfo *m; - jbyte b; - - m = (methodinfo *) methodID; - - b = _Jv_jni_CallIntMethod(NULL, NULL, m, args); - - return b; -} - - -jbyte _Jv_JNI_CallStaticByteMethodA(JNIEnv *env, jclass clazz, - jmethodID methodID, const jvalue *args) -{ - methodinfo *m; - jbyte b; - - m = (methodinfo *) methodID; - - b = _Jv_jni_CallIntMethodA(NULL, NULL, m, args); - - return b; -} - - -jchar _Jv_JNI_CallStaticCharMethod(JNIEnv *env, jclass clazz, - jmethodID methodID, ...) -{ - methodinfo *m; - va_list ap; - jchar c; - - m = (methodinfo *) methodID; - - va_start(ap, methodID); - c = _Jv_jni_CallIntMethod(NULL, NULL, m, ap); - va_end(ap); - - return c; -} - - -jchar _Jv_JNI_CallStaticCharMethodV(JNIEnv *env, jclass clazz, - jmethodID methodID, va_list args) -{ - methodinfo *m; - jchar c; - - m = (methodinfo *) methodID; - - c = _Jv_jni_CallIntMethod(NULL, NULL, m, args); - - return c; -} - - -jchar _Jv_JNI_CallStaticCharMethodA(JNIEnv *env, jclass clazz, - jmethodID methodID, const jvalue *args) -{ - methodinfo *m; - jchar c; - - m = (methodinfo *) methodID; - - c = _Jv_jni_CallIntMethodA(NULL, NULL, m, args); - - return c; -} - - -jshort _Jv_JNI_CallStaticShortMethod(JNIEnv *env, jclass clazz, - jmethodID methodID, ...) -{ - methodinfo *m; - va_list ap; - jshort s; - - m = (methodinfo *) methodID; - - va_start(ap, methodID); - s = _Jv_jni_CallIntMethod(NULL, NULL, m, ap); - va_end(ap); - - return s; -} - - -jshort _Jv_JNI_CallStaticShortMethodV(JNIEnv *env, jclass clazz, - jmethodID methodID, va_list args) -{ - methodinfo *m; - jshort s; - - m = (methodinfo *) methodID; - - s = _Jv_jni_CallIntMethod(NULL, NULL, m, args); - - return s; -} - - -jshort _Jv_JNI_CallStaticShortMethodA(JNIEnv *env, jclass clazz, - jmethodID methodID, const jvalue *args) -{ - methodinfo *m; - jshort s; - - m = (methodinfo *) methodID; - - s = _Jv_jni_CallIntMethodA(NULL, NULL, m, args); - - return s; -} - - -jint _Jv_JNI_CallStaticIntMethod(JNIEnv *env, jclass clazz, jmethodID methodID, - ...) -{ - methodinfo *m; - va_list ap; - jint i; - - m = (methodinfo *) methodID; - - va_start(ap, methodID); - i = _Jv_jni_CallIntMethod(NULL, NULL, m, ap); - va_end(ap); - - return i; -} - - -jint _Jv_JNI_CallStaticIntMethodV(JNIEnv *env, jclass clazz, - jmethodID methodID, va_list args) -{ - methodinfo *m; - jint i; - - m = (methodinfo *) methodID; - - i = _Jv_jni_CallIntMethod(NULL, NULL, m, args); - - return i; -} - - -jint _Jv_JNI_CallStaticIntMethodA(JNIEnv *env, jclass clazz, - jmethodID methodID, const jvalue *args) -{ - methodinfo *m; - jint i; - - m = (methodinfo *) methodID; - - i = _Jv_jni_CallIntMethodA(NULL, NULL, m, args); - - return i; -} - - -jlong _Jv_JNI_CallStaticLongMethod(JNIEnv *env, jclass clazz, - jmethodID methodID, ...) -{ - methodinfo *m; - va_list ap; - jlong l; - - m = (methodinfo *) methodID; - - va_start(ap, methodID); - l = _Jv_jni_CallLongMethod(NULL, NULL, m, ap); - va_end(ap); - - return l; -} - - -jlong _Jv_JNI_CallStaticLongMethodV(JNIEnv *env, jclass clazz, - jmethodID methodID, va_list args) -{ - methodinfo *m; - jlong l; - - m = (methodinfo *) methodID; - - l = _Jv_jni_CallLongMethod(NULL, NULL, m, args); - - return l; -} - - -jlong _Jv_JNI_CallStaticLongMethodA(JNIEnv *env, jclass clazz, - jmethodID methodID, const jvalue *args) -{ - methodinfo *m; - jlong l; - - m = (methodinfo *) methodID; - - l = _Jv_jni_CallLongMethodA(NULL, NULL, m, args); - - return l; -} - - - -jfloat _Jv_JNI_CallStaticFloatMethod(JNIEnv *env, jclass clazz, - jmethodID methodID, ...) -{ - methodinfo *m; - va_list ap; - jfloat f; - - m = (methodinfo *) methodID; - - va_start(ap, methodID); - f = _Jv_jni_CallFloatMethod(NULL, NULL, m, ap); - va_end(ap); - - return f; -} - - -jfloat _Jv_JNI_CallStaticFloatMethodV(JNIEnv *env, jclass clazz, - jmethodID methodID, va_list args) -{ - methodinfo *m; - jfloat f; - - m = (methodinfo *) methodID; - - f = _Jv_jni_CallFloatMethod(NULL, NULL, m, args); - - return f; -} - - -jfloat _Jv_JNI_CallStaticFloatMethodA(JNIEnv *env, jclass clazz, - jmethodID methodID, const jvalue *args) -{ - methodinfo *m; - jfloat f; - - m = (methodinfo *) methodID; - - f = _Jv_jni_CallFloatMethodA(NULL, NULL, m, args); - - return f; -} - - -jdouble _Jv_JNI_CallStaticDoubleMethod(JNIEnv *env, jclass clazz, - jmethodID methodID, ...) -{ - methodinfo *m; - va_list ap; - jdouble d; - - m = (methodinfo *) methodID; - - va_start(ap, methodID); - d = _Jv_jni_CallDoubleMethod(NULL, NULL, m, ap); - va_end(ap); - - return d; -} - - -jdouble _Jv_JNI_CallStaticDoubleMethodV(JNIEnv *env, jclass clazz, - jmethodID methodID, va_list args) -{ - methodinfo *m; - jdouble d; - - m = (methodinfo *) methodID; - - d = _Jv_jni_CallDoubleMethod(NULL, NULL, m, args); - - return d; -} - - -jdouble _Jv_JNI_CallStaticDoubleMethodA(JNIEnv *env, jclass clazz, - jmethodID methodID, const jvalue *args) -{ - methodinfo *m; - jdouble d; - - m = (methodinfo *) methodID; - - d = _Jv_jni_CallDoubleMethodA(NULL, NULL, m, args); - - return d; -} - - -void _Jv_JNI_CallStaticVoidMethod(JNIEnv *env, jclass clazz, - jmethodID methodID, ...) -{ - methodinfo *m; - va_list ap; - - m = (methodinfo *) methodID; - - va_start(ap, methodID); - _Jv_jni_CallVoidMethod(NULL, NULL, m, ap); - va_end(ap); -} - - -void _Jv_JNI_CallStaticVoidMethodV(JNIEnv *env, jclass clazz, - jmethodID methodID, va_list args) -{ - methodinfo *m; - - m = (methodinfo *) methodID; - - _Jv_jni_CallVoidMethod(NULL, NULL, m, args); -} - - -void _Jv_JNI_CallStaticVoidMethodA(JNIEnv *env, jclass clazz, - jmethodID methodID, const jvalue * args) -{ - methodinfo *m; - - m = (methodinfo *) methodID; - - _Jv_jni_CallVoidMethodA(NULL, NULL, m, args); -} - - -/* Accessing Static Fields ****************************************************/ - -/* GetStaticFieldID ************************************************************ - - Returns the field ID for a static field of a class. The field is - specified by its name and signature. The GetStaticField and - SetStaticField families of accessor functions use field IDs - to retrieve static fields. - -*******************************************************************************/ - -jfieldID _Jv_JNI_GetStaticFieldID(JNIEnv *env, jclass clazz, const char *name, - const char *sig) -{ - classinfo *c; - fieldinfo *f; - utf *uname; - utf *usig; - - STATISTICS(jniinvokation()); - - c = (classinfo *) clazz; - - uname = utf_new_char((char *) name); - usig = utf_new_char((char *) sig); - - f = class_findfield(c, uname, usig); - - if (f == NULL) - exceptions_throw_nosuchfielderror(c, uname); - - return (jfieldID) f; -} - - -/* GetStaticField ******************************************************** - - This family of accessor routines returns the value of a static - field of an object. - -*******************************************************************************/ - -jobject _Jv_JNI_GetStaticObjectField(JNIEnv *env, jclass clazz, - jfieldID fieldID) -{ - classinfo *c; - fieldinfo *f; - - STATISTICS(jniinvokation()); - - c = (classinfo *) clazz; - f = (fieldinfo *) fieldID; - - if (!(c->state & CLASS_INITIALIZED)) - if (!initialize_class(c)) - return NULL; - - return _Jv_JNI_NewLocalRef(env, f->value.a); -} - - -jboolean _Jv_JNI_GetStaticBooleanField(JNIEnv *env, jclass clazz, - jfieldID fieldID) -{ - classinfo *c; - fieldinfo *f; - - STATISTICS(jniinvokation()); - - c = (classinfo *) clazz; - f = (fieldinfo *) fieldID; - - if (!(c->state & CLASS_INITIALIZED)) - if (!initialize_class(c)) - return false; - - return f->value.i; -} - - -jbyte _Jv_JNI_GetStaticByteField(JNIEnv *env, jclass clazz, jfieldID fieldID) -{ - classinfo *c; - fieldinfo *f; - - STATISTICS(jniinvokation()); - - c = (classinfo *) clazz; - f = (fieldinfo *) fieldID; - - if (!(c->state & CLASS_INITIALIZED)) - if (!initialize_class(c)) - return 0; - - return f->value.i; -} - - -jchar _Jv_JNI_GetStaticCharField(JNIEnv *env, jclass clazz, jfieldID fieldID) -{ - classinfo *c; - fieldinfo *f; - - STATISTICS(jniinvokation()); - - c = (classinfo *) clazz; - f = (fieldinfo *) fieldID; - - if (!(c->state & CLASS_INITIALIZED)) - if (!initialize_class(c)) - return 0; - - return f->value.i; -} - - -jshort _Jv_JNI_GetStaticShortField(JNIEnv *env, jclass clazz, jfieldID fieldID) -{ - classinfo *c; - fieldinfo *f; - - STATISTICS(jniinvokation()); - - c = (classinfo *) clazz; - f = (fieldinfo *) fieldID; - - if (!(c->state & CLASS_INITIALIZED)) - if (!initialize_class(c)) - return 0; - - return f->value.i; -} - - -jint _Jv_JNI_GetStaticIntField(JNIEnv *env, jclass clazz, jfieldID fieldID) -{ - classinfo *c; - fieldinfo *f; - - STATISTICS(jniinvokation()); - - c = (classinfo *) clazz; - f = (fieldinfo *) fieldID; - - if (!(c->state & CLASS_INITIALIZED)) - if (!initialize_class(c)) - return 0; - - return f->value.i; -} - - -jlong _Jv_JNI_GetStaticLongField(JNIEnv *env, jclass clazz, jfieldID fieldID) -{ - classinfo *c; - fieldinfo *f; - - STATISTICS(jniinvokation()); - - c = (classinfo *) clazz; - f = (fieldinfo *) fieldID; - - if (!(c->state & CLASS_INITIALIZED)) - if (!initialize_class(c)) - return 0; - - return f->value.l; -} - - -jfloat _Jv_JNI_GetStaticFloatField(JNIEnv *env, jclass clazz, jfieldID fieldID) -{ - classinfo *c; - fieldinfo *f; - - STATISTICS(jniinvokation()); - - c = (classinfo *) clazz; - f = (fieldinfo *) fieldID; - - if (!(c->state & CLASS_INITIALIZED)) - if (!initialize_class(c)) - return 0.0; - - return f->value.f; -} - - -jdouble _Jv_JNI_GetStaticDoubleField(JNIEnv *env, jclass clazz, - jfieldID fieldID) -{ - classinfo *c; - fieldinfo *f; - - STATISTICS(jniinvokation()); - - c = (classinfo *) clazz; - f = (fieldinfo *) fieldID; - - if (!(c->state & CLASS_INITIALIZED)) - if (!initialize_class(c)) - return 0.0; - - return f->value.d; -} - - -/* SetStaticField ******************************************************* - - This family of accessor routines sets the value of a static field - of an object. - -*******************************************************************************/ - -void _Jv_JNI_SetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID, - jobject value) -{ - classinfo *c; - fieldinfo *f; - - STATISTICS(jniinvokation()); - - c = (classinfo *) clazz; - f = (fieldinfo *) fieldID; - - if (!(c->state & CLASS_INITIALIZED)) - if (!initialize_class(c)) - return; - - f->value.a = value; -} - - -void _Jv_JNI_SetStaticBooleanField(JNIEnv *env, jclass clazz, jfieldID fieldID, - jboolean value) -{ - classinfo *c; - fieldinfo *f; - - STATISTICS(jniinvokation()); - - c = (classinfo *) clazz; - f = (fieldinfo *) fieldID; - - if (!(c->state & CLASS_INITIALIZED)) - if (!initialize_class(c)) - return; - - f->value.i = value; -} - - -void _Jv_JNI_SetStaticByteField(JNIEnv *env, jclass clazz, jfieldID fieldID, - jbyte value) -{ - classinfo *c; - fieldinfo *f; - - STATISTICS(jniinvokation()); - - c = (classinfo *) clazz; - f = (fieldinfo *) fieldID; - - if (!(c->state & CLASS_INITIALIZED)) - if (!initialize_class(c)) - return; - - f->value.i = value; -} - - -void _Jv_JNI_SetStaticCharField(JNIEnv *env, jclass clazz, jfieldID fieldID, - jchar value) -{ - classinfo *c; - fieldinfo *f; - - STATISTICS(jniinvokation()); - - c = (classinfo *) clazz; - f = (fieldinfo *) fieldID; - - if (!(c->state & CLASS_INITIALIZED)) - if (!initialize_class(c)) - return; - - f->value.i = value; -} - - -void _Jv_JNI_SetStaticShortField(JNIEnv *env, jclass clazz, jfieldID fieldID, - jshort value) -{ - classinfo *c; - fieldinfo *f; - - STATISTICS(jniinvokation()); - - c = (classinfo *) clazz; - f = (fieldinfo *) fieldID; - - if (!(c->state & CLASS_INITIALIZED)) - if (!initialize_class(c)) - return; - - f->value.i = value; -} - - -void _Jv_JNI_SetStaticIntField(JNIEnv *env, jclass clazz, jfieldID fieldID, - jint value) -{ - classinfo *c; - fieldinfo *f; - - STATISTICS(jniinvokation()); - - c = (classinfo *) clazz; - f = (fieldinfo *) fieldID; - - if (!(c->state & CLASS_INITIALIZED)) - if (!initialize_class(c)) - return; - - f->value.i = value; -} - - -void _Jv_JNI_SetStaticLongField(JNIEnv *env, jclass clazz, jfieldID fieldID, - jlong value) -{ - classinfo *c; - fieldinfo *f; - - STATISTICS(jniinvokation()); - - c = (classinfo *) clazz; - f = (fieldinfo *) fieldID; - - if (!(c->state & CLASS_INITIALIZED)) - if (!initialize_class(c)) - return; - - f->value.l = value; -} - - -void _Jv_JNI_SetStaticFloatField(JNIEnv *env, jclass clazz, jfieldID fieldID, - jfloat value) -{ - classinfo *c; - fieldinfo *f; - - STATISTICS(jniinvokation()); - - c = (classinfo *) clazz; - f = (fieldinfo *) fieldID; - - if (!(c->state & CLASS_INITIALIZED)) - if (!initialize_class(c)) - return; - - f->value.f = value; -} - - -void _Jv_JNI_SetStaticDoubleField(JNIEnv *env, jclass clazz, jfieldID fieldID, - jdouble value) -{ - classinfo *c; - fieldinfo *f; - - STATISTICS(jniinvokation()); - - c = (classinfo *) clazz; - f = (fieldinfo *) fieldID; - - if (!(c->state & CLASS_INITIALIZED)) - if (!initialize_class(c)) - return; - - f->value.d = value; -} - - -/* String Operations **********************************************************/ - -/* NewString ******************************************************************* - - Create new java.lang.String object from an array of Unicode - characters. - -*******************************************************************************/ - -jstring _Jv_JNI_NewString(JNIEnv *env, const jchar *buf, jsize len) -{ - java_lang_String *s; - java_chararray *a; - u4 i; - - STATISTICS(jniinvokation()); - - s = (java_lang_String *) builtin_new(class_java_lang_String); - a = builtin_newarray_char(len); - - /* javastring or characterarray could not be created */ - if ((a == NULL) || (s == NULL)) - return NULL; - - /* copy text */ - for (i = 0; i < len; i++) - a->data[i] = buf[i]; - - s->value = a; - s->offset = 0; - s->count = len; - - return (jstring) _Jv_JNI_NewLocalRef(env, (jobject) s); -} - - -static jchar emptyStringJ[]={0,0}; - -/* GetStringLength ************************************************************* - - Returns the length (the count of Unicode characters) of a Java - string. - -*******************************************************************************/ - -jsize _Jv_JNI_GetStringLength(JNIEnv *env, jstring str) -{ - java_lang_String *s; - - TRACEJNICALLS("_Jv_JNI_GetStringLength(env=%p, str=%p)", env, str); - - s = (java_lang_String *) str; - - return s->count; -} - - -/******************** convertes javastring to u2-array ****************************/ - -u2 *javastring_tou2(jstring so) -{ - java_lang_String *s; - java_chararray *a; - u2 *stringbuffer; - u4 i; - - STATISTICS(jniinvokation()); - - s = (java_lang_String *) so; - - if (!s) - return NULL; - - a = s->value; - - if (!a) - return NULL; - - /* allocate memory */ - - stringbuffer = MNEW(u2, s->count + 1); - - /* copy text */ - - for (i = 0; i < s->count; i++) - stringbuffer[i] = a->data[s->offset + i]; - - /* terminate string */ - - stringbuffer[i] = '\0'; - - return stringbuffer; -} - - -/* GetStringChars ************************************************************** - - Returns a pointer to the array of Unicode characters of the - string. This pointer is valid until ReleaseStringChars() is called. - -*******************************************************************************/ - -const jchar *_Jv_JNI_GetStringChars(JNIEnv *env, jstring str, jboolean *isCopy) -{ - jchar *jc; - - STATISTICS(jniinvokation()); - - jc = javastring_tou2(str); - - if (jc) { - if (isCopy) - *isCopy = JNI_TRUE; - - return jc; - } - - if (isCopy) - *isCopy = JNI_TRUE; - - return emptyStringJ; -} - - -/* ReleaseStringChars ********************************************************** - - Informs the VM that the native code no longer needs access to - chars. The chars argument is a pointer obtained from string using - GetStringChars(). - -*******************************************************************************/ - -void _Jv_JNI_ReleaseStringChars(JNIEnv *env, jstring str, const jchar *chars) -{ - STATISTICS(jniinvokation()); - - if (chars == emptyStringJ) - return; - - MFREE(((jchar *) chars), jchar, ((java_lang_String *) str)->count + 1); -} - - -/* NewStringUTF **************************************************************** - - Constructs a new java.lang.String object from an array of UTF-8 - characters. - -*******************************************************************************/ - -jstring _Jv_JNI_NewStringUTF(JNIEnv *env, const char *bytes) -{ - java_lang_String *s; - - TRACEJNICALLS("_Jv_JNI_NewStringUTF(env=%p, bytes=%s)", env, bytes); - - s = (java_lang_String *) javastring_safe_new_from_utf8(bytes); - - return (jstring) _Jv_JNI_NewLocalRef(env, (jobject) s); -} - - -/****************** returns the utf8 length in bytes of a string *******************/ - -jsize _Jv_JNI_GetStringUTFLength(JNIEnv *env, jstring string) -{ - java_lang_String *s; - s4 length; - - TRACEJNICALLS("_Jv_JNI_GetStringUTFLength(env=%p, string=%p)", env, string); - - s = (java_lang_String *) string; - - length = u2_utflength(s->value->data, s->count); - - return length; -} - - -/* GetStringUTFChars *********************************************************** - - Returns a pointer to an array of UTF-8 characters of the - string. This array is valid until it is released by - ReleaseStringUTFChars(). - -*******************************************************************************/ - -const char *_Jv_JNI_GetStringUTFChars(JNIEnv *env, jstring string, - jboolean *isCopy) -{ - utf *u; - - STATISTICS(jniinvokation()); - - if (string == NULL) - return ""; - - if (isCopy) - *isCopy = JNI_TRUE; - - u = javastring_toutf((java_objectheader *) string, false); - - if (u != NULL) - return u->text; - - return ""; -} - - -/* ReleaseStringUTFChars ******************************************************* - - Informs the VM that the native code no longer needs access to - utf. The utf argument is a pointer derived from string using - GetStringUTFChars(). - -*******************************************************************************/ - -void _Jv_JNI_ReleaseStringUTFChars(JNIEnv *env, jstring string, const char *utf) -{ - STATISTICS(jniinvokation()); - - /* XXX we don't release utf chars right now, perhaps that should be done - later. Since there is always one reference the garbage collector will - never get them */ -} - - -/* Array Operations ***********************************************************/ - -/* GetArrayLength ************************************************************** - - Returns the number of elements in the array. - -*******************************************************************************/ - -jsize _Jv_JNI_GetArrayLength(JNIEnv *env, jarray array) -{ - java_arrayheader *a; - - STATISTICS(jniinvokation()); - - a = (java_arrayheader *) array; - - return a->size; -} - - -/* NewObjectArray ************************************************************** - - Constructs a new array holding objects in class elementClass. All - elements are initially set to initialElement. - -*******************************************************************************/ - -jobjectArray _Jv_JNI_NewObjectArray(JNIEnv *env, jsize length, - jclass elementClass, jobject initialElement) -{ - classinfo *c; - java_objectheader *o; - java_objectarray *oa; - s4 i; - - STATISTICS(jniinvokation()); - - c = (classinfo *) elementClass; - o = (java_objectheader *) initialElement; - - if (length < 0) { - exceptions_throw_negativearraysizeexception(); - return NULL; - } - - oa = builtin_anewarray(length, c); - - if (oa == NULL) - return NULL; - - /* set all elements to initialElement */ - - for (i = 0; i < length; i++) - oa->data[i] = o; - - return (jobjectArray) _Jv_JNI_NewLocalRef(env, (jobject) oa); -} - - -jobject _Jv_JNI_GetObjectArrayElement(JNIEnv *env, jobjectArray array, - jsize index) -{ - java_objectarray *oa; - java_objectheader *o; - - STATISTICS(jniinvokation()); - - oa = (java_objectarray *) array; - - if (index >= oa->header.size) { - exceptions_throw_arrayindexoutofboundsexception(); - return NULL; - } - - o = oa->data[index]; - - return _Jv_JNI_NewLocalRef(env, (jobject) o); -} - - -void _Jv_JNI_SetObjectArrayElement(JNIEnv *env, jobjectArray array, - jsize index, jobject val) -{ - java_objectarray *oa; - java_objectheader *o; + classinfo *c; + fieldinfo *f; + utf *uname; + utf *usig; STATISTICS(jniinvokation()); - oa = (java_objectarray *) array; - o = (java_objectheader *) val; - - if (index >= oa->header.size) { - exceptions_throw_arrayindexoutofboundsexception(); - return; - } + c = (classinfo *) clazz; - /* check if the class of value is a subclass of the element class - of the array */ + uname = utf_new_char((char *) name); + usig = utf_new_char((char *) sig); - if (!builtin_canstore(oa, o)) - return; + f = class_findfield(c, uname, usig); + + if (f == NULL) + exceptions_throw_nosuchfielderror(c, uname); - oa->data[index] = o; + return (jfieldID) f; } -jbooleanArray _Jv_JNI_NewBooleanArray(JNIEnv *env, jsize len) -{ - java_booleanarray *ba; - - STATISTICS(jniinvokation()); +/* GetStaticField ******************************************************** - if (len < 0) { - exceptions_throw_negativearraysizeexception(); - return NULL; - } + This family of accessor routines returns the value of a static + field of an object. - ba = builtin_newarray_boolean(len); +*******************************************************************************/ - return (jbooleanArray) _Jv_JNI_NewLocalRef(env, (jobject) ba); -} +#define JNI_GET_STATIC_FIELD(name, type, field) \ +type _Jv_JNI_GetStatic##name##Field(JNIEnv *env, jclass clazz, \ + jfieldID fieldID) \ +{ \ + classinfo *c; \ + fieldinfo *f; \ + \ + STATISTICS(jniinvokation()); \ + \ + c = (classinfo *) clazz; \ + f = (fieldinfo *) fieldID; \ + \ + if (!(c->state & CLASS_INITIALIZED)) \ + if (!initialize_class(c)) \ + return 0; \ + \ + return f->value->field; \ +} + +JNI_GET_STATIC_FIELD(Boolean, jboolean, i) +JNI_GET_STATIC_FIELD(Byte, jbyte, i) +JNI_GET_STATIC_FIELD(Char, jchar, i) +JNI_GET_STATIC_FIELD(Short, jshort, i) +JNI_GET_STATIC_FIELD(Int, jint, i) +JNI_GET_STATIC_FIELD(Long, jlong, l) +JNI_GET_STATIC_FIELD(Float, jfloat, f) +JNI_GET_STATIC_FIELD(Double, jdouble, d) -jbyteArray _Jv_JNI_NewByteArray(JNIEnv *env, jsize len) +jobject _Jv_JNI_GetStaticObjectField(JNIEnv *env, jclass clazz, + jfieldID fieldID) { - java_bytearray *ba; + classinfo *c; + fieldinfo *f; STATISTICS(jniinvokation()); - if (len < 0) { - exceptions_throw_negativearraysizeexception(); - return NULL; - } + c = (classinfo *) clazz; + f = (fieldinfo *) fieldID; - ba = builtin_newarray_byte(len); + if (!(c->state & CLASS_INITIALIZED)) + if (!initialize_class(c)) + return NULL; - return (jbyteArray) _Jv_JNI_NewLocalRef(env, (jobject) ba); + return _Jv_JNI_NewLocalRef(env, f->value->a); } -jcharArray _Jv_JNI_NewCharArray(JNIEnv *env, jsize len) -{ - java_chararray *ca; - - STATISTICS(jniinvokation()); +/* SetStaticField ******************************************************* - if (len < 0) { - exceptions_throw_negativearraysizeexception(); - return NULL; - } + This family of accessor routines sets the value of a static field + of an object. - ca = builtin_newarray_char(len); +*******************************************************************************/ - return (jcharArray) _Jv_JNI_NewLocalRef(env, (jobject) ca); -} +#define JNI_SET_STATIC_FIELD(name, type, field) \ +void _Jv_JNI_SetStatic##name##Field(JNIEnv *env, jclass clazz, \ + jfieldID fieldID, \ + type value) \ +{ \ + classinfo *c; \ + fieldinfo *f; \ + \ + STATISTICS(jniinvokation()); \ + \ + c = (classinfo *) clazz; \ + f = (fieldinfo *) fieldID; \ + \ + if (!(c->state & CLASS_INITIALIZED)) \ + if (!initialize_class(c)) \ + return; \ + \ + f->value->field = value; \ +} + +JNI_SET_STATIC_FIELD(Boolean, jboolean, i) +JNI_SET_STATIC_FIELD(Byte, jbyte, i) +JNI_SET_STATIC_FIELD(Char, jchar, i) +JNI_SET_STATIC_FIELD(Short, jshort, i) +JNI_SET_STATIC_FIELD(Int, jint, i) +JNI_SET_STATIC_FIELD(Long, jlong, l) +JNI_SET_STATIC_FIELD(Float, jfloat, f) +JNI_SET_STATIC_FIELD(Double, jdouble, d) -jshortArray _Jv_JNI_NewShortArray(JNIEnv *env, jsize len) +void _Jv_JNI_SetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID, + jobject value) { - java_shortarray *sa; + classinfo *c; + fieldinfo *f; STATISTICS(jniinvokation()); - if (len < 0) { - exceptions_throw_negativearraysizeexception(); - return NULL; - } + c = (classinfo *) clazz; + f = (fieldinfo *) fieldID; - sa = builtin_newarray_short(len); + if (!(c->state & CLASS_INITIALIZED)) + if (!initialize_class(c)) + return; - return (jshortArray) _Jv_JNI_NewLocalRef(env, (jobject) sa); + f->value->a = value; } -jintArray _Jv_JNI_NewIntArray(JNIEnv *env, jsize len) -{ - java_intarray *ia; - - STATISTICS(jniinvokation()); - - if (len < 0) { - exceptions_throw_negativearraysizeexception(); - return NULL; - } +/* String Operations **********************************************************/ - ia = builtin_newarray_int(len); +/* NewString ******************************************************************* - return (jintArray) _Jv_JNI_NewLocalRef(env, (jobject) ia); -} + Create new java.lang.String object from an array of Unicode + characters. +*******************************************************************************/ -jlongArray _Jv_JNI_NewLongArray(JNIEnv *env, jsize len) +jstring _Jv_JNI_NewString(JNIEnv *env, const jchar *buf, jsize len) { - java_longarray *la; + java_lang_String *s; + java_chararray *a; + u4 i; STATISTICS(jniinvokation()); + + s = (java_lang_String *) builtin_new(class_java_lang_String); + a = builtin_newarray_char(len); - if (len < 0) { - exceptions_throw_negativearraysizeexception(); + /* javastring or characterarray could not be created */ + if ((a == NULL) || (s == NULL)) return NULL; - } - - la = builtin_newarray_long(len); - - return (jlongArray) _Jv_JNI_NewLocalRef(env, (jobject) la); -} + /* copy text */ + for (i = 0; i < len; i++) + a->data[i] = buf[i]; -jfloatArray _Jv_JNI_NewFloatArray(JNIEnv *env, jsize len) -{ - java_floatarray *fa; - - STATISTICS(jniinvokation()); - - if (len < 0) { - exceptions_throw_negativearraysizeexception(); - return NULL; - } - - fa = builtin_newarray_float(len); + LLNI_field_set_ref(s, value , a); + LLNI_field_set_val(s, offset, 0); + LLNI_field_set_val(s, count , len); - return (jfloatArray) _Jv_JNI_NewLocalRef(env, (jobject) fa); + return (jstring) _Jv_JNI_NewLocalRef(env, (jobject) s); } -jdoubleArray _Jv_JNI_NewDoubleArray(JNIEnv *env, jsize len) -{ - java_doublearray *da; - - STATISTICS(jniinvokation()); - - if (len < 0) { - exceptions_throw_negativearraysizeexception(); - return NULL; - } - - da = builtin_newarray_double(len); - - return (jdoubleArray) _Jv_JNI_NewLocalRef(env, (jobject) da); -} - +static jchar emptyStringJ[]={0,0}; -/* GetArrayElements ********************************************* +/* GetStringLength ************************************************************* - A family of functions that returns the body of the primitive array. + Returns the length (the count of Unicode characters) of a Java + string. *******************************************************************************/ -jboolean *_Jv_JNI_GetBooleanArrayElements(JNIEnv *env, jbooleanArray array, - jboolean *isCopy) -{ - java_booleanarray *ba; - - STATISTICS(jniinvokation()); - - ba = (java_booleanarray *) array; - - if (isCopy) - *isCopy = JNI_FALSE; - - return ba->data; -} - - -jbyte *_Jv_JNI_GetByteArrayElements(JNIEnv *env, jbyteArray array, - jboolean *isCopy) -{ - java_bytearray *ba; - - STATISTICS(jniinvokation()); - - ba = (java_bytearray *) array; - - if (isCopy) - *isCopy = JNI_FALSE; - - return ba->data; -} - - -jchar *_Jv_JNI_GetCharArrayElements(JNIEnv *env, jcharArray array, - jboolean *isCopy) -{ - java_chararray *ca; - - STATISTICS(jniinvokation()); - - ca = (java_chararray *) array; - - if (isCopy) - *isCopy = JNI_FALSE; - - return ca->data; -} - - -jshort *_Jv_JNI_GetShortArrayElements(JNIEnv *env, jshortArray array, - jboolean *isCopy) -{ - java_shortarray *sa; - - STATISTICS(jniinvokation()); - - sa = (java_shortarray *) array; - - if (isCopy) - *isCopy = JNI_FALSE; - - return sa->data; -} - - -jint *_Jv_JNI_GetIntArrayElements(JNIEnv *env, jintArray array, - jboolean *isCopy) -{ - java_intarray *ia; - - STATISTICS(jniinvokation()); - - ia = (java_intarray *) array; - - if (isCopy) - *isCopy = JNI_FALSE; - - return ia->data; -} - - -jlong *_Jv_JNI_GetLongArrayElements(JNIEnv *env, jlongArray array, - jboolean *isCopy) -{ - java_longarray *la; - - STATISTICS(jniinvokation()); - - la = (java_longarray *) array; - - if (isCopy) - *isCopy = JNI_FALSE; - - /* We cast this one to prevent a compiler warning on 64-bit - systems since GNU Classpath typedef jlong to long long. */ - - return (jlong *) la->data; -} - - -jfloat *_Jv_JNI_GetFloatArrayElements(JNIEnv *env, jfloatArray array, - jboolean *isCopy) +jsize _Jv_JNI_GetStringLength(JNIEnv *env, jstring str) { - java_floatarray *fa; + java_lang_String *s; + jsize len; - STATISTICS(jniinvokation()); + TRACEJNICALLS("_Jv_JNI_GetStringLength(env=%p, str=%p)", env, str); - fa = (java_floatarray *) array; + s = (java_lang_String *) str; - if (isCopy) - *isCopy = JNI_FALSE; + LLNI_field_get_val(s, count, len); - return fa->data; + return len; } -jdouble *_Jv_JNI_GetDoubleArrayElements(JNIEnv *env, jdoubleArray array, - jboolean *isCopy) +/******************** convertes javastring to u2-array ****************************/ + +u2 *javastring_tou2(jstring so) { - java_doublearray *da; + java_lang_String *s; + java_chararray *a; + u2 *stringbuffer; + u4 i; STATISTICS(jniinvokation()); + + s = (java_lang_String *) so; - da = (java_doublearray *) array; - - if (isCopy) - *isCopy = JNI_FALSE; - - return da->data; -} - - -/* ReleaseArrayElements ***************************************** - - A family of functions that informs the VM that the native code no - longer needs access to elems. The elems argument is a pointer - derived from array using the corresponding - GetArrayElements() function. If necessary, this - function copies back all changes made to elems to the original - array. - -*******************************************************************************/ + if (!s) + return NULL; -void _Jv_JNI_ReleaseBooleanArrayElements(JNIEnv *env, jbooleanArray array, - jboolean *elems, jint mode) -{ - java_booleanarray *ba; + LLNI_field_get_ref(s, value, a); - STATISTICS(jniinvokation()); + if (!a) + return NULL; - ba = (java_booleanarray *) array; - - if (elems != ba->data) { - switch (mode) { - case JNI_COMMIT: - MCOPY(ba->data, elems, u1, ba->header.size); - break; - case 0: - MCOPY(ba->data, elems, u1, ba->header.size); - /* XXX TWISTI how should it be freed? */ - break; - case JNI_ABORT: - /* XXX TWISTI how should it be freed? */ - break; - } - } -} + /* allocate memory */ + stringbuffer = MNEW(u2, LLNI_field_direct(s, count) + 1); -void _Jv_JNI_ReleaseByteArrayElements(JNIEnv *env, jbyteArray array, - jbyte *elems, jint mode) -{ - java_bytearray *ba; + /* copy text */ - STATISTICS(jniinvokation()); + for (i = 0; i < LLNI_field_direct(s, count); i++) + stringbuffer[i] = a->data[LLNI_field_direct(s, offset) + i]; + + /* terminate string */ - ba = (java_bytearray *) array; + stringbuffer[i] = '\0'; - if (elems != ba->data) { - switch (mode) { - case JNI_COMMIT: - MCOPY(ba->data, elems, s1, ba->header.size); - break; - case 0: - MCOPY(ba->data, elems, s1, ba->header.size); - /* XXX TWISTI how should it be freed? */ - break; - case JNI_ABORT: - /* XXX TWISTI how should it be freed? */ - break; - } - } + return stringbuffer; } -void _Jv_JNI_ReleaseCharArrayElements(JNIEnv *env, jcharArray array, - jchar *elems, jint mode) -{ - java_chararray *ca; - - STATISTICS(jniinvokation()); +/* GetStringChars ************************************************************** - ca = (java_chararray *) array; - - if (elems != ca->data) { - switch (mode) { - case JNI_COMMIT: - MCOPY(ca->data, elems, u2, ca->header.size); - break; - case 0: - MCOPY(ca->data, elems, u2, ca->header.size); - /* XXX TWISTI how should it be freed? */ - break; - case JNI_ABORT: - /* XXX TWISTI how should it be freed? */ - break; - } - } -} + Returns a pointer to the array of Unicode characters of the + string. This pointer is valid until ReleaseStringChars() is called. +*******************************************************************************/ -void _Jv_JNI_ReleaseShortArrayElements(JNIEnv *env, jshortArray array, - jshort *elems, jint mode) -{ - java_shortarray *sa; +const jchar *_Jv_JNI_GetStringChars(JNIEnv *env, jstring str, jboolean *isCopy) +{ + jchar *jc; STATISTICS(jniinvokation()); - sa = (java_shortarray *) array; - - if (elems != sa->data) { - switch (mode) { - case JNI_COMMIT: - MCOPY(sa->data, elems, s2, sa->header.size); - break; - case 0: - MCOPY(sa->data, elems, s2, sa->header.size); - /* XXX TWISTI how should it be freed? */ - break; - case JNI_ABORT: - /* XXX TWISTI how should it be freed? */ - break; - } - } -} + jc = javastring_tou2(str); + if (jc) { + if (isCopy) + *isCopy = JNI_TRUE; -void _Jv_JNI_ReleaseIntArrayElements(JNIEnv *env, jintArray array, jint *elems, - jint mode) -{ - java_intarray *ia; + return jc; + } - STATISTICS(jniinvokation()); + if (isCopy) + *isCopy = JNI_TRUE; - ia = (java_intarray *) array; - - if (elems != ia->data) { - switch (mode) { - case JNI_COMMIT: - MCOPY(ia->data, elems, s4, ia->header.size); - break; - case 0: - MCOPY(ia->data, elems, s4, ia->header.size); - /* XXX TWISTI how should it be freed? */ - break; - case JNI_ABORT: - /* XXX TWISTI how should it be freed? */ - break; - } - } + return emptyStringJ; } -void _Jv_JNI_ReleaseLongArrayElements(JNIEnv *env, jlongArray array, - jlong *elems, jint mode) -{ - java_longarray *la; - - STATISTICS(jniinvokation()); +/* ReleaseStringChars ********************************************************** - la = (java_longarray *) array; - - /* We cast this one to prevent a compiler warning on 64-bit - systems since GNU Classpath typedef jlong to long long. */ - - if ((s8 *) elems != la->data) { - switch (mode) { - case JNI_COMMIT: - MCOPY(la->data, elems, s8, la->header.size); - break; - case 0: - MCOPY(la->data, elems, s8, la->header.size); - /* XXX TWISTI how should it be freed? */ - break; - case JNI_ABORT: - /* XXX TWISTI how should it be freed? */ - break; - } - } -} + Informs the VM that the native code no longer needs access to + chars. The chars argument is a pointer obtained from string using + GetStringChars(). +*******************************************************************************/ -void _Jv_JNI_ReleaseFloatArrayElements(JNIEnv *env, jfloatArray array, - jfloat *elems, jint mode) +void _Jv_JNI_ReleaseStringChars(JNIEnv *env, jstring str, const jchar *chars) { - java_floatarray *fa; + java_lang_String *s; STATISTICS(jniinvokation()); - fa = (java_floatarray *) array; - - if (elems != fa->data) { - switch (mode) { - case JNI_COMMIT: - MCOPY(fa->data, elems, float, fa->header.size); - break; - case 0: - MCOPY(fa->data, elems, float, fa->header.size); - /* XXX TWISTI how should it be freed? */ - break; - case JNI_ABORT: - /* XXX TWISTI how should it be freed? */ - break; - } - } -} - - -void _Jv_JNI_ReleaseDoubleArrayElements(JNIEnv *env, jdoubleArray array, - jdouble *elems, jint mode) -{ - java_doublearray *da; + if (chars == emptyStringJ) + return; - STATISTICS(jniinvokation()); + s = (java_lang_String *) str; - da = (java_doublearray *) array; - - if (elems != da->data) { - switch (mode) { - case JNI_COMMIT: - MCOPY(da->data, elems, double, da->header.size); - break; - case 0: - MCOPY(da->data, elems, double, da->header.size); - /* XXX TWISTI how should it be freed? */ - break; - case JNI_ABORT: - /* XXX TWISTI how should it be freed? */ - break; - } - } + MFREE(((jchar *) chars), jchar, LLNI_field_direct(s, count) + 1); } -/* GetArrayRegion ********************************************** +/* NewStringUTF **************************************************************** - A family of functions that copies a region of a primitive array - into a buffer. + Constructs a new java.lang.String object from an array of UTF-8 + characters. *******************************************************************************/ -void _Jv_JNI_GetBooleanArrayRegion(JNIEnv *env, jbooleanArray array, - jsize start, jsize len, jboolean *buf) +jstring _Jv_JNI_NewStringUTF(JNIEnv *env, const char *bytes) { - java_booleanarray *ba; + java_lang_String *s; - STATISTICS(jniinvokation()); + TRACEJNICALLS("_Jv_JNI_NewStringUTF(env=%p, bytes=%s)", env, bytes); - ba = (java_booleanarray *) array; + s = (java_lang_String *) javastring_safe_new_from_utf8(bytes); - if ((start < 0) || (len < 0) || (start + len > ba->header.size)) - exceptions_throw_arrayindexoutofboundsexception(); - else - MCOPY(buf, &ba->data[start], u1, len); + return (jstring) _Jv_JNI_NewLocalRef(env, (jobject) s); } -void _Jv_JNI_GetByteArrayRegion(JNIEnv *env, jbyteArray array, jsize start, - jsize len, jbyte *buf) -{ - java_bytearray *ba; +/****************** returns the utf8 length in bytes of a string *******************/ - STATISTICS(jniinvokation()); +jsize _Jv_JNI_GetStringUTFLength(JNIEnv *env, jstring string) +{ + java_lang_String *s; + s4 length; - ba = (java_bytearray *) array; + TRACEJNICALLS("_Jv_JNI_GetStringUTFLength(env=%p, string=%p)", env, string); - if ((start < 0) || (len < 0) || (start + len > ba->header.size)) - exceptions_throw_arrayindexoutofboundsexception(); - else - MCOPY(buf, &ba->data[start], s1, len); -} + s = (java_lang_String *) string; + length = u2_utflength(LLNI_field_direct(s, value)->data, LLNI_field_direct(s, count)); -void _Jv_JNI_GetCharArrayRegion(JNIEnv *env, jcharArray array, jsize start, - jsize len, jchar *buf) -{ - java_chararray *ca; + return length; +} - STATISTICS(jniinvokation()); - ca = (java_chararray *) array; +/* GetStringUTFChars *********************************************************** - if ((start < 0) || (len < 0) || (start + len > ca->header.size)) - exceptions_throw_arrayindexoutofboundsexception(); - else - MCOPY(buf, &ca->data[start], u2, len); -} + Returns a pointer to an array of UTF-8 characters of the + string. This array is valid until it is released by + ReleaseStringUTFChars(). +*******************************************************************************/ -void _Jv_JNI_GetShortArrayRegion(JNIEnv *env, jshortArray array, jsize start, - jsize len, jshort *buf) +const char *_Jv_JNI_GetStringUTFChars(JNIEnv *env, jstring string, + jboolean *isCopy) { - java_shortarray *sa; + utf *u; STATISTICS(jniinvokation()); - sa = (java_shortarray *) array; + if (string == NULL) + return ""; - if ((start < 0) || (len < 0) || (start + len > sa->header.size)) - exceptions_throw_arrayindexoutofboundsexception(); - else - MCOPY(buf, &sa->data[start], s2, len); -} + if (isCopy) + *isCopy = JNI_TRUE; + + u = javastring_toutf((java_handle_t *) string, false); + if (u != NULL) + return u->text; -void _Jv_JNI_GetIntArrayRegion(JNIEnv *env, jintArray array, jsize start, - jsize len, jint *buf) -{ - java_intarray *ia; + return ""; +} - STATISTICS(jniinvokation()); - ia = (java_intarray *) array; +/* ReleaseStringUTFChars ******************************************************* - if ((start < 0) || (len < 0) || (start + len > ia->header.size)) - exceptions_throw_arrayindexoutofboundsexception(); - else - MCOPY(buf, &ia->data[start], s4, len); -} + Informs the VM that the native code no longer needs access to + utf. The utf argument is a pointer derived from string using + GetStringUTFChars(). +*******************************************************************************/ -void _Jv_JNI_GetLongArrayRegion(JNIEnv *env, jlongArray array, jsize start, - jsize len, jlong *buf) +void _Jv_JNI_ReleaseStringUTFChars(JNIEnv *env, jstring string, const char *utf) { - java_longarray *la; - STATISTICS(jniinvokation()); - la = (java_longarray *) array; - - if ((start < 0) || (len < 0) || (start + len > la->header.size)) - exceptions_throw_arrayindexoutofboundsexception(); - else - MCOPY(buf, &la->data[start], s8, len); + /* XXX we don't release utf chars right now, perhaps that should be done + later. Since there is always one reference the garbage collector will + never get them */ } -void _Jv_JNI_GetFloatArrayRegion(JNIEnv *env, jfloatArray array, jsize start, - jsize len, jfloat *buf) -{ - java_floatarray *fa; - - STATISTICS(jniinvokation()); +/* Array Operations ***********************************************************/ - fa = (java_floatarray *) array; +/* GetArrayLength ************************************************************** - if ((start < 0) || (len < 0) || (start + len > fa->header.size)) - exceptions_throw_arrayindexoutofboundsexception(); - else - MCOPY(buf, &fa->data[start], float, len); -} + Returns the number of elements in the array. +*******************************************************************************/ -void _Jv_JNI_GetDoubleArrayRegion(JNIEnv *env, jdoubleArray array, jsize start, - jsize len, jdouble *buf) +jsize _Jv_JNI_GetArrayLength(JNIEnv *env, jarray array) { - java_doublearray *da; + java_arrayheader *a; STATISTICS(jniinvokation()); - da = (java_doublearray *) array; + a = (java_arrayheader *) array; - if ((start < 0) || (len < 0) || (start + len > da->header.size)) - exceptions_throw_arrayindexoutofboundsexception(); - else - MCOPY(buf, &da->data[start], double, len); + return a->size; } -/* SetArrayRegion ********************************************** +/* NewObjectArray ************************************************************** - A family of functions that copies back a region of a primitive - array from a buffer. + Constructs a new array holding objects in class elementClass. All + elements are initially set to initialElement. *******************************************************************************/ -void _Jv_JNI_SetBooleanArrayRegion(JNIEnv *env, jbooleanArray array, - jsize start, jsize len, const jboolean *buf) +jobjectArray _Jv_JNI_NewObjectArray(JNIEnv *env, jsize length, + jclass elementClass, jobject initialElement) { - java_booleanarray *ba; + classinfo *c; + java_handle_t *o; + java_objectarray *oa; + s4 i; STATISTICS(jniinvokation()); - ba = (java_booleanarray *) array; + c = (classinfo *) elementClass; + o = (java_handle_t *) initialElement; - if ((start < 0) || (len < 0) || (start + len > ba->header.size)) - exceptions_throw_arrayindexoutofboundsexception(); - else - MCOPY(&ba->data[start], buf, u1, len); -} + if (length < 0) { + exceptions_throw_negativearraysizeexception(); + return NULL; + } + oa = builtin_anewarray(length, c); -void _Jv_JNI_SetByteArrayRegion(JNIEnv *env, jbyteArray array, jsize start, - jsize len, const jbyte *buf) -{ - java_bytearray *ba; + if (oa == NULL) + return NULL; - STATISTICS(jniinvokation()); + /* set all elements to initialElement */ - ba = (java_bytearray *) array; + for (i = 0; i < length; i++) + oa->data[i] = o; - if ((start < 0) || (len < 0) || (start + len > ba->header.size)) - exceptions_throw_arrayindexoutofboundsexception(); - else - MCOPY(&ba->data[start], buf, s1, len); + return (jobjectArray) _Jv_JNI_NewLocalRef(env, (jobject) oa); } -void _Jv_JNI_SetCharArrayRegion(JNIEnv *env, jcharArray array, jsize start, - jsize len, const jchar *buf) +jobject _Jv_JNI_GetObjectArrayElement(JNIEnv *env, jobjectArray array, + jsize index) { - java_chararray *ca; + java_objectarray *oa; + java_handle_t *o; STATISTICS(jniinvokation()); - ca = (java_chararray *) array; + oa = (java_objectarray *) array; - if ((start < 0) || (len < 0) || (start + len > ca->header.size)) + if (index >= oa->header.size) { exceptions_throw_arrayindexoutofboundsexception(); - else - MCOPY(&ca->data[start], buf, u2, len); + return NULL; + } + + o = oa->data[index]; + + return _Jv_JNI_NewLocalRef(env, (jobject) o); } -void _Jv_JNI_SetShortArrayRegion(JNIEnv *env, jshortArray array, jsize start, - jsize len, const jshort *buf) +void _Jv_JNI_SetObjectArrayElement(JNIEnv *env, jobjectArray array, + jsize index, jobject val) { - java_shortarray *sa; + java_objectarray *oa; + java_handle_t *o; STATISTICS(jniinvokation()); - sa = (java_shortarray *) array; + oa = (java_objectarray *) array; + o = (java_handle_t *) val; - if ((start < 0) || (len < 0) || (start + len > sa->header.size)) + if (index >= oa->header.size) { exceptions_throw_arrayindexoutofboundsexception(); - else - MCOPY(&sa->data[start], buf, s2, len); -} + return; + } + /* check if the class of value is a subclass of the element class + of the array */ -void _Jv_JNI_SetIntArrayRegion(JNIEnv *env, jintArray array, jsize start, - jsize len, const jint *buf) -{ - java_intarray *ia; + if (!builtin_canstore(oa, o)) + return; - STATISTICS(jniinvokation()); + oa->data[index] = o; +} - ia = (java_intarray *) array; - if ((start < 0) || (len < 0) || (start + len > ia->header.size)) - exceptions_throw_arrayindexoutofboundsexception(); - else - MCOPY(&ia->data[start], buf, s4, len); +#define JNI_NEW_ARRAY(name, type, intern) \ +type _Jv_JNI_New##name##Array(JNIEnv *env, jsize len) \ +{ \ + java_##intern##array *a; \ + \ + STATISTICS(jniinvokation()); \ + \ + if (len < 0) { \ + exceptions_throw_negativearraysizeexception(); \ + return NULL; \ + } \ + \ + a = builtin_newarray_##intern(len); \ + \ + return (type) _Jv_JNI_NewLocalRef(env, (jobject) a); \ } +JNI_NEW_ARRAY(Boolean, jbooleanArray, boolean) +JNI_NEW_ARRAY(Byte, jbyteArray, byte) +JNI_NEW_ARRAY(Char, jcharArray, char) +JNI_NEW_ARRAY(Short, jshortArray, byte) +JNI_NEW_ARRAY(Int, jintArray, int) +JNI_NEW_ARRAY(Long, jlongArray, long) +JNI_NEW_ARRAY(Float, jfloatArray, float) +JNI_NEW_ARRAY(Double, jdoubleArray, double) -void _Jv_JNI_SetLongArrayRegion(JNIEnv* env, jlongArray array, jsize start, - jsize len, const jlong *buf) -{ - java_longarray *la; - STATISTICS(jniinvokation()); +/* GetArrayElements ********************************************* - la = (java_longarray *) array; + A family of functions that returns the body of the primitive array. - if ((start < 0) || (len < 0) || (start + len > la->header.size)) - exceptions_throw_arrayindexoutofboundsexception(); - else - MCOPY(&la->data[start], buf, s8, len); -} +*******************************************************************************/ +#define JNI_GET_ARRAY_ELEMENTS(name, type, intern) \ +type *_Jv_JNI_Get##name##ArrayElements(JNIEnv *env, type##Array array, \ + jboolean *isCopy) \ +{ \ + java_##intern##array *a; \ + \ + STATISTICS(jniinvokation()); \ + \ + a = (java_##intern##array *) array; \ + \ + if (isCopy) \ + *isCopy = JNI_FALSE; \ + \ + return a->data; \ +} + +JNI_GET_ARRAY_ELEMENTS(Boolean, jboolean, boolean) +JNI_GET_ARRAY_ELEMENTS(Byte, jbyte, byte) +JNI_GET_ARRAY_ELEMENTS(Char, jchar, char) +JNI_GET_ARRAY_ELEMENTS(Short, jshort, short) +JNI_GET_ARRAY_ELEMENTS(Int, jint, int) +JNI_GET_ARRAY_ELEMENTS(Long, jlong, long) +JNI_GET_ARRAY_ELEMENTS(Float, jfloat, float) +JNI_GET_ARRAY_ELEMENTS(Double, jdouble, double) -void _Jv_JNI_SetFloatArrayRegion(JNIEnv *env, jfloatArray array, jsize start, - jsize len, const jfloat *buf) -{ - java_floatarray *fa; - STATISTICS(jniinvokation()); +/* ReleaseArrayElements ***************************************** - fa = (java_floatarray *) array; + A family of functions that informs the VM that the native code no + longer needs access to elems. The elems argument is a pointer + derived from array using the corresponding + GetArrayElements() function. If necessary, this + function copies back all changes made to elems to the original + array. - if ((start < 0) || (len < 0) || (start + len > fa->header.size)) - exceptions_throw_arrayindexoutofboundsexception(); - else - MCOPY(&fa->data[start], buf, float, len); -} +*******************************************************************************/ +#define JNI_RELEASE_ARRAY_ELEMENTS(name, type, intern, intern2) \ +void _Jv_JNI_Release##name##ArrayElements(JNIEnv *env, type##Array array, \ + type *elems, jint mode) \ +{ \ + java_##intern##array *a; \ + \ + STATISTICS(jniinvokation()); \ + \ + a = (java_##intern##array *) array; \ + \ + if (elems != a->data) { \ + switch (mode) { \ + case JNI_COMMIT: \ + MCOPY(a->data, elems, intern2, a->header.size); \ + break; \ + case 0: \ + MCOPY(a->data, elems, intern2, a->header.size); \ + /* XXX TWISTI how should it be freed? */ \ + break; \ + case JNI_ABORT: \ + /* XXX TWISTI how should it be freed? */ \ + break; \ + } \ + } \ +} + +JNI_RELEASE_ARRAY_ELEMENTS(Boolean, jboolean, boolean, u1) +JNI_RELEASE_ARRAY_ELEMENTS(Byte, jbyte, byte, s1) +JNI_RELEASE_ARRAY_ELEMENTS(Char, jchar, char, u2) +JNI_RELEASE_ARRAY_ELEMENTS(Short, jshort, short, s2) +JNI_RELEASE_ARRAY_ELEMENTS(Int, jint, int, s4) +JNI_RELEASE_ARRAY_ELEMENTS(Long, jlong, long, s8) +JNI_RELEASE_ARRAY_ELEMENTS(Float, jfloat, float, float) +JNI_RELEASE_ARRAY_ELEMENTS(Double, jdouble, double, double) -void _Jv_JNI_SetDoubleArrayRegion(JNIEnv *env, jdoubleArray array, jsize start, - jsize len, const jdouble *buf) -{ - java_doublearray *da; - STATISTICS(jniinvokation()); +/* GetArrayRegion ********************************************** + + A family of functions that copies a region of a primitive array + into a buffer. - da = (java_doublearray *) array; +*******************************************************************************/ - if ((start < 0) || (len < 0) || (start + len > da->header.size)) - exceptions_throw_arrayindexoutofboundsexception(); - else - MCOPY(&da->data[start], buf, double, len); -} +#define JNI_GET_ARRAY_REGION(name, type, intern, intern2) \ +void _Jv_JNI_Get##name##ArrayRegion(JNIEnv *env, type##Array array, \ + jsize start, jsize len, type *buf) \ +{ \ + java_##intern##array *a; \ + \ + STATISTICS(jniinvokation()); \ + \ + a = (java_##intern##array *) array; \ + \ + if ((start < 0) || (len < 0) || (start + len > a->header.size)) \ + exceptions_throw_arrayindexoutofboundsexception(); \ + else \ + MCOPY(buf, &a->data[start], intern2, len); \ +} + +JNI_GET_ARRAY_REGION(Boolean, jboolean, boolean, u1) +JNI_GET_ARRAY_REGION(Byte, jbyte, byte, s1) +JNI_GET_ARRAY_REGION(Char, jchar, char, u2) +JNI_GET_ARRAY_REGION(Short, jshort, short, s2) +JNI_GET_ARRAY_REGION(Int, jint, int, s4) +JNI_GET_ARRAY_REGION(Long, jlong, long, s8) +JNI_GET_ARRAY_REGION(Float, jfloat, float, float) +JNI_GET_ARRAY_REGION(Double, jdouble, double, double) + + +/* SetArrayRegion ********************************************** + + A family of functions that copies back a region of a primitive + array from a buffer. + +*******************************************************************************/ + +#define JNI_SET_ARRAY_REGION(name, type, intern, intern2) \ +void _Jv_JNI_Set##name##ArrayRegion(JNIEnv *env, type##Array array, \ + jsize start, jsize len, const type *buf) \ +{ \ + java_##intern##array *a; \ + \ + STATISTICS(jniinvokation()); \ + \ + a = (java_##intern##array *) array; \ + \ + if ((start < 0) || (len < 0) || (start + len > a->header.size)) \ + exceptions_throw_arrayindexoutofboundsexception(); \ + else \ + MCOPY(&a->data[start], buf, intern2, len); \ +} + +JNI_SET_ARRAY_REGION(Boolean, jboolean, boolean, u1) +JNI_SET_ARRAY_REGION(Byte, jbyte, byte, s1) +JNI_SET_ARRAY_REGION(Char, jchar, char, u2) +JNI_SET_ARRAY_REGION(Short, jshort, short, s2) +JNI_SET_ARRAY_REGION(Int, jint, int, s4) +JNI_SET_ARRAY_REGION(Long, jlong, long, s8) +JNI_SET_ARRAY_REGION(Float, jfloat, float, float) +JNI_SET_ARRAY_REGION(Double, jdouble, double, double) /* Registering Native Methods *************************************************/ @@ -5566,10 +3277,10 @@ void _Jv_JNI_GetStringRegion(JNIEnv* env, jstring str, jsize start, jsize len, STATISTICS(jniinvokation()); s = (java_lang_String *) str; - ca = s->value; + LLNI_field_get_ref(s, value, ca); - if ((start < 0) || (len < 0) || (start > s->count) || - (start + len > s->count)) { + if ((start < 0) || (len < 0) || (start > LLNI_field_direct(s, count)) || + (start + len > LLNI_field_direct(s, count))) { exceptions_throw_stringindexoutofboundsexception(); return; } @@ -5598,16 +3309,16 @@ void _Jv_JNI_GetStringUTFRegion(JNIEnv* env, jstring str, jsize start, TRACEJNICALLS("_Jv_JNI_GetStringUTFRegion(env=%p, str=%p, start=%d, len=%d, buf=%p)", env, str, start, len, buf); s = (java_lang_String *) str; - ca = s->value; + LLNI_field_get_ref(s, value, ca); - if ((start < 0) || (len < 0) || (start > s->count) || - (start + len > s->count)) { + if ((start < 0) || (len < 0) || (start > LLNI_field_direct(s, count)) || + (start + len > LLNI_field_direct(s, count))) { exceptions_throw_stringindexoutofboundsexception(); return; } for (i = 0; i < len; i++) - buf[i] = ca->data[s->offset + start + i]; + buf[i] = ca->data[LLNI_field_direct(s, offset) + start + i]; buf[i] = '\0'; } @@ -5708,11 +3419,11 @@ jobject _Jv_JNI_NewGlobalRef(JNIEnv* env, jobject obj) hashtable_global_ref_entry *gre; u4 key; /* hashkey */ u4 slot; /* slot in hashtable */ - java_objectheader *o; + java_handle_t *o; STATISTICS(jniinvokation()); - o = (java_objectheader *) obj; + o = (java_handle_t *) obj; LOCK_MONITOR_ENTER(hashtable_global_ref->header); @@ -5779,11 +3490,11 @@ void _Jv_JNI_DeleteGlobalRef(JNIEnv* env, jobject globalRef) hashtable_global_ref_entry *prevgre; u4 key; /* hashkey */ u4 slot; /* slot in hashtable */ - java_objectheader *o; + java_handle_t *o; STATISTICS(jniinvokation()); - o = (java_objectheader *) globalRef; + o = (java_handle_t *) globalRef; LOCK_MONITOR_ENTER(hashtable_global_ref->header); @@ -5848,7 +3559,7 @@ void _Jv_JNI_DeleteGlobalRef(JNIEnv* env, jobject globalRef) jboolean _Jv_JNI_ExceptionCheck(JNIEnv *env) { - java_objectheader *o; + java_handle_t *o; STATISTICS(jniinvokation()); @@ -5871,7 +3582,7 @@ jboolean _Jv_JNI_ExceptionCheck(JNIEnv *env) jobject _Jv_JNI_NewDirectByteBuffer(JNIEnv *env, void *address, jlong capacity) { #if defined(ENABLE_JAVASE) && defined(WITH_CLASSPATH_GNU) - java_objectheader *nbuf; + java_handle_t *nbuf; # if SIZEOF_VOID_P == 8 gnu_classpath_Pointer64 *paddress; @@ -5894,7 +3605,7 @@ jobject _Jv_JNI_NewDirectByteBuffer(JNIEnv *env, void *address, jlong capacity) /* fill gnu.classpath.Pointer{32,64} with address */ - paddress->data = (ptrint) address; + LLNI_field_set_val(paddress, data, (ptrint) address); /* create a java.nio.DirectByteBufferImpl$ReadWrite object */ @@ -5927,10 +3638,11 @@ void *_Jv_JNI_GetDirectBufferAddress(JNIEnv *env, jobject buf) #if defined(ENABLE_JAVASE) && defined(WITH_CLASSPATH_GNU) java_nio_DirectByteBufferImpl *nbuf; # if SIZEOF_VOID_P == 8 - gnu_classpath_Pointer64 *address; + gnu_classpath_Pointer64 *paddress; # else - gnu_classpath_Pointer32 *address; + gnu_classpath_Pointer32 *paddress; # endif + void *address; STATISTICS(jniinvokation()); @@ -5940,15 +3652,20 @@ void *_Jv_JNI_GetDirectBufferAddress(JNIEnv *env, jobject buf) nbuf = (java_nio_DirectByteBufferImpl *) buf; # if SIZEOF_VOID_P == 8 - address = (gnu_classpath_Pointer64 *) nbuf->address; + LLNI_field_get_ref(nbuf, address, paddress); + /* this was the cast to avaoid warning: (gnu_classpath_Pointer64 *) nbuf->address; */ # else - address = (gnu_classpath_Pointer32 *) nbuf->address; + LLNI_field_get_ref(nbuf, address, paddress); + /* this was the cast to avaoid warning: (gnu_classpath_Pointer32 *) nbuf->address; */ # endif - if (address == NULL) + if (paddress == NULL) return NULL; - return (void *) address->data; + LLNI_field_get_val(paddress, data, address); + /* this was the cast to avaoid warning: (void *) paddress->data */ + + return address; #else vm_abort("_Jv_JNI_GetDirectBufferAddress: not implemented in this configuration"); @@ -5969,19 +3686,22 @@ void *_Jv_JNI_GetDirectBufferAddress(JNIEnv *env, jobject buf) jlong _Jv_JNI_GetDirectBufferCapacity(JNIEnv* env, jobject buf) { #if defined(ENABLE_JAVASE) && defined(WITH_CLASSPATH_GNU) - java_objectheader *o; - java_nio_Buffer *nbuf; + java_handle_t *o; + java_nio_Buffer *nbuf; + jlong capacity; STATISTICS(jniinvokation()); - o = (java_objectheader *) buf; + o = (java_handle_t *) buf; if (!builtin_instanceof(o, class_java_nio_DirectByteBufferImpl)) return -1; nbuf = (java_nio_Buffer *) o; - return (jlong) nbuf->cap; + LLNI_field_get_val(nbuf, cap, capacity); + + return capacity; #else vm_abort("_Jv_JNI_GetDirectBufferCapacity: not implemented in this configuration"); @@ -6043,7 +3763,7 @@ static s4 jni_attach_current_thread(void **p_env, void *thr_args, bool isdaemon) if (!threads_attach_current_thread(vm_aargs, false)) return JNI_ERR; - if (!jni_init_localref_table()) + if (!localref_table_init()) return JNI_ERR; } #endif