* m4/classpath.m4: Renamed --with-classpath* options to
[cacao.git] / src / native / jni.c
index ffd652c6291d1ccc3a22683aec39d60316c6fcdc..6cfd983f9c98d085ffe1014f5446f508db004f7d 100644 (file)
@@ -40,7 +40,7 @@
 #include "native/native.h"
 
 #if defined(ENABLE_JAVASE)
-# if defined(WITH_CLASSPATH_GNU)
+# if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
 #  include "native/include/gnu_classpath_Pointer.h"
 
 #  if SIZEOF_VOID_P == 8
@@ -56,7 +56,8 @@
 #include "native/include/java_lang_Throwable.h"
 
 #if defined(ENABLE_JAVASE)
-# if defined(WITH_CLASSPATH_SUN)
+
+# if defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
 #  include "native/include/java_nio_ByteBuffer.h"       /* required by j.l.CL */
 # endif
 
@@ -75,17 +76,21 @@ struct java_lang_ClassLoader;
 
 # include "native/include/java_nio_Buffer.h"
 
-# if defined(WITH_CLASSPATH_GNU)
+# if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
+#  include "native/include/java_lang_reflect_VMConstructor.h"
+#  include "native/include/java_lang_reflect_VMField.h"
+#  include "native/include/java_lang_reflect_VMMethod.h"
+
 #  include "native/include/java_nio_DirectByteBufferImpl.h"
 # endif
+#elif defined(ENABLE_JAVAME_CLDC1_1)
+# include "native/include/java_lang_Class.h"
 #endif
 
 #if defined(ENABLE_JVMTI)
 # include "native/jvmti/cacaodbg.h"
 #endif
 
-#include "native/vm/java_lang_Class.h"
-
 #if defined(ENABLE_JAVASE)
 # include "native/vm/reflect.h"
 #endif
@@ -145,7 +150,7 @@ static hashtable *hashtable_global_ref; /* hashtable for globalrefs           */
 #if defined(ENABLE_JAVASE)
 static classinfo *class_java_nio_Buffer;
 
-# if defined(WITH_CLASSPATH_GNU)
+# if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
 
 static classinfo *class_java_nio_DirectByteBufferImpl;
 static classinfo *class_java_nio_DirectByteBufferImpl_ReadWrite;
@@ -158,7 +163,7 @@ static classinfo *class_gnu_classpath_Pointer32;
 
 static methodinfo *dbbirw_init;
 
-# elif defined(WITH_CLASSPATH_SUN)
+# elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
 
 static classinfo *class_sun_nio_ch_DirectBuffer;
 static classinfo *class_java_nio_DirectByteBuffer;
@@ -199,7 +204,7 @@ bool jni_init(void)
                !link_class(class_java_nio_Buffer))
                return false;
 
-# if defined(WITH_CLASSPATH_GNU)
+# if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
 
        if (!(class_java_nio_DirectByteBufferImpl =
                  load_class_bootstrap(utf_new_char("java/nio/DirectByteBufferImpl"))) ||
@@ -229,7 +234,7 @@ bool jni_init(void)
                return false;
 #  endif
 
-# elif defined(WITH_CLASSPATH_SUN)
+# elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
 
        if (!(class_sun_nio_ch_DirectBuffer =
                  load_class_bootstrap(utf_new_char("sun/nio/ch/DirectBuffer"))))
@@ -801,83 +806,6 @@ static void _Jv_jni_CallVoidMethodA(java_handle_t *o, vftbl_t *vftbl,
 }
 
 
-/* _Jv_jni_invokeNative ********************************************************
-
-   Invoke a method on the given object with the given arguments.
-
-   For instance methods OBJ must be != NULL and the method is looked up
-   in the vftbl of the object.
-
-   For static methods, OBJ is ignored.
-
-*******************************************************************************/
-
-java_handle_t *_Jv_jni_invokeNative(methodinfo *m, java_handle_t *o,
-                                                                       java_handle_objectarray_t *params)
-{
-       methodinfo    *resm;
-       java_handle_t *ro;
-       s4             argcount;
-       s4             paramcount;
-
-       if (m == NULL) {
-               exceptions_throw_nullpointerexception();
-               return NULL;
-       }
-
-       argcount = m->parseddesc->paramcount;
-       paramcount = argcount;
-
-       /* if method is non-static, remove the `this' pointer */
-
-       if (!(m->flags & ACC_STATIC))
-               paramcount--;
-
-       /* For instance methods the object has to be an instance of the
-          class the method belongs to. For static methods the obj
-          parameter is ignored. */
-
-       if (!(m->flags & ACC_STATIC) && o && (!builtin_instanceof(o, m->class))) {
-               exceptions_throw_illegalargumentexception();
-               return NULL;
-       }
-
-       /* check if we got the right number of arguments */
-
-       if (((params == NULL) && (paramcount != 0)) ||
-               (params && (LLNI_array_size(params) != paramcount))) 
-       {
-               exceptions_throw_illegalargumentexception();
-               return NULL;
-       }
-
-       /* for instance methods we need an object */
-
-       if (!(m->flags & ACC_STATIC) && (o == NULL)) {
-               /* XXX not sure if that is the correct exception */
-               exceptions_throw_nullpointerexception();
-               return NULL;
-       }
-
-       /* for static methods, zero object to make subsequent code simpler */
-       if (m->flags & ACC_STATIC)
-               o = NULL;
-
-       if (o != NULL) {
-               /* for instance methods we must do a vftbl lookup */
-               resm = method_vftbl_lookup(LLNI_vftbl_direct(o), m);
-       }
-       else {
-               /* for static methods, just for convenience */
-               resm = m;
-       }
-
-       ro = vm_call_method_objectarray(resm, o, params);
-
-       return ro;
-}
-
-
 /* GetVersion ******************************************************************
 
    Returns the major version number in the higher 16 bits and the
@@ -910,7 +838,7 @@ jclass _Jv_JNI_DefineClass(JNIEnv *env, const char *name, jobject loader,
 {
 #if defined(ENABLE_JAVASE)
        utf             *u;
-       classloader     *cl;
+       classloader_t   *cl;
        classinfo       *c;
        java_lang_Class *co;
 
@@ -1062,15 +990,15 @@ jclass _Jv_JNI_GetSuperclass(JNIEnv *env, jclass sub)
 
 jboolean _Jv_JNI_IsAssignableFrom(JNIEnv *env, jclass sub, jclass sup)
 {
-       java_lang_Class *csup;
-       java_lang_Class *csub;
+       classinfo *to;
+       classinfo *from;
 
-       csup = (java_lang_Class *) sup;
-       csub = (java_lang_Class *) sub;
+       TRACEJNICALLS(("_Jv_JNI_IsAssignableFrom(env=%p, sub=%p, sup=%p)", env, sub, sup));
 
-       STATISTICS(jniinvokation());
+       to   = (classinfo *) sup;
+       from = (classinfo *) sub;
 
-       return _Jv_java_lang_Class_isAssignableFrom(csup, csub);
+       return class_is_assignable_from(to, from);
 }
 
 
@@ -1520,15 +1448,16 @@ jclass _Jv_JNI_GetObjectClass(JNIEnv *env, jobject obj)
 
 jboolean _Jv_JNI_IsInstanceOf(JNIEnv *env, jobject obj, jclass clazz)
 {
-       java_lang_Class  *c;
-       java_lang_Object *o;
+       classinfo     *c;
+       java_handle_t *h;
 
-       STATISTICS(jniinvokation());
+       TRACEJNICALLS(("_Jv_JNI_IsInstanceOf(env=%p, obj=%p, clazz=%p)", env, obj, clazz));
 
-       c = (java_lang_Class *) clazz;
-       o = (java_lang_Object *) obj;
+       /* XXX Is this correct? */
+       c = LLNI_classinfo_unwrap(clazz);
+       h = (java_handle_t *) obj;
 
-       return _Jv_java_lang_Class_isInstance(c, o);
+       return class_is_instance(c, h);
 }
 
 
@@ -1541,45 +1470,74 @@ jboolean _Jv_JNI_IsInstanceOf(JNIEnv *env, jobject obj, jclass clazz)
   
 *******************************************************************************/
   
-jmethodID _Jv_JNI_FromReflectedMethod(JNIEnv *env, jobject method)
+jmethodID jni_FromReflectedMethod(JNIEnv *env, jobject method)
 {
 #if defined(ENABLE_JAVASE)
-       java_handle_t *o;
-       classinfo     *c;
-       methodinfo    *m;
-       s4             slot;
+       java_handle_t                   *o;
+       java_lang_reflect_Method        *rm;
+       java_lang_reflect_Constructor   *rc;
+       classinfo                       *c;
+       methodinfo                      *m;
+       int32_t                          slot;
+
+#if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
+       java_lang_reflect_VMMethod      *rvmm;
+       java_lang_reflect_VMConstructor *rvmc;
+#endif
 
-       STATISTICS(jniinvokation());
+       TRACEJNICALLS(("jni_FromReflectedMethod(env=%p, method=%p)", env, method));
 
        o = (java_handle_t *) method;
 
        if (o == NULL)
                return NULL;
-       
-       if (builtin_instanceof(o, class_java_lang_reflect_Method)) {
-               java_lang_reflect_Method *rm;
 
-               rm   = (java_lang_reflect_Method *) method;
-               LLNI_field_get_cls(rm, clazz, c);
-               LLNI_field_get_val(rm, slot , slot);
-       }
-       else if (builtin_instanceof(o, class_java_lang_reflect_Constructor)) {
-               java_lang_reflect_Constructor *rc;
+       if (o->vftbl->clazz == class_java_lang_reflect_Constructor) {
+               rc = (java_lang_reflect_Constructor *) method;
+
+#if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
+
+               LLNI_field_get_ref(rc,   cons , rvmc);
+               LLNI_field_get_cls(rvmc, clazz, c);
+               LLNI_field_get_val(rvmc, slot , slot);
+
+#elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
 
-               rc   = (java_lang_reflect_Constructor *) method;
                LLNI_field_get_cls(rc, clazz, c);
                LLNI_field_get_val(rc, slot , slot);
+
+#else
+# error unknown configuration
+#endif
+       }
+       else {
+               assert(o->vftbl->clazz == class_java_lang_reflect_Method);
+
+               rm = (java_lang_reflect_Method *) method;
+
+#if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
+
+               LLNI_field_get_ref(rm,   m ,    rvmm);
+               LLNI_field_get_cls(rvmm, clazz, c);
+               LLNI_field_get_val(rvmm, slot , slot);
+
+#elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
+
+               LLNI_field_get_cls(rm, clazz, c);
+               LLNI_field_get_val(rm, slot , slot);
+
+#else
+# error unknown configuration
+#endif
        }
-       else
-               return NULL;
 
        m = &(c->methods[slot]);
 
        return (jmethodID) m;
 #else
-       vm_abort("_Jv_JNI_FromReflectedMethod: not implemented in this configuration");
+       vm_abort("jni_FromReflectedMethod: Not implemented in this configuration.");
 
-       /* keep compiler happy */
+       /* Keep compiler happy. */
 
        return NULL;
 #endif
@@ -1592,30 +1550,47 @@ jmethodID _Jv_JNI_FromReflectedMethod(JNIEnv *env, jobject method)
 
 *******************************************************************************/
  
-jfieldID _Jv_JNI_FromReflectedField(JNIEnv* env, jobject field)
+jfieldID jni_FromReflectedField(JNIEnv* env, jobject field)
 {
 #if defined(ENABLE_JAVASE)
-       java_lang_reflect_Field *rf;
-       classinfo               *c;
-       fieldinfo               *f;
-       int32_t                  slot;
+       java_lang_reflect_Field   *rf;
+       classinfo                 *c;
+       fieldinfo                 *f;
+       int32_t                    slot;
 
-       STATISTICS(jniinvokation());
+#if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
+       java_lang_reflect_VMField *rvmf;
+#endif
+
+       TRACEJNICALLS(("jni_FromReflectedField(env=%p, field=%p)", env, field));
 
        rf = (java_lang_reflect_Field *) field;
 
        if (rf == NULL)
                return NULL;
 
+#if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
+
+       LLNI_field_get_ref(rf,   f,     rvmf);
+       LLNI_field_get_cls(rvmf, clazz, c);
+       LLNI_field_get_val(rvmf, slot , slot);
+
+#elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
+
        LLNI_field_get_cls(rf, clazz, c);
        LLNI_field_get_val(rf, slot , slot);
+
+#else
+# error unknown configuration
+#endif
+
        f = &(c->fields[slot]);
 
        return (jfieldID) f;
 #else
-       vm_abort("_Jv_JNI_FromReflectedField: not implemented in this configuration");
+       vm_abort("jni_FromReflectedField: Not implemented in this configuration.");
 
-       /* keep compiler happy */
+       /* Keep compiler happy. */
 
        return NULL;
 #endif
@@ -2960,7 +2935,7 @@ type _Jv_JNI_New##name##Array(JNIEnv *env, jsize len)    \
 JNI_NEW_ARRAY(Boolean, jbooleanArray, boolean)
 JNI_NEW_ARRAY(Byte,    jbyteArray,    byte)
 JNI_NEW_ARRAY(Char,    jcharArray,    char)
-JNI_NEW_ARRAY(Short,   jshortArray,   byte)
+JNI_NEW_ARRAY(Short,   jshortArray,   short)
 JNI_NEW_ARRAY(Int,     jintArray,     int)
 JNI_NEW_ARRAY(Long,    jlongArray,    long)
 JNI_NEW_ARRAY(Float,   jfloatArray,   float)
@@ -3308,21 +3283,37 @@ void _Jv_JNI_GetStringUTFRegion(JNIEnv* env, jstring str, jsize start,
 
    Obtain a direct pointer to array elements.
 
+   ATTENTION: Critical section keeps open when this function returns!
+   See ReleasePrimitiveArrayCritical.
+
 *******************************************************************************/
 
-void *_Jv_JNI_GetPrimitiveArrayCritical(JNIEnv *env, jarray array,
-                                                                               jboolean *isCopy)
+void* jni_GetPrimitiveArrayCritical(JNIEnv *env, jarray array, jboolean *isCopy)
 {
-       java_handle_bytearray_t *ba;
-       jbyte                   *bp;
+       java_handle_t*   h;
+       java_array_t*    a;
+       arraydescriptor* ad;
+       void*            data;
 
-       ba = (java_handle_bytearray_t *) array;
+       TRACEJNICALLS(("jni_GetPrimitiveArrayCritical(env=%p, array=%p, isCopy=%d)", env, array, isCopy));
 
-       /* do the same as Kaffe does */
+       if (isCopy != NULL) {
+               *isCopy = JNI_FALSE;
+       }
 
-       bp = _Jv_JNI_GetByteArrayElements(env, (jbyteArray) ba, isCopy);
+       LLNI_CRITICAL_START;
+
+       h  = (java_handle_t*) array;
+       a  = (java_array_t*) LLNI_UNWRAP(h);
+       ad = a->objheader.vftbl->arraydesc;
+
+       /* Sanity check. */
 
-       return (void *) bp;
+       assert(ad != NULL);
+
+       data = (void*) (((intptr_t) a) + ad->dataoffset);
+
+       return data;
 }
 
 
@@ -3330,17 +3321,16 @@ void *_Jv_JNI_GetPrimitiveArrayCritical(JNIEnv *env, jarray array,
 
    No specific documentation.
 
+   ATTENTION: This function closes the critical section opened in
+   GetPrimitiveArrayCritical!
+
 *******************************************************************************/
 
-void _Jv_JNI_ReleasePrimitiveArrayCritical(JNIEnv *env, jarray array,
-                                                                                  void *carray, jint mode)
+void jni_ReleasePrimitiveArrayCritical(JNIEnv *env, jarray array, void *carray, jint mode)
 {
-       STATISTICS(jniinvokation());
-
-       /* do the same as Kaffe does */
+       TRACEJNICALLS(("jni_ReleasePrimitiveArrayCritical(env=%p, array=%p, carray=%p, mode=%d)", env, array, carray, mode));
 
-       _Jv_JNI_ReleaseByteArrayElements(env, (jbyteArray) array, (jbyte *) carray,
-                                                                        mode);
+       LLNI_CRITICAL_END;
 }
 
 
@@ -3576,7 +3566,7 @@ jboolean _Jv_JNI_ExceptionCheck(JNIEnv *env)
 jobject _Jv_JNI_NewDirectByteBuffer(JNIEnv *env, void *address, jlong capacity)
 {
 #if defined(ENABLE_JAVASE)
-# if defined(WITH_CLASSPATH_GNU)
+# if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
        java_handle_t           *nbuf;
 
 # if SIZEOF_VOID_P == 8
@@ -3612,7 +3602,7 @@ jobject _Jv_JNI_NewDirectByteBuffer(JNIEnv *env, void *address, jlong capacity)
 
        return _Jv_JNI_NewLocalRef(env, nbuf);
 
-# elif defined(WITH_CLASSPATH_SUN)
+# elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
 
        jobject o;
        int64_t addr;
@@ -3658,7 +3648,7 @@ void *_Jv_JNI_GetDirectBufferAddress(JNIEnv *env, jobject buf)
 #if defined(ENABLE_JAVASE)
        java_handle_t                 *h;
 
-# if defined(WITH_CLASSPATH_GNU)
+# if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
 
        java_nio_DirectByteBufferImpl *nbuf;
        gnu_classpath_Pointer         *po;
@@ -3699,7 +3689,7 @@ void *_Jv_JNI_GetDirectBufferAddress(JNIEnv *env, jobject buf)
 
        return p;
 
-# elif defined(WITH_CLASSPATH_SUN)
+# elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
 
        java_nio_Buffer *o;
        int64_t          address;
@@ -3747,7 +3737,7 @@ void *_Jv_JNI_GetDirectBufferAddress(JNIEnv *env, jobject buf)
 
 jlong _Jv_JNI_GetDirectBufferCapacity(JNIEnv* env, jobject buf)
 {
-#if defined(ENABLE_JAVASE) && defined(WITH_CLASSPATH_GNU)
+#if defined(ENABLE_JAVASE) && defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
        java_handle_t   *o;
        java_nio_Buffer *nbuf;
        jlong            capacity;
@@ -4038,8 +4028,8 @@ struct JNINativeInterface_ _Jv_JNINativeInterface = {
 
        _Jv_JNI_DefineClass,
        jni_FindClass,
-       _Jv_JNI_FromReflectedMethod,
-       _Jv_JNI_FromReflectedField,
+       jni_FromReflectedMethod,
+       jni_FromReflectedField,
        _Jv_JNI_ToReflectedMethod,
        _Jv_JNI_GetSuperclass,
        _Jv_JNI_IsAssignableFrom,
@@ -4281,8 +4271,8 @@ struct JNINativeInterface_ _Jv_JNINativeInterface = {
        _Jv_JNI_GetStringRegion,
        _Jv_JNI_GetStringUTFRegion,
 
-       _Jv_JNI_GetPrimitiveArrayCritical,
-       _Jv_JNI_ReleasePrimitiveArrayCritical,
+       jni_GetPrimitiveArrayCritical,
+       jni_ReleasePrimitiveArrayCritical,
 
        _Jv_JNI_GetStringCritical,
        _Jv_JNI_ReleaseStringCritical,