* Removed all Id tags.
[cacao.git] / src / native / vm / gnu / java_lang_VMClassLoader.c
index 5897448bfaf98142ee69c6a4319a5b247b1930fa..1a21ae5126753dbc4041f63385c1a843fb021c12 100644 (file)
@@ -22,8 +22,6 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: java_lang_VMClassLoader.c 7408 2007-02-26 22:11:38Z twisti $
-
 */
 
 
@@ -36,6 +34,7 @@
 #include "mm/memory.h"
 
 #include "native/jni.h"
+#include "native/llni.h"
 #include "native/native.h"
 #include "native/include/java_lang_Class.h"
 #include "native/include/java_lang_String.h"
@@ -43,6 +42,8 @@
 #include "native/include/java_lang_ClassLoader.h"
 #include "native/include/java_util_Vector.h"
 
+#include "native/include/java_lang_VMClassLoader.h"
+
 #include "native/vm/java_lang_ClassLoader.h"
 
 #include "toolbox/logging.h"
@@ -50,6 +51,7 @@
 #include "vm/builtin.h"
 #include "vm/exceptions.h"
 #include "vm/initialize.h"
+#include "vm/primitive.h"
 #include "vm/stringlocal.h"
 #include "vm/vm.h"
 
 #endif
 
 
+/* native methods implemented by this file ************************************/
+
+static JNINativeMethod methods[] = {
+       { "defineClass",            "(Ljava/lang/ClassLoader;Ljava/lang/String;[BIILjava/security/ProtectionDomain;)Ljava/lang/Class;", (void *) (ptrint) &Java_java_lang_VMClassLoader_defineClass            },
+       { "getPrimitiveClass",      "(C)Ljava/lang/Class;",                                                                             (void *) (ptrint) &Java_java_lang_VMClassLoader_getPrimitiveClass      },
+       { "resolveClass",           "(Ljava/lang/Class;)V",                                                                             (void *) (ptrint) &Java_java_lang_VMClassLoader_resolveClass           },
+       { "loadClass",              "(Ljava/lang/String;Z)Ljava/lang/Class;",                                                           (void *) (ptrint) &Java_java_lang_VMClassLoader_loadClass              },
+       { "nativeGetResources",     "(Ljava/lang/String;)Ljava/util/Vector;",                                                           (void *) (ptrint) &Java_java_lang_VMClassLoader_nativeGetResources     },
+       { "defaultAssertionStatus", "()Z",                                                                                              (void *) (ptrint) &Java_java_lang_VMClassLoader_defaultAssertionStatus },
+       { "findLoadedClass",        "(Ljava/lang/ClassLoader;Ljava/lang/String;)Ljava/lang/Class;",                                     (void *) (ptrint) &Java_java_lang_VMClassLoader_findLoadedClass        },
+};
+
+
+/* _Jv_java_lang_VMClassLoader_init ********************************************
+
+   Register native functions.
+
+*******************************************************************************/
+
+void _Jv_java_lang_VMClassLoader_init(void)
+{
+       utf *u;
+
+       u = utf_new_char("java/lang/VMClassLoader");
+
+       native_method_register(u, methods, NATIVE_METHODS_COUNT);
+}
+
+
 /*
  * Class:     java/lang/VMClassLoader
  * Method:    defineClass
  * Signature: (Ljava/lang/ClassLoader;Ljava/lang/String;[BIILjava/security/ProtectionDomain;)Ljava/lang/Class;
  */
-JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_defineClass(JNIEnv *env, jclass clazz, java_lang_ClassLoader *cl, java_lang_String *name, java_bytearray *data, s4 offset, s4 len, java_security_ProtectionDomain *pd)
+JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_defineClass(JNIEnv *env, jclass clazz, java_lang_ClassLoader *cl, java_lang_String *name, java_handle_bytearray_t *data, s4 offset, s4 len, java_security_ProtectionDomain *pd)
 {
        return _Jv_java_lang_ClassLoader_defineClass(cl, name, data, offset, len, pd);
 }
@@ -88,46 +119,15 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_defineClass(JNIE
 JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_getPrimitiveClass(JNIEnv *env, jclass clazz, s4 type)
 {
        classinfo *c;
-       s4         index;
-
-       /* get primitive class */
-
-       switch (type) {
-       case 'I':
-               index = PRIMITIVETYPE_INT;
-               break;
-       case 'J':
-               index = PRIMITIVETYPE_LONG;
-               break;
-       case 'F':
-               index = PRIMITIVETYPE_FLOAT;
-               break;
-       case 'D':
-               index = PRIMITIVETYPE_DOUBLE;
-               break;
-       case 'B':
-               index = PRIMITIVETYPE_BYTE;
-               break;
-       case 'C':
-               index = PRIMITIVETYPE_CHAR;
-               break;
-       case 'S':
-               index = PRIMITIVETYPE_SHORT;
-               break;
-       case 'Z':
-               index = PRIMITIVETYPE_BOOLEAN;
-               break;
-       case 'V':
-               index = PRIMITIVETYPE_VOID;
-               break;
-       default:
-               exceptions_throw_noclassdeffounderror(utf_null);
-               c = NULL;
-       }
 
-       c = primitivetype_table[index].class_primitive;
+       c = primitive_class_get_by_char(type);
+
+       if (c == NULL) {
+               exceptions_throw_classnotfoundexception(utf_null);
+               return NULL;
+       }
 
-       return (java_lang_Class *) c;
+       return LLNI_classinfo_wrap(c);
 }
 
 
@@ -140,7 +140,7 @@ JNIEXPORT void JNICALL Java_java_lang_VMClassLoader_resolveClass(JNIEnv *env, jc
 {
        classinfo *ci;
 
-       ci = (classinfo *) c;
+       ci = LLNI_classinfo_unwrap(c);
 
        if (!ci) {
                exceptions_throw_nullpointerexception();
@@ -161,11 +161,10 @@ JNIEXPORT void JNICALL Java_java_lang_VMClassLoader_resolveClass(JNIEnv *env, jc
  * Method:    loadClass
  * Signature: (Ljava/lang/String;Z)Ljava/lang/Class;
  */
-JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_loadClass(JNIEnv *env, jclass clazz, java_lang_String *name, jboolean resolve)
+JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_loadClass(JNIEnv *env, jclass clazz, java_lang_String *name, s4 resolve)
 {
-       classinfo         *c;
-       utf               *u;
-       java_objectheader *xptr;
+       classinfo *c;
+       utf       *u;
 
        if (name == NULL) {
                exceptions_throw_nullpointerexception();
@@ -174,40 +173,22 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_loadClass(JNIEnv
 
        /* create utf string in which '.' is replaced by '/' */
 
-       u = javastring_toutf(name, true);
+       u = javastring_toutf((java_handle_t *) name, true);
 
        /* load class */
 
        c = load_class_bootstrap(u);
 
        if (c == NULL)
-               goto exception;
+               return NULL;
 
        /* resolve class -- if requested */
 
 /*     if (resolve) */
                if (!link_class(c))
-                       goto exception;
-
-       return (java_lang_Class *) c;
-
- exception:
-       xptr = exceptions_get_exception();
-
-       c = xptr->vftbl->class;
-       
-       /* if the exception is a NoClassDefFoundError, we replace it with a
-          ClassNotFoundException, otherwise return the exception */
+                       return NULL;
 
-       if (c == class_java_lang_NoClassDefFoundError) {
-               /* clear exceptionptr, because builtin_new checks for 
-                  ExceptionInInitializerError */
-               exceptions_clear_exception();
-
-               exceptions_throw_classnotfoundexception(u);
-       }
-
-       return NULL;
+       return LLNI_classinfo_wrap(c);
 }
 
 
@@ -218,9 +199,9 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_loadClass(JNIEnv
  */
 JNIEXPORT java_util_Vector* JNICALL Java_java_lang_VMClassLoader_nativeGetResources(JNIEnv *env, jclass clazz, java_lang_String *name)
 {
-       jobject               o;         /* vector being created     */
+       java_handle_t        *o;         /* vector being created     */
        methodinfo           *m;         /* "add" method of vector   */
-       java_lang_String     *path;      /* path to be added         */
+       java_handle_t        *path;      /* path to be added         */
        list_classpath_entry *lce;       /* classpath entry          */
        utf                  *utfname;   /* utf to look for          */
        char                 *buffer;    /* char buffer              */
@@ -235,16 +216,17 @@ JNIEXPORT java_util_Vector* JNICALL Java_java_lang_VMClassLoader_nativeGetResour
 
        /* get the resource name as utf string */
 
-       utfname = javastring_toutf(name, false);
-       if (!utfname)
+       utfname = javastring_toutf((java_handle_t *) name, false);
+
+       if (utfname == NULL)
                return NULL;
 
        /* copy it to a char buffer */
 
-       namelen = utf_bytes(utfname);
+       namelen   = utf_bytes(utfname);
        searchlen = namelen;
-       bufsize = namelen + strlen("0");
-       buffer = MNEW(char, bufsize);
+       bufsize   = namelen + strlen("0");
+       buffer    = MNEW(char, bufsize);
 
        utf_copy(buffer, utfname);
        namestart = buffer;
@@ -275,7 +257,7 @@ JNIEXPORT java_util_Vector* JNICALL Java_java_lang_VMClassLoader_nativeGetResour
 
        o = native_new_and_init(class_java_util_Vector);
 
-       if (!o)
+       if (o == NULL)
                goto return_NULL;
 
        /* get Vector.add() method */
@@ -286,7 +268,7 @@ JNIEXPORT java_util_Vector* JNICALL Java_java_lang_VMClassLoader_nativeGetResour
                                                                 NULL,
                                                                 true);
 
-       if (!m)
+       if (m == NULL)
                goto return_NULL;
 
        /* iterate over all classpath entries */
@@ -332,7 +314,7 @@ JNIEXPORT java_util_Vector* JNICALL Java_java_lang_VMClassLoader_nativeGetResour
 
                /* if a resource was found, add it to the vector */
 
-               if (path) {
+               if (path != NULL) {
                        ret = vm_call_method_int(m, o, path);
 
                        if (exceptions_get_exception() != NULL)
@@ -370,25 +352,28 @@ JNIEXPORT s4 JNICALL Java_java_lang_VMClassLoader_defaultAssertionStatus(JNIEnv
  * Method:    findLoadedClass
  * Signature: (Ljava/lang/ClassLoader;Ljava/lang/String;)Ljava/lang/Class;
  */
-JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_findLoadedClass(JNIEnv *env, jclass clazz, java_lang_ClassLoader *cl, java_lang_String *name)
+JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_findLoadedClass(JNIEnv *env, jclass clazz, java_lang_ClassLoader *loader, java_lang_String *name)
 {
-       classinfo *c;
-       utf       *u;
+       classloader *cl;
+       classinfo   *c;
+       utf         *u;
+
+       cl = (classloader *) loader;
 
        /* replace `.' by `/', this is required by the classcache */
 
-       u = javastring_toutf(name, true);
+       u = javastring_toutf((java_handle_t *) name, true);
 
        /* lookup for defining classloader */
 
-       c = classcache_lookup_defined((classloader *) cl, u);
+       c = classcache_lookup_defined(cl, u);
 
        /* if not found, lookup for initiating classloader */
 
        if (c == NULL)
-               c = classcache_lookup((classloader *) cl, u);
+               c = classcache_lookup(cl, u);
 
-       return (java_lang_Class *) c;
+       return LLNI_classinfo_wrap(c);
 }