* src/vm/array.hpp: Implemented array access classes in C++.
[cacao.git] / src / native / vm / gnuclasspath / java_lang_VMClassLoader.cpp
index 1e0473520f29accab2994cbb25a056a14c549069..b67c8bc9ef48de663bc5034d189a81006380e26e 100644 (file)
 #include <stdint.h>
 #include <sys/stat.h>
 
-#include "mm/memory.h"
+#include "mm/memory.hpp"
 
-#include "native/jni.h"
+#include "native/jni.hpp"
 #include "native/llni.h"
-#include "native/native.h"
-#include "native/include/java_lang_Class.h"
-#include "native/include/java_lang_String.h"
-#include "native/include/java_security_ProtectionDomain.h"  /* required by... */
-#include "native/include/java_lang_ClassLoader.h"
-#include "native/include/java_util_HashMap.h"
-#include "native/include/java_util_Map.h"
-#include "native/include/java_lang_Boolean.h"
-
-// FIXME
-extern "C" {
-#include "native/include/java_lang_VMClassLoader.h"
-}
+#include "native/native.hpp"
 
-#include "toolbox/logging.h"
-#include "toolbox/list.h"
+#if defined(ENABLE_JNI_HEADERS)
+# include "native/vm/include/java_lang_VMClassLoader.h"
+#endif
+
+#include "toolbox/logging.hpp"
+#include "toolbox/list.hpp"
 
 #if defined(ENABLE_ASSERTION)
-#include "vm/assertion.h"
+#include "vm/assertion.hpp"
 #endif
 
-#include "vm/builtin.h"
+#include "vm/array.hpp"
+#include "vm/jit/builtin.hpp"
+#include "vm/class.hpp"
+#include "vm/classcache.hpp"
 #include "vm/exceptions.hpp"
-#include "vm/initialize.h"
+#include "vm/globals.hpp"
+#include "vm/initialize.hpp"
+#include "vm/javaobjects.hpp"
+#include "vm/linker.hpp"
+#include "vm/loader.hpp"
+#include "vm/options.h"
 #include "vm/primitive.hpp"
+#include "vm/statistics.h"
 #include "vm/string.hpp"
 #include "vm/vm.hpp"
+#include "vm/zip.hpp"
 
 #include "vm/jit/asmpart.h"
 
-#include "vmcore/class.h"
-#include "vmcore/classcache.h"
-#include "vmcore/globals.hpp"
-#include "vmcore/linker.h"
-#include "vmcore/loader.h"
-#include "vmcore/options.h"
-#include "vmcore/statistics.h"
-#include "vmcore/suck.h"
-#include "vmcore/zip.h"
-
 #if defined(ENABLE_JVMTI)
 #include "native/jvmti/cacaodbg.h"
 #endif
@@ -86,12 +78,12 @@ extern "C" {
  * 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_handle_bytearray_t *data, int32_t offset, int32_t len, java_security_ProtectionDomain *pd)
+JNIEXPORT jclass JNICALL Java_java_lang_VMClassLoader_defineClass(JNIEnv *env, jclass clazz, jobject cl, jstring name, jbyteArray data, jint offset, jint len, jobject pd)
 {
-       utf             *utfname;
-       classinfo       *c;
-       classloader_t   *loader;
-       java_lang_Class *o;
+       utf*           utfname;
+       classinfo*     c;
+       classloader_tloader;
+       uint8_t*       stream;
 
 #if defined(ENABLE_JVMTI)
        jint new_class_data_len = 0;
@@ -107,7 +99,9 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_defineClass(JNIE
 
        /* check the indexes passed */
 
-       if ((offset < 0) || (len < 0) || ((offset + len) > LLNI_array_size(data))) {
+       ByteArray ba(data);
+
+       if ((offset < 0) || (len < 0) || ((offset + len) > ba.get_length())) {
                exceptions_throw_arrayindexoutofboundsexception();
                return NULL;
        }
@@ -145,20 +139,22 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_defineClass(JNIE
                c = class_define(utfname, loader, new_class_data_len, new_class_data, pd); 
        else
 #endif
-               c = class_define(utfname, loader, len, (uint8_t *) &LLNI_array_direct(data, offset), (java_handle_t *) pd);
+       {
+               stream = ((uint8_t *) ba.get_raw_data_ptr()) + offset;
+               c = class_define(utfname, loader, len, stream, (java_handle_t *) pd);
+       }
 
        if (c == NULL)
                return NULL;
 
-       /* for convenience */
-
-       o = LLNI_classinfo_wrap(c);
-
-       /* set ProtectionDomain */
+       // REMOVEME
+       java_handle_t* h = LLNI_classinfo_wrap(c);
 
-       LLNI_field_set_ref(o, pd, pd);
+       // Set ProtectionDomain.
+       java_lang_Class jlc(h);
+       jlc.set_pd(pd);
 
-       return o;
+       return (jclass) jlc.get_handle();
 }
 
 
@@ -167,7 +163,7 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_defineClass(JNIE
  * Method:    getPrimitiveClass
  * Signature: (C)Ljava/lang/Class;
  */
-JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_getPrimitiveClass(JNIEnv *env, jclass clazz, int32_t type)
+JNIEXPORT jclass JNICALL Java_java_lang_VMClassLoader_getPrimitiveClass(JNIEnv *env, jclass clazz, jchar type)
 {
        classinfo *c;
 
@@ -178,7 +174,7 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_getPrimitiveClas
                return NULL;
        }
 
-       return LLNI_classinfo_wrap(c);
+       return (jclass) LLNI_classinfo_wrap(c);
 }
 
 
@@ -187,7 +183,7 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_getPrimitiveClas
  * Method:    resolveClass
  * Signature: (Ljava/lang/Class;)V
  */
-JNIEXPORT void JNICALL Java_java_lang_VMClassLoader_resolveClass(JNIEnv *env, jclass clazz, java_lang_Class *c)
+JNIEXPORT void JNICALL Java_java_lang_VMClassLoader_resolveClass(JNIEnv *env, jclass clazz, jclass c)
 {
        classinfo *ci;
 
@@ -212,7 +208,7 @@ 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, int32_t resolve)
+JNIEXPORT jclass JNICALL Java_java_lang_VMClassLoader_loadClass(JNIEnv *env, jclass clazz, jstring name, jboolean resolve)
 {
        classinfo *c;
        utf       *u;
@@ -239,7 +235,7 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_loadClass(JNIEnv
                if (!link_class(c))
                        return NULL;
 
-       return LLNI_classinfo_wrap(c);
+       return (jclass) LLNI_classinfo_wrap(c);
 }
 
 
@@ -248,12 +244,11 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_loadClass(JNIEnv
  * Method:    nativeGetResources
  * Signature: (Ljava/lang/String;)Ljava/util/Vector;
  */
-JNIEXPORT struct java_util_Vector* JNICALL Java_java_lang_VMClassLoader_nativeGetResources(JNIEnv *env, jclass clazz, java_lang_String *name)
+JNIEXPORT jobject JNICALL Java_java_lang_VMClassLoader_nativeGetResources(JNIEnv *env, jclass clazz, jstring name)
 {
        java_handle_t        *o;         /* vector being created     */
        methodinfo           *m;         /* "add" method of vector   */
        java_handle_t        *path;      /* path to be added         */
-       list_classpath_entry *lce;       /* classpath entry          */
        utf                  *utfname;   /* utf to look for          */
        char                 *buffer;    /* char buffer              */
        char                 *namestart; /* start of name to use     */
@@ -324,8 +319,9 @@ JNIEXPORT struct java_util_Vector* JNICALL Java_java_lang_VMClassLoader_nativeGe
 
        /* iterate over all classpath entries */
 
-       for (lce = (list_classpath_entry*) list_first(list_classpath_entries); lce != NULL;
-                lce = (list_classpath_entry*) list_next(list_classpath_entries, lce)) {
+       for (List<list_classpath_entry*>::iterator it = list_classpath_entries->begin(); it != list_classpath_entries->end(); it++) {
+               list_classpath_entry* lce = *it;
+
                /* clear path pointer */
                path = NULL;
 
@@ -378,7 +374,7 @@ JNIEXPORT struct java_util_Vector* JNICALL Java_java_lang_VMClassLoader_nativeGe
 
        MFREE(buffer, char, bufsize);
 
-       return (struct java_util_Vector *) o;
+       return (jobject) o;
 
 return_NULL:
        MFREE(buffer, char, bufsize);
@@ -392,7 +388,7 @@ return_NULL:
  * Method:    defaultAssertionStatus
  * Signature: ()Z
  */
-JNIEXPORT int32_t JNICALL Java_java_lang_VMClassLoader_defaultAssertionStatus(JNIEnv *env, jclass clazz)
+JNIEXPORT jboolean JNICALL Java_java_lang_VMClassLoader_defaultAssertionStatus(JNIEnv *env, jclass clazz)
 {
 #if defined(ENABLE_ASSERTION)
        return assertion_system_enabled;
@@ -406,7 +402,7 @@ JNIEXPORT int32_t JNICALL Java_java_lang_VMClassLoader_defaultAssertionStatus(JN
  * Method:    userAssertionStatus
  * Signature: ()Z
  */
-JNIEXPORT int32_t JNICALL Java_java_lang_VMClassLoader_defaultUserAssertionStatus(JNIEnv *env, jclass clazz)
+JNIEXPORT jboolean JNICALL Java_java_lang_VMClassLoader_defaultUserAssertionStatus(JNIEnv *env, jclass clazz)
 {
 #if defined(ENABLE_ASSERTION)
        return assertion_user_enabled;
@@ -418,15 +414,14 @@ JNIEXPORT int32_t JNICALL Java_java_lang_VMClassLoader_defaultUserAssertionStatu
 /*
  * Class:     java/lang/VMClassLoader
  * Method:    packageAssertionStatus
- * Signature: ()Ljava_util_Map;
+ * Signature: (Ljava/lang/Boolean;Ljava/lang/Boolean;)Ljava/util/Map;
  */
-JNIEXPORT java_util_Map* JNICALL Java_java_lang_VMClassLoader_packageAssertionStatus0(JNIEnv *env, jclass clazz, java_lang_Boolean *jtrue, java_lang_Boolean *jfalse)
+JNIEXPORT jobject JNICALL Java_java_lang_VMClassLoader_packageAssertionStatus0(JNIEnv *env, jclass clazz, jobject jtrue, jobject jfalse)
 {
        java_handle_t     *hm;
 #if defined(ENABLE_ASSERTION)
        java_handle_t     *js;
        methodinfo        *m;
-       assertion_name_t  *item;
 #endif
 
        /* new HashMap() */
@@ -440,7 +435,7 @@ JNIEXPORT java_util_Map* JNICALL Java_java_lang_VMClassLoader_packageAssertionSt
        /* if nothing todo, return now */
 
        if (assertion_package_count == 0) {
-               return (java_util_Map *) hm;
+               return (jobject) hm;
        }
 
        /* get HashMap.put method */
@@ -455,13 +450,11 @@ JNIEXPORT java_util_Map* JNICALL Java_java_lang_VMClassLoader_packageAssertionSt
                return NULL;
        }
 
-       item = (assertion_name_t *)list_first(list_assertion_names);
+       for (List<assertion_name_t*>::iterator it = list_assertion_names->begin(); it != list_assertion_names->end(); it++) {
+               assertion_name_t* item = *it;
 
-       while (item != NULL) {
-               if (item->package == false) {
-                       item = (assertion_name_t *)list_next(list_assertion_names, item);
+               if (item->package == false)
                        continue;
-               }
                
                if (strcmp(item->name, "") == 0) {
                        /* unnamed package wanted */
@@ -480,26 +473,23 @@ JNIEXPORT java_util_Map* JNICALL Java_java_lang_VMClassLoader_packageAssertionSt
                else {
                        vm_call_method(m, hm, js, jfalse);
                }
-
-               item = (assertion_name_t *)list_next(list_assertion_names, item);
        }
 #endif
 
-       return (java_util_Map *) hm;
+       return (jobject) hm;
 }
 
 /*
  * Class:     java/lang/VMClassLoader
  * Method:    classAssertionStatus
- * Signature: ()Ljava_util_Map;
+ * Signature: (Ljava/lang/Boolean;Ljava/lang/Boolean;)Ljava/util/Map;
  */
-JNIEXPORT java_util_Map* JNICALL Java_java_lang_VMClassLoader_classAssertionStatus0(JNIEnv *env, jclass clazz, java_lang_Boolean *jtrue, java_lang_Boolean *jfalse)
+JNIEXPORT jobject JNICALL Java_java_lang_VMClassLoader_classAssertionStatus0(JNIEnv *env, jclass clazz, jobject jtrue, jobject jfalse)
 {
        java_handle_t     *hm;
 #if defined(ENABLE_ASSERTION)
        java_handle_t     *js;
        methodinfo        *m;
-       assertion_name_t  *item;
 #endif
 
        /* new HashMap() */
@@ -513,7 +503,7 @@ JNIEXPORT java_util_Map* JNICALL Java_java_lang_VMClassLoader_classAssertionStat
        /* if nothing todo, return now */
 
        if (assertion_class_count == 0) {
-               return (java_util_Map *) hm;
+               return (jobject) hm;
        }
 
        /* get HashMap.put method */
@@ -528,13 +518,11 @@ JNIEXPORT java_util_Map* JNICALL Java_java_lang_VMClassLoader_classAssertionStat
                return NULL;
        }
 
-       item = (assertion_name_t *)list_first(list_assertion_names);
+       for (List<assertion_name_t*>::iterator it = list_assertion_names->begin(); it != list_assertion_names->end(); it++) {
+               assertion_name_t* item = *it;
 
-       while (item != NULL) {
-               if (item->package == true) {
-                       item = (assertion_name_t *)list_next(list_assertion_names, item);
+               if (item->package == true)
                        continue;
-               }
 
                js = javastring_new_from_ascii(item->name);
                if (js == NULL) {
@@ -547,12 +535,10 @@ JNIEXPORT java_util_Map* JNICALL Java_java_lang_VMClassLoader_classAssertionStat
                else {
                        vm_call_method(m, hm, js, jfalse);
                }
-
-               item = (assertion_name_t *)list_next(list_assertion_names, item);
        }
 #endif
 
-       return (java_util_Map *) hm;
+       return (jobject) hm;
 }
 
 
@@ -561,7 +547,7 @@ JNIEXPORT java_util_Map* JNICALL Java_java_lang_VMClassLoader_classAssertionStat
  * 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 *loader, java_lang_String *name)
+JNIEXPORT jclass JNICALL Java_java_lang_VMClassLoader_findLoadedClass(JNIEnv *env, jclass clazz, jobject loader, jstring name)
 {
        classloader_t *cl;
        classinfo     *c;
@@ -584,7 +570,7 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_findLoadedClass(
        if (c == NULL)
                c = classcache_lookup(cl, u);
 
-       return LLNI_classinfo_wrap(c);
+       return (jclass) LLNI_classinfo_wrap(c);
 }
 
 } // extern "C"
@@ -612,16 +598,12 @@ static JNINativeMethod methods[] = {
 
 *******************************************************************************/
 
-// FIXME
-extern "C" {
 void _Jv_java_lang_VMClassLoader_init(void)
 {
-       utf *u;
+       utf* u = utf_new_char("java/lang/VMClassLoader");
 
-       u = utf_new_char("java/lang/VMClassLoader");
-
-       native_method_register(u, methods, NATIVE_METHODS_COUNT);
-}
+       NativeMethods& nm = VM::get_current()->get_nativemethods();
+       nm.register_methods(u, methods, NATIVE_METHODS_COUNT);
 }