* exceptions_throw_illegalargumentexception,
[cacao.git] / src / native / jni.c
index f59fecb51fb5ba97fefeb1ecfe0d385bf11b2785..c1711f00ada23c40ad4bb476e2b3fb52a9745c6c 100644 (file)
             Martin Platter
             Christian Thalinger
 
-   $Id: jni.c 3663 2005-11-11 14:06:36Z twisti $
+   $Id: jni.c 4123 2006-01-10 20:46:50Z twisti $
 
 */
 
 
+#include "config.h"
+
 #include <assert.h>
 #include <string.h>
 
-#include "config.h"
+#include "vm/types.h"
 
 #include "mm/boehm.h"
 #include "mm/memory.h"
@@ -96,7 +98,6 @@
 #include "vm/resolve.h"
 #include "vm/statistics.h"
 #include "vm/stringlocal.h"
-#include "vm/tables.h"
 #include "vm/jit/asmpart.h"
 #include "vm/jit/jit.h"
 #include "vm/statistics.h"
@@ -130,20 +131,22 @@ static methodinfo *removemid = NULL;
 
 /* direct buffer stuff ********************************************************/
 
-static utf *utf_java_nio_DirectByteBufferImpl;
+static utf *utf_java_nio_DirectByteBufferImpl_ReadWrite;
 #if SIZEOF_VOID_P == 8
 static utf *utf_gnu_classpath_Pointer64;
 #else
 static utf *utf_gnu_classpath_Pointer32;
 #endif
 
-static classinfo *class_java_nio_DirectByteBufferImpl;
+static classinfo *class_java_nio_DirectByteBufferImpl_ReadWrite;
 #if SIZEOF_VOID_P == 8
 static classinfo *class_gnu_classpath_Pointer64;
 #else
 static classinfo *class_gnu_classpath_Pointer32;
 #endif
 
+static methodinfo *dbbirw_init;
+
 
 /* local reference table ******************************************************/
 
@@ -152,10 +155,13 @@ localref_table *_no_threads_localref_table;
 #endif
 
 
-/********************* accessing instance-fields **********************************/
+/* accessing instance fields macros *******************************************/
 
-#define setField(obj,typ,var,val) *((typ*) ((long int) obj + (long int) var->offset))=val;  
-#define getField(obj,typ,var)     *((typ*) ((long int) obj + (long int) var->offset))
+#define SET_FIELD(obj,type,var,value) \
+    *((type *) ((ptrint) (obj) + (ptrint) (var)->offset)) = (type) (value)
+
+#define GET_FIELD(obj,type,var) \
+    *((type *) ((ptrint) (obj) + (ptrint) (var)->offset))
 
 
 /* some forward declarations **************************************************/
@@ -198,14 +204,20 @@ bool jni_init(void)
 
        /* direct buffer stuff */
 
-       utf_java_nio_DirectByteBufferImpl =
-               utf_new_char("java/nio/DirectByteBufferImpl");
+       utf_java_nio_DirectByteBufferImpl_ReadWrite =
+               utf_new_char("java/nio/DirectByteBufferImpl$ReadWrite");
+
+       if (!(class_java_nio_DirectByteBufferImpl_ReadWrite =
+                 load_class_bootstrap(utf_java_nio_DirectByteBufferImpl_ReadWrite)))
+               return false;
 
-       if (!(class_java_nio_DirectByteBufferImpl =
-                 load_class_bootstrap(utf_java_nio_DirectByteBufferImpl)))
+       if (!link_class(class_java_nio_DirectByteBufferImpl_ReadWrite))
                return false;
 
-       if (!link_class(class_java_nio_DirectByteBufferImpl))
+       if (!(dbbirw_init =
+               class_resolvemethod(class_java_nio_DirectByteBufferImpl_ReadWrite,
+                                                       utf_init,
+                                                       utf_new_char("(Ljava/lang/Object;Lgnu/classpath/Pointer;III)V"))))
                return false;
 
 #if SIZEOF_VOID_P == 8
@@ -460,7 +472,7 @@ static bool fill_callblock_from_objectarray(void *obj, methoddesc *descr,
        return true;
 
 illegal_arg:
-       *exceptionptr = new_illegalargumentexception();
+       exceptions_throw_illegalargumentexception();
        return false;
 }
 
@@ -513,7 +525,7 @@ static jobject callObjectMethod(jobject obj, jmethodID methodID, va_list args)
 
        fill_callblock_from_vargs(obj, methodID->parseddesc, blk, args, TYPE_ADR);
 
-       STATS(jnicallXmethodnvokation();)
+       STATISTICS(jnicallXmethodnvokation());
 
        ret = asm_calljavafunction2(methodID,
                                                                argcount,
@@ -536,7 +548,7 @@ static jint callIntegerMethod(jobject obj, jmethodID methodID, int retType, va_l
        jni_callblock *blk;
        jint ret;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
         /*
         log_text("JNI-Call: CallObjectMethodV");
@@ -568,7 +580,7 @@ static jint callIntegerMethod(jobject obj, jmethodID methodID, int retType, va_l
 
        fill_callblock_from_vargs(obj, methodID->parseddesc, blk, args, retType);
 
-       STATS(jnicallXmethodnvokation();)
+       STATISTICS(jnicallXmethodnvokation());
 
        ret = asm_calljavafunction2int(methodID,
                                                                   argcount,
@@ -593,7 +605,7 @@ static jlong callLongMethod(jobject obj, jmethodID methodID, va_list args)
        jni_callblock *blk;
        jlong          ret;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (methodID == 0) {
                *exceptionptr = new_exception(string_java_lang_NoSuchMethodError); 
@@ -617,7 +629,7 @@ static jlong callLongMethod(jobject obj, jmethodID methodID, va_list args)
 
        fill_callblock_from_vargs(obj, methodID->parseddesc, blk, args, TYPE_LNG);
 
-       STATS(jnicallXmethodnvokation();)
+       STATISTICS(jnicallXmethodnvokation());
 
        ret = asm_calljavafunction2long(methodID,
                                                                        argcount,
@@ -637,7 +649,7 @@ static jdouble callFloatMethod(jobject obj, jmethodID methodID, va_list args,int
        jni_callblock *blk;
        jdouble ret;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        assert(0);
 
@@ -652,7 +664,9 @@ static jdouble callFloatMethod(jobject obj, jmethodID methodID, va_list args,int
        fill_callblock_from_vargs(obj, methodID->parseddesc, blk, args, retType);
 
        /*      printf("parameter: obj: %p",blk[0].item); */
-       STATS(jnicallXmethodnvokation();)
+
+       STATISTICS(jnicallXmethodnvokation());
+
        ret = asm_calljavafunction2double(methodID,
                                                                          argcount + 1,
                                                                          (argcount + 1) * sizeof(jni_callblock),
@@ -696,7 +710,7 @@ static void cacao_jni_CallVoidMethod(jobject obj, jmethodID m, va_list ap)
 
        fill_callblock_from_vargs(obj, m->parseddesc, blk, ap, TYPE_VOID);
 
-       STATS(jnicallXmethodnvokation();)
+       STATISTICS(jnicallXmethodnvokation());
 
        (void) asm_calljavafunction2(m,
                                                                 paramcount,
@@ -718,7 +732,7 @@ static void cacao_jni_CallVoidMethod(jobject obj, jmethodID m, va_list ap)
 
 jint GetVersion(JNIEnv *env)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        /* we support JNI 1.4 */
 
@@ -744,7 +758,7 @@ jclass DefineClass(JNIEnv *env, const char *name, jobject loader,
        java_bytearray        *ba;
        jclass                 c;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        cl = (java_lang_ClassLoader *) loader;
        s = javastring_new_char(name);
@@ -771,7 +785,7 @@ jclass FindClass(JNIEnv *env, const char *name)
        classinfo         *c;
        java_objectheader *cl;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        u = utf_new_char_classname((char *) name);
 
@@ -799,9 +813,6 @@ jclass FindClass(JNIEnv *env, const char *name)
        if (!link_class(c))
                return NULL;
 
-       if (!use_class_as_object(c))
-               return NULL;
-
        return (jclass) NewLocalRef(env, (jobject) c);
 }
   
@@ -819,7 +830,7 @@ jmethodID FromReflectedMethod(JNIEnv *env, jobject method)
        classinfo  *c;
        s4          slot;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (method == NULL)
                return NULL;
@@ -866,16 +877,13 @@ jclass GetSuperclass(JNIEnv *env, jclass sub)
 {
        classinfo *c;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        c = ((classinfo *) sub)->super.cls;
 
        if (!c)
                return NULL;
 
-       if (!use_class_as_object(c))
-               return NULL;
-
        return (jclass) NewLocalRef(env, (jobject) c);
 }
   
@@ -888,7 +896,8 @@ jclass GetSuperclass(JNIEnv *env, jclass sub)
 
 jboolean IsAssignableFrom(JNIEnv *env, jclass sub, jclass sup)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
        return Java_java_lang_VMClass_isAssignableFrom(env,
                                                                                                   NULL,
                                                                                                   (java_lang_Class *) sup,
@@ -896,16 +905,6 @@ jboolean IsAssignableFrom(JNIEnv *env, jclass sub, jclass sup)
 }
 
 
-/***** converts a field ID derived from cls to a java.lang.reflect.Field object ***/
-
-jobject ToReflectedField(JNIEnv* env, jclass cls, jfieldID fieldID, jboolean isStatic)
-{
-       log_text("JNI-Call: ToReflectedField: IMPLEMENT ME!!!");
-       STATS(jniinvokation();)
-       return NULL;
-}
-
-
 /* Throw ***********************************************************************
 
    Causes a java.lang.Throwable object to be thrown.
@@ -914,8 +913,9 @@ jobject ToReflectedField(JNIEnv* env, jclass cls, jfieldID fieldID, jboolean isS
 
 jint Throw(JNIEnv *env, jthrowable obj)
 {
+       STATISTICS(jniinvokation());
+
        *exceptionptr = (java_objectheader *) obj;
-       STATS(jniinvokation();)
 
        return JNI_OK;
 }
@@ -933,7 +933,8 @@ jint ThrowNew(JNIEnv* env, jclass clazz, const char *msg)
 {
        java_lang_Throwable *o;
        java_lang_String    *s;
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
 
        s = (java_lang_String *) javastring_new_char(msg);
 
@@ -963,7 +964,7 @@ jthrowable ExceptionOccurred(JNIEnv *env)
 {
        java_objectheader *e;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        e = *exceptionptr;
 
@@ -983,7 +984,8 @@ void ExceptionDescribe(JNIEnv *env)
 {
        java_objectheader *e;
        methodinfo        *m;
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
 
        e = *exceptionptr;
 
@@ -1020,7 +1022,7 @@ void ExceptionDescribe(JNIEnv *env)
 
 void ExceptionClear(JNIEnv *env)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        *exceptionptr = NULL;
 }
@@ -1035,7 +1037,7 @@ void ExceptionClear(JNIEnv *env)
 
 void FatalError(JNIEnv *env, const char *msg)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        throw_cacao_exception_exit(string_java_lang_InternalError, msg);
 }
@@ -1050,7 +1052,7 @@ void FatalError(JNIEnv *env, const char *msg)
 
 jint PushLocalFrame(JNIEnv* env, jint capacity)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        log_text("JNI-Call: PushLocalFrame: IMPLEMENT ME!");
 
@@ -1069,7 +1071,7 @@ jint PushLocalFrame(JNIEnv* env, jint capacity)
 
 jobject PopLocalFrame(JNIEnv* env, jobject result)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        log_text("JNI-Call: PopLocalFrame: IMPLEMENT ME!");
 
@@ -1093,7 +1095,7 @@ void DeleteLocalRef(JNIEnv *env, jobject localRef)
        localref_table    *lrt;
        s4                 i;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        o = (java_objectheader *) localRef;
 
@@ -1128,7 +1130,7 @@ void DeleteLocalRef(JNIEnv *env, jobject localRef)
 
 jboolean IsSameObject(JNIEnv *env, jobject ref1, jobject ref2)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (ref1 == ref2)
                return JNI_TRUE;
@@ -1148,7 +1150,7 @@ jobject NewLocalRef(JNIEnv *env, jobject ref)
        localref_table *lrt;
        s4              i;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (ref == NULL)
                return NULL;
@@ -1195,7 +1197,7 @@ jint EnsureLocalCapacity(JNIEnv* env, jint capacity)
 {
        localref_table *lrt;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        /* get local reference table (thread specific) */
 
@@ -1223,7 +1225,7 @@ jobject AllocObject(JNIEnv *env, jclass clazz)
 {
        java_objectheader *o;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if ((clazz->flags & ACC_INTERFACE) || (clazz->flags & ACC_ABSTRACT)) {
                *exceptionptr =
@@ -1252,7 +1254,7 @@ jobject NewObject(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
        java_objectheader *o;
        va_list            ap;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        /* create object */
 
@@ -1280,7 +1282,7 @@ jobject NewObject(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
 
 jobject NewObjectV(JNIEnv* env, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        log_text("JNI-Call: NewObjectV: IMPLEMENT ME!");
 
@@ -1298,7 +1300,7 @@ jobject NewObjectV(JNIEnv* env, jclass clazz, jmethodID methodID, va_list args)
 
 jobject NewObjectA(JNIEnv* env, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        log_text("JNI-Call: NewObjectA: IMPLEMENT ME!");
 
@@ -1316,16 +1318,13 @@ jclass GetObjectClass(JNIEnv *env, jobject obj)
 {
        classinfo *c;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
        
        if (!obj || !obj->vftbl)
                return NULL;
 
        c = obj->vftbl->class;
 
-       if (!use_class_as_object(c))
-               return NULL;
-
        return (jclass) NewLocalRef(env, (jobject) c);
 }
 
@@ -1338,7 +1337,7 @@ jclass GetObjectClass(JNIEnv *env, jobject obj)
 
 jboolean IsInstanceOf(JNIEnv *env, jobject obj, jclass clazz)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        return Java_java_lang_VMClass_isInstance(env,
                                                                                         NULL,
@@ -1354,7 +1353,9 @@ jfieldID FromReflectedField(JNIEnv* env, jobject field)
        java_lang_reflect_Field *f;
        classinfo *c;
        jfieldID fid;   /* the JNI-fieldid of the wrapping object */
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
+
        /*log_text("JNI-Call: FromReflectedField");*/
 
        f=(java_lang_reflect_Field *)field;
@@ -1371,17 +1372,37 @@ jfieldID FromReflectedField(JNIEnv* env, jobject field)
 }
 
 
-/**********************************************************************************
+/* ToReflectedMethod ***********************************************************
 
-       converts a method ID to a java.lang.reflect.Method or 
-       java.lang.reflect.Constructor object
+   Converts a method ID derived from cls to an instance of the
+   java.lang.reflect.Method class or to an instance of the
+   java.lang.reflect.Constructor class.
 
-**********************************************************************************/
+*******************************************************************************/
 
 jobject ToReflectedMethod(JNIEnv* env, jclass cls, jmethodID methodID, jboolean isStatic)
 {
-       log_text("JNI-Call: ToReflectedMethod");
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: ToReflectedMethod: IMPLEMENT ME!");
+
+       return NULL;
+}
+
+
+/* ToReflectedField ************************************************************
+
+   Converts a field ID derived from cls to an instance of the
+   java.lang.reflect.Field class.
+
+*******************************************************************************/
+
+jobject ToReflectedField(JNIEnv* env, jclass cls, jfieldID fieldID,
+                                                jboolean isStatic)
+{
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: ToReflectedField: IMPLEMENT ME!");
 
        return NULL;
 }
@@ -1408,14 +1429,14 @@ jmethodID GetMethodID(JNIEnv* env, jclass clazz, const char *name,
        utf        *udesc;
        methodinfo *m;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        c = (classinfo *) clazz;
 
        if (!c)
                return NULL;
 
-       if (!c->initialized)
+       if (!(c->state & CLASS_INITIALIZED))
                if (!initialize_class(c))
                        return NULL;
 
@@ -1443,7 +1464,7 @@ jobject CallObjectMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
        java_objectheader* ret;
        va_list            vaargs;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        va_start(vaargs, methodID);
        ret = callObjectMethod(obj, methodID, vaargs);
@@ -1457,7 +1478,7 @@ jobject CallObjectMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list
 {
        java_objectheader* ret;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        ret = callObjectMethod(obj, methodID, args);
 
@@ -1467,7 +1488,7 @@ jobject CallObjectMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list
 
 jobject CallObjectMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        log_text("JNI-Call: CallObjectMethodA: IMPLEMENT ME!");
 
@@ -1481,7 +1502,8 @@ jboolean CallBooleanMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
 {
        jboolean ret;
        va_list vaargs;
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
 
 /*     log_text("JNI-Call: CallBooleanMethod");*/
 
@@ -1494,7 +1516,7 @@ jboolean CallBooleanMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
 
 jboolean CallBooleanMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        return (jboolean)callIntegerMethod(obj,get_virtual(obj,methodID),PRIMITIVETYPE_BOOLEAN,args);
 
@@ -1502,7 +1524,8 @@ jboolean CallBooleanMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_li
 
 jboolean CallBooleanMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
        log_text("JNI-Call: CallBooleanMethodA");
 
        return 0;
@@ -1512,7 +1535,8 @@ jbyte CallByteMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
 {
        jbyte ret;
        va_list vaargs;
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
 
 /*     log_text("JNI-Call: CallVyteMethod");*/
 
@@ -1526,7 +1550,8 @@ jbyte CallByteMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
 jbyte CallByteMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
 {
 /*     log_text("JNI-Call: CallByteMethodV");*/
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
 
        return callIntegerMethod(obj,methodID,PRIMITIVETYPE_BYTE,args);
 }
@@ -1534,8 +1559,9 @@ jbyte CallByteMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list arg
 
 jbyte CallByteMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
 {
-       log_text("JNI-Call: CallByteMethodA");
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallByteMethodA: IMPLEMENT ME!");
 
        return 0;
 }
@@ -1545,7 +1571,8 @@ jchar CallCharMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
 {
        jchar ret;
        va_list vaargs;
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
 
 /*     log_text("JNI-Call: CallCharMethod");*/
 
@@ -1559,18 +1586,19 @@ jchar CallCharMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
 
 jchar CallCharMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
 /*     log_text("JNI-Call: CallCharMethodV");*/
+
        return callIntegerMethod(obj,get_virtual(obj,methodID),PRIMITIVETYPE_CHAR,args);
 }
 
 
 jchar CallCharMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       log_text("JNI-Call: CallCharMethodA");
+       log_text("JNI-Call: CallCharMethodA: IMPLEMENT ME!");
 
        return 0;
 }
@@ -1580,7 +1608,8 @@ jshort CallShortMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
 {
        jshort ret;
        va_list vaargs;
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
 
 /*     log_text("JNI-Call: CallShortMethod");*/
 
@@ -1594,15 +1623,17 @@ jshort CallShortMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
 
 jshort CallShortMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
        return callIntegerMethod(obj, get_virtual(obj, methodID),PRIMITIVETYPE_SHORT, args);
 }
 
 
 jshort CallShortMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallShortMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallShortMethodA: IMPLEMENT ME!");
 
        return 0;
 }
@@ -1613,7 +1644,8 @@ jint CallIntMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
 {
        jint ret;
        va_list vaargs;
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
 
        va_start(vaargs,methodID);
        ret = callIntegerMethod(obj, get_virtual(obj, methodID),PRIMITIVETYPE_INT, vaargs);
@@ -1625,15 +1657,17 @@ jint CallIntMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
 
 jint CallIntMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
        return callIntegerMethod(obj, get_virtual(obj, methodID),PRIMITIVETYPE_INT, args);
 }
 
 
 jint CallIntMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallIntMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallIntMethodA: IMPLEMENT ME!");
 
        return 0;
 }
@@ -1644,8 +1678,9 @@ jlong CallLongMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
 {
        jlong ret;
        va_list vaargs;
-       STATS(jniinvokation();)
-       
+
+       STATISTICS(jniinvokation());
+
        va_start(vaargs,methodID);
        ret = callLongMethod(obj,get_virtual(obj, methodID),vaargs);
        va_end(vaargs);
@@ -1656,15 +1691,17 @@ jlong CallLongMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
 
 jlong CallLongMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
        return  callLongMethod(obj,get_virtual(obj, methodID),args);
 }
 
 
 jlong CallLongMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallLongMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallLongMethodA: IMPLEMENT ME!");
 
        return 0;
 }
@@ -1676,7 +1713,8 @@ jfloat CallFloatMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
        jfloat ret;
        va_list vaargs;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
 /*     log_text("JNI-Call: CallFloatMethod");*/
 
        va_start(vaargs,methodID);
@@ -1689,16 +1727,19 @@ jfloat CallFloatMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
 
 jfloat CallFloatMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallFloatMethodV");
+       STATISTICS(jniinvokation());
+
+/*     log_text("JNI-Call: CallFloatMethodV"); */
+
        return callFloatMethod(obj, get_virtual(obj, methodID), args, PRIMITIVETYPE_FLOAT);
 }
 
 
 jfloat CallFloatMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallFloatMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallFloatMethodA: IMPLEMENT ME!");
 
        return 0;
 }
@@ -1709,7 +1750,8 @@ jdouble CallDoubleMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
 {
        jdouble ret;
        va_list vaargs;
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
 
 /*     log_text("JNI-Call: CallDoubleMethod");*/
 
@@ -1723,16 +1765,20 @@ jdouble CallDoubleMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
 
 jdouble CallDoubleMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallDoubleMethodV");
+       STATISTICS(jniinvokation());
+
+/*     log_text("JNI-Call: CallDoubleMethodV"); */
+
        return callFloatMethod(obj, get_virtual(obj, methodID), args, PRIMITIVETYPE_DOUBLE);
 }
 
 
 jdouble CallDoubleMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallDoubleMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallDoubleMethodA: IMPLEMENT ME!");
+
        return 0;
 }
 
@@ -1741,7 +1787,8 @@ jdouble CallDoubleMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *
 void CallVoidMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
 {
        va_list vaargs;
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
 
        va_start(vaargs,methodID);
        (void) callIntegerMethod(obj, get_virtual(obj, methodID),TYPE_VOID, vaargs);
@@ -1749,25 +1796,28 @@ void CallVoidMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
 }
 
 
-void CallVoidMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
+void CallVoidMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
 {
-       log_text("JNI-Call: CallVoidMethodV");
-       STATS(jniinvokation();)
-       (void)callIntegerMethod(obj,get_virtual(obj,methodID),TYPE_VOID,args);
+       STATISTICS(jniinvokation());
+
+/*     log_text("JNI-Call: CallVoidMethodV"); */
+
+       (void) callIntegerMethod(obj, get_virtual(obj, methodID), TYPE_VOID,args);
 }
 
 
-void CallVoidMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args)
+void CallVoidMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallVoidMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallVoidMethodA: IMPLEMENT ME!");
 }
 
 
 
 jobject CallNonvirtualObjectMethod(JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        log_text("JNI-Call: CallNonvirtualObjectMethod: IMPLEMENT ME!");
 
@@ -1777,7 +1827,7 @@ jobject CallNonvirtualObjectMethod(JNIEnv *env, jobject obj, jclass clazz, jmeth
 
 jobject CallNonvirtualObjectMethodV(JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        log_text("JNI-Call: CallNonvirtualObjectMethodV: IMPLEMENT ME!");
 
@@ -1785,9 +1835,9 @@ jobject CallNonvirtualObjectMethodV(JNIEnv *env, jobject obj, jclass clazz, jmet
 }
 
 
-jobject CallNonvirtualObjectMethodA(JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args)
+jobject CallNonvirtualObjectMethodA(JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        log_text("JNI-Call: CallNonvirtualObjectMethodA: IMPLEMENT ME!");
 
@@ -1800,13 +1850,15 @@ jboolean CallNonvirtualBooleanMethod (JNIEnv *env, jobject obj, jclass clazz, jm
 {
        jboolean ret;
        va_list vaargs;
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
 
 /*     log_text("JNI-Call: CallNonvirtualBooleanMethod");*/
 
        va_start(vaargs,methodID);
        ret = (jboolean)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_BOOLEAN,vaargs);
        va_end(vaargs);
+
        return ret;
 
 }
@@ -1814,83 +1866,94 @@ jboolean CallNonvirtualBooleanMethod (JNIEnv *env, jobject obj, jclass clazz, jm
 
 jboolean CallNonvirtualBooleanMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
 /*     log_text("JNI-Call: CallNonvirtualBooleanMethodV");*/
+
        return (jboolean)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_BOOLEAN,args);
 }
 
 
-jboolean CallNonvirtualBooleanMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args)
+jboolean CallNonvirtualBooleanMethodA(JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallNonvirtualBooleanMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallNonvirtualBooleanMethodA: IMPLEMENT ME!");
 
        return 0;
 }
 
 
-
 jbyte CallNonvirtualByteMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
 {
        jbyte ret;
        va_list vaargs;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
 /*     log_text("JNI-Call: CallNonvirutalByteMethod");*/
 
        va_start(vaargs,methodID);
        ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_BYTE,vaargs);
        va_end(vaargs);
+
        return ret;
 }
 
 
 jbyte CallNonvirtualByteMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
        /*log_text("JNI-Call: CallNonvirtualByteMethodV"); */
-       return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_BYTE,args);
 
+       return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_BYTE,args);
 }
 
 
-jbyte CallNonvirtualByteMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
+jbyte CallNonvirtualByteMethodA(JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallNonvirtualByteMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallNonvirtualByteMethodA: IMPLEMENT ME!");
 
        return 0;
 }
 
 
 
-jchar CallNonvirtualCharMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
+jchar CallNonvirtualCharMethod(JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
 {
        jchar ret;
        va_list vaargs;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
 /*     log_text("JNI-Call: CallNonVirtualCharMethod");*/
 
        va_start(vaargs,methodID);
        ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_CHAR,vaargs);
        va_end(vaargs);
+
        return ret;
 }
 
 
 jchar CallNonvirtualCharMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
        /*log_text("JNI-Call: CallNonvirtualCharMethodV");*/
+
        return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_CHAR,args);
 }
 
 
 jchar CallNonvirtualCharMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallNonvirtualCharMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallNonvirtualCharMethodA: IMPLEMENT ME!");
 
        return 0;
 }
@@ -1901,29 +1964,34 @@ jshort CallNonvirtualShortMethod (JNIEnv *env, jobject obj, jclass clazz, jmetho
 {
        jshort ret;
        va_list vaargs;
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
 
        /*log_text("JNI-Call: CallNonvirtualShortMethod");*/
 
        va_start(vaargs,methodID);
        ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_SHORT,vaargs);
        va_end(vaargs);
+
        return ret;
 }
 
 
 jshort CallNonvirtualShortMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
        /*log_text("JNI-Call: CallNonvirtualShortMethodV");*/
+
        return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_SHORT,args);
 }
 
 
 jshort CallNonvirtualShortMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallNonvirtualShortMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallNonvirtualShortMethodA: IMPLEMENT ME!");
 
        return 0;
 }
@@ -1932,32 +2000,36 @@ jshort CallNonvirtualShortMethodA (JNIEnv *env, jobject obj, jclass clazz, jmeth
 
 jint CallNonvirtualIntMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
 {
+       jint ret;
+       va_list vaargs;
 
-        jint ret;
-        va_list vaargs;
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        /*log_text("JNI-Call: CallNonvirtualIntMethod");*/
 
-        va_start(vaargs,methodID);
-        ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_INT,vaargs);
-        va_end(vaargs);
-        return ret;
+       va_start(vaargs,methodID);
+       ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_INT,vaargs);
+       va_end(vaargs);
+
+       return ret;
 }
 
 
 jint CallNonvirtualIntMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
        /*log_text("JNI-Call: CallNonvirtualIntMethodV");*/
-        return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_INT,args);
+
+       return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_INT,args);
 }
 
 
 jint CallNonvirtualIntMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallNonvirtualIntMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallNonvirtualIntMethodA: IMPLEMENT ME!");
 
        return 0;
 }
@@ -1966,8 +2038,9 @@ jint CallNonvirtualIntMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID
 
 jlong CallNonvirtualLongMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallNonvirtualLongMethod");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallNonvirtualLongMethod: IMPLEMENT ME!");
 
        return 0;
 }
@@ -1975,8 +2048,9 @@ jlong CallNonvirtualLongMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodI
 
 jlong CallNonvirtualLongMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallNonvirtualLongMethodV");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallNonvirtualLongMethodV: IMPLEMENT ME!");
 
        return 0;
 }
@@ -1984,8 +2058,9 @@ jlong CallNonvirtualLongMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethod
 
 jlong CallNonvirtualLongMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallNonvirtualLongMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallNonvirtualLongMethodA: IMPLEMENT ME!");
 
        return 0;
 }
@@ -1996,31 +2071,34 @@ jfloat CallNonvirtualFloatMethod (JNIEnv *env, jobject obj, jclass clazz, jmetho
 {
        jfloat ret;
        va_list vaargs;
-       STATS(jniinvokation();)
 
-       /*log_text("JNI-Call: CallNonvirtualFloatMethod");*/
+       STATISTICS(jniinvokation());
 
+       /*log_text("JNI-Call: CallNonvirtualFloatMethod");*/
 
        va_start(vaargs,methodID);
        ret = callFloatMethod(obj,get_nonvirtual(clazz,methodID),vaargs,PRIMITIVETYPE_FLOAT);
        va_end(vaargs);
-       return ret;
 
+       return ret;
 }
 
 
 jfloat CallNonvirtualFloatMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallNonvirtualFloatMethodV");
+       STATISTICS(jniinvokation());
+
+/*     log_text("JNI-Call: CallNonvirtualFloatMethodV"); */
+
        return callFloatMethod(obj,get_nonvirtual(clazz,methodID),args,PRIMITIVETYPE_FLOAT);
 }
 
 
 jfloat CallNonvirtualFloatMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallNonvirtualFloatMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallNonvirtualFloatMethodA: IMPLEMENT ME!");
 
        return 0;
 }
@@ -2031,29 +2109,34 @@ jdouble CallNonvirtualDoubleMethod (JNIEnv *env, jobject obj, jclass clazz, jmet
 {
        jdouble ret;
        va_list vaargs;
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallNonvirtualDoubleMethod");
+
+       STATISTICS(jniinvokation());
+
+/*     log_text("JNI-Call: CallNonvirtualDoubleMethod"); */
 
        va_start(vaargs,methodID);
        ret = callFloatMethod(obj,get_nonvirtual(clazz,methodID),vaargs,PRIMITIVETYPE_DOUBLE);
        va_end(vaargs);
-       return ret;
 
+       return ret;
 }
 
 
 jdouble CallNonvirtualDoubleMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
 /*     log_text("JNI-Call: CallNonvirtualDoubleMethodV");*/
+
        return callFloatMethod(obj,get_nonvirtual(clazz,methodID),args,PRIMITIVETYPE_DOUBLE);
 }
 
 
 jdouble CallNonvirtualDoubleMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallNonvirtualDoubleMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallNonvirtualDoubleMethodA: IMPLEMENT ME!");
 
        return 0;
 }
@@ -2062,43 +2145,60 @@ jdouble CallNonvirtualDoubleMethodA (JNIEnv *env, jobject obj, jclass clazz, jme
 
 void CallNonvirtualVoidMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
 {
-        va_list vaargs;
-       STATS(jniinvokation();)
+       va_list vaargs;
 
-/*      log_text("JNI-Call: CallNonvirtualVoidMethod");*/
+       STATISTICS(jniinvokation());
 
-        va_start(vaargs,methodID);
-        (void)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),TYPE_VOID,vaargs);
-        va_end(vaargs);
+/*      log_text("JNI-Call: CallNonvirtualVoidMethod");*/
 
+       va_start(vaargs,methodID);
+       (void)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),TYPE_VOID,vaargs);
+       va_end(vaargs);
 }
 
 
 void CallNonvirtualVoidMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
 {
-/*     log_text("JNI-Call: CallNonvirtualVoidMethodV");*/
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-        (void)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),TYPE_VOID,args);
+/*     log_text("JNI-Call: CallNonvirtualVoidMethodV");*/
 
+       (void)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),TYPE_VOID,args);
 }
 
 
 void CallNonvirtualVoidMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallNonvirtualVoidMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallNonvirtualVoidMethodA: IMPLEMENT ME!");
 }
 
-/************************* JNI-functions for accessing fields ************************/
 
-jfieldID GetFieldID(JNIEnv *env, jclass clazz, const char *name, const char *sig) 
+/* 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
+   Get<type>Field and Set<type>Field families of accessor functions
+   use field IDs to retrieve object fields.
+
+*******************************************************************************/
+
+jfieldID GetFieldID(JNIEnv *env, jclass clazz, const char *name,
+                                       const char *sig) 
 {
-       jfieldID f;
+       fieldinfo *f;
+       utf       *uname;
+       utf       *udesc;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       f = class_findfield(clazz, utf_new_char((char *) name), utf_new_char((char *) sig)); 
+       uname = utf_new_char((char *) name);
+       udesc = utf_new_char((char *) sig);
+
+       f = class_findfield(clazz, uname, udesc); 
        
        if (!f)
                *exceptionptr = new_exception(string_java_lang_NoSuchFieldError);  
@@ -2107,133 +2207,199 @@ jfieldID GetFieldID(JNIEnv *env, jclass clazz, const char *name, const char *sig
 }
 
 
+/* Get<type>Field 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 GetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID)
 {
        java_objectheader *o;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       o = getField(obj, java_objectheader*, fieldID);
+       o = GET_FIELD(obj, java_objectheader*, fieldID);
 
        return NewLocalRef(env, o);
 }
 
 
-jboolean GetBooleanField (JNIEnv *env, jobject obj, jfieldID fieldID)
+jboolean GetBooleanField(JNIEnv *env, jobject obj, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
-       return getField(obj,jboolean,fieldID);
+       s4 i;
+
+       STATISTICS(jniinvokation());
+
+       i = GET_FIELD(obj, s4, fieldID);
+
+       return (jboolean) i;
 }
 
 
-jbyte GetByteField (JNIEnv *env, jobject obj, jfieldID fieldID)
+jbyte GetByteField(JNIEnv *env, jobject obj, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
-       return getField(obj,jbyte,fieldID);
+       s4 i;
+
+       STATISTICS(jniinvokation());
+
+       i = GET_FIELD(obj, s4, fieldID);
+
+       return (jbyte) i;
 }
 
 
-jchar GetCharField (JNIEnv *env, jobject obj, jfieldID fieldID)
+jchar GetCharField(JNIEnv *env, jobject obj, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
-       return getField(obj,jchar,fieldID);
+       s4 i;
+
+       STATISTICS(jniinvokation());
+
+       i = GET_FIELD(obj, s4, fieldID);
+
+       return (jchar) i;
 }
 
 
-jshort GetShortField (JNIEnv *env, jobject obj, jfieldID fieldID)
+jshort GetShortField(JNIEnv *env, jobject obj, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
-       return getField(obj,jshort,fieldID);
+       s4 i;
+
+       STATISTICS(jniinvokation());
+
+       i = GET_FIELD(obj, s4, fieldID);
+
+       return (jshort) i;
 }
 
 
-jint GetIntField (JNIEnv *env, jobject obj, jfieldID fieldID)
+jint GetIntField(JNIEnv *env, jobject obj, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
-       return getField(obj,jint,fieldID);
+       s4 i;
+
+       STATISTICS(jniinvokation());
+
+       i = GET_FIELD(obj, s4, fieldID);
+
+       return i;
 }
 
 
-jlong GetLongField (JNIEnv *env, jobject obj, jfieldID fieldID)
+jlong GetLongField(JNIEnv *env, jobject obj, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
-       return getField(obj,jlong,fieldID);
+       s8 l;
+
+       STATISTICS(jniinvokation());
+
+       l = GET_FIELD(obj, s8, fieldID);
+
+       return l;
 }
 
 
-jfloat GetFloatField (JNIEnv *env, jobject obj, jfieldID fieldID)
+jfloat GetFloatField(JNIEnv *env, jobject obj, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
-       return getField(obj,jfloat,fieldID);
+       float f;
+
+       STATISTICS(jniinvokation());
+
+       f = GET_FIELD(obj, float, fieldID);
+
+       return f;
 }
 
 
-jdouble GetDoubleField (JNIEnv *env, jobject obj, jfieldID fieldID)
+jdouble GetDoubleField(JNIEnv *env, jobject obj, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
-       return getField(obj,jdouble,fieldID);
+       double d;
+
+       STATISTICS(jniinvokation());
+
+       d = GET_FIELD(obj, double, fieldID);
+
+       return d;
 }
 
-void SetObjectField (JNIEnv *env, jobject obj, jfieldID fieldID, jobject val)
+
+/* Set<type>Field 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 SetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID, jobject value)
 {
-       STATS(jniinvokation();)
-        setField(obj,jobject,fieldID,val);
+       STATISTICS(jniinvokation());
+
+       SET_FIELD(obj, java_objectheader*, fieldID, value);
 }
 
 
-void SetBooleanField (JNIEnv *env, jobject obj, jfieldID fieldID, jboolean val)
+void SetBooleanField(JNIEnv *env, jobject obj, jfieldID fieldID, jboolean value)
 {
-       STATS(jniinvokation();)
-        setField(obj,jboolean,fieldID,val);
+       STATISTICS(jniinvokation());
+
+       SET_FIELD(obj, s4, fieldID, value);
 }
 
 
-void SetByteField (JNIEnv *env, jobject obj, jfieldID fieldID, jbyte val)
+void SetByteField(JNIEnv *env, jobject obj, jfieldID fieldID, jbyte value)
 {
-       STATS(jniinvokation();)
-        setField(obj,jbyte,fieldID,val);
+       STATISTICS(jniinvokation());
+
+       SET_FIELD(obj, s4, fieldID, value);
 }
 
 
-void SetCharField (JNIEnv *env, jobject obj, jfieldID fieldID, jchar val)
+void SetCharField(JNIEnv *env, jobject obj, jfieldID fieldID, jchar value)
 {
-       STATS(jniinvokation();)
-        setField(obj,jchar,fieldID,val);
+       STATISTICS(jniinvokation());
+
+       SET_FIELD(obj, s4, fieldID, value);
 }
 
 
-void SetShortField (JNIEnv *env, jobject obj, jfieldID fieldID, jshort val)
+void SetShortField(JNIEnv *env, jobject obj, jfieldID fieldID, jshort value)
 {
-       STATS(jniinvokation();)
-        setField(obj,jshort,fieldID,val);
+       STATISTICS(jniinvokation());
+
+       SET_FIELD(obj, s4, fieldID, value);
 }
 
 
-void SetIntField (JNIEnv *env, jobject obj, jfieldID fieldID, jint val)
+void SetIntField(JNIEnv *env, jobject obj, jfieldID fieldID, jint value)
 {
-       STATS(jniinvokation();)
-        setField(obj,jint,fieldID,val);
+       STATISTICS(jniinvokation());
+
+       SET_FIELD(obj, s4, fieldID, value);
 }
 
 
-void SetLongField (JNIEnv *env, jobject obj, jfieldID fieldID, jlong val)
+void SetLongField(JNIEnv *env, jobject obj, jfieldID fieldID, jlong value)
 {
-       STATS(jniinvokation();)
-        setField(obj,jlong,fieldID,val);
+       STATISTICS(jniinvokation());
+
+       SET_FIELD(obj, s8, fieldID, value);
 }
 
 
-void SetFloatField (JNIEnv *env, jobject obj, jfieldID fieldID, jfloat val)
+void SetFloatField(JNIEnv *env, jobject obj, jfieldID fieldID, jfloat value)
 {
-       STATS(jniinvokation();)
-        setField(obj,jfloat,fieldID,val);
+       STATISTICS(jniinvokation());
+
+       SET_FIELD(obj, float, fieldID, value);
 }
 
 
-void SetDoubleField (JNIEnv *env, jobject obj, jfieldID fieldID, jdouble val)
+void SetDoubleField(JNIEnv *env, jobject obj, jfieldID fieldID, jdouble value)
 {
-       STATS(jniinvokation();)
-        setField(obj,jdouble,fieldID,val);
+       STATISTICS(jniinvokation());
+
+       SET_FIELD(obj, double, fieldID, value);
 }
 
 
@@ -2257,14 +2423,14 @@ jmethodID GetStaticMethodID(JNIEnv *env, jclass clazz, const char *name,
        utf        *udesc;
        methodinfo *m;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        c = (classinfo *) clazz;
 
        if (!c)
                return NULL;
 
-       if (!c->initialized)
+       if (!(c->state & CLASS_INITIALIZED))
                if (!initialize_class(c))
                        return NULL;
 
@@ -2290,7 +2456,7 @@ jobject CallStaticObjectMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ..
        java_objectheader *ret;
        va_list            vaargs;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        va_start(vaargs, methodID);
        ret = callObjectMethod(0, methodID, vaargs);
@@ -2304,7 +2470,7 @@ jobject CallStaticObjectMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, v
 {
        java_objectheader *ret;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
        
        ret = callObjectMethod(0, methodID, args);
 
@@ -2314,7 +2480,7 @@ jobject CallStaticObjectMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, v
 
 jobject CallStaticObjectMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        log_text("JNI-Call: CallStaticObjectMethodA: IMPLEMENT ME!");
 
@@ -2327,7 +2493,7 @@ jboolean CallStaticBooleanMethod(JNIEnv *env, jclass clazz, jmethodID methodID,
        va_list  vaargs;
        jboolean ret;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        va_start(vaargs, methodID);
        ret = (jboolean) callIntegerMethod(0, methodID, PRIMITIVETYPE_BOOLEAN, vaargs);
@@ -2339,7 +2505,7 @@ jboolean CallStaticBooleanMethod(JNIEnv *env, jclass clazz, jmethodID methodID,
 
 jboolean CallStaticBooleanMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        return (jboolean) callIntegerMethod(0, methodID, PRIMITIVETYPE_BOOLEAN, args);
 }
@@ -2347,7 +2513,7 @@ jboolean CallStaticBooleanMethodV(JNIEnv *env, jclass clazz, jmethodID methodID,
 
 jboolean CallStaticBooleanMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        log_text("JNI-Call: CallStaticBooleanMethodA: IMPLEMENT ME!");
 
@@ -2360,7 +2526,7 @@ jbyte CallStaticByteMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
        va_list vaargs;
        jbyte   ret;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        va_start(vaargs, methodID);
        ret = (jbyte) callIntegerMethod(0, methodID, PRIMITIVETYPE_BYTE, vaargs);
@@ -2372,14 +2538,15 @@ jbyte CallStaticByteMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
 
 jbyte CallStaticByteMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
        return (jbyte) callIntegerMethod(0, methodID, PRIMITIVETYPE_BYTE, args);
 }
 
 
 jbyte CallStaticByteMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        log_text("JNI-Call: CallStaticByteMethodA: IMPLEMENT ME!");
 
@@ -2392,7 +2559,7 @@ jchar CallStaticCharMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
        va_list vaargs;
        jchar   ret;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        va_start(vaargs, methodID);
        ret = (jchar) callIntegerMethod(0, methodID, PRIMITIVETYPE_CHAR, vaargs);
@@ -2404,7 +2571,7 @@ jchar CallStaticCharMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
 
 jchar CallStaticCharMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        return (jchar) callIntegerMethod(0, methodID, PRIMITIVETYPE_CHAR, args);
 }
@@ -2412,7 +2579,7 @@ jchar CallStaticCharMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_li
 
 jchar CallStaticCharMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        log_text("JNI-Call: CallStaticCharMethodA: IMPLEMENT ME!");
 
@@ -2425,7 +2592,7 @@ jshort CallStaticShortMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
        va_list vaargs;
        jshort  ret;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        va_start(vaargs, methodID);
        ret = (jshort) callIntegerMethod(0, methodID, PRIMITIVETYPE_SHORT, vaargs);
@@ -2437,7 +2604,7 @@ jshort CallStaticShortMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
 
 jshort CallStaticShortMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        return (jshort) callIntegerMethod(0, methodID, PRIMITIVETYPE_SHORT, args);
 }
@@ -2445,7 +2612,7 @@ jshort CallStaticShortMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_
 
 jshort CallStaticShortMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        log_text("JNI-Call: CallStaticShortMethodA: IMPLEMENT ME!");
 
@@ -2458,7 +2625,7 @@ jint CallStaticIntMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
        va_list vaargs;
        jint    ret;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        va_start(vaargs, methodID);
        ret = callIntegerMethod(0, methodID, PRIMITIVETYPE_INT, vaargs);
@@ -2470,7 +2637,7 @@ jint CallStaticIntMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
 
 jint CallStaticIntMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        return callIntegerMethod(0, methodID, PRIMITIVETYPE_INT, args);
 }
@@ -2478,7 +2645,7 @@ jint CallStaticIntMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list
 
 jint CallStaticIntMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        log_text("JNI-Call: CallStaticIntMethodA: IMPLEMENT ME!");
 
@@ -2491,7 +2658,7 @@ jlong CallStaticLongMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
        va_list vaargs;
        jlong   ret;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        va_start(vaargs, methodID);
        ret = callLongMethod(0, methodID, vaargs);
@@ -2504,7 +2671,7 @@ jlong CallStaticLongMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
 jlong CallStaticLongMethodV(JNIEnv *env, jclass clazz, jmethodID methodID,
                                                        va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
        
        return callLongMethod(0, methodID, args);
 }
@@ -2512,7 +2679,7 @@ jlong CallStaticLongMethodV(JNIEnv *env, jclass clazz, jmethodID methodID,
 
 jlong CallStaticLongMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        log_text("JNI-Call: CallStaticLongMethodA: IMPLEMENT ME!");
 
@@ -2526,7 +2693,7 @@ jfloat CallStaticFloatMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
        va_list vaargs;
        jfloat  ret;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        va_start(vaargs, methodID);
        ret = callFloatMethod(0, methodID, vaargs, PRIMITIVETYPE_FLOAT);
@@ -2538,7 +2705,7 @@ jfloat CallStaticFloatMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
 
 jfloat CallStaticFloatMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        return callFloatMethod(0, methodID, args, PRIMITIVETYPE_FLOAT);
 
@@ -2547,7 +2714,7 @@ jfloat CallStaticFloatMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_
 
 jfloat CallStaticFloatMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        log_text("JNI-Call: CallStaticFloatMethodA: IMPLEMENT ME!");
 
@@ -2560,7 +2727,7 @@ jdouble CallStaticDoubleMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ..
        va_list vaargs;
        jdouble ret;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        va_start(vaargs,methodID);
        ret = callFloatMethod(0, methodID, vaargs, PRIMITIVETYPE_DOUBLE);
@@ -2572,7 +2739,7 @@ jdouble CallStaticDoubleMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ..
 
 jdouble CallStaticDoubleMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        return callFloatMethod(0, methodID, args, PRIMITIVETYPE_DOUBLE);
 }
@@ -2580,7 +2747,7 @@ jdouble CallStaticDoubleMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, v
 
 jdouble CallStaticDoubleMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        log_text("JNI-Call: CallStaticDoubleMethodA: IMPLEMENT ME!");
 
@@ -2592,7 +2759,7 @@ void CallStaticVoidMethod(JNIEnv *env, jclass cls, jmethodID methodID, ...)
 {
        va_list vaargs;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        va_start(vaargs, methodID);
        (void) callIntegerMethod(0, methodID, TYPE_VOID, vaargs);
@@ -2602,7 +2769,7 @@ void CallStaticVoidMethod(JNIEnv *env, jclass cls, jmethodID methodID, ...)
 
 void CallStaticVoidMethodV(JNIEnv *env, jclass cls, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        (void) callIntegerMethod(0, methodID, TYPE_VOID, args);
 }
@@ -2610,7 +2777,7 @@ void CallStaticVoidMethodV(JNIEnv *env, jclass cls, jmethodID methodID, va_list
 
 void CallStaticVoidMethodA(JNIEnv *env, jclass cls, jmethodID methodID, jvalue * args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        log_text("JNI-Call: CallStaticVoidMethodA: IMPLEMENT ME!");
 }
@@ -2630,7 +2797,8 @@ void CallStaticVoidMethodA(JNIEnv *env, jclass cls, jmethodID methodID, jvalue *
 jfieldID GetStaticFieldID(JNIEnv *env, jclass clazz, const char *name, const char *sig)
 {
        jfieldID f;
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
 
        f = class_findfield(clazz,
                                                utf_new_char((char *) name),
@@ -2652,9 +2820,9 @@ jfieldID GetStaticFieldID(JNIEnv *env, jclass clazz, const char *name, const cha
 
 jobject GetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return NULL;
 
@@ -2664,9 +2832,9 @@ jobject GetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 
 jboolean GetStaticBooleanField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return false;
 
@@ -2676,9 +2844,9 @@ jboolean GetStaticBooleanField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 
 jbyte GetStaticByteField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return 0;
 
@@ -2688,9 +2856,9 @@ jbyte GetStaticByteField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 
 jchar GetStaticCharField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return 0;
 
@@ -2700,9 +2868,9 @@ jchar GetStaticCharField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 
 jshort GetStaticShortField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return 0;
 
@@ -2712,9 +2880,9 @@ jshort GetStaticShortField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 
 jint GetStaticIntField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return 0;
 
@@ -2724,9 +2892,9 @@ jint GetStaticIntField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 
 jlong GetStaticLongField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return 0;
 
@@ -2736,9 +2904,9 @@ jlong GetStaticLongField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 
 jfloat GetStaticFloatField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return 0.0;
 
@@ -2748,9 +2916,9 @@ jfloat GetStaticFloatField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 
 jdouble GetStaticDoubleField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return 0.0;
 
@@ -2767,9 +2935,9 @@ jdouble GetStaticDoubleField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 
 void SetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return;
 
@@ -2779,9 +2947,9 @@ void SetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID, jobject v
 
 void SetStaticBooleanField(JNIEnv *env, jclass clazz, jfieldID fieldID, jboolean value)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return;
 
@@ -2791,9 +2959,9 @@ void SetStaticBooleanField(JNIEnv *env, jclass clazz, jfieldID fieldID, jboolean
 
 void SetStaticByteField(JNIEnv *env, jclass clazz, jfieldID fieldID, jbyte value)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return;
 
@@ -2803,9 +2971,9 @@ void SetStaticByteField(JNIEnv *env, jclass clazz, jfieldID fieldID, jbyte value
 
 void SetStaticCharField(JNIEnv *env, jclass clazz, jfieldID fieldID, jchar value)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return;
 
@@ -2815,9 +2983,9 @@ void SetStaticCharField(JNIEnv *env, jclass clazz, jfieldID fieldID, jchar value
 
 void SetStaticShortField(JNIEnv *env, jclass clazz, jfieldID fieldID, jshort value)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return;
 
@@ -2827,9 +2995,9 @@ void SetStaticShortField(JNIEnv *env, jclass clazz, jfieldID fieldID, jshort val
 
 void SetStaticIntField(JNIEnv *env, jclass clazz, jfieldID fieldID, jint value)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return;
 
@@ -2839,9 +3007,9 @@ void SetStaticIntField(JNIEnv *env, jclass clazz, jfieldID fieldID, jint value)
 
 void SetStaticLongField(JNIEnv *env, jclass clazz, jfieldID fieldID, jlong value)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return;
 
@@ -2851,9 +3019,9 @@ void SetStaticLongField(JNIEnv *env, jclass clazz, jfieldID fieldID, jlong value
 
 void SetStaticFloatField(JNIEnv *env, jclass clazz, jfieldID fieldID, jfloat value)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return;
 
@@ -2863,9 +3031,9 @@ void SetStaticFloatField(JNIEnv *env, jclass clazz, jfieldID fieldID, jfloat val
 
 void SetStaticDoubleField(JNIEnv *env, jclass clazz, jfieldID fieldID, jdouble value)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return;
 
@@ -2888,7 +3056,7 @@ jstring NewString(JNIEnv *env, const jchar *buf, jsize len)
        java_chararray   *a;
        u4                i;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
        
        s = (java_lang_String *) builtin_new(class_java_lang_String);
        a = builtin_newarray_char(len);
@@ -2933,7 +3101,7 @@ u2 *javastring_tou2(jstring so)
        u2               *stringbuffer;
        u4                i;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
        
        s = (java_lang_String *) so;
 
@@ -2973,7 +3141,7 @@ const jchar *GetStringChars(JNIEnv *env, jstring str, jboolean *isCopy)
 {      
        jchar *jc;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        jc = javastring_tou2(str);
 
@@ -3001,7 +3169,7 @@ const jchar *GetStringChars(JNIEnv *env, jstring str, jboolean *isCopy)
 
 void ReleaseStringChars(JNIEnv *env, jstring str, const jchar *chars)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (chars == emptyStringJ)
                return;
@@ -3020,7 +3188,7 @@ jstring NewStringUTF(JNIEnv *env, const char *bytes)
 {
        java_lang_String *s;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        s = javastring_new(utf_new_char(bytes));
 
@@ -3033,7 +3201,8 @@ jstring NewStringUTF(JNIEnv *env, const char *bytes)
 jsize GetStringUTFLength (JNIEnv *env, jstring string)
 {   
     java_lang_String *s = (java_lang_String*) string;
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
 
     return (jsize) u2_utflength(s->value->data, s->count); 
 }
@@ -3050,7 +3219,8 @@ jsize GetStringUTFLength (JNIEnv *env, jstring string)
 const char *GetStringUTFChars(JNIEnv *env, jstring string, jboolean *isCopy)
 {
        utf *u;
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
 
        if (!string)
                return "";
@@ -3077,7 +3247,7 @@ const char *GetStringUTFChars(JNIEnv *env, jstring string, jboolean *isCopy)
 
 void ReleaseStringUTFChars(JNIEnv *env, jstring string, const char *utf)
 {
-       STATS(jniinvokation();)
+       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
@@ -3095,7 +3265,7 @@ void ReleaseStringUTFChars(JNIEnv *env, jstring string, const char *utf)
 
 jsize GetArrayLength(JNIEnv *env, jarray array)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        return array->size;
 }
@@ -3113,10 +3283,10 @@ jobjectArray NewObjectArray(JNIEnv *env, jsize length, jclass elementClass, jobj
        java_objectarray *oa;
        s4                i;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (length < 0) {
-               *exceptionptr = new_negativearraysizeexception();
+               exceptions_throw_negativearraysizeexception();
                return NULL;
        }
 
@@ -3138,11 +3308,10 @@ jobject GetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index)
 {
     jobject o;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (index >= array->header.size) {
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
+               exceptions_throw_arrayindexoutofboundsexception();
                return NULL;
        }
 
@@ -3154,18 +3323,29 @@ jobject GetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index)
 
 void SetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index, jobject val)
 {
-       STATS(jniinvokation();)
-    if (index >= array->header.size)
-               *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
+       java_objectarray  *oa;
+       java_objectheader *o;
+
+       STATISTICS(jniinvokation());
+
+       oa = (java_objectarray *) array;
+       o  = (java_objectheader *) val;
 
-    else {
-               /* check if the class of value is a subclass of the element class of the array */
-               if (!builtin_canstore((java_objectarray *) array, (java_objectheader *) val))
-                       *exceptionptr = new_exception(string_java_lang_ArrayStoreException);
+    if (index >= array->header.size) {
+               exceptions_throw_arrayindexoutofboundsexception();
+               return;
+       }
+
+       /* check if the class of value is a subclass of the element class
+          of the array */
+
+       if (!builtin_canstore(oa, o)) {
+               *exceptionptr = new_exception(string_java_lang_ArrayStoreException);
 
-               else
-                       array->data[index] = val;
-    }
+               return;
+       }
+
+       array->data[index] = val;
 }
 
 
@@ -3173,10 +3353,10 @@ jbooleanArray NewBooleanArray(JNIEnv *env, jsize len)
 {
        java_booleanarray *ba;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (len < 0) {
-               *exceptionptr = new_negativearraysizeexception();
+               exceptions_throw_negativearraysizeexception();
                return NULL;
        }
 
@@ -3190,10 +3370,10 @@ jbyteArray NewByteArray(JNIEnv *env, jsize len)
 {
        java_bytearray *ba;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (len < 0) {
-               *exceptionptr = new_negativearraysizeexception();
+               exceptions_throw_negativearraysizeexception();
                return NULL;
        }
 
@@ -3207,10 +3387,10 @@ jcharArray NewCharArray(JNIEnv *env, jsize len)
 {
        java_chararray *ca;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (len < 0) {
-               *exceptionptr = new_negativearraysizeexception();
+               exceptions_throw_negativearraysizeexception();
                return NULL;
        }
 
@@ -3224,10 +3404,10 @@ jshortArray NewShortArray(JNIEnv *env, jsize len)
 {
        java_shortarray *sa;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (len < 0) {
-               *exceptionptr = new_negativearraysizeexception();
+               exceptions_throw_negativearraysizeexception();
                return NULL;
        }
 
@@ -3241,10 +3421,10 @@ jintArray NewIntArray(JNIEnv *env, jsize len)
 {
        java_intarray *ia;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (len < 0) {
-               *exceptionptr = new_negativearraysizeexception();
+               exceptions_throw_negativearraysizeexception();
                return NULL;
        }
 
@@ -3258,10 +3438,10 @@ jlongArray NewLongArray(JNIEnv *env, jsize len)
 {
        java_longarray *la;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (len < 0) {
-               *exceptionptr = new_negativearraysizeexception();
+               exceptions_throw_negativearraysizeexception();
                return NULL;
        }
 
@@ -3275,10 +3455,10 @@ jfloatArray NewFloatArray(JNIEnv *env, jsize len)
 {
        java_floatarray *fa;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (len < 0) {
-               *exceptionptr = new_negativearraysizeexception();
+               exceptions_throw_negativearraysizeexception();
                return NULL;
        }
 
@@ -3292,10 +3472,10 @@ jdoubleArray NewDoubleArray(JNIEnv *env, jsize len)
 {
        java_doublearray *da;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (len < 0) {
-               *exceptionptr = new_negativearraysizeexception();
+               exceptions_throw_negativearraysizeexception();
                return NULL;
        }
 
@@ -3314,7 +3494,7 @@ jdoubleArray NewDoubleArray(JNIEnv *env, jsize len)
 jboolean *GetBooleanArrayElements(JNIEnv *env, jbooleanArray array,
                                                                  jboolean *isCopy)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (isCopy)
                *isCopy = JNI_FALSE;
@@ -3325,7 +3505,7 @@ jboolean *GetBooleanArrayElements(JNIEnv *env, jbooleanArray array,
 
 jbyte *GetByteArrayElements(JNIEnv *env, jbyteArray array, jboolean *isCopy)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (isCopy)
                *isCopy = JNI_FALSE;
@@ -3336,7 +3516,7 @@ jbyte *GetByteArrayElements(JNIEnv *env, jbyteArray array, jboolean *isCopy)
 
 jchar *GetCharArrayElements(JNIEnv *env, jcharArray array, jboolean *isCopy)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (isCopy)
                *isCopy = JNI_FALSE;
@@ -3347,7 +3527,7 @@ jchar *GetCharArrayElements(JNIEnv *env, jcharArray array, jboolean *isCopy)
 
 jshort *GetShortArrayElements(JNIEnv *env, jshortArray array, jboolean *isCopy)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (isCopy)
                *isCopy = JNI_FALSE;
@@ -3358,7 +3538,7 @@ jshort *GetShortArrayElements(JNIEnv *env, jshortArray array, jboolean *isCopy)
 
 jint *GetIntArrayElements(JNIEnv *env, jintArray array, jboolean *isCopy)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (isCopy)
                *isCopy = JNI_FALSE;
@@ -3369,7 +3549,7 @@ jint *GetIntArrayElements(JNIEnv *env, jintArray array, jboolean *isCopy)
 
 jlong *GetLongArrayElements(JNIEnv *env, jlongArray array, jboolean *isCopy)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (isCopy)
                *isCopy = JNI_FALSE;
@@ -3380,7 +3560,7 @@ jlong *GetLongArrayElements(JNIEnv *env, jlongArray array, jboolean *isCopy)
 
 jfloat *GetFloatArrayElements(JNIEnv *env, jfloatArray array, jboolean *isCopy)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (isCopy)
                *isCopy = JNI_FALSE;
@@ -3392,7 +3572,7 @@ jfloat *GetFloatArrayElements(JNIEnv *env, jfloatArray array, jboolean *isCopy)
 jdouble *GetDoubleArrayElements(JNIEnv *env, jdoubleArray array,
                                                                jboolean *isCopy)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (isCopy)
                *isCopy = JNI_FALSE;
@@ -3415,7 +3595,7 @@ jdouble *GetDoubleArrayElements(JNIEnv *env, jdoubleArray array,
 void ReleaseBooleanArrayElements(JNIEnv *env, jbooleanArray array,
                                                                 jboolean *elems, jint mode)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (elems != array->data) {
                switch (mode) {
@@ -3437,7 +3617,7 @@ void ReleaseBooleanArrayElements(JNIEnv *env, jbooleanArray array,
 void ReleaseByteArrayElements(JNIEnv *env, jbyteArray array, jbyte *elems,
                                                          jint mode)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (elems != array->data) {
                switch (mode) {
@@ -3459,7 +3639,7 @@ void ReleaseByteArrayElements(JNIEnv *env, jbyteArray array, jbyte *elems,
 void ReleaseCharArrayElements(JNIEnv *env, jcharArray array, jchar *elems,
                                                          jint mode)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (elems != array->data) {
                switch (mode) {
@@ -3481,7 +3661,7 @@ void ReleaseCharArrayElements(JNIEnv *env, jcharArray array, jchar *elems,
 void ReleaseShortArrayElements(JNIEnv *env, jshortArray array, jshort *elems,
                                                           jint mode)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (elems != array->data) {
                switch (mode) {
@@ -3503,7 +3683,7 @@ void ReleaseShortArrayElements(JNIEnv *env, jshortArray array, jshort *elems,
 void ReleaseIntArrayElements(JNIEnv *env, jintArray array, jint *elems,
                                                         jint mode)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (elems != array->data) {
                switch (mode) {
@@ -3525,7 +3705,7 @@ void ReleaseIntArrayElements(JNIEnv *env, jintArray array, jint *elems,
 void ReleaseLongArrayElements(JNIEnv *env, jlongArray array, jlong *elems,
                                                          jint mode)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (elems != array->data) {
                switch (mode) {
@@ -3547,7 +3727,7 @@ void ReleaseLongArrayElements(JNIEnv *env, jlongArray array, jlong *elems,
 void ReleaseFloatArrayElements(JNIEnv *env, jfloatArray array, jfloat *elems,
                                                           jint mode)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (elems != array->data) {
                switch (mode) {
@@ -3569,7 +3749,7 @@ void ReleaseFloatArrayElements(JNIEnv *env, jfloatArray array, jfloat *elems,
 void ReleaseDoubleArrayElements(JNIEnv *env, jdoubleArray array,
                                                                jdouble *elems, jint mode)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (elems != array->data) {
                switch (mode) {
@@ -3598,12 +3778,10 @@ void ReleaseDoubleArrayElements(JNIEnv *env, jdoubleArray array,
 void GetBooleanArrayRegion(JNIEnv *env, jbooleanArray array, jsize start,
                                                   jsize len, jboolean *buf)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (start < 0 || len < 0 || start + len > array->header.size)
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
-
+               exceptions_throw_arrayindexoutofboundsexception();
     else
                MCOPY(buf, &array->data[start], jboolean, len);
 }
@@ -3612,12 +3790,10 @@ void GetBooleanArrayRegion(JNIEnv *env, jbooleanArray array, jsize start,
 void GetByteArrayRegion(JNIEnv *env, jbyteArray array, jsize start, jsize len,
                                                jbyte *buf)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (start < 0 || len < 0 || start + len > array->header.size) 
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
-
+               exceptions_throw_arrayindexoutofboundsexception();
     else
                MCOPY(buf, &array->data[start], jbyte, len);
 }
@@ -3626,12 +3802,10 @@ void GetByteArrayRegion(JNIEnv *env, jbyteArray array, jsize start, jsize len,
 void GetCharArrayRegion(JNIEnv *env, jcharArray array, jsize start, jsize len,
                                                jchar *buf)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (start < 0 || len < 0 || start + len > array->header.size)
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
-
+               exceptions_throw_arrayindexoutofboundsexception();
     else
                MCOPY(buf, &array->data[start], jchar, len);
 }
@@ -3640,12 +3814,10 @@ void GetCharArrayRegion(JNIEnv *env, jcharArray array, jsize start, jsize len,
 void GetShortArrayRegion(JNIEnv *env, jshortArray array, jsize start,
                                                 jsize len, jshort *buf)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (start < 0 || len < 0 || start + len > array->header.size)
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
-
+               exceptions_throw_arrayindexoutofboundsexception();
     else       
                MCOPY(buf, &array->data[start], jshort, len);
 }
@@ -3654,12 +3826,10 @@ void GetShortArrayRegion(JNIEnv *env, jshortArray array, jsize start,
 void GetIntArrayRegion(JNIEnv *env, jintArray array, jsize start, jsize len,
                                           jint *buf)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (start < 0 || len < 0 || start + len > array->header.size)
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
-
+               exceptions_throw_arrayindexoutofboundsexception();
     else
                MCOPY(buf, &array->data[start], jint, len);
 }
@@ -3668,12 +3838,10 @@ void GetIntArrayRegion(JNIEnv *env, jintArray array, jsize start, jsize len,
 void GetLongArrayRegion(JNIEnv *env, jlongArray array, jsize start, jsize len,
                                                jlong *buf)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (start < 0 || len < 0 || start + len > array->header.size)
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
-
+               exceptions_throw_arrayindexoutofboundsexception();
     else
                MCOPY(buf, &array->data[start], jlong, len);
 }
@@ -3682,12 +3850,10 @@ void GetLongArrayRegion(JNIEnv *env, jlongArray array, jsize start, jsize len,
 void GetFloatArrayRegion(JNIEnv *env, jfloatArray array, jsize start,
                                                 jsize len, jfloat *buf)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (start < 0 || len < 0 || start + len > array->header.size)
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
-
+               exceptions_throw_arrayindexoutofboundsexception();
     else
                MCOPY(buf, &array->data[start], jfloat, len);
 }
@@ -3696,12 +3862,10 @@ void GetFloatArrayRegion(JNIEnv *env, jfloatArray array, jsize start,
 void GetDoubleArrayRegion(JNIEnv *env, jdoubleArray array, jsize start,
                                                  jsize len, jdouble *buf)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (start < 0 || len < 0 || start+len>array->header.size)
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
-
+               exceptions_throw_arrayindexoutofboundsexception();
     else
                MCOPY(buf, &array->data[start], jdouble, len);
 }
@@ -3717,12 +3881,10 @@ void GetDoubleArrayRegion(JNIEnv *env, jdoubleArray array, jsize start,
 void SetBooleanArrayRegion(JNIEnv *env, jbooleanArray array, jsize start,
                                                   jsize len, jboolean *buf)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (start < 0 || len < 0 || start + len > array->header.size)
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
-
+               exceptions_throw_arrayindexoutofboundsexception();
     else
                MCOPY(&array->data[start], buf, jboolean, len);
 }
@@ -3731,12 +3893,10 @@ void SetBooleanArrayRegion(JNIEnv *env, jbooleanArray array, jsize start,
 void SetByteArrayRegion(JNIEnv *env, jbyteArray array, jsize start, jsize len,
                                                jbyte *buf)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (start < 0 || len < 0 || start + len > array->header.size)
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
-
+               exceptions_throw_arrayindexoutofboundsexception();
     else
                MCOPY(&array->data[start], buf, jbyte, len);
 }
@@ -3745,27 +3905,22 @@ void SetByteArrayRegion(JNIEnv *env, jbyteArray array, jsize start, jsize len,
 void SetCharArrayRegion(JNIEnv *env, jcharArray array, jsize start, jsize len,
                                                jchar *buf)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (start < 0 || len < 0 || start + len > array->header.size)
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
-
+               exceptions_throw_arrayindexoutofboundsexception();
     else
                MCOPY(&array->data[start], buf, jchar, len);
-
 }
 
 
 void SetShortArrayRegion(JNIEnv *env, jshortArray array, jsize start,
                                                 jsize len, jshort *buf)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (start < 0 || len < 0 || start + len > array->header.size)
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
-
+               exceptions_throw_arrayindexoutofboundsexception();
     else
                MCOPY(&array->data[start], buf, jshort, len);
 }
@@ -3774,57 +3929,46 @@ void SetShortArrayRegion(JNIEnv *env, jshortArray array, jsize start,
 void SetIntArrayRegion(JNIEnv *env, jintArray array, jsize start, jsize len,
                                           jint *buf)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (start < 0 || len < 0 || start + len > array->header.size)
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
-
+               exceptions_throw_arrayindexoutofboundsexception();
     else
                MCOPY(&array->data[start], buf, jint, len);
-
 }
 
 
 void SetLongArrayRegion(JNIEnv* env, jlongArray array, jsize start, jsize len,
                                                jlong *buf)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (start < 0 || len < 0 || start + len > array->header.size)
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
-
+               exceptions_throw_arrayindexoutofboundsexception();
     else
                MCOPY(&array->data[start], buf, jlong, len);
-
 }
 
 
 void SetFloatArrayRegion(JNIEnv *env, jfloatArray array, jsize start,
                                                 jsize len, jfloat *buf)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (start < 0 || len < 0 || start + len > array->header.size)
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
-
+               exceptions_throw_arrayindexoutofboundsexception();
     else
                MCOPY(&array->data[start], buf, jfloat, len);
-
 }
 
 
 void SetDoubleArrayRegion(JNIEnv *env, jdoubleArray array, jsize start,
                                                  jsize len, jdouble *buf)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (start < 0 || len < 0 || start + len > array->header.size)
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
-
+               exceptions_throw_arrayindexoutofboundsexception();
     else
                MCOPY(&array->data[start], buf, jdouble, len);
 }
@@ -3845,7 +3989,7 @@ void SetDoubleArrayRegion(JNIEnv *env, jdoubleArray array, jsize start,
 jint RegisterNatives(JNIEnv *env, jclass clazz, const JNINativeMethod *methods,
                                         jint nMethods)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     log_text("JNI-Call: RegisterNatives: IMPLEMENT ME!!!");
 
@@ -3867,7 +4011,7 @@ jint RegisterNatives(JNIEnv *env, jclass clazz, const JNINativeMethod *methods,
 
 jint UnregisterNatives(JNIEnv *env, jclass clazz)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        /* XXX TWISTI hmm, maybe we should not support that (like kaffe) */
 
@@ -3888,10 +4032,10 @@ jint UnregisterNatives(JNIEnv *env, jclass clazz)
 
 jint MonitorEnter(JNIEnv *env, jobject obj)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (!obj) {
-               *exceptionptr = new_nullpointerexception();
+               exceptions_throw_nullpointerexception();
                return JNI_ERR;
        }
 
@@ -3915,9 +4059,10 @@ jint MonitorEnter(JNIEnv *env, jobject obj)
 
 jint MonitorExit(JNIEnv *env, jobject obj)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
        if (!obj) {
-               *exceptionptr = new_nullpointerexception();
+               exceptions_throw_nullpointerexception();
                return JNI_ERR;
        }
 
@@ -3941,24 +4086,27 @@ jint MonitorExit(JNIEnv *env, jobject obj)
 
 jint GetJavaVM(JNIEnv *env, JavaVM **vm)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
     *vm = &ptr_jvm;
 
        return 0;
 }
 
 
-void GetStringRegion (JNIEnv* env, jstring str, jsize start, jsize len, jchar *buf)
+void GetStringRegion(JNIEnv* env, jstring str, jsize start, jsize len, jchar *buf)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: GetStringRegion");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: GetStringRegion: IMPLEMENT ME!");
 }
 
 
 void GetStringUTFRegion (JNIEnv* env, jstring str, jsize start, jsize len, char *buf)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: GetStringUTFRegion");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: GetStringUTFRegion: IMPLEMENT ME!");
 }
 
 
@@ -3970,9 +4118,16 @@ void GetStringUTFRegion (JNIEnv* env, jstring str, jsize start, jsize len, char
 
 void *GetPrimitiveArrayCritical(JNIEnv *env, jarray array, jboolean *isCopy)
 {
+       java_bytearray *ba;
+       jbyte          *bp;
+
+       ba = (java_bytearray *) array;
+
        /* do the same as Kaffe does */
 
-       return GetByteArrayElements(env, (jbyteArray) array, isCopy);
+       bp = GetByteArrayElements(env, ba, isCopy);
+
+       return (void *) bp;
 }
 
 
@@ -3985,7 +4140,7 @@ void *GetPrimitiveArrayCritical(JNIEnv *env, jarray array, jboolean *isCopy)
 void ReleasePrimitiveArrayCritical(JNIEnv *env, jarray array, void *carray,
                                                                   jint mode)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        /* do the same as Kaffe does */
 
@@ -4002,7 +4157,7 @@ void ReleasePrimitiveArrayCritical(JNIEnv *env, jarray array, void *carray,
 
 const jchar *GetStringCritical(JNIEnv *env, jstring string, jboolean *isCopy)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        return GetStringChars(env, string, isCopy);
 }
@@ -4010,27 +4165,27 @@ const jchar *GetStringCritical(JNIEnv *env, jstring string, jboolean *isCopy)
 
 void ReleaseStringCritical(JNIEnv *env, jstring string, const jchar *cstring)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        ReleaseStringChars(env, string, cstring);
 }
 
 
-jweak NewWeakGlobalRef (JNIEnv* env, jobject obj)
+jweak NewWeakGlobalRef(JNIEnv* env, jobject obj)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: NewWeakGlobalRef");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: NewWeakGlobalRef: IMPLEMENT ME!");
 
        return obj;
 }
 
 
-void DeleteWeakGlobalRef (JNIEnv* env, jweak ref)
+void DeleteWeakGlobalRef(JNIEnv* env, jweak ref)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: DeleteWeakGlobalRef");
+       STATISTICS(jniinvokation());
 
-       /* empty */
+       log_text("JNI-Call: DeleteWeakGlobalRef: IMPLEMENT ME");
 }
 
 
@@ -4046,7 +4201,7 @@ jobject NewGlobalRef(JNIEnv* env, jobject lobj)
        java_lang_Integer *refcount;
        java_objectheader *newval;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
 #if defined(USE_THREADS)
        builtin_monitorenter(*global_ref_table);
@@ -4093,7 +4248,7 @@ void DeleteGlobalRef(JNIEnv* env, jobject globalRef)
        java_lang_Integer *refcount;
        s4                 val;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
 #if defined(USE_THREADS)
        builtin_monitorenter(*global_ref_table);
@@ -4138,7 +4293,8 @@ void DeleteGlobalRef(JNIEnv* env, jobject globalRef)
 
 jboolean ExceptionCheck(JNIEnv *env)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
        return *exceptionptr ? JNI_TRUE : JNI_FALSE;
 }
 
@@ -4155,28 +4311,33 @@ jboolean ExceptionCheck(JNIEnv *env)
 
 jobject NewDirectByteBuffer(JNIEnv *env, void *address, jlong capacity)
 {
-       java_nio_DirectByteBufferImpl *nbuf;
+       java_objectheader *nbuf;
 #if SIZEOF_VOID_P == 8
        gnu_classpath_Pointer64 *paddress;
 #else
        gnu_classpath_Pointer32 *paddress;
 #endif
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        log_text("JNI-NewDirectByteBuffer: called");
 
-       /* allocate a java.nio.DirectByteBufferImpl object */
+#if 0
+       /* allocate a java.nio.DirectByteBufferImpl$ReadWrite object */
 
-       if (!(nbuf = (java_nio_DirectByteBufferImpl *) builtin_new(class_java_nio_DirectByteBufferImpl)))
+       if (!(nbuf = (java_nio_DirectByteBufferImpl$ReadWrite *)
+                 builtin_new(class_java_nio_DirectByteBufferImpl_ReadWrite)))
                return NULL;
+#endif
 
        /* alocate a gnu.classpath.Pointer{32,64} object */
 
 #if SIZEOF_VOID_P == 8
-       if (!(paddress = (gnu_classpath_Pointer64 *) builtin_new(class_gnu_classpath_Pointer64)))
+       if (!(paddress = (gnu_classpath_Pointer64 *)
+                 builtin_new(class_gnu_classpath_Pointer64)))
 #else
-       if (!(paddress = (gnu_classpath_Pointer32 *) builtin_new(class_gnu_classpath_Pointer32)))
+       if (!(paddress = (gnu_classpath_Pointer32 *)
+                 builtin_new(class_gnu_classpath_Pointer32)))
 #endif
                return NULL;
 
@@ -4184,16 +4345,22 @@ jobject NewDirectByteBuffer(JNIEnv *env, void *address, jlong capacity)
 
        paddress->data = (ptrint) address;
 
+#if 0
        /* fill java.nio.Buffer object */
 
        nbuf->cap     = (s4) capacity;
        nbuf->limit   = (s4) capacity;
        nbuf->pos     = 0;
        nbuf->address = (gnu_classpath_Pointer *) paddress;
+#endif
+
+       nbuf = (*env)->NewObject(env, class_java_nio_DirectByteBufferImpl_ReadWrite,
+                                                        dbbirw_init, NULL, paddress,
+                                                        (jint) capacity, (jint) capacity, (jint) 0);
 
        /* add local reference and return the value */
 
-       return NewLocalRef(env, (jobject) nbuf);
+       return NewLocalRef(env, nbuf);
 }
 
 
@@ -4213,7 +4380,7 @@ void *GetDirectBufferAddress(JNIEnv *env, jobject buf)
        gnu_classpath_Pointer32       *address;
 #endif
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
 #if 0
        if (!builtin_instanceof(buf, class_java_nio_DirectByteBufferImpl))
@@ -4243,7 +4410,7 @@ jlong GetDirectBufferCapacity(JNIEnv* env, jobject buf)
 {
        java_nio_Buffer *nbuf;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (buf == NULL)
                return -1;
@@ -4256,8 +4423,9 @@ jlong GetDirectBufferCapacity(JNIEnv* env, jobject buf)
 
 jint DestroyJavaVM(JavaVM *vm)
 {
-       STATS(jniinvokation();)
-       log_text("DestroyJavaVM called");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: DestroyJavaVM: IMPLEMENT ME!");
 
        return 0;
 }
@@ -4279,9 +4447,9 @@ jint DestroyJavaVM(JavaVM *vm)
 
 jint AttachCurrentThread(JavaVM *vm, void **env, void *thr_args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       log_text("AttachCurrentThread called");
+       log_text("JNI-Call: AttachCurrentThread: IMPLEMENT ME!");
 
 #if !defined(HAVE___THREAD)
 /*     cacao_thread_attach();*/
@@ -4297,8 +4465,9 @@ jint AttachCurrentThread(JavaVM *vm, void **env, void *thr_args)
 
 jint DetachCurrentThread(JavaVM *vm)
 {
-       STATS(jniinvokation();)
-       log_text("DetachCurrentThread called");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: DetachCurrentThread: IMPLEMENT ME!");
 
        return 0;
 }
@@ -4315,7 +4484,7 @@ jint DetachCurrentThread(JavaVM *vm)
 
 jint GetEnv(JavaVM *vm, void **env, jint version)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
        if (thread_getself() == NULL) {
@@ -4350,8 +4519,9 @@ jint GetEnv(JavaVM *vm, void **env, jint version)
 
 jint AttachCurrentThreadAsDaemon(JavaVM *vm, void **par1, void *par2)
 {
-       STATS(jniinvokation();)
-       log_text("AttachCurrentThreadAsDaemon called");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: AttachCurrentThreadAsDaemon: IMPLEMENT ME!");
 
        return 0;
 }