* src/vm/vm.c, src/vm/vm.h: Moved to .cpp.
authorChristian Thalinger <twisti@complang.tuwien.ac.at>
Mon, 14 Jul 2008 18:45:13 +0000 (20:45 +0200)
committerChristian Thalinger <twisti@complang.tuwien.ac.at>
Mon, 14 Jul 2008 18:45:13 +0000 (20:45 +0200)
* src/vm/vm.cpp, src/vm/vm.hpp: New file.

The following files mostly contain include changes but also other
changes related to the C++'ification.

* contrib/mapfile-vers-product,
src/cacao/cacao.c,
src/cacaoh/cacaoh.c,
src/cacaoh/dummy.c,
src/mm/boehm-gc/Makefile.am,
src/mm/boehm.c,
src/mm/cacao-gc/gc.c,
src/mm/cacao-gc/heap.c,
src/mm/cacao-gc/mark.c,
src/mm/dumpmemory.c,
src/mm/memory.c,
src/mm/nogc.c,
src/native/jni.c,
src/native/jni.h,
src/native/jvmti/cacaodbg.c,
src/native/localref.c,
src/native/native.c,
src/native/vm/cldc1.1/com_sun_cldc_io_ResourceInputStream.c,
src/native/vm/cldc1.1/com_sun_cldc_io_j2me_socket_Protocol.c,
src/native/vm/cldc1.1/java_lang_Runtime.c,
src/native/vm/gnuclasspath/gnu_classpath_VMSystemProperties.c,
src/native/vm/gnuclasspath/gnu_java_lang_management_VMClassLoadingMXBeanImpl.c,
src/native/vm/gnuclasspath/gnu_java_lang_management_VMMemoryMXBeanImpl.c,
src/native/vm/gnuclasspath/gnu_java_lang_management_VMRuntimeMXBeanImpl.c,
src/native/vm/gnuclasspath/gnu_java_lang_management_VMThreadMXBeanImpl.c,
src/native/vm/gnuclasspath/java_lang_VMClass.c,
src/native/vm/gnuclasspath/java_lang_VMClassLoader.c,
src/native/vm/gnuclasspath/java_lang_VMRuntime.c,
src/native/vm/gnuclasspath/java_lang_reflect_VMConstructor.cpp,
src/native/vm/gnuclasspath/java_lang_reflect_VMMethod.cpp,
src/native/vm/gnuclasspath/sun_reflect_ConstantPool.cpp,
src/native/vm/nativevm.c,
src/native/vm/openjdk/hpi.c,
src/native/vm/openjdk/jvm.c,
src/native/vm/reflect.c,
src/threads/posix/condition-posix.hpp,
src/threads/posix/lock.c,
src/threads/posix/mutex-posix.hpp,
src/threads/posix/thread-posix.c,
src/threads/posix/thread-posix.h,
src/threads/thread.c,
src/toolbox/avl.c,
src/toolbox/util.c,
src/vm/Makefile.am,
src/vm/array.c,
src/vm/assertion.c,
src/vm/exceptions.c,
src/vm/finalizer.c,
src/vm/initialize.c,
src/vm/jit/alpha/codegen.c,
src/vm/jit/alpha/md.h,
src/vm/jit/argument.c,
src/vm/jit/arm/codegen.c,
src/vm/jit/arm/linux/md-os.c,
src/vm/jit/asmpart.h,
src/vm/jit/code.c,
src/vm/jit/i386/codegen.c,
src/vm/jit/i386/md.c,
src/vm/jit/intrp/codegen.c,
src/vm/jit/m68k/codegen.c,
src/vm/jit/m68k/emit.h,
src/vm/jit/m68k/linux/md-os.c,
src/vm/jit/m68k/md.c,
src/vm/jit/mips/codegen.c,
src/vm/jit/mips/md.c,
src/vm/jit/mips/md.h,
src/vm/jit/mips/uclinux/md-os.c,
src/vm/jit/optimizing/ifconv.c,
src/vm/jit/patcher-common.c,
src/vm/jit/powerpc/codegen.c,
src/vm/jit/powerpc/md.c,
src/vm/jit/powerpc/md.h,
src/vm/jit/powerpc64/codegen.c,
src/vm/jit/powerpc64/emit.c,
src/vm/jit/powerpc64/md.h,
src/vm/jit/s390/codegen.c,
src/vm/jit/show.c,
src/vm/jit/stacktrace.c,
src/vm/jit/trap.c,
src/vm/jit/verify/typecheck-typeinferer.c,
src/vm/jit/x86_64/codegen.c,
src/vm/jit/x86_64/md.c,
src/vm/primitive.cpp,
src/vm/primitive.hpp,
src/vm/properties.c,
src/vm/signal.c,
src/vm/string.c,
src/vmcore/descriptor.c,
src/vmcore/field.c,
src/vmcore/linker.c,
src/vmcore/loader.c,
src/vmcore/method.c,
src/vmcore/options.c,
src/vmcore/primitivecore.c,
src/vmcore/suck.c,
src/vmcore/system.c,
src/vmcore/zip.c: C++ changes.

101 files changed:
contrib/mapfile-vers-product
src/cacao/cacao.c
src/cacaoh/cacaoh.c
src/cacaoh/dummy.c
src/mm/boehm-gc/Makefile.am
src/mm/boehm.c
src/mm/cacao-gc/gc.c
src/mm/cacao-gc/heap.c
src/mm/cacao-gc/mark.c
src/mm/dumpmemory.c
src/mm/memory.c
src/mm/nogc.c
src/native/jni.c
src/native/jni.h
src/native/jvmti/cacaodbg.c
src/native/localref.c
src/native/native.c
src/native/vm/cldc1.1/com_sun_cldc_io_ResourceInputStream.c
src/native/vm/cldc1.1/com_sun_cldc_io_j2me_socket_Protocol.c
src/native/vm/cldc1.1/java_lang_Runtime.c
src/native/vm/gnuclasspath/gnu_classpath_VMSystemProperties.c
src/native/vm/gnuclasspath/gnu_java_lang_management_VMClassLoadingMXBeanImpl.c
src/native/vm/gnuclasspath/gnu_java_lang_management_VMMemoryMXBeanImpl.c
src/native/vm/gnuclasspath/gnu_java_lang_management_VMRuntimeMXBeanImpl.c
src/native/vm/gnuclasspath/gnu_java_lang_management_VMThreadMXBeanImpl.c
src/native/vm/gnuclasspath/java_lang_VMClass.c
src/native/vm/gnuclasspath/java_lang_VMClassLoader.c
src/native/vm/gnuclasspath/java_lang_VMRuntime.c
src/native/vm/gnuclasspath/java_lang_reflect_VMConstructor.cpp
src/native/vm/gnuclasspath/java_lang_reflect_VMMethod.cpp
src/native/vm/gnuclasspath/sun_reflect_ConstantPool.cpp
src/native/vm/nativevm.c
src/native/vm/openjdk/hpi.c
src/native/vm/openjdk/jvm.c
src/native/vm/reflect.c
src/threads/posix/condition-posix.hpp
src/threads/posix/lock.c
src/threads/posix/mutex-posix.hpp
src/threads/posix/thread-posix.c
src/threads/posix/thread-posix.h
src/threads/thread.c
src/toolbox/avl.c
src/toolbox/util.c
src/vm/Makefile.am
src/vm/array.c
src/vm/assertion.c
src/vm/exceptions.c
src/vm/finalizer.c
src/vm/initialize.c
src/vm/jit/alpha/codegen.c
src/vm/jit/alpha/md.h
src/vm/jit/argument.c
src/vm/jit/arm/codegen.c
src/vm/jit/arm/linux/md-os.c
src/vm/jit/asmpart.h
src/vm/jit/code.c
src/vm/jit/i386/codegen.c
src/vm/jit/i386/md.c
src/vm/jit/intrp/codegen.c
src/vm/jit/m68k/codegen.c
src/vm/jit/m68k/emit.h
src/vm/jit/m68k/linux/md-os.c
src/vm/jit/m68k/md.c
src/vm/jit/mips/codegen.c
src/vm/jit/mips/md.c
src/vm/jit/mips/md.h
src/vm/jit/mips/uclinux/md-os.c
src/vm/jit/optimizing/ifconv.c
src/vm/jit/patcher-common.c
src/vm/jit/powerpc/codegen.c
src/vm/jit/powerpc/md.c
src/vm/jit/powerpc/md.h
src/vm/jit/powerpc64/codegen.c
src/vm/jit/powerpc64/emit.c
src/vm/jit/powerpc64/md.h
src/vm/jit/s390/codegen.c
src/vm/jit/show.c
src/vm/jit/stacktrace.c
src/vm/jit/trap.c
src/vm/jit/verify/typecheck-typeinferer.c
src/vm/jit/x86_64/codegen.c
src/vm/jit/x86_64/md.c
src/vm/primitive.cpp
src/vm/primitive.hpp
src/vm/properties.c
src/vm/signal.c
src/vm/string.c
src/vm/vm.c [deleted file]
src/vm/vm.cpp [new file with mode: 0644]
src/vm/vm.h [deleted file]
src/vm/vm.hpp [new file with mode: 0644]
src/vmcore/descriptor.c
src/vmcore/field.c
src/vmcore/linker.c
src/vmcore/loader.c
src/vmcore/method.c
src/vmcore/options.c
src/vmcore/primitivecore.c
src/vmcore/suck.c
src/vmcore/system.c
src/vmcore/zip.c

index 5d23dfa6a39cba8819fd75f90dd348ccdc155aa0..d414e6358b2b86d451b08c7ba0f85215136f7dda 100644 (file)
@@ -31,7 +31,7 @@
 SUNWprivate_1.1 {
         global:
                 # CACAO
-                vm_createjvm;
+                VM_create;
                 vm_run;
 
                 # JNI
index 436b05d6fd8fe43b351f804818229900ea74c949..b347b678a9f5f4cc85d398aed668af6a9a690b02 100644 (file)
@@ -48,7 +48,7 @@
 
 #include "vmcore/system.h"
 
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 
 /* Defines. *******************************************************************/
@@ -80,11 +80,11 @@ int main(int argc, char **argv)
 #if defined(ENABLE_LIBJVM)     
        /* Variables for JNI_CreateJavaVM dlopen call. */
        void*       libjvm_handle;
-       void*       libjvm_vm_createjvm;
+       void*       libjvm_VM_create;
        void*       libjvm_vm_run;
        const char* lterror;
 
-       bool (*vm_createjvm)(JavaVM **, void **, void *);
+       bool (*VM_create)(JavaVM **, void **, void *);
        void (*vm_run)(JavaVM *, JavaVMInitArgs *);
 #endif
 
@@ -155,20 +155,20 @@ int main(int argc, char **argv)
                free((void *) lterror);
        }
 
-       libjvm_vm_createjvm = system_dlsym(libjvm_handle, "vm_createjvm");
+       libjvm_VM_create = system_dlsym(libjvm_handle, "VM_create");
 
-       if (libjvm_vm_createjvm == NULL) {
+       if (libjvm_VM_create == NULL) {
                fprintf(stderr, "main: lt_dlsym failed: %s\n", system_dlerror());
                abort();
        }
 
-       vm_createjvm =
-               (bool (*)(JavaVM **, void **, void *)) (ptrint) libjvm_vm_createjvm;
+       VM_create =
+               (bool (*)(JavaVM **, void **, void *)) (ptrint) libjvm_VM_create;
 #endif
 
        /* create the Java VM */
 
-       (void) vm_createjvm(&vm, (void *) &env, vm_args);
+       (void) VM_create(&vm, (void *) &env, vm_args);
 
 #if defined(ENABLE_JVMTI)
 # error This should be a JVMTI function.
index b852bfc65f2242d6cf567c6d29b848ac91f73582..17c391cc168ec531ec0c5ab54210a71b108fb9e3 100644 (file)
@@ -42,7 +42,7 @@
 #include "vm/exceptions.h"
 #include "vm/global.h"
 #include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vmcore/classcache.h"
 #include "vmcore/loader.h"
index e41bca4f5326a12669ef3ec6ee4bc5fb2977937b..3e64b04c45acbb523fe77e95a7f4726a7a434aac 100644 (file)
@@ -42,7 +42,7 @@
 #include "vm/exceptions.h"
 #include "vm/global.h"
 #include "vm/primitive.hpp"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/code.h"
 
@@ -850,6 +850,11 @@ void vmlog_cacao_set_ignoreprefix(const char *arg)
 #endif
 
 
+/* Legacy C interface *********************************************************/
+
+bool VM_is_initializing() { return true; }
+
+
 /*
  * These are local overrides for various environment variables in Emacs.
  * Please do not remove this and leave it at the end of the file, where
index 14091f125765507737082f8e14b75bcc148ab800..cf83b26147f3d9bd6d6adaefbd4f0098221b3566 100644 (file)
@@ -16,6 +16,8 @@
 
 ## Process this file with automake to produce Makefile.in.
 
+ACLOCAL_AMFLAGS = -I m4
+
 DISTCLEANFILES = \
        atomic_ops.c \
        atomic_ops_sysdeps.S \
index c3847c01681c2087ffb872bee414b8a66e9c39e0..796f2ef2654d30a3b28de4296d01e1829c017b7e 100644 (file)
@@ -48,7 +48,7 @@
 #include "vm/finalizer.h"
 #include "vm/global.h"
 #include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vmcore/loader.h"
 #include "vmcore/options.h"
index 1f8f5db417ab966ca231be28a922a910a92e961e..0f954b3bb2e6dfc6c7020112d60bdfbc59c6f948 100644 (file)
@@ -44,7 +44,7 @@
 #include "mm/memory.h"
 #include "toolbox/logging.h"
 #include "vm/finalizer.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 #include "vmcore/rt-timing.h"
 
 
index 425b0dfc38286eb353155446e7d76fcdbde2be9d..ae5adfd36fcbdc86c50e3d1a3de53a12c533d795 100644 (file)
@@ -41,7 +41,7 @@
 #include "toolbox/logging.h"
 #include "vm/global.h"
 #include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 #include "vmcore/options.h"
 #include "vmcore/rt-timing.h"
 
index c2c8a5c9b71a4896bf5b2c9743b3c9b0e91830ae..6647c4bcf64a5971805702a818be6b2fafb3b937 100644 (file)
@@ -33,7 +33,7 @@
 #include "mm/memory.h"
 #include "toolbox/logging.h"
 #include "vm/global.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 #include "vmcore/linker.h"
 
 
index 0dc19151500dced52cc509cb8a16a3a51be2ef64..ca98e5e901eb89989b4ad3e3c81cc9c7c9d349bf 100644 (file)
@@ -40,7 +40,7 @@
 
 #include "vmcore/system.h"
 
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 
 /*******************************************************************************
index 0b74e53517e14d2a2fa788716ef834917addf308..80951ee5e6e34f13bf88ea66b40586786d2385c9 100644 (file)
@@ -54,7 +54,7 @@
 #include "vm/exceptions.h"
 #include "vm/global.h"
 #include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vmcore/options.h"
 
index f59032492a1725db170d6a38e76e369e8affd1f6..ff939fecc505e6fd36571d04073f14e5aad6860e 100644 (file)
@@ -46,7 +46,7 @@
 #include "vm/exceptions.h"
 #include "vm/global.h"
 #include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vmcore/loader.h"
 #include "vmcore/options.h"
index e8dda9d7d8cfe402ec3d3d5e9ccb7f444d3bfa99..592a16350d690640a5ce3ffacf2b6db34c2b22d5 100644 (file)
@@ -108,7 +108,7 @@ struct java_lang_ClassLoader;
 #include "vm/primitive.hpp"
 #include "vm/resolve.h"
 #include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/argument.h"
 #include "vm/jit/asmpart.h"
@@ -3229,7 +3229,7 @@ jint _Jv_JNI_GetJavaVM(JNIEnv *env, JavaVM **vm)
 {
        STATISTICS(jniinvokation());
 
-    *vm = (JavaVM *) _Jv_jvm;
+    *vm = VM_get_javavm();
 
        return 0;
 }
@@ -3822,7 +3822,7 @@ jint _Jv_JNI_DestroyJavaVM(JavaVM *vm)
 
        TRACEJNICALLS(("_Jv_JNI_DestroyJavaVM(vm=%p)", vm));
 
-       if (vm_created == false)
+       if (VM_is_created() == false)
                return JNI_ERR;
 
     status = vm_destroy(vm);
@@ -3857,7 +3857,7 @@ static int jni_attach_current_thread(void **p_env, void *thr_args, bool isdaemon
        result = thread_current_is_attached();
 
        if (result == true) {
-               *p_env = _Jv_env;
+               *p_env = VM_get_jnienv();
 
                return JNI_OK;
        }
@@ -3877,7 +3877,7 @@ static int jni_attach_current_thread(void **p_env, void *thr_args, bool isdaemon
                return JNI_ERR;
 #endif
 
-       *p_env = _Jv_env;
+       *p_env = VM_get_jnienv();
 
        return JNI_OK;
 }
@@ -3889,7 +3889,7 @@ jint jni_AttachCurrentThread(JavaVM *vm, void **p_env, void *thr_args)
 
        TRACEJNICALLS(("jni_AttachCurrentThread(vm=%p, p_env=%p, thr_args=%p)", vm, p_env, thr_args));
 
-       if (vm_created == false)
+       if (VM_is_created() == false)
                return JNI_ERR;
 
        result = jni_attach_current_thread(p_env, thr_args, false);
@@ -3958,7 +3958,7 @@ jint jni_GetEnv(JavaVM *vm, void **env, jint version)
 {
        TRACEJNICALLS(("jni_GetEnv(vm=%p, env=%p, version=%d)", vm, env, version));
 
-       if (vm_created == false) {
+       if (VM_is_created() == false) {
                *env = NULL;
                return JNI_EDETACHED;
        }
@@ -3974,7 +3974,7 @@ jint jni_GetEnv(JavaVM *vm, void **env, jint version)
        /* Check the JNI version. */
 
        if (jni_version_check(version) == true) {
-               *env = _Jv_env;
+               *env = VM_get_jnienv();
                return JNI_OK;
        }
 
@@ -4014,7 +4014,7 @@ jint jni_AttachCurrentThreadAsDaemon(JavaVM *vm, void **penv, void *args)
 
        TRACEJNICALLS(("jni_AttachCurrentThreadAsDaemon(vm=%p, penv=%p, args=%p)", vm, penv, args));
 
-       if (vm_created == false)
+       if (VM_is_created() == false)
                return JNI_ERR;
 
        result = jni_attach_current_thread(penv, args, true);
@@ -4369,7 +4369,7 @@ jint JNI_GetCreatedJavaVMs(JavaVM **vmBuf, jsize bufLen, jsize *nVMs)
 
        /* We currently only support 1 VM running. */
 
-       vmBuf[0] = (JavaVM *) _Jv_jvm;
+       vmBuf[0] = VM_get_javavm();
        *nVMs    = 1;
 
     return JNI_OK;
@@ -4389,7 +4389,7 @@ jint JNI_CreateJavaVM(JavaVM **p_vm, void **p_env, void *vm_args)
 
        /* actually create the JVM */
 
-       if (!vm_createjvm(p_vm, p_env, vm_args))
+       if (!VM_create(p_vm, p_env, vm_args))
                return JNI_ERR;
 
        return JNI_OK;
index c930fab0b5ac02ce4e23c60effe6357961ad851a..920bb6de8f990ed0d2c6c8702afebcb3828e8f5f 100644 (file)
@@ -55,6 +55,9 @@
 #ifndef _JNI_H
 #define _JNI_H
 
+#ifdef __cplusplus
+extern "C" {
+#endif
 
 #include "vm/types.h"
 
@@ -63,6 +66,7 @@
 #include "vmcore/method.h"
 
 
+#if 0
 /* _Jv_JNIEnv *****************************************************************/
 
 #ifndef __cplusplus
@@ -103,6 +107,7 @@ struct _Jv_JavaVM {
 };
 
 #endif
+#endif
 
 
 /* CACAO related stuff ********************************************************/
@@ -127,6 +132,10 @@ struct hashtable_global_ref_entry {
 bool jni_init(void);
 bool jni_version_check(int version);
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif /* _JNI_H */
 
 
index 8db874a8fb8d8102250be0fe2d80aeb16f0ffbf1..7c11aafe180eaf76d6677db0f2571b609d974467 100644 (file)
@@ -26,7 +26,7 @@
 #include "native/jvmti/jvmti.h"
 #include "native/jvmti/cacaodbg.h"
 #include "native/jvmti/dbg.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 #include "vm/loader.h"
 #include "vm/exceptions.h"
 #include "vm/builtin.h"
index 8e364b515e79ead77c0183e6996efeac655bd32b..9ef934e9f6d638e3c5b979d750bddc7460ca4dce 100644 (file)
@@ -36,7 +36,7 @@
 
 #include "toolbox/logging.h"
 
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/argument.h"
 
index 72c90371a5f3d4d99c04bd82426a2441b96fc2c9..1c0ffd916872e6aff51e7b1c9a7c01732c89f507 100644 (file)
@@ -50,7 +50,7 @@
 #include "vm/global.h"
 #include "vm/resolve.h"
 #include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/asmpart.h"
 #include "vm/jit/jit.h"
index 8395adac0178ea17207ebd856370600d5a280985..5c8697d7f0c09ef1397f1ac26c4913bb24fd5b6e 100644 (file)
@@ -45,7 +45,7 @@
 
 #include "vm/types.h"
 #include "vm/builtin.h"
-#include "vm/vm.h" /* REMOVE ME: temporarily */
+#include "vm/vm.hpp" /* REMOVE ME: temporarily */
 #include "vm/exceptions.h"
 #include "vm/stringlocal.h"
 
index ee32030c2097a38055a235718257719b1c461503..81d7bdadc2ac9cf9694c235121517ae2595b05f0 100644 (file)
@@ -44,7 +44,7 @@
 #include "native/include/com_sun_cldc_io_j2me_socket_Protocol.h"
 
 #include "vm/global.h"
-#include "vm/vm.h" /* REMOVE ME: temporarily */
+#include "vm/vm.hpp" /* REMOVE ME: temporarily */
 
 
 /* native methods implemented by this file ************************************/
index b7c2cfdec042cefcce4366d4649439299b415cd2..3b330a73224d1aa4e1fe91471398d2b4efa970c1 100644 (file)
@@ -34,7 +34,7 @@
 
 #include "native/include/java_lang_Runtime.h"
 
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vmcore/utf8.h"
 
index 5517c6c1a03bb1b80bdcb72843110e06150603da..8072ab4584c743e6d4eaabe069ac1180b93ca41a 100644 (file)
@@ -41,7 +41,7 @@
 
 #include "vm/exceptions.h"
 #include "vm/properties.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 
 /* native methods implemented by this file ************************************/
index 39bc924641fd7342b2f12bf81599b12a8bc3f2d3..f0ee36acdfec89aed3239229f66b672ec83702ff 100644 (file)
@@ -1,9 +1,7 @@
-/* src/native/vm/gnu/gnu_java_lang_management_VMClassLoadingMXBeanImpl.c
+/* src/native/vm/gnuclasspath/gnu_java_lang_management_VMClassLoadingMXBeanImpl.c
 
-   Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
-   C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
-   E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
-   J. Wenninger, Institut f. Computersprachen - TU Wien
+   Copyright (C) 1996-2005, 2006, 2007, 2008
+   CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
 
    This file is part of CACAO.
 
@@ -38,7 +36,7 @@
 
 #include "toolbox/logging.h"
 
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vmcore/classcache.h"
 #include "vmcore/utf8.h"
@@ -105,7 +103,9 @@ JNIEXPORT int64_t JNICALL Java_gnu_java_lang_management_VMClassLoadingMXBeanImpl
  */
 JNIEXPORT int32_t JNICALL Java_gnu_java_lang_management_VMClassLoadingMXBeanImpl_isVerbose(JNIEnv *env, jclass clazz)
 {
-       return _Jv_jvm->Java_gnu_java_lang_management_VMClassLoadingMXBeanImpl_verbose;
+/*     return _Jv_jvm->Java_gnu_java_lang_management_VMClassLoadingMXBeanImpl_verbose; */
+#warning Move to C++
+       log_println("Java_gnu_java_lang_management_VMClassLoadingMXBeanImpl_isVerbose: MOVE TO C++!");
 }
 
 
@@ -116,7 +116,9 @@ JNIEXPORT int32_t JNICALL Java_gnu_java_lang_management_VMClassLoadingMXBeanImpl
  */
 JNIEXPORT void JNICALL Java_gnu_java_lang_management_VMClassLoadingMXBeanImpl_setVerbose(JNIEnv *env, jclass clazz, int32_t verbose)
 {
-       _Jv_jvm->Java_gnu_java_lang_management_VMClassLoadingMXBeanImpl_verbose = verbose;
+/*     _Jv_jvm->Java_gnu_java_lang_management_VMClassLoadingMXBeanImpl_verbose = verbose; */
+#warning Move to C++
+       log_println("Java_gnu_java_lang_management_VMClassLoadingMXBeanImpl_setVerbose: MOVE TO C++!");
 }
 
 
index eadb365c78a6ff3747672e9916b58b44700ce2e9..df8ca44c1b83e3992bd94dacebcdb8e0e94bb1f6 100644 (file)
@@ -1,4 +1,4 @@
-/* src/native/vm/gnu/gnu_java_lang_management_VMMemoryMXBeanImpl.c
+/* src/native/vm/gnuclasspath/gnu_java_lang_management_VMMemoryMXBeanImpl.c
 
    Copyright (C) 1996-2005, 2006, 2007, 2008
    CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
@@ -38,7 +38,7 @@
 
 #include "vm/builtin.h"
 #include "vm/global.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vmcore/class.h"
 #include "vmcore/loader.h"               /* XXX only for load_class_bootstrap */
@@ -164,7 +164,9 @@ JNIEXPORT int32_t JNICALL Java_gnu_java_lang_management_VMMemoryMXBeanImpl_getOb
  */
 JNIEXPORT int32_t JNICALL Java_gnu_java_lang_management_VMMemoryMXBeanImpl_isVerbose(JNIEnv *env, jclass clazz)
 {
-       return _Jv_jvm->Java_gnu_java_lang_management_VMMemoryMXBeanImpl_verbose;
+/*     return _Jv_jvm->Java_gnu_java_lang_management_VMMemoryMXBeanImpl_verbose; */
+#warning Move to C++
+       log_println("Java_gnu_java_lang_management_VMMemoryMXBeanImpl_isVerbose: MOVE TO C++!");
 }
 
 
@@ -175,7 +177,9 @@ JNIEXPORT int32_t JNICALL Java_gnu_java_lang_management_VMMemoryMXBeanImpl_isVer
  */
 JNIEXPORT void JNICALL Java_gnu_java_lang_management_VMMemoryMXBeanImpl_setVerbose(JNIEnv *env, jclass clazz, int32_t verbose)
 {
-       _Jv_jvm->Java_gnu_java_lang_management_VMMemoryMXBeanImpl_verbose = verbose;
+/*     _Jv_jvm->Java_gnu_java_lang_management_VMMemoryMXBeanImpl_verbose = verbose; */
+#warning Move to C++
+       log_println("Java_gnu_java_lang_management_VMMemoryMXBeanImpl_setVerbose: MOVE TO C++!");
 }
 
 
index cbd1e965da8c9e5a8961402d226302b570d0ebab..13ebe25b9d5109888505bf6605fca19eda97318d 100644 (file)
@@ -1,9 +1,7 @@
-/* src/native/vm/gnu/gnu_java_lang_management_VMRuntimeMXBeanImpl.c
+/* src/native/vm/gnuclasspath/gnu_java_lang_management_VMRuntimeMXBeanImpl.c
 
-   Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
-   C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
-   E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
-   J. Wenninger, Institut f. Computersprachen - TU Wien
+   Copyright (C) 1996-2005, 2006, 2007, 2008
+   CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
 
    This file is part of CACAO.
 
@@ -36,7 +34,7 @@
 
 #include "vm/builtin.h"
 #include "vm/global.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vmcore/class.h"
 #include "vmcore/utf8.h"
@@ -86,7 +84,7 @@ JNIEXPORT java_handle_objectarray_t* JNICALL Java_gnu_java_lang_management_VMRun
  */
 JNIEXPORT int64_t JNICALL Java_gnu_java_lang_management_VMRuntimeMXBeanImpl_getStartTime(JNIEnv *env, jclass clazz)
 {
-       return _Jv_jvm->starttime;
+       return VM_get_starttime();
 }
 
 /*
index c05fd189c948ba1fd6985cc49fd34f6e0e811979..d264c15e74160e9a0234fb53f4d6565e7261611b 100644 (file)
@@ -1,9 +1,7 @@
-/* src/native/vm/gnu/gnu_java_lang_management_VMThreadMXBeanImpl.c
+/* src/native/vm/gnuclasspath/gnu_java_lang_management_VMThreadMXBeanImpl.c
 
-   Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
-   C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
-   E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
-   J. Wenninger, Institut f. Computersprachen - TU Wien
+   Copyright (C) 1996-2005, 2006, 2008
+   CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
 
    This file is part of CACAO.
 
@@ -41,7 +39,7 @@
 
 #include "toolbox/logging.h"
 
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vmcore/classcache.h"
 #include "vmcore/utf8.h"
@@ -124,7 +122,9 @@ JNIEXPORT int64_t JNICALL Java_gnu_java_lang_management_VMThreadMXBeanImpl_getCu
  */
 JNIEXPORT int32_t JNICALL Java_gnu_java_lang_management_VMThreadMXBeanImpl_getPeakThreadCount(JNIEnv *env, jclass clazz)
 {
-       return _Jv_jvm->java_lang_management_ThreadMXBean_PeakThreadCount;
+/*     return _Jv_jvm->java_lang_management_ThreadMXBean_PeakThreadCount; */
+#warning Move to C++
+       log_println("Java_gnu_java_lang_management_ThreadMXBean_getPeakThreadCount: MOVE TO C++!");
 }
 
 
@@ -174,7 +174,9 @@ JNIEXPORT int64_t JNICALL Java_gnu_java_lang_management_VMThreadMXBeanImpl_getTh
  */
 JNIEXPORT int64_t JNICALL Java_gnu_java_lang_management_VMThreadMXBeanImpl_getTotalStartedThreadCount(JNIEnv *env, jclass clazz)
 {
-       return _Jv_jvm->java_lang_management_ThreadMXBean_TotalStartedThreadCount;
+/*     return _Jv_jvm->java_lang_management_ThreadMXBean_TotalStartedThreadCount; */
+#warning Move to C++
+       log_println("Java_gnu_java_lang_management_ThreadMXBean_getTotalStartedThreadCount: MOVE TO C++!");
 }
 
 
@@ -185,8 +187,10 @@ JNIEXPORT int64_t JNICALL Java_gnu_java_lang_management_VMThreadMXBeanImpl_getTo
  */
 JNIEXPORT void JNICALL Java_gnu_java_lang_management_VMThreadMXBeanImpl_resetPeakThreadCount(JNIEnv *env, jclass clazz)
 {
-       _Jv_jvm->java_lang_management_ThreadMXBean_PeakThreadCount =
-               _Jv_jvm->java_lang_management_ThreadMXBean_ThreadCount;
+/*     _Jv_jvm->java_lang_management_ThreadMXBean_PeakThreadCount = */
+/*             _Jv_jvm->java_lang_management_ThreadMXBean_ThreadCount; */
+#warning Move to C++
+       log_println("Java_gnu_java_lang_management_VMThreadMXBeanImpl_resetPeakThreadCount: MOVE TO C++!");
 }
 
 
index c61e4cc57a38914fbe8aac13601d0142dec1e0d8..87d9191ac4b1ba1918b6a89c7ed23cb87ad0cd92 100644 (file)
@@ -50,7 +50,7 @@
 #if defined(ENABLE_ANNOTATIONS)
 #include "native/include/sun_reflect_ConstantPool.h"
 
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vmcore/annotation.h"
 #endif
index 66d33ab1d1f7b5955e1ac3c4f97f782d2c80a8cd..6a48533cd6f61cd2361c040b47a2821c11a18029 100644 (file)
@@ -56,7 +56,7 @@
 #include "vm/initialize.h"
 #include "vm/primitive.hpp"
 #include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/asmpart.h"
 
index 4ee0c608c19ceeb9fa07c8e6ee3ad660443825a2..1d0d43ae256f7d3d982b52e53fbc5f4db31a2047 100644 (file)
@@ -54,7 +54,7 @@
 #include "vm/builtin.h"
 #include "vm/exceptions.h"
 #include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vmcore/system.h"
 #include "vmcore/utf8.h"
index be21bc218c78b8a550ec5516d6630bec9e905bb7..a7ca0e7ea01d43647174cc295aa809bddab8336a 100644 (file)
 #include <assert.h>
 #include <stdlib.h>
 
-#if defined(ENABLE_ANNOTATIONS)
-#include "vm/vm.h"
-#include "vm/exceptions.h"
-#endif
-
 #include "native/jni.h"
 #include "native/llni.h"
 #include "native/native.h"
index cc91894aab7da0bec2bf3752c54e09a8158c078a..cc9ba7f83fc08d0eed8ac83a6a0fd89b7bf86350 100644 (file)
@@ -28,7 +28,7 @@
 #include <stdint.h>
 
 #if defined(ENABLE_ANNOTATIONS)
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 #endif
 
 #include "native/jni.h"
index 27fde6cbdb9189d23365a18805e5a04dd93f3887..0ac5ab13697edc1e7e56b5e1c88b3ef77f963722 100644 (file)
@@ -58,7 +58,7 @@ extern "C" {
 
 #include "toolbox/logging.h"
 
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 #include "vm/exceptions.h"
 #include "vm/resolve.h"
 #include "vm/stringlocal.h"
index defffab17908eda060fc92871961545796a169b0..aa46de4160798236296e4473894d282c760825e1 100644 (file)
@@ -44,7 +44,7 @@
 # include "native/vm/openjdk/hpi.h"
 
 # include "vm/properties.h"
-# include "vm/vm.h"
+# include "vm/vm.hpp"
 
 # include "vmcore/utf8.h"
 #endif
index d55bae037dbe528b3eddb4bb255358f4acc5033a..65c28ddbaadafe7f8d019a4817816e66f023761d 100644 (file)
@@ -37,7 +37,7 @@
 #include "native/native.h"
 
 #include "vm/properties.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vmcore/options.h"
 #include "vmcore/system.h"
index 8008b8a9f73f1e4db3e0b299f1b8ca71f3cbdee2..af4e1a3c14658e091ca2c8db24ee2ce958fda7e7 100644 (file)
@@ -87,7 +87,7 @@
 #include "vm/resolve.h"
 #include "vm/signallocal.h"
 #include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/stacktrace.h"
 
index aca294ea4dcda28437508714ca7dcc103463af59..311cc543e63126704bcbd9443b0c588d134704a7 100644 (file)
@@ -53,7 +53,7 @@
 #endif
 
 #if defined(ENABLE_ANNOTATIONS) && defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
-# include "vm/vm.h"
+# include "vm/vm.hpp"
 # include "native/include/sun_reflect_ConstantPool.h"
 #endif
 
index ed7432c344352aa5bd18bd0d2ce27a26fd78dcd3..4c8afc060baf4dcef9d333abf0f85a38cafdf241 100644 (file)
@@ -31,7 +31,7 @@
 #include <pthread.h>
 #include <time.h>
 
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #ifdef __cplusplus
 
index a5111765a27754931c99b67a6b45798aa362c1b7..3567f64e796fc8071b5478c0a3d9fec5170c6cdf 100644 (file)
@@ -51,7 +51,7 @@
 #include "vm/exceptions.h"
 #include "vm/finalizer.h"
 #include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vmcore/options.h"
 
index 5bf985624c3b716d3be89b9645f649fb077840ef..3a262aea050346b9105cd0325768e2932dab6f75 100644 (file)
@@ -30,7 +30,7 @@
 
 #include <pthread.h>
 
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #ifdef __cplusplus
 
index edc2458b92e3d82da7cdfa8c17e2137e78038a8d..8e0e45650cfe724ac5e7883e0e15a91a179645da 100644 (file)
@@ -79,7 +79,7 @@
 #include "vm/exceptions.h"
 #include "vm/global.h"
 #include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/asmpart.h"
 
@@ -880,13 +880,14 @@ static void *threads_startup_thread(void *arg)
 
                /* set ThreadMXBean variables */
 
-               _Jv_jvm->java_lang_management_ThreadMXBean_ThreadCount++;
-               _Jv_jvm->java_lang_management_ThreadMXBean_TotalStartedThreadCount++;
+/*             _Jv_jvm->java_lang_management_ThreadMXBean_ThreadCount++; */
+/*             _Jv_jvm->java_lang_management_ThreadMXBean_TotalStartedThreadCount++; */
 
-               if (_Jv_jvm->java_lang_management_ThreadMXBean_ThreadCount >
-                       _Jv_jvm->java_lang_management_ThreadMXBean_PeakThreadCount)
-                       _Jv_jvm->java_lang_management_ThreadMXBean_PeakThreadCount =
-                               _Jv_jvm->java_lang_management_ThreadMXBean_ThreadCount;
+/*             if (_Jv_jvm->java_lang_management_ThreadMXBean_ThreadCount > */
+/*                     _Jv_jvm->java_lang_management_ThreadMXBean_PeakThreadCount) */
+/*                     _Jv_jvm->java_lang_management_ThreadMXBean_PeakThreadCount = */
+/*                             _Jv_jvm->java_lang_management_ThreadMXBean_ThreadCount; */
+#warning Move to C++
 
 #if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
                /* we need to start the run method of java.lang.VMThread */
@@ -907,13 +908,14 @@ static void *threads_startup_thread(void *arg)
        else {
                /* set ThreadMXBean variables */
 
-               _Jv_jvm->java_lang_management_ThreadMXBean_ThreadCount++;
-               _Jv_jvm->java_lang_management_ThreadMXBean_TotalStartedThreadCount++;
+/*             _Jv_jvm->java_lang_management_ThreadMXBean_ThreadCount++; */
+/*             _Jv_jvm->java_lang_management_ThreadMXBean_TotalStartedThreadCount++; */
 
-               if (_Jv_jvm->java_lang_management_ThreadMXBean_ThreadCount >
-                       _Jv_jvm->java_lang_management_ThreadMXBean_PeakThreadCount)
-                       _Jv_jvm->java_lang_management_ThreadMXBean_PeakThreadCount =
-                               _Jv_jvm->java_lang_management_ThreadMXBean_ThreadCount;
+/*             if (_Jv_jvm->java_lang_management_ThreadMXBean_ThreadCount > */
+/*                     _Jv_jvm->java_lang_management_ThreadMXBean_PeakThreadCount) */
+/*                     _Jv_jvm->java_lang_management_ThreadMXBean_PeakThreadCount = */
+/*                             _Jv_jvm->java_lang_management_ThreadMXBean_ThreadCount; */
+#warning Move to C++
 
                /* call passed function, e.g. finalizer_thread */
 
@@ -935,7 +937,8 @@ static void *threads_startup_thread(void *arg)
 
        /* set ThreadMXBean variables */
 
-       _Jv_jvm->java_lang_management_ThreadMXBean_ThreadCount--;
+/*     _Jv_jvm->java_lang_management_ThreadMXBean_ThreadCount--; */
+#warning Move to C++
 
        return NULL;
 }
index f1114886dacc4be2d3c2d22f228436fc870b93d5..23395267596248f6daebe2fe2b7956fc6847e1ec 100644 (file)
@@ -52,7 +52,7 @@ typedef struct threadobject threadobject;
 #include "threads/posix/lock.h"
 
 #include "vm/global.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #if defined(ENABLE_GC_CACAO)
 # include "vm/jit/executionstate.h"
index 307562094284b253b0e59536b9fa2513690d0a87..79ae1a9d9a4548a26de06efca74d4a3e6a41ec93 100644 (file)
@@ -62,7 +62,7 @@
 #include "vm/builtin.h"
 #include "vm/exceptions.h"
 #include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/stacktrace.h"
 
index 4fe67c5c992af864f4d44c727f00df683831af79..0b6b481442b3c57435f42ef3287b3e56f3f94e7f 100644 (file)
@@ -1,9 +1,7 @@
 /* src/toolbox/avl.c - AVL tree implementation
 
-   Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
-   C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
-   E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
-   J. Wenninger, Institut f. Computersprachen - TU Wien
+   Copyright (C) 1996-2005, 2006, 2007, 2008
+   CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
 
    This file is part of CACAO.
 
@@ -39,7 +37,7 @@
 #include "toolbox/logging.h"
 
 #include "vm/global.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 
 /* avl_create ******************************************************************
index 82acc8ff7f517543a2999cb0fd9af244295f7f15..2e26c259b6c1be35205db5583e73d469480cd6f7 100644 (file)
@@ -1,9 +1,7 @@
 /* src/toolbox/util.c - contains some utility functions
 
-   Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
-   C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
-   E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
-   J. Wenninger, Institut f. Computersprachen - TU Wien
+   Copyright (C) 1996-2005, 2006, 2008
+   CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
 
    This file is part of CACAO.
 
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   Contact: cacao@cacaojvm.org
-
-   Authors: Christian Thalinger
-
-   Changes:
-
 */
 
 
@@ -41,7 +33,7 @@
 #include "vm/types.h"
 
 #include "mm/memory.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 
 /* _Jv_getcwd ******************************************************************
index 31319fa50305ed689eda6fee60f0a40b22811ae5..495a67d4c9bc3c7c61203814bbc385d50474d584 100644 (file)
@@ -75,8 +75,8 @@ libvm_la_SOURCES = \
        signallocal.h \
        string.c \
        stringlocal.h \
-       vm.c \
-       vm.h
+       vm.cpp \
+       vm.hpp
 
 libvm_la_LIBADD = \
        jit/libjit.la
index 07d8c34400bf7a7666bbb945b685e4e225fc7307..4969d0a669d672ff267e5d479cc97745932b39af 100644 (file)
@@ -33,7 +33,7 @@
 #include "vm/exceptions.h"
 #include "vm/global.h"
 #include "vm/primitive.hpp"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 
 /* array_element_get ***********************************************************
index 6a1f0f694f13a8132d7b82ab7010f03db88e423a..a00c3ed6215b970ef624cea5ad45289ae9cbcf66 100644 (file)
@@ -34,7 +34,7 @@
 
 #include "vm/assertion.h"
 #include "vm/global.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vmcore/system.h"
 
index d258329c1f8c538ffe476884da8e0f4d2ecfd09a..642c31325dd7b3c5e87a75cba42e3538f59557ff 100644 (file)
@@ -54,7 +54,7 @@
 #include "vm/exceptions.h"
 #include "vm/global.h"
 #include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/asmpart.h"
 #include "vm/jit/jit.h"
@@ -267,7 +267,7 @@ static java_handle_t *exceptions_new_class_utf(classinfo *c, utf *message)
        java_handle_t *s;
        java_handle_t *o;
 
-       if (vm_initializing) {
+       if (VM_is_initializing()) {
                /* This can happen when global class variables are used which
                   are not initialized yet. */
 
@@ -305,7 +305,7 @@ static java_handle_t *exceptions_new_utf(utf *classname)
        classinfo     *c;
        java_handle_t *o;
 
-       if (vm_initializing)
+       if (VM_is_initializing())
                exceptions_abort(classname, NULL);
 
        c = load_class_bootstrap(classname);
@@ -343,7 +343,7 @@ static java_handle_t *exceptions_new_utf_javastring(utf *classname,
        java_handle_t *o;
        classinfo     *c;
    
-       if (vm_initializing)
+       if (VM_is_initializing())
                exceptions_abort(classname, NULL);
 
        c = load_class_bootstrap(classname);
@@ -380,7 +380,7 @@ static java_handle_t *exceptions_new_utf_utf(utf *classname, utf *message)
        classinfo     *c;
        java_handle_t *o;
 
-       if (vm_initializing)
+       if (VM_is_initializing())
                exceptions_abort(classname, message);
 
        c = load_class_bootstrap(classname);
@@ -457,7 +457,7 @@ static void exceptions_throw_utf_throwable(utf *classname,
        methodinfo          *m;
        java_lang_Throwable *object;
 
-       if (vm_initializing)
+       if (VM_is_initializing())
                exceptions_abort(classname, NULL);
 
        object = (java_lang_Throwable *) cause;
@@ -509,7 +509,7 @@ static void exceptions_throw_utf_exception(utf *classname,
        java_handle_t *o;
        methodinfo    *m;
 
-       if (vm_initializing)
+       if (VM_is_initializing())
                exceptions_abort(classname, NULL);
 
        c = load_class_bootstrap(classname);
@@ -560,7 +560,7 @@ static void exceptions_throw_utf_cause(utf *classname, java_handle_t *cause)
        java_lang_String    *s;
        java_lang_Throwable *object;
 
-       if (vm_initializing)
+       if (VM_is_initializing())
                exceptions_abort(classname, NULL);
 
        object = (java_lang_Throwable *) cause;
index 833efbfb127d02449d36c7d5c342e06e867df1d5..d6576eb32fddf721947738d3ddc84a5b222c3156 100644 (file)
@@ -38,7 +38,7 @@
 #include "vm/exceptions.h"
 #include "vm/global.h"
 #include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/asmpart.h"
 
index 6e0c10838155bac944f8427877302f4069f1a282..36df049d17b410a592c5c5422288db83d7a495b9 100644 (file)
@@ -36,7 +36,7 @@
 #include "vm/builtin.h"
 #include "vm/exceptions.h"
 #include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/asmpart.h"
 
index aa899028330e1475bdf04ad1a8b48368977af8e1..bd53494aa37538afc8c9098d7e6811fb51a6e9bd 100644 (file)
@@ -47,7 +47,7 @@
 #include "vm/builtin.h"
 #include "vm/exceptions.h"
 #include "vm/global.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/abi.h"
 #include "vm/jit/asmpart.h"
index 4899d8f9ffd15d347773cd52eb5a4575ff4f8d57..649a8d253f8ba4c72c2a8486d2da63cc56b10ef4 100644 (file)
@@ -36,7 +36,7 @@
 #include "vm/jit/alpha/codegen.h"
 
 #include "vm/global.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/asmpart.h"
 #include "vm/jit/codegen-common.h"
index bc0e4bddeb550164c37ca1d02fb16f3aa2807647..986dcb60efdd2da0988248f625bbdbd0b5791547 100644 (file)
@@ -38,7 +38,7 @@
 #include "vm/global.h"
 #include "vm/primitive.hpp"
 #include "vm/resolve.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/abi-asm.h"
 
index 387822a685811141e507b66cd7882461e3e109d6..e7dd2443eb92bedf5f78210861076a8ecb68b008 100644 (file)
@@ -45,7 +45,7 @@
 #include "vm/builtin.h"
 #include "vm/exceptions.h"
 #include "vm/global.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/abi.h"
 #include "vm/jit/asmpart.h"
index a9e3e9a9cf67ac723c9421667c577c349d49e294..9b78fa1e4e161e29c2190a22bd671410c18e08c4 100644 (file)
@@ -54,7 +54,7 @@ typedef struct ucontext {
 #include "vm/exceptions.h"
 #include "vm/signallocal.h"
 #include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/asmpart.h"
 #include "vm/jit/executionstate.h"
index 65638faf7fc0022b7a40a7585eba830d9df7af3a..f9e3c1af0450295a538d7ca051fef04c569d137f 100644 (file)
 
 #include <stdint.h>
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 #include "vm/types.h"
 
 #include "vm/global.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vmcore/linker.h"
 
@@ -108,6 +112,10 @@ void *md_asm_codegen_get_pv_from_pc(void *ra);
 void asm_escape_check(java_object_t *obj);
 #endif
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif /* _ASMPART_H */
 
 
index 3bdc4678f5e4467ae9d329bd1f6e7e1c50fe9684..f3d3ab9c996471e9a0016d5ac1364b75e164de5b 100644 (file)
@@ -32,7 +32,7 @@
 
 #include "mm/memory.h"
 
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/code.h"
 #include "vm/jit/codegen-common.h"
index 7d64347c3844b519b1f46b5d949d8867680fdc6a..8e43cfe411be34d3367d09e9b3294feb8e7e6f9a 100644 (file)
@@ -48,7 +48,7 @@
 #include "vm/global.h"
 #include "vm/primitive.hpp"
 #include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/abi.h"
 #include "vm/jit/asmpart.h"
@@ -3621,7 +3621,7 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int s
 
                /* put env into first argument */
 
-               M_AST_IMM(_Jv_env, REG_SP, 0 * 4);
+               M_AST_IMM(VM_get_jnienv(), REG_SP, 0 * 4);
        }
 
        /* Call the native function. */
index 48664ef1fddd22e7084106164fcab40f35011947..cc93cd855bcb5cbc64250d54f4c0b70144be520c 100644 (file)
@@ -1,9 +1,7 @@
 /* src/vm/jit/i386/md.c - machine dependent i386 functions
 
-   Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
-   C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
-   E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
-   J. Wenninger, Institut f. Computersprachen - TU Wien
+   Copyright (C) 1996-2005, 2006, 2007, 2008
+   CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
 
    This file is part of CACAO.
 
@@ -33,7 +31,7 @@
 #include "vm/types.h"
 
 #include "vm/global.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/asmpart.h"
 #include "vm/jit/jit.h"
index 6fe3cc7270a935a532f0651a0c7e09e188b727e7..b715b1c4b4a44f6de973e358c4ea2a13c10d944f 100644 (file)
@@ -51,7 +51,7 @@
 #include "vm/exceptions.h"
 #include "vm/global.h"
 #include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/asmpart.h"
 #include "vm/jit/codegen-common.h"
index f62c9b734661bffb671cf80ed38e188bc847718c..f46e4e3f3291dbb55b6f40bdb8808c40cd20b633 100644 (file)
@@ -45,7 +45,7 @@
 #include "vm/exceptions.h"
 #include "vm/global.h"
 #include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/asmpart.h"
 #include "vm/jit/codegen-common.h"
index 778c700bf71c06c59f987ffe4adb6b61e990adf7..20fa2ea8e119c5235fcfc445aa62f72caf545643 100644 (file)
@@ -30,7 +30,7 @@
 #include "config.h"
 
 #include "vm/types.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 #include "vm/jit/codegen-common.h"
 
 void emit_mov_imm_reg (codegendata *cd, s4 imm, s4 dreg);
index 444f55c97edbeecc184ff9100fc27ebce2e86f60..f7a58a61ddc778626a31f2bee53c44aa66b357dc 100644 (file)
@@ -30,7 +30,7 @@
 
 #include "vm/exceptions.h"
 #include "vm/signallocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/asmpart.h"
 #include "vm/jit/trap.h"
index 9fb12da0c144ba32773430e615448de7fc377bd5..071a195303ee1705de9dd1295bd30c7e4c8de5d8 100644 (file)
@@ -32,7 +32,7 @@
 
 #include "vm/types.h"
 
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 
 /*
index b51b8d675124741a4287d75efb51c051860c57cc..68ad764c25c95a1976a362173a738ccea746a9f4 100644 (file)
@@ -44,7 +44,7 @@
 
 #include "vm/builtin.h"
 #include "vm/exceptions.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/abi.h"
 #include "vm/jit/asmpart.h"
index 61e5113ee000d5382eff5ba3e8a61d9b59413556..af5f92fc1ab74d57fd369f933311801ca4ef17bf 100644 (file)
@@ -35,7 +35,7 @@
 #include "vm/jit/mips/md.h"
 
 #include "vm/global.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/jit.h"
 
index fc70b19bddbcbc9b229c9bdd1780f37f1a648207..50743ce7e8a4853b96727bd0d9cb31658fd92ce4 100644 (file)
@@ -37,7 +37,7 @@
 
 #include "vm/types.h"
 
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 
 /* md_stacktrace_get_returnaddress *********************************************
index c5f89b3a12d47bc247e0d20fa8f509fad97c0907..fa352116becda5c4287eda97f5986fdd76f89833 100644 (file)
@@ -30,7 +30,7 @@
 
 #include "vm/types.h"
 
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 
 /* md_init *********************************************************************
index bfaef14a792812d1e8d9c44f17ce89b2e0deb34e..63c0716e532fc9be051caa69117dc23fe828a5fd 100644 (file)
@@ -1,9 +1,7 @@
-/* src/vm/jit/ifconv/ifconv.c - if-conversion
+/* src/vm/jit/optimizing/ifconv.c - if-conversion
 
-   Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
-   C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
-   E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
-   J. Wenninger, Institut f. Computersprachen - TU Wien
+   Copyright (C) 1996-2005, 2006, 2007, 2008
+   CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
 
    This file is part of CACAO.
 
@@ -31,7 +29,7 @@
 
 #include "vm/types.h"
 
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/codegen-common.h"
 #include "vm/jit/jit.h"
index b3fbe3042570bdce3ca4e330c5c29420e9cf20b9..077398ab428397424468c0987f1b07d6156dcce1 100644 (file)
@@ -43,7 +43,7 @@
 #include "vm/exceptions.h"
 #include "vm/initialize.h"
 #include "vm/resolve.h"
-#include "vm/vm.h"                     /* for vm_abort */
+#include "vm/vm.hpp"                     /* for vm_abort */
 
 #include "vm/jit/code.h"
 #include "vm/jit/disass.h"
index 7adbc03b55e8484fbae6d4cecf80d1f15f497116..6aa903a2b5c5a8332e97e96cd5821b103e45f4de 100644 (file)
@@ -47,7 +47,7 @@
 #include "vm/exceptions.h"
 #include "vm/global.h"
 #include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/abi.h"
 #include "vm/jit/abi-asm.h"
index b85321c9d7f4ab89d4efe3a6802d00dcf1bd99c9..80257ab60cc5e958d33c29123feec1cf6c70ad0d 100644 (file)
@@ -1,9 +1,7 @@
 /* src/vm/jit/powerpc/md.c - machine dependent PowerPC functions
 
-   Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
-   C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
-   E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
-   J. Wenninger, Institut f. Computersprachen - TU Wien
+   Copyright (C) 1996-2005, 2006, 2007, 2008
+   CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
 
    This file is part of CACAO.
 
@@ -37,7 +35,7 @@
 #include "vm/jit/powerpc/md.h"
 
 #include "vm/global.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/jit.h"
 
index 6572885984ce9f7d9a51ef888f802d76e63150dd..57b5b9484c3dbdb93a4520429017a6a55cf2aa28 100644 (file)
@@ -1,9 +1,7 @@
 /* src/vm/jit/powerpc/md.h - machine dependent PowerPC functions
 
-   Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
-   C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
-   E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
-   J. Wenninger, Institut f. Computersprachen - TU Wien
+   Copyright (C) 1996-2005, 2006, 2007, 2008
+   CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
 
    This file is part of CACAO.
 
@@ -36,7 +34,7 @@
 #include "vm/jit/powerpc/codegen.h"
 
 #include "vm/global.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/asmpart.h"
 #include "vm/jit/codegen-common.h"
index be082d70c49bf502eccad0ffd882e6ebecb2483a..1f77469be131048544962bedb255d5c1e5805995 100644 (file)
@@ -48,7 +48,7 @@
 #include "vm/exceptions.h"
 #include "vm/global.h"
 #include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/abi.h"
 #include "vm/jit/abi-asm.h"
index b2a5119ee15daed98a51cba959f36ab118e0b736..83f95ab4af80abb910de6f6b915eee381d54a5c1 100644 (file)
@@ -37,7 +37,7 @@
 #include "threads/lock-common.h"
 
 #include "vm/exceptions.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/abi.h"
 #include "vm/jit/asmpart.h"
index 4a4d165e94777bb75a612bca55b73f98892f4ea7..1f328eb13bd3bbac9d3c40ca7b536f6859455e92 100644 (file)
@@ -36,7 +36,7 @@
 #include "vm/jit/powerpc64/codegen.h"
 
 #include "vm/global.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/asmpart.h"
 #include "vm/jit/jit.h"
index 4392759b995082d91e35db80c35d18d2c37cebda..84452ffcf359dba43d1c001363122d247f09de8c 100644 (file)
@@ -51,7 +51,7 @@
 #include "vm/global.h"
 #include "vm/types.h"
 #include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/abi.h"
 #if defined(ENABLE_LSRA)
index 7287f0968e56b600c981ef66ad0061dca47e385e..d126c9df0fd797978c0b4dd54dee744768ea7604 100644 (file)
@@ -37,7 +37,7 @@
 #include "vm/global.h"
 #include "vm/builtin.h"
 #include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/abi.h"
 #include "vm/jit/jit.h"
index f9e3303c92b563312a8ec9aec4174956eacc7ede..a0d69338eb7529cd96dc44033d6cb360f715df8e 100644 (file)
@@ -60,7 +60,7 @@
 #include "vm/cycles-stats.h"
 #include "vm/exceptions.h"
 #include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/asmpart.h"
 #include "vm/jit/codegen-common.h"
index 562bb0907e5c2aa5b28e2a20601cf06bdc428ab2..a3400d2bffeb5d84de8bf52e3dd9131673a41ba8 100644 (file)
@@ -38,7 +38,7 @@
 #include "toolbox/logging.h"
 
 #include "vm/exceptions.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/code.h"
 #include "vm/jit/disass.h"
index 15c1a251433d68b7059d88195ab17a3a69c47beb..7ba2c6e10e5f92f48ae2982a1ecf203ff4439a8d 100644 (file)
@@ -41,7 +41,7 @@
 #include "vm/exceptions.h"
 #include "vm/primitive.hpp"
 #include "vm/resolve.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/jit.h"
 #include "vm/jit/show.h"
index a7c3409fe2bb0e70caa6858a3ea838703c92147a..985d07fea50397e73304407e9069ee730d52a1df 100644 (file)
@@ -50,7 +50,7 @@
 #include "vm/global.h"
 #include "vm/primitive.hpp"
 #include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/abi.h"
 #include "vm/jit/asmpart.h"
@@ -3027,7 +3027,7 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int s
 
                /* put env into first argument register */
 
-               M_MOV_IMM(_Jv_env, REG_A0);
+               M_MOV_IMM(VM_get_jnienv(), REG_A0);
        }
 
        /* Call the native function. */
index dc4b3fab1820ca149ac1d34817c35a15200c9e92..75a61687a8a2e4126f4d47d1a4ea1c557f4f2341 100644 (file)
@@ -1,9 +1,7 @@
 /* src/vm/jit/x86_64/md.c - machine dependent x86_64 functions
 
-   Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
-   C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
-   E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
-   J. Wenninger, Institut f. Computersprachen - TU Wien
+   Copyright (C) 1996-2005, 2006, 2007, 2008
+   CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
 
    This file is part of CACAO.
 
@@ -33,7 +31,7 @@
 
 #include "vm/jit/x86_64/md-abi.h"
 
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/codegen-common.h"
 #include "vm/jit/jit.h"
index d513a6b01a458b3750ae2f392a0be22348a793ea..f40a263fc9ca207ff51dccd7b14e6713ddd28972 100644 (file)
@@ -43,7 +43,7 @@
 #include "vm/builtin.h"
 #include "vm/global.h"
 #include "vm/primitive.hpp"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vmcore/class.h"
 #include "vmcore/utf8.h"
index 2615b3c9b353f60f0c136e17252754a7f89e9bf6..7a8d09771a4961b2a655001752acfc437c9dcef6 100644 (file)
@@ -119,13 +119,12 @@ struct primitivetypeinfo {
 
 extern primitivetypeinfo primitivetype_table[PRIMITIVETYPE_COUNT];
 
-#ifndef __cplusplus
-// Legacy C interface.
-
 /* this function is in src/vmcore/primitivecore.c */
 void       primitive_init(void);
 void       primitive_postinit(void);
 
+#ifndef __cplusplus
+// Legacy C interface.
 classinfo *Primitive_get_class_by_name(utf *name);
 classinfo *Primitive_get_class_by_type(int type);
 classinfo *Primitive_get_class_by_char(char ch);
index 29a200aa671136a3ebf31f3d608337a15391354d..99a57e25b6e94f492c39e53d6109411cd4a63644 100644 (file)
@@ -47,7 +47,7 @@
 
 #include "vm/properties.h"
 #include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/asmpart.h"
 
index ddaf410dbc816d92a9d905f1b39cd58d386e2501..a07fed5b1fc1789ba41cddfa945e11dab483aa31 100644 (file)
@@ -47,7 +47,7 @@
 
 #include "vm/exceptions.h"
 #include "vm/signallocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vmcore/options.h"
 
index 74400828214dddca58a96e3403a2af24e4842b42..cd283d02fb904011bc37caecc332aef7c966b999 100644 (file)
@@ -47,7 +47,7 @@
 #include "vm/exceptions.h"
 #include "vm/primitive.hpp"
 #include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vmcore/options.h"
 #include "vmcore/statistics.h"
diff --git a/src/vm/vm.c b/src/vm/vm.c
deleted file mode 100644 (file)
index 39cefbd..0000000
+++ /dev/null
@@ -1,2664 +0,0 @@
-/* src/vm/vm.c - VM startup and shutdown functions
-
-   Copyright (C) 1996-2005, 2006, 2007, 2008
-   CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
-
-   This file is part of CACAO.
-
-   This program is free software; you can redistribute it and/or
-   modify it under the terms of the GNU General Public License as
-   published by the Free Software Foundation; either version 2, or (at
-   your option) any later version.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301, USA.
-
-*/
-
-
-#include "config.h"
-
-#include <assert.h>
-#include <errno.h>
-#include <stdint.h>
-#include <stdlib.h>
-
-#include "vm/types.h"
-
-#include "arch.h"
-#include "md-abi.h"
-
-#include "vm/jit/abi-asm.h"
-
-#include "mm/codememory.h"
-#include "mm/gc.hpp"
-#include "mm/memory.h"
-
-#include "native/jni.h"
-#include "native/llni.h"
-#include "native/localref.h"
-#include "native/native.h"
-
-#include "native/include/java_lang_Object.h"             /* required by j.l.C */
-#include "native/include/java_lang_String.h"             /* required by j.l.C */
-
-#if defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
-# include "native/include/java_nio_ByteBuffer.h"        /* required by j.l.CL */
-# include "native/include/java_lang_ClassLoader.h"       /* required by j.l.C */
-#endif
-
-#include "native/include/java_lang_Class.h"
-
-#include "native/vm/nativevm.h"
-
-#include "threads/lock-common.h"
-#include "threads/threadlist.h"
-#include "threads/thread.h"
-
-#include "toolbox/logging.h"
-
-#include "vm/array.h"
-
-#if defined(ENABLE_ASSERTION)
-#include "vm/assertion.h"
-#endif
-
-#include "vm/builtin.h"
-#include "vm/exceptions.h"
-#include "vm/finalizer.h"
-#include "vm/global.h"
-#include "vm/initialize.h"
-#include "vm/package.hpp"
-#include "vm/primitive.hpp"
-#include "vm/properties.h"
-#include "vm/signallocal.h"
-#include "vm/stringlocal.h"
-#include "vm/vm.h"
-
-#include "vm/jit/argument.h"
-#include "vm/jit/asmpart.h"
-#include "vm/jit/code.h"
-
-#if defined(ENABLE_DISASSEMBLER)
-# include "vm/jit/disass.h"
-#endif
-
-#include "vm/jit/jit.h"
-#include "vm/jit/methodtree.h"
-
-#if defined(ENABLE_PROFILING)
-# include "vm/jit/optimizing/profile.h"
-#endif
-
-#include "vm/jit/optimizing/recompile.h"
-
-#if defined(ENABLE_PYTHON)
-# include "vm/jit/python.h"
-#endif
-
-#include "vm/jit/trap.h"
-
-#include "vmcore/classcache.h"
-#include "vmcore/options.h"
-#include "vmcore/statistics.h"
-#include "vmcore/suck.h"
-#include "vmcore/system.h"
-
-#if defined(ENABLE_JVMTI)
-# include "native/jvmti/cacaodbg.h"
-#endif
-
-#if defined(ENABLE_VMLOG)
-#include <vmlog_cacao.h>
-#endif
-
-
-/* Invocation API variables ***************************************************/
-
-_Jv_JavaVM *_Jv_jvm;                    /* denotes a Java VM                  */
-_Jv_JNIEnv *_Jv_env;                    /* pointer to native method interface */
-
-
-/* global variables ***********************************************************/
-
-s4 vms = 0;                             /* number of VMs created              */
-
-bool vm_initializing = false;
-bool vm_created      = false;
-bool vm_exiting      = false;
-
-static classinfo *mainclass = NULL;
-
-#if defined(ENABLE_INTRP)
-u1 *intrp_main_stack = NULL;
-#endif
-
-
-/* define heap sizes **********************************************************/
-
-#define HEAP_MAXSIZE      128 * 1024 * 1024 /* default 128MB                  */
-#define HEAP_STARTSIZE      2 * 1024 * 1024 /* default 2MB                    */
-#define STACK_SIZE               128 * 1024 /* default 64kB                   */
-
-
-/* define command line options ************************************************/
-
-enum {
-       OPT_FOO,
-
-       /* Java options */
-
-       OPT_JAR,
-
-       OPT_D32,
-       OPT_D64,
-
-       OPT_CLASSPATH,
-       OPT_D,
-
-       OPT_VERBOSE,
-
-       OPT_VERSION,
-       OPT_SHOWVERSION,
-       OPT_FULLVERSION,
-
-       OPT_HELP,
-       OPT_X,
-       OPT_XX,
-
-       OPT_EA,
-       OPT_DA,
-       OPT_EA_NOARG,
-       OPT_DA_NOARG,
-    
-
-       OPT_ESA,
-       OPT_DSA,
-
-       /* Java non-standard options */
-
-       OPT_JIT,
-       OPT_INTRP,
-
-       OPT_BOOTCLASSPATH,
-       OPT_BOOTCLASSPATH_A,
-       OPT_BOOTCLASSPATH_P,
-
-       OPT_BOOTCLASSPATH_C,
-
-#if defined(ENABLE_PROFILING)
-       OPT_PROF,
-       OPT_PROF_OPTION,
-#endif
-
-       OPT_MS,
-       OPT_MX,
-
-       /* CACAO options */
-
-       OPT_VERBOSE1,
-       OPT_NOIEEE,
-
-#if defined(ENABLE_STATISTICS)
-       OPT_TIME,
-       OPT_STAT,
-#endif
-
-       OPT_LOG,
-       OPT_CHECK,
-       OPT_LOAD,
-       OPT_SHOW,
-       OPT_DEBUGCOLOR,
-
-#if !defined(NDEBUG)
-       OPT_ALL,
-       OPT_METHOD,
-       OPT_SIGNATURE,
-#endif
-
-#if defined(ENABLE_VERIFIER)
-       OPT_NOVERIFY,
-#if defined(TYPECHECK_VERBOSE)
-       OPT_VERBOSETC,
-#endif
-#endif /* defined(ENABLE_VERIFIER) */
-
-       /* optimization options */
-
-#if defined(ENABLE_LOOP)
-       OPT_OLOOP,
-#endif
-       
-#if defined(ENABLE_IFCONV)
-       OPT_IFCONV,
-#endif
-
-#if defined(ENABLE_LSRA) || defined(ENABLE_SSA)
-       OPT_LSRA,
-#endif
-
-#if defined(ENABLE_INTRP)
-       /* interpreter options */
-
-       OPT_NO_DYNAMIC,
-       OPT_NO_REPLICATION,
-       OPT_NO_QUICKSUPER,
-       OPT_STATIC_SUPERS,
-       OPT_TRACE,
-#endif
-
-       OPT_SS,
-
-#ifdef ENABLE_JVMTI
-       OPT_DEBUG,
-       OPT_XRUNJDWP,
-       OPT_NOAGENT,
-       OPT_AGENTLIB,
-       OPT_AGENTPATH,
-#endif
-
-#if defined(ENABLE_DEBUG_FILTER)
-       OPT_FILTER_VERBOSECALL_INCLUDE,
-       OPT_FILTER_VERBOSECALL_EXCLUDE,
-       OPT_FILTER_SHOW_METHOD,
-#endif
-
-       DUMMY
-};
-
-
-opt_struct opts[] = {
-       { "foo",               false, OPT_FOO },
-
-       /* Java options */
-
-       { "jar",               false, OPT_JAR },
-
-       { "d32",               false, OPT_D32 },
-       { "d64",               false, OPT_D64 },
-       { "client",            false, OPT_IGNORE },
-       { "server",            false, OPT_IGNORE },
-       { "jvm",               false, OPT_IGNORE },
-       { "hotspot",           false, OPT_IGNORE },
-
-       { "classpath",         true,  OPT_CLASSPATH },
-       { "cp",                true,  OPT_CLASSPATH },
-       { "D",                 true,  OPT_D },
-       { "version",           false, OPT_VERSION },
-       { "showversion",       false, OPT_SHOWVERSION },
-       { "fullversion",       false, OPT_FULLVERSION },
-       { "help",              false, OPT_HELP },
-       { "?",                 false, OPT_HELP },
-       { "X",                 false, OPT_X },
-       { "XX:",               true,  OPT_XX },
-
-       { "ea:",               true,  OPT_EA },
-       { "da:",               true,  OPT_DA },
-       { "ea",                false, OPT_EA_NOARG },
-       { "da",                false, OPT_DA_NOARG },
-
-       { "enableassertions:",  true,  OPT_EA },
-       { "disableassertions:", true,  OPT_DA },
-       { "enableassertions",   false, OPT_EA_NOARG },
-       { "disableassertions",  false, OPT_DA_NOARG },
-
-       { "esa",                     false, OPT_ESA },
-       { "enablesystemassertions",  false, OPT_ESA },
-       { "dsa",                     false, OPT_DSA },
-       { "disablesystemassertions", false, OPT_DSA },
-
-       { "noasyncgc",         false, OPT_IGNORE },
-#if defined(ENABLE_VERIFIER)
-       { "noverify",          false, OPT_NOVERIFY },
-       { "Xverify:none",      false, OPT_NOVERIFY },
-#endif
-       { "v",                 false, OPT_VERBOSE1 },
-       { "verbose:",          true,  OPT_VERBOSE },
-
-#if defined(ENABLE_VERIFIER) && defined(TYPECHECK_VERBOSE)
-       { "verbosetc",         false, OPT_VERBOSETC },
-#endif
-#if defined(__ALPHA__)
-       { "noieee",            false, OPT_NOIEEE },
-#endif
-#if defined(ENABLE_STATISTICS)
-       { "time",              false, OPT_TIME },
-       { "stat",              false, OPT_STAT },
-#endif
-       { "log",               true,  OPT_LOG },
-       { "c",                 true,  OPT_CHECK },
-       { "l",                 false, OPT_LOAD },
-
-#if !defined(NDEBUG)
-       { "all",               false, OPT_ALL },
-       { "sig",               true,  OPT_SIGNATURE },
-#endif
-
-#if defined(ENABLE_LOOP)
-       { "oloop",             false, OPT_OLOOP },
-#endif
-#if defined(ENABLE_IFCONV)
-       { "ifconv",            false, OPT_IFCONV },
-#endif
-#if defined(ENABLE_LSRA)
-       { "lsra",              false, OPT_LSRA },
-#endif
-#if  defined(ENABLE_SSA)
-       { "lsra",              true, OPT_LSRA },
-#endif
-
-#if defined(ENABLE_INTRP)
-       /* interpreter options */
-
-       { "trace",             false, OPT_TRACE },
-       { "static-supers",     true,  OPT_STATIC_SUPERS },
-       { "no-dynamic",        false, OPT_NO_DYNAMIC },
-       { "no-replication",    false, OPT_NO_REPLICATION },
-       { "no-quicksuper",     false, OPT_NO_QUICKSUPER },
-#endif
-
-       /* JVMTI Agent Command Line Options */
-#ifdef ENABLE_JVMTI
-       { "agentlib:",         true,  OPT_AGENTLIB },
-       { "agentpath:",        true,  OPT_AGENTPATH },
-#endif
-
-       /* Java non-standard options */
-
-       { "Xjit",              false, OPT_JIT },
-       { "Xint",              false, OPT_INTRP },
-       { "Xbootclasspath:",   true,  OPT_BOOTCLASSPATH },
-       { "Xbootclasspath/a:", true,  OPT_BOOTCLASSPATH_A },
-       { "Xbootclasspath/p:", true,  OPT_BOOTCLASSPATH_P },
-       { "Xbootclasspath/c:", true,  OPT_BOOTCLASSPATH_C },
-
-#ifdef ENABLE_JVMTI
-       { "Xdebug",            false, OPT_DEBUG },
-       { "Xnoagent",          false, OPT_NOAGENT },
-       { "Xrunjdwp",          true,  OPT_XRUNJDWP },
-#endif 
-
-       { "Xms",               true,  OPT_MS },
-       { "ms",                true,  OPT_MS },
-       { "Xmx",               true,  OPT_MX },
-       { "mx",                true,  OPT_MX },
-       { "Xss",               true,  OPT_SS },
-       { "ss",                true,  OPT_SS },
-
-#if defined(ENABLE_PROFILING)
-       { "Xprof:",            true,  OPT_PROF_OPTION },
-       { "Xprof",             false, OPT_PROF },
-#endif
-
-       /* keep these at the end of the list */
-
-#if !defined(NDEBUG)
-       { "m",                 true,  OPT_METHOD },
-#endif
-
-       { "s",                 true,  OPT_SHOW },
-       { "debug-color",      false,  OPT_DEBUGCOLOR },
-
-#if defined(ENABLE_DEBUG_FILTER)
-       { "XXfi",              true,  OPT_FILTER_VERBOSECALL_INCLUDE },
-       { "XXfx",              true,  OPT_FILTER_VERBOSECALL_EXCLUDE },
-       { "XXfm",              true,  OPT_FILTER_SHOW_METHOD },
-#endif
-
-       { NULL,                false, 0 }
-};
-
-
-/* usage ***********************************************************************
-
-   Prints the correct usage syntax to stdout.
-
-*******************************************************************************/
-
-void usage(void)
-{
-       puts("Usage: cacao [-options] classname [arguments]");
-       puts("               (to run a class file)");
-       puts("   or  cacao [-options] -jar jarfile [arguments]");
-       puts("               (to run a standalone jar file)\n");
-
-       puts("where options include:");
-       puts("    -d32                     use 32-bit data model if available");
-       puts("    -d64                     use 64-bit data model if available");
-       puts("    -client                  compatibility (currently ignored)");
-       puts("    -server                  compatibility (currently ignored)");
-       puts("    -jvm                     compatibility (currently ignored)");
-       puts("    -hotspot                 compatibility (currently ignored)\n");
-
-       puts("    -cp <path>               specify a path to look for classes");
-       puts("    -classpath <path>        specify a path to look for classes");
-       puts("    -D<name>=<value>         add an entry to the property list");
-       puts("    -verbose[:class|gc|jni]  enable specific verbose output");
-       puts("    -version                 print product version and exit");
-       puts("    -fullversion             print jpackage-compatible product version and exit");
-       puts("    -showversion             print product version and continue");
-       puts("    -help, -?                print this help message");
-       puts("    -X                       print help on non-standard Java options");
-       puts("    -XX                      print help on debugging options");
-    puts("    -ea[:<packagename>...|:<classname>]");
-    puts("    -enableassertions[:<packagename>...|:<classname>]");
-       puts("                             enable assertions with specified granularity");
-       puts("    -da[:<packagename>...|:<classname>]");
-       puts("    -disableassertions[:<packagename>...|:<classname>]");
-       puts("                             disable assertions with specified granularity");
-       puts("    -esa | -enablesystemassertions");
-       puts("                             enable system assertions");
-       puts("    -dsa | -disablesystemassertions");
-       puts("                             disable system assertions");
-
-#ifdef ENABLE_JVMTI
-       puts("    -agentlib:<agent-lib-name>=<options>  library to load containg JVMTI agent");
-       puts ("                                         for jdwp help use: -agentlib:jdwp=help");
-       puts("    -agentpath:<path-to-agent>=<options>  path to library containg JVMTI agent");
-#endif
-
-       /* exit with error code */
-
-       exit(1);
-}   
-
-
-static void Xusage(void)
-{
-#if defined(ENABLE_JIT)
-       puts("    -Xjit                    JIT mode execution (default)");
-#endif
-#if defined(ENABLE_INTRP)
-       puts("    -Xint                    interpreter mode execution");
-#endif
-       puts("    -Xbootclasspath:<zip/jar files and directories separated by :>");
-    puts("                             value is set as bootstrap class path");
-       puts("    -Xbootclasspath/a:<zip/jar files and directories separated by :>");
-       puts("                             value is appended to the bootstrap class path");
-       puts("    -Xbootclasspath/p:<zip/jar files and directories separated by :>");
-       puts("                             value is prepended to the bootstrap class path");
-       puts("    -Xbootclasspath/c:<zip/jar files and directories separated by :>");
-       puts("                             value is used as Java core library, but the");
-       puts("                             hardcoded VM interface classes are prepended");
-       printf("    -Xms<size>               set the initial size of the heap (default: %dMB)\n", HEAP_STARTSIZE / 1024 / 1024);
-       printf("    -Xmx<size>               set the maximum size of the heap (default: %dMB)\n", HEAP_MAXSIZE / 1024 / 1024);
-       printf("    -Xss<size>               set the thread stack size (default: %dkB)\n", STACK_SIZE / 1024);
-
-#if defined(ENABLE_PROFILING)
-       puts("    -Xprof[:bb]              collect and print profiling data");
-#endif
-
-#if defined(ENABLE_JVMTI)
-    /* -Xdebug option depend on gnu classpath JDWP options. options: 
-        transport=dt_socket,address=<hostname:port>,server=(y|n),suspend(y|n) */
-       puts("    -Xdebug                  enable remote debugging\n");
-       puts("    -Xrunjdwp transport=[dt_socket|...],address=<hostname:port>,server=[y|n],suspend=[y|n]\n");
-       puts("                             enable remote debugging\n");
-#endif 
-
-       /* exit with error code */
-
-       exit(1);
-}   
-
-
-#if 0
-static void XXusage(void)
-{
-       puts("    -v                       write state-information");
-#if !defined(NDEBUG)
-       puts("    -verbose:jit             enable specific verbose output");
-       puts("    -debug-color             colored output for ANSI terms");
-#endif
-#ifdef TYPECHECK_VERBOSE
-       puts("    -verbosetc               write debug messages while typechecking");
-#endif
-#if defined(__ALPHA__)
-       puts("    -noieee                  don't use ieee compliant arithmetic");
-#endif
-#if defined(ENABLE_VERIFIER)
-       puts("    -noverify                don't verify classfiles");
-#endif
-#if defined(ENABLE_STATISTICS)
-       puts("    -time                    measure the runtime");
-       puts("    -stat                    detailed compiler statistics");
-#endif
-       puts("    -log logfile             specify a name for the logfile");
-       puts("    -c(heck)b(ounds)         don't check array bounds");
-       puts("            s(ync)           don't check for synchronization");
-#if defined(ENABLE_LOOP)
-       puts("    -oloop                   optimize array accesses in loops");
-#endif
-       puts("    -l                       don't start the class after loading");
-#if !defined(NDEBUG)
-       puts("    -all                     compile all methods, no execution");
-       puts("    -m                       compile only a specific method");
-       puts("    -sig                     specify signature for a specific method");
-#endif
-
-       puts("    -s...                    show...");
-       puts("      (c)onstants            the constant pool");
-       puts("      (m)ethods              class fields and methods");
-       puts("      (u)tf                  the utf - hash");
-       puts("      (i)ntermediate         intermediate representation");
-#if defined(ENABLE_DISASSEMBLER)
-       puts("      (a)ssembler            disassembled listing");
-       puts("      n(o)ps                 show NOPs in disassembler output");
-#endif
-       puts("      (d)atasegment          data segment listing");
-
-#if defined(ENABLE_IFCONV)
-       puts("    -ifconv                  use if-conversion");
-#endif
-#if defined(ENABLE_LSRA)
-       puts("    -lsra                    use linear scan register allocation");
-#endif
-#if defined(ENABLE_SSA)
-       puts("    -lsra:...                use linear scan register allocation (with SSA)");
-       puts("       (d)ead code elimination");
-       puts("       (c)opy propagation");
-#endif
-#if defined(ENABLE_DEBUG_FILTER)
-       puts("    -XXfi <regex>            begin of dynamic scope for verbosecall filter");
-       puts("    -XXfx <regex>            end of dynamic scope for verbosecall filter");
-       puts("    -XXfm <regex>            filter for show options");
-#endif
-       /* exit with error code */
-
-       exit(1);
-}
-#endif
-
-
-/* version *********************************************************************
-
-   Only prints cacao version information.
-
-*******************************************************************************/
-
-static void version(bool opt_exit)
-{
-       puts("java version \""JAVA_VERSION"\"");
-       puts("CACAO version "VERSION"\n");
-
-       puts("Copyright (C) 1996-2005, 2006, 2007, 2008");
-       puts("CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO");
-       puts("This is free software; see the source for copying conditions.  There is NO");
-       puts("warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.");
-
-       /* exit normally, if requested */
-
-       if (opt_exit)
-               exit(0);
-}
-
-
-/* fullversion *****************************************************************
-
-   Prints a Sun compatible version information (required e.g. by
-   jpackage, www.jpackage.org).
-
-*******************************************************************************/
-
-static void fullversion(void)
-{
-       puts("java full version \"cacao-"JAVA_VERSION"\"");
-
-       /* exit normally */
-
-       exit(0);
-}
-
-
-static void vm_printconfig(void)
-{
-       puts("Configure/Build options:\n");
-       puts("  ./configure: "VERSION_CONFIGURE_ARGS"");
-#if defined(__VERSION__)
-       puts("  CC         : "VERSION_CC" ("__VERSION__")");
-#else
-       puts("  CC         : "VERSION_CC"");
-#endif
-       puts("  CFLAGS     : "VERSION_CFLAGS"\n");
-
-       puts("Default variables:\n");
-       printf("  maximum heap size              : %d\n", HEAP_MAXSIZE);
-       printf("  initial heap size              : %d\n", HEAP_STARTSIZE);
-       printf("  stack size                     : %d\n", STACK_SIZE);
-
-#if defined(ENABLE_JRE_LAYOUT)
-       /* When we're building with JRE-layout, the default paths are the
-          same as the runtime paths. */
-#else
-# if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
-       puts("  gnu.classpath.boot.library.path: "JAVA_RUNTIME_LIBRARY_LIBDIR);
-       puts("  java.boot.class.path           : "CACAO_VM_ZIP":"JAVA_RUNTIME_LIBRARY_CLASSES"");
-# elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
-       puts("  sun.boot.library.path          : "JAVA_RUNTIME_LIBRARY_LIBDIR);
-       puts("  java.boot.class.path           : "JAVA_RUNTIME_LIBRARY_CLASSES);
-# endif
-#endif
-
-       puts("");
-
-       puts("Runtime variables:\n");
-       printf("  maximum heap size              : %d\n", opt_heapmaxsize);
-       printf("  initial heap size              : %d\n", opt_heapstartsize);
-       printf("  stack size                     : %d\n", opt_stacksize);
-
-#if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
-       printf("  gnu.classpath.boot.library.path: %s\n", properties_get("gnu.classpath.boot.library.path"));
-#elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
-       printf("  sun.boot.library.path          : %s\n", properties_get("sun.boot.library.path"));
-#endif
-
-       printf("  java.boot.class.path           : %s\n", properties_get("java.boot.class.path"));
-       printf("  java.class.path                : %s\n", properties_get("java.class.path"));
-}
-
-
-/* forward declarations *******************************************************/
-
-static char *vm_get_mainclass_from_jar(char *mainstring);
-#if !defined(NDEBUG)
-static void  vm_compile_all(void);
-static void  vm_compile_method(char* mainname);
-#endif
-
-
-/* vm_createjvm ****************************************************************
-
-   Implementation for JNI_CreateJavaVM.
-
-*******************************************************************************/
-
-bool vm_createjvm(JavaVM **p_vm, void **p_env, void *vm_args)
-{
-       JavaVMInitArgs *_vm_args;
-       _Jv_JNIEnv     *env;
-       _Jv_JavaVM     *vm;
-
-       /* get the arguments for the new JVM */
-
-       _vm_args = (JavaVMInitArgs *) vm_args;
-
-       /* get the VM and Env tables (must be set before vm_create) */
-
-       env = NEW(_Jv_JNIEnv);
-
-#if defined(ENABLE_JNI)
-       env->env = &_Jv_JNINativeInterface;
-#endif
-
-       /* XXX Set the global variable.  Maybe we should do that differently. */
-
-       _Jv_env = env;
-
-       /* create and fill a JavaVM structure */
-
-       vm = NEW(_Jv_JavaVM);
-
-#if defined(ENABLE_JNI)
-       vm->functions = &_Jv_JNIInvokeInterface;
-#endif
-
-       /* XXX Set the global variable.  Maybe we should do that differently. */
-       /* XXX JVMTI Agents needs a JavaVM  */
-
-       _Jv_jvm = vm;
-
-       /* actually create the JVM */
-
-       if (!vm_create(_vm_args))
-               goto error;
-
-       /* now return the values */
-
-       *p_vm  = (JavaVM *) vm;
-       *p_env = (void *) env;
-
-       return true;
-
- error:
-       /* release allocated memory */
-
-       FREE(env, _Jv_JNIEnv);
-       FREE(vm, _Jv_JavaVM);
-
-       return false;
-}
-
-
-/* vm_create *******************************************************************
-
-   Creates a JVM.  Called by vm_createjvm.
-
-*******************************************************************************/
-
-bool vm_create(JavaVMInitArgs *vm_args)
-{
-       int   len;
-       char *p;
-       char *boot_class_path;
-       char *class_path;
-       int   opt;
-       int   i, j;
-       bool  opt_version;
-       bool  opt_exit;
-
-#if defined(ENABLE_JVMTI)
-       lt_dlhandle  handle;
-       char *libname, *agentarg;
-       bool jdwp,agentbypath;
-       jdwp = agentbypath = false;
-#endif
-
-#if defined(ENABLE_JNI)
-       /* Check the JNI version requested. */
-
-       if (!jni_version_check(vm_args->version))
-               return false;
-#endif
-
-       /* We only support 1 JVM instance. */
-
-       if (vms > 0)
-               return false;
-
-       /* Install the exit handler. */
-
-       if (atexit(vm_exit_handler))
-               vm_abort("atexit failed: %s\n", strerror(errno));
-
-       /* Set some options. */
-
-       opt_version       = false;
-       opt_exit          = false;
-
-       opt_noieee        = false;
-
-       opt_heapmaxsize   = HEAP_MAXSIZE;
-       opt_heapstartsize = HEAP_STARTSIZE;
-       opt_stacksize     = STACK_SIZE;
-
-       /* Initialize the properties list before command-line handling.
-          Otherwise -XX:+PrintConfig crashes. */
-
-       properties_init();
-
-       /* First of all, parse the -XX options. */
-
-#if defined(ENABLE_VMLOG)
-       vmlog_cacao_init_options();
-#endif
-
-       options_xx(vm_args);
-
-#if defined(ENABLE_VMLOG)
-       vmlog_cacao_init();
-#endif
-
-       /* We need to check if the actual size of a java.lang.Class object
-          is smaller or equal than the assumption made in
-          src/vmcore/class.h. */
-
-       if (sizeof(java_lang_Class) > sizeof(dummy_java_lang_Class))
-               vm_abort("vm_create: java_lang_Class structure is bigger than classinfo.object (%d > %d)", sizeof(java_lang_Class), sizeof(dummy_java_lang_Class));
-
-       /* set the VM starttime */
-
-       _Jv_jvm->starttime = builtin_currenttimemillis();
-
-#if defined(ENABLE_JVMTI)
-       /* initialize JVMTI related  **********************************************/
-       jvmti = false;
-#endif
-
-       /* Fill the properties before command-line handling. */
-
-       properties_set();
-
-       /* iterate over all passed options */
-
-       while ((opt = options_get(opts, vm_args)) != OPT_DONE) {
-               switch (opt) {
-               case OPT_FOO:
-                       opt_foo = true;
-                       break;
-
-               case OPT_IGNORE:
-                       break;
-                       
-               case OPT_JAR:
-                       opt_jar = true;
-                       break;
-
-               case OPT_D32:
-#if SIZEOF_VOID_P == 8
-                       puts("Running a 32-bit JVM is not supported on this platform.");
-                       exit(1);
-#endif
-                       break;
-
-               case OPT_D64:
-#if SIZEOF_VOID_P == 4
-                       puts("Running a 64-bit JVM is not supported on this platform.");
-                       exit(1);
-#endif
-                       break;
-
-               case OPT_CLASSPATH:
-                       /* Forget old classpath and set the argument as new
-                          classpath. */
-
-                       class_path = properties_get("java.class.path");
-
-                       p = MNEW(char, strlen(opt_arg) + strlen("0"));
-
-                       strcpy(p, opt_arg);
-
-#if defined(ENABLE_JAVASE)
-                       properties_add("java.class.path", p);
-#endif
-
-                       MFREE(class_path, char, strlen(class_path));
-                       break;
-
-               case OPT_D:
-                       for (i = 0; i < strlen(opt_arg); i++) {
-                               if (opt_arg[i] == '=') {
-                                       opt_arg[i] = '\0';
-                                       properties_add(opt_arg, opt_arg + i + 1);
-                                       goto opt_d_done;
-                               }
-                       }
-
-                       /* if no '=' is given, just create an empty property */
-
-                       properties_add(opt_arg, "");
-
-               opt_d_done:
-                       break;
-
-               case OPT_BOOTCLASSPATH:
-                       /* Forget default bootclasspath and set the argument as
-                          new boot classpath. */
-
-                       boot_class_path = properties_get("sun.boot.class.path");
-
-                       p = MNEW(char, strlen(opt_arg) + strlen("0"));
-
-                       strcpy(p, opt_arg);
-
-                       properties_add("sun.boot.class.path", p);
-                       properties_add("java.boot.class.path", p);
-
-                       MFREE(boot_class_path, char, strlen(boot_class_path));
-                       break;
-
-               case OPT_BOOTCLASSPATH_A:
-                       /* Append to bootclasspath. */
-
-                       boot_class_path = properties_get("sun.boot.class.path");
-
-                       len = strlen(boot_class_path);
-
-                       p = MREALLOC(boot_class_path,
-                                                char,
-                                                len + strlen("0"),
-                                                len + strlen(":") +
-                                                strlen(opt_arg) + strlen("0"));
-
-                       strcat(p, ":");
-                       strcat(p, opt_arg);
-
-                       properties_add("sun.boot.class.path", p);
-                       properties_add("java.boot.class.path", p);
-                       break;
-
-               case OPT_BOOTCLASSPATH_P:
-                       /* Prepend to bootclasspath. */
-
-                       boot_class_path = properties_get("sun.boot.class.path");
-
-                       len = strlen(boot_class_path);
-
-                       p = MNEW(char, strlen(opt_arg) + strlen(":") + len + strlen("0"));
-
-                       strcpy(p, opt_arg);
-                       strcat(p, ":");
-                       strcat(p, boot_class_path);
-
-                       properties_add("sun.boot.class.path", p);
-                       properties_add("java.boot.class.path", p);
-
-                       MFREE(boot_class_path, char, len);
-                       break;
-
-               case OPT_BOOTCLASSPATH_C:
-                       /* Use as Java core library, but prepend VM interface
-                          classes. */
-
-                       boot_class_path = properties_get("sun.boot.class.path");
-
-                       len =
-                               strlen(CACAO_VM_ZIP) +
-                               strlen(":") +
-                               strlen(opt_arg) +
-                               strlen("0");
-
-                       p = MNEW(char, len);
-
-                       strcpy(p, CACAO_VM_ZIP);
-                       strcat(p, ":");
-                       strcat(p, opt_arg);
-
-                       properties_add("sun.boot.class.path", p);
-                       properties_add("java.boot.class.path", p);
-
-                       MFREE(boot_class_path, char, strlen(boot_class_path));
-                       break;
-
-#if defined(ENABLE_JVMTI)
-               case OPT_DEBUG:
-                       /* this option exists only for compatibility reasons */
-                       break;
-
-               case OPT_NOAGENT:
-                       /* I don't know yet what Xnoagent should do. This is only for 
-                          compatiblity with eclipse - motse */
-                       break;
-
-               case OPT_XRUNJDWP:
-                       agentbypath = true;
-                       jvmti       = true;
-                       jdwp        = true;
-
-                       len =
-                               strlen(CACAO_LIBDIR) +
-                               strlen("/libjdwp.so=") +
-                               strlen(opt_arg) +
-                               strlen("0");
-
-                       agentarg = MNEW(char, len);
-
-                       strcpy(agentarg, CACAO_LIBDIR);
-                       strcat(agentarg, "/libjdwp.so=");
-                       strcat(agentarg, &opt_arg[1]);
-                       break;
-
-               case OPT_AGENTPATH:
-                       agentbypath = true;
-
-               case OPT_AGENTLIB:
-                       jvmti = true;
-                       agentarg = opt_arg;
-                       break;
-#endif
-                       
-               case OPT_MX:
-               case OPT_MS:
-               case OPT_SS:
-                       {
-                               char c;
-                               c = opt_arg[strlen(opt_arg) - 1];
-
-                               if ((c == 'k') || (c == 'K')) {
-                                       j = atoi(opt_arg) * 1024;
-
-                               } else if ((c == 'm') || (c == 'M')) {
-                                       j = atoi(opt_arg) * 1024 * 1024;
-
-                               } else
-                                       j = atoi(opt_arg);
-
-                               if (opt == OPT_MX)
-                                       opt_heapmaxsize = j;
-                               else if (opt == OPT_MS)
-                                       opt_heapstartsize = j;
-                               else
-                                       opt_stacksize = j;
-                       }
-                       break;
-
-               case OPT_VERBOSE1:
-                       opt_verbose = true;
-                       break;
-
-               case OPT_VERBOSE:
-                       if (strcmp("class", opt_arg) == 0) {
-                               opt_verboseclass = true;
-                       }
-                       else if (strcmp("gc", opt_arg) == 0) {
-                               opt_verbosegc = true;
-                       }
-                       else if (strcmp("jni", opt_arg) == 0) {
-                               opt_verbosejni = true;
-                       }
-#if !defined(NDEBUG)
-                       else if (strcmp("jit", opt_arg) == 0) {
-                               opt_verbose = true;
-                               loadverbose = true;
-                               initverbose = true;
-                               compileverbose = true;
-                       }
-#endif
-                       else {
-                               printf("Unknown -verbose option: %s\n", opt_arg);
-                               usage();
-                       }
-                       break;
-
-               case OPT_DEBUGCOLOR:
-                       opt_debugcolor = true;
-                       break;
-
-#if defined(ENABLE_VERIFIER) && defined(TYPECHECK_VERBOSE)
-               case OPT_VERBOSETC:
-                       opt_typecheckverbose = true;
-                       break;
-#endif
-                               
-               case OPT_VERSION:
-                       opt_version = true;
-                       opt_exit    = true;
-                       break;
-
-               case OPT_FULLVERSION:
-                       fullversion();
-                       break;
-
-               case OPT_SHOWVERSION:
-                       opt_version = true;
-                       break;
-
-               case OPT_NOIEEE:
-                       opt_noieee = true;
-                       break;
-
-#if defined(ENABLE_VERIFIER)
-               case OPT_NOVERIFY:
-                       opt_verify = false;
-                       break;
-#endif
-
-#if defined(ENABLE_STATISTICS)
-               case OPT_TIME:
-                       opt_getcompilingtime = true;
-                       opt_getloadingtime = true;
-                       break;
-                                       
-               case OPT_STAT:
-                       opt_stat = true;
-                       break;
-#endif
-                                       
-               case OPT_LOG:
-                       log_init(opt_arg);
-                       break;
-                       
-               case OPT_CHECK:
-                       for (i = 0; i < strlen(opt_arg); i++) {
-                               switch (opt_arg[i]) {
-                               case 'b':
-                                       checkbounds = false;
-                                       break;
-                               case 's':
-                                       checksync = false;
-                                       break;
-                               default:
-                                       usage();
-                               }
-                       }
-                       break;
-                       
-               case OPT_LOAD:
-                       opt_run = false;
-                       makeinitializations = false;
-                       break;
-
-#if !defined(NDEBUG)
-               case OPT_ALL:
-                       compileall = true;
-                       opt_run = false;
-                       makeinitializations = false;
-                       break;
-
-               case OPT_METHOD:
-                       opt_run = false;
-                       opt_method = opt_arg;
-                       makeinitializations = false;
-                       break;
-
-               case OPT_SIGNATURE:
-                       opt_signature = opt_arg;
-                       break;
-#endif
-
-               case OPT_SHOW:       /* Display options */
-                       for (i = 0; i < strlen(opt_arg); i++) {         
-                               switch (opt_arg[i]) {
-                               case 'c':
-                                       showconstantpool = true;
-                                       break;
-
-                               case 'u':
-                                       showutf = true;
-                                       break;
-
-                               case 'm':
-                                       showmethods = true;
-                                       break;
-
-                               case 'i':
-                                       opt_showintermediate = true;
-                                       compileverbose = true;
-                                       break;
-
-#if defined(ENABLE_DISASSEMBLER)
-                               case 'a':
-                                       opt_showdisassemble = true;
-                                       compileverbose = true;
-                                       break;
-
-                               case 'o':
-                                       opt_shownops = true;
-                                       break;
-#endif
-
-                               case 'd':
-                                       opt_showddatasegment = true;
-                                       break;
-
-                               default:
-                                       usage();
-                               }
-                       }
-                       break;
-                       
-#if defined(ENABLE_LOOP)
-               case OPT_OLOOP:
-                       opt_loops = true;
-                       break;
-#endif
-
-#if defined(ENABLE_IFCONV)
-               case OPT_IFCONV:
-                       opt_ifconv = true;
-                       break;
-#endif
-
-#if defined(ENABLE_LSRA)
-               case OPT_LSRA:
-                       opt_lsra = true;
-                       break;
-#endif
-#if  defined(ENABLE_SSA)
-               case OPT_LSRA:
-                       opt_lsra = true;
-                       for (i = 0; i < strlen(opt_arg); i++) {         
-                               switch (opt_arg[i]) {
-                               case 'c':
-                                       opt_ssa_cp = true;
-                                       break;
-
-                               case 'd':
-                                       opt_ssa_dce = true;
-                                       break;
-
-                               case ':':
-                                       break;
-
-                               default:
-                                       usage();
-                               }
-                       }
-                       break;
-#endif
-
-               case OPT_HELP:
-                       usage();
-                       break;
-
-               case OPT_X:
-                       Xusage();
-                       break;
-
-               case OPT_XX:
-                       /* Already parsed. */
-                       break;
-
-               case OPT_EA:
-#if defined(ENABLE_ASSERTION)
-                       assertion_ea_da(opt_arg, true);
-#endif
-                       break;
-
-               case OPT_DA:
-#if defined(ENABLE_ASSERTION)
-                       assertion_ea_da(opt_arg, false);
-#endif
-                       break;
-
-               case OPT_EA_NOARG:
-#if defined(ENABLE_ASSERTION)
-                       assertion_user_enabled = true;
-#endif
-                       break;
-
-               case OPT_DA_NOARG:
-#if defined(ENABLE_ASSERTION)
-                       assertion_user_enabled = false;
-#endif
-                       break;
-
-               case OPT_ESA:
-#if defined(ENABLE_ASSERTION)
-                       assertion_system_enabled = true;
-#endif
-                       break;
-
-               case OPT_DSA:
-#if defined(ENABLE_ASSERTION)
-                       assertion_system_enabled = false;
-#endif
-                       break;
-
-#if defined(ENABLE_PROFILING)
-               case OPT_PROF_OPTION:
-                       /* use <= to get the last \0 too */
-
-                       for (i = 0, j = 0; i <= strlen(opt_arg); i++) {
-                               if (opt_arg[i] == ',')
-                                       opt_arg[i] = '\0';
-
-                               if (opt_arg[i] == '\0') {
-                                       if (strcmp("bb", opt_arg + j) == 0)
-                                               opt_prof_bb = true;
-
-                                       else {
-                                               printf("Unknown option: -Xprof:%s\n", opt_arg + j);
-                                               usage();
-                                       }
-
-                                       /* set k to next char */
-
-                                       j = i + 1;
-                               }
-                       }
-                       /* fall through */
-
-               case OPT_PROF:
-                       opt_prof = true;
-                       break;
-#endif
-
-               case OPT_JIT:
-#if defined(ENABLE_JIT)
-                       opt_jit = true;
-#else
-                       printf("-Xjit option not enabled.\n");
-                       exit(1);
-#endif
-                       break;
-
-               case OPT_INTRP:
-#if defined(ENABLE_INTRP)
-                       opt_intrp = true;
-#else
-                       printf("-Xint option not enabled.\n");
-                       exit(1);
-#endif
-                       break;
-
-#if defined(ENABLE_INTRP)
-               case OPT_STATIC_SUPERS:
-                       opt_static_supers = atoi(opt_arg);
-                       break;
-
-               case OPT_NO_DYNAMIC:
-                       opt_no_dynamic = true;
-                       break;
-
-               case OPT_NO_REPLICATION:
-                       opt_no_replication = true;
-                       break;
-
-               case OPT_NO_QUICKSUPER:
-                       opt_no_quicksuper = true;
-                       break;
-
-               case OPT_TRACE:
-                       vm_debug = true;
-                       break;
-#endif
-
-#if defined(ENABLE_DEBUG_FILTER)
-               case OPT_FILTER_VERBOSECALL_INCLUDE:
-                       opt_filter_verbosecall_include = opt_arg;
-                       break;
-
-               case OPT_FILTER_VERBOSECALL_EXCLUDE:
-                       opt_filter_verbosecall_exclude = opt_arg;
-                       break;
-
-               case OPT_FILTER_SHOW_METHOD:
-                       opt_filter_show_method = opt_arg;
-                       break;
-
-#endif
-               default:
-                       printf("Unknown option: %s\n",
-                                  vm_args->options[opt_index].optionString);
-                       usage();
-               }
-       }
-
-#if defined(ENABLE_JVMTI)
-       if (jvmti) {
-               jvmti_set_phase(JVMTI_PHASE_ONLOAD);
-               jvmti_agentload(agentarg, agentbypath, &handle, &libname);
-
-               if (jdwp)
-                       MFREE(agentarg, char, strlen(agentarg));
-
-               jvmti_set_phase(JVMTI_PHASE_PRIMORDIAL);
-       }
-#endif
-
-       /* initialize this JVM ****************************************************/
-
-       vm_initializing = true;
-
-       /* initialize the garbage collector */
-
-       gc_init(opt_heapmaxsize, opt_heapstartsize);
-
-#if defined(ENABLE_THREADS)
-       /* BEFORE: threads_preinit */
-
-       threadlist_init();
-
-       /* AFTER: gc_init (directly after, as this initializes the
-          stopworldlock lock */
-
-       threads_preinit();
-       lock_init();
-#endif
-
-       /* install architecture dependent signal handlers */
-
-       if (!signal_init())
-               vm_abort("vm_create: signal_init failed");
-
-#if defined(ENABLE_INTRP)
-       /* Allocate main thread stack on the Java heap. */
-
-       if (opt_intrp) {
-               intrp_main_stack = GCMNEW(u1, opt_stacksize);
-               MSET(intrp_main_stack, 0, u1, opt_stacksize);
-       }
-#endif
-
-       /* AFTER: threads_preinit */
-
-       if (!string_init())
-               vm_abort("vm_create: string_init failed");
-
-       /* AFTER: threads_preinit */
-
-       utf8_init();
-
-       /* AFTER: thread_preinit */
-
-       if (!suck_init())
-               vm_abort("vm_create: suck_init failed");
-
-       suck_add_from_property("java.endorsed.dirs");
-
-       /* Now we have all options handled and we can print the version
-          information.
-
-          AFTER: suck_add_from_property("java.endorsed.dirs"); */
-
-       if (opt_version)
-               version(opt_exit);
-
-       /* AFTER: utf8_init */
-
-       boot_class_path = properties_get("sun.boot.class.path");
-       suck_add(boot_class_path);
-
-       /* initialize the classcache hashtable stuff: lock, hashtable
-          (must be done _after_ threads_preinit) */
-
-       if (!classcache_init())
-               vm_abort("vm_create: classcache_init failed");
-
-       /* Initialize the code memory management. */
-       /* AFTER: threads_preinit */
-
-       codememory_init();
-
-       /* initialize the finalizer stuff (must be done _after_
-          threads_preinit) */
-
-       if (!finalizer_init())
-               vm_abort("vm_create: finalizer_init failed");
-
-       /* Initialize the JIT compiler. */
-
-       jit_init();
-       code_init();
-       methodtree_init();
-
-#if defined(ENABLE_PYTHON)
-       pythonpass_init();
-#endif
-
-       /* BEFORE: loader_preinit */
-
-       Package_initialize();
-
-       /* AFTER: utf8_init, classcache_init */
-
-       loader_preinit();
-       linker_preinit();
-
-       /* AFTER: loader_preinit, linker_preinit */
-
-       primitive_init();
-
-       loader_init();
-       linker_init();
-
-       /* AFTER: loader_init, linker_init */
-
-       primitive_postinit();
-       method_init();
-
-#if defined(ENABLE_JIT)
-       trap_init();
-#endif
-
-       if (!builtin_init())
-               vm_abort("vm_create: builtin_init failed");
-
-       /* Initialize the native subsystem. */
-       /* BEFORE: threads_init */
-
-       if (!native_init())
-               vm_abort("vm_create: native_init failed");
-
-       /* Register the native methods implemented in the VM. */
-       /* BEFORE: threads_init */
-
-       nativevm_preinit();
-
-#if defined(ENABLE_JNI)
-       /* Initialize the JNI subsystem (must be done _before_
-          threads_init, as threads_init can call JNI methods
-          (e.g. NewGlobalRef). */
-
-       if (!jni_init())
-               vm_abort("vm_create: jni_init failed");
-#endif
-
-#if defined(ENABLE_JNI) || defined(ENABLE_HANDLES)
-       /* Initialize the local reference table for the main thread. */
-       /* BEFORE: threads_init */
-
-       if (!localref_table_init())
-               vm_abort("vm_create: localref_table_init failed");
-#endif
-
-       /* Iinitialize some important system classes. */
-       /* BEFORE: threads_init */
-
-       initialize_init();
-
-#if defined(ENABLE_THREADS)
-       threads_init();
-#endif
-
-       /* Initialize the native VM subsystem. */
-       /* AFTER: threads_init (at least for SUN's classes) */
-
-       nativevm_init();
-
-#if defined(ENABLE_PROFILING)
-       /* initialize profiling */
-
-       if (!profile_init())
-               vm_abort("vm_create: profile_init failed");
-#endif
-
-#if defined(ENABLE_THREADS)
-       /* initialize recompilation */
-
-       if (!recompile_init())
-               vm_abort("vm_create: recompile_init failed");
-
-       /* start the signal handler thread */
-
-#if defined(__LINUX__)
-       /* XXX Remove for exact-GC. */
-       if (threads_pthreads_implementation_nptl)
-#endif
-               if (!signal_start_thread())
-                       vm_abort("vm_create: signal_start_thread failed");
-
-       /* finally, start the finalizer thread */
-
-       if (!finalizer_start_thread())
-               vm_abort("vm_create: finalizer_start_thread failed");
-
-# if !defined(NDEBUG)
-       /* start the memory profiling thread */
-
-       if (opt_ProfileMemoryUsage || opt_ProfileGCMemoryUsage)
-               if (!memory_start_thread())
-                       vm_abort("vm_create: memory_start_thread failed");
-# endif
-
-       /* start the recompilation thread (must be done before the
-          profiling thread) */
-
-       if (!recompile_start_thread())
-               vm_abort("vm_create: recompile_start_thread failed");
-
-# if defined(ENABLE_PROFILING)
-       /* start the profile sampling thread */
-
-/*     if (opt_prof) */
-/*             if (!profile_start_thread()) */
-/*                     vm_abort("vm_create: profile_start_thread failed"); */
-# endif
-#endif
-
-#if defined(ENABLE_JVMTI)
-# if defined(ENABLE_GC_CACAO)
-       /* XXX this will not work with the new indirection cells for classloaders!!! */
-       assert(0);
-# endif
-       if (jvmti) {
-               /* add agent library to native library hashtable */
-               native_hashtable_library_add(utf_new_char(libname), class_java_lang_Object->classloader, handle);
-       }
-#endif
-
-       /* Increment the number of VMs. */
-
-       vms++;
-
-       /* Initialization is done, VM is created.. */
-
-       vm_created      = true;
-       vm_initializing = false;
-
-       /* Print the VM configuration after all stuff is set and the VM is
-          initialized. */
-
-       if (opt_PrintConfig)
-               vm_printconfig();
-
-       /* everything's ok */
-
-       return true;
-}
-
-
-/* vm_run **********************************************************************
-
-   Runs the main-method of the passed class.
-
-*******************************************************************************/
-
-void vm_run(JavaVM *vm, JavaVMInitArgs *vm_args)
-{
-       char*                      option;
-       char*                      mainname;
-       char*                      p;
-       utf                       *mainutf;
-       classinfo                 *mainclass;
-       java_handle_t             *e;
-       methodinfo                *m;
-       java_handle_objectarray_t *oa; 
-       s4                         oalength;
-       utf                       *u;
-       java_handle_t             *s;
-       int                        status;
-       int                        i;
-
-       // Prevent compiler warnings.
-       oa = NULL;
-
-#if !defined(NDEBUG)
-       if (compileall) {
-               vm_compile_all();
-               return;
-       }
-#endif
-
-       /* Get the main class plus it's arguments. */
-
-       mainname = NULL;
-
-       if (opt_index < vm_args->nOptions) {
-               /* Get main-class argument. */
-
-               mainname = vm_args->options[opt_index].optionString;
-
-               /* If the main class argument is a jar file, put it into the
-                  classpath. */
-
-               if (opt_jar == true) {
-                       p = MNEW(char, strlen(mainname) + strlen("0"));
-
-                       strcpy(p, mainname);
-
-#if defined(ENABLE_JAVASE)
-                       properties_add("java.class.path", p);
-#endif
-               }
-               else {
-                       /* Replace dots with slashes in the class name. */
-
-                       for (i = 0; i < strlen(mainname); i++)
-                               if (mainname[i] == '.')
-                                       mainname[i] = '/';
-               }
-
-               /* Build argument array.  Move index to first argument. */
-
-               opt_index++;
-
-               oalength = vm_args->nOptions - opt_index;
-
-               oa = builtin_anewarray(oalength, class_java_lang_String);
-
-               for (i = 0; i < oalength; i++) {
-                       option = vm_args->options[opt_index + i].optionString;
-
-                       u = utf_new_char(option);
-                       s = javastring_new(u);
-
-                       array_objectarray_element_set(oa, i, s);
-               }
-       }
-
-       /* Do we have a main-class argument? */
-
-       if (mainname == NULL)
-               usage();
-
-#if !defined(NDEBUG)
-       if (opt_method != NULL) {
-               vm_compile_method(mainname);
-               return;
-       }
-#endif
-
-       /* set return value to OK */
-
-       status = 0;
-
-       if (opt_jar == true) {
-               /* open jar file with java.util.jar.JarFile */
-
-               mainname = vm_get_mainclass_from_jar(mainname);
-
-               if (mainname == NULL)
-                       vm_exit(1);
-       }
-
-       /* load the main class */
-
-       mainutf = utf_new_char(mainname);
-
-#if defined(ENABLE_JAVAME_CLDC1_1)
-       mainclass = load_class_bootstrap(mainutf);
-#else
-       mainclass = load_class_from_sysloader(mainutf);
-#endif
-
-       /* error loading class */
-
-       e = exceptions_get_and_clear_exception();
-
-       if ((e != NULL) || (mainclass == NULL)) {
-               exceptions_throw_noclassdeffounderror_cause(e);
-               exceptions_print_stacktrace(); 
-               vm_exit(1);
-       }
-
-       if (!link_class(mainclass)) {
-               exceptions_print_stacktrace();
-               vm_exit(1);
-       }
-                       
-       /* find the `main' method of the main class */
-
-       m = class_resolveclassmethod(mainclass,
-                                                                utf_new_char("main"), 
-                                                                utf_new_char("([Ljava/lang/String;)V"),
-                                                                class_java_lang_Object,
-                                                                false);
-
-       if (exceptions_get_exception()) {
-               exceptions_print_stacktrace();
-               vm_exit(1);
-       }
-
-       /* there is no main method or it isn't static */
-
-       if ((m == NULL) || !(m->flags & ACC_STATIC)) {
-               exceptions_clear_exception();
-               exceptions_throw_nosuchmethoderror(mainclass,
-                                                                                  utf_new_char("main"), 
-                                                                                  utf_new_char("([Ljava/lang/String;)V"));
-
-               exceptions_print_stacktrace();
-               vm_exit(1);
-       }
-
-#ifdef TYPEINFO_DEBUG_TEST
-       /* test the typeinfo system */
-       typeinfo_test();
-#endif
-
-#if defined(ENABLE_JVMTI)
-       jvmti_set_phase(JVMTI_PHASE_LIVE);
-#endif
-
-       /* set ThreadMXBean variables */
-
-       _Jv_jvm->java_lang_management_ThreadMXBean_ThreadCount++;
-       _Jv_jvm->java_lang_management_ThreadMXBean_TotalStartedThreadCount++;
-
-       if (_Jv_jvm->java_lang_management_ThreadMXBean_ThreadCount >
-               _Jv_jvm->java_lang_management_ThreadMXBean_PeakThreadCount)
-               _Jv_jvm->java_lang_management_ThreadMXBean_PeakThreadCount =
-                       _Jv_jvm->java_lang_management_ThreadMXBean_ThreadCount;
-
-       /* start the main thread */
-
-       (void) vm_call_method(m, NULL, oa);
-
-       /* exception occurred? */
-
-       if (exceptions_get_exception()) {
-               exceptions_print_stacktrace();
-               status = 1;
-       }
-
-#if defined(ENABLE_THREADS)
-    /* Detach the main thread so that it appears to have ended when
-          the application's main method exits. */
-
-       if (!thread_detach_current_thread())
-               vm_abort("vm_run: Could not detach main thread.");
-#endif
-
-       /* Destroy the JavaVM. */
-
-       (void) vm_destroy(vm);
-
-       /* And exit. */
-
-       vm_exit(status);
-}
-
-
-/* vm_destroy ******************************************************************
-
-   Unloads a Java VM and reclaims its resources.
-
-*******************************************************************************/
-
-int vm_destroy(JavaVM *vm)
-{
-#if defined(ENABLE_THREADS)
-       /* Create a a trivial new Java waiter thread called
-          "DestroyJavaVM". */
-
-       JavaVMAttachArgs args;
-
-       args.name  = "DestroyJavaVM";
-       args.group = NULL;
-
-       if (!thread_attach_current_thread(&args, false))
-               return 1;
-
-       /* Wait until we are the last non-daemon thread. */
-
-       threads_join_all_threads();
-#endif
-
-       /* VM is gone. */
-
-       vm_created = false;
-
-       /* Everything is ok. */
-
-       return 0;
-}
-
-
-/* vm_exit *********************************************************************
-
-   Calls java.lang.System.exit(I)V to exit the JavaVM correctly.
-
-*******************************************************************************/
-
-void vm_exit(s4 status)
-{
-       methodinfo *m;
-
-       /* signal that we are exiting */
-
-       vm_exiting = true;
-
-       assert(class_java_lang_System);
-       assert(class_java_lang_System->state & CLASS_LOADED);
-
-#if defined(ENABLE_JVMTI)
-       if (jvmti || (dbgcom!=NULL)) {
-               jvmti_set_phase(JVMTI_PHASE_DEAD);
-               if (jvmti) jvmti_agentunload();
-       }
-#endif
-
-       if (!link_class(class_java_lang_System)) {
-               exceptions_print_stacktrace();
-               exit(1);
-       }
-
-       /* call java.lang.System.exit(I)V */
-
-       m = class_resolveclassmethod(class_java_lang_System,
-                                                                utf_new_char("exit"),
-                                                                utf_int__void,
-                                                                class_java_lang_Object,
-                                                                true);
-       
-       if (m == NULL) {
-               exceptions_print_stacktrace();
-               exit(1);
-       }
-
-       /* call the exit function with passed exit status */
-
-       (void) vm_call_method(m, NULL, status);
-
-       /* If we had an exception, just ignore the exception and exit with
-          the proper code. */
-
-       vm_shutdown(status);
-}
-
-
-/* vm_shutdown *****************************************************************
-
-   Terminates the system immediately without freeing memory explicitly
-   (to be used only for abnormal termination).
-       
-*******************************************************************************/
-
-void vm_shutdown(s4 status)
-{
-       if (opt_verbose 
-#if defined(ENABLE_STATISTICS)
-               || opt_getcompilingtime || opt_stat
-#endif
-          ) 
-       {
-               log_text("CACAO terminated by shutdown");
-               dolog("Exit status: %d\n", (s4) status);
-
-       }
-
-#if defined(ENABLE_JVMTI)
-# error This should be a JVMTI function.
-       /* terminate cacaodbgserver */
-       if (dbgcom!=NULL) {
-               Mutex_lock(&dbgcomlock);
-               dbgcom->running=1;
-               Mutex_unlock(&dbgcomlock);
-               jvmti_cacaodbgserver_quit();
-       }       
-#endif
-
-       exit(status);
-}
-
-
-/* vm_exit_handler *************************************************************
-
-   The exit_handler function is called upon program termination.
-
-   ATTENTION: Don't free system resources here! Some threads may still
-   be running as this is called from VMRuntime.exit(). The OS does the
-   cleanup for us.
-
-*******************************************************************************/
-
-void vm_exit_handler(void)
-{
-#if !defined(NDEBUG)
-       if (showmethods)
-               class_showmethods(mainclass);
-
-       if (showconstantpool)
-               class_showconstantpool(mainclass);
-
-       if (showutf)
-               utf_show();
-
-# if defined(ENABLE_PROFILING)
-       if (opt_prof)
-               profile_printstats();
-# endif
-#endif /* !defined(NDEBUG) */
-
-#if defined(ENABLE_RT_TIMING)
-       rt_timing_print_time_stats(stderr);
-#endif
-
-#if defined(ENABLE_CYCLES_STATS)
-       builtin_print_cycles_stats(stderr);
-       stacktrace_print_cycles_stats(stderr);
-#endif
-
-       if (opt_verbose 
-#if defined(ENABLE_STATISTICS)
-               || opt_getcompilingtime || opt_stat
-#endif
-          ) 
-       {
-               log_text("CACAO terminated");
-
-#if defined(ENABLE_STATISTICS)
-               if (opt_stat) {
-                       print_stats();
-#ifdef TYPECHECK_STATISTICS
-                       typecheck_print_statistics(get_logfile());
-#endif
-               }
-
-               if (opt_getcompilingtime)
-                       print_times();
-#endif /* defined(ENABLE_STATISTICS) */
-       }
-       /* vm_print_profile(stderr);*/
-}
-
-
-/* vm_abort ********************************************************************
-
-   Prints an error message and aborts the VM.
-
-   IN:
-       text ... error message to print
-
-*******************************************************************************/
-
-void vm_abort(const char *text, ...)
-{
-       va_list ap;
-
-       /* Print the log message. */
-
-       log_start();
-
-       va_start(ap, text);
-       log_vprint(text, ap);
-       va_end(ap);
-
-       log_finish();
-
-       /* Now abort the VM. */
-
-       system_abort();
-}
-
-
-/* vm_abort_errnum *************************************************************
-
-   Prints an error message, appends ":" plus the strerror-message of
-   errnum and aborts the VM.
-
-   IN:
-       errnum ... error number
-       text ..... error message to print
-
-*******************************************************************************/
-
-void vm_abort_errnum(int errnum, const char *text, ...)
-{
-       va_list ap;
-
-       /* Print the log message. */
-
-       log_start();
-
-       va_start(ap, text);
-       log_vprint(text, ap);
-       va_end(ap);
-
-       /* Print the strerror-message of errnum. */
-
-       log_print(": %s", system_strerror(errnum));
-
-       log_finish();
-
-       /* Now abort the VM. */
-
-       system_abort();
-}
-
-
-/* vm_abort_errno **************************************************************
-
-   Equal to vm_abort_errnum, but uses errno to get the error number.
-
-   IN:
-       text ... error message to print
-
-*******************************************************************************/
-
-void vm_abort_errno(const char *text, ...)
-{
-       va_list ap;
-
-       va_start(ap, text);
-       vm_abort_errnum(errno, text, ap);
-       va_end(ap);
-}
-
-
-/* vm_abort_disassemble ********************************************************
-
-   Prints an error message, disassemble the given code range (if
-   enabled) and aborts the VM.
-
-   IN:
-       pc.......PC to disassemble
-          count....number of instructions to disassemble
-
-*******************************************************************************/
-
-void vm_abort_disassemble(void *pc, int count, const char *text, ...)
-{
-       va_list ap;
-#if defined(ENABLE_DISASSEMBLER)
-       int     i;
-#endif
-
-       /* Print debug message. */
-
-       log_start();
-
-       va_start(ap, text);
-       log_vprint(text, ap);
-       va_end(ap);
-
-       log_finish();
-
-       /* Print the PC. */
-
-#if SIZEOF_VOID_P == 8
-       log_println("PC=0x%016lx", pc);
-#else
-       log_println("PC=0x%08x", pc);
-#endif
-
-#if defined(ENABLE_DISASSEMBLER)
-       log_println("machine instructions at PC:");
-
-       /* Disassemble the given number of instructions. */
-
-       for (i = 0; i < count; i++)
-               pc = disassinstr(pc);
-#endif
-
-       vm_abort("Aborting...");
-}
-
-
-/* vm_get_mainclass_from_jar ***************************************************
-
-   Gets the name of the main class from a JAR's manifest file.
-
-*******************************************************************************/
-
-static char *vm_get_mainclass_from_jar(char *mainname)
-{
-       classinfo     *c;
-       java_handle_t *o;
-       methodinfo    *m;
-       java_handle_t *s;
-
-       c = load_class_from_sysloader(utf_new_char("java/util/jar/JarFile"));
-
-       if (c == NULL) {
-               exceptions_print_stacktrace();
-               return NULL;
-       }
-
-       /* create JarFile object */
-
-       o = builtin_new(c);
-
-       if (o == NULL) {
-               exceptions_print_stacktrace();
-               return NULL;
-       }
-
-       m = class_resolveclassmethod(c,
-                                                                utf_init, 
-                                                                utf_java_lang_String__void,
-                                                                class_java_lang_Object,
-                                                                true);
-
-       if (m == NULL) {
-               exceptions_print_stacktrace();
-               return NULL;
-       }
-
-       s = javastring_new_from_ascii(mainname);
-
-       (void) vm_call_method(m, o, s);
-
-       if (exceptions_get_exception()) {
-               exceptions_print_stacktrace();
-               return NULL;
-       }
-
-       /* get manifest object */
-
-       m = class_resolveclassmethod(c,
-                                                                utf_new_char("getManifest"), 
-                                                                utf_new_char("()Ljava/util/jar/Manifest;"),
-                                                                class_java_lang_Object,
-                                                                true);
-
-       if (m == NULL) {
-               exceptions_print_stacktrace();
-               return NULL;
-       }
-
-       o = vm_call_method(m, o);
-
-       if (o == NULL) {
-               fprintf(stderr, "Could not get manifest from %s (invalid or corrupt jarfile?)\n", mainname);
-               return NULL;
-       }
-
-
-       /* get Main Attributes */
-
-       LLNI_class_get(o, c);
-
-       m = class_resolveclassmethod(c,
-                                                                utf_new_char("getMainAttributes"), 
-                                                                utf_new_char("()Ljava/util/jar/Attributes;"),
-                                                                class_java_lang_Object,
-                                                                true);
-
-       if (m == NULL) {
-               exceptions_print_stacktrace();
-               return NULL;
-       }
-
-       o = vm_call_method(m, o);
-
-       if (o == NULL) {
-               fprintf(stderr, "Could not get main attributes from %s (invalid or corrupt jarfile?)\n", mainname);
-               return NULL;
-       }
-
-
-       /* get property Main-Class */
-
-       LLNI_class_get(o, c);
-
-       m = class_resolveclassmethod(c,
-                                                                utf_new_char("getValue"), 
-                                                                utf_new_char("(Ljava/lang/String;)Ljava/lang/String;"),
-                                                                class_java_lang_Object,
-                                                                true);
-
-       if (m == NULL) {
-               exceptions_print_stacktrace();
-               return NULL;
-       }
-
-       s = javastring_new_from_ascii("Main-Class");
-
-       o = vm_call_method(m, o, s);
-
-       if (o == NULL) {
-               fprintf(stderr, "Failed to load Main-Class manifest attribute from\n");
-               fprintf(stderr, "%s\n", mainname);
-               return NULL;
-       }
-
-       return javastring_tochar(o);
-}
-
-
-/* vm_compile_all **************************************************************
-
-   Compile all methods found in the bootclasspath.
-
-*******************************************************************************/
-
-#if !defined(NDEBUG)
-static void vm_compile_all(void)
-{
-       classinfo              *c;
-       methodinfo             *m;
-       u4                      slot;
-       classcache_name_entry  *nmen;
-       classcache_class_entry *clsen;
-       s4                      i;
-
-       /* create all classes found in the bootclasspath */
-       /* XXX currently only works with zip/jar's */
-
-       loader_load_all_classes();
-
-       /* link all classes */
-
-       for (slot = 0; slot < hashtable_classcache.size; slot++) {
-               nmen = (classcache_name_entry *) hashtable_classcache.ptr[slot];
-
-               for (; nmen; nmen = nmen->hashlink) {
-                       /* iterate over all class entries */
-
-                       for (clsen = nmen->classes; clsen; clsen = clsen->next) {
-                               c = clsen->classobj;
-
-                               if (c == NULL)
-                                       continue;
-
-                               if (!(c->state & CLASS_LINKED)) {
-                                       if (!link_class(c)) {
-                                               fprintf(stderr, "Error linking: ");
-                                               utf_fprint_printable_ascii_classname(stderr, c->name);
-                                               fprintf(stderr, "\n");
-
-                                               /* print out exception and cause */
-
-                                               exceptions_print_current_exception();
-
-                                               /* goto next class */
-
-                                               continue;
-                                       }
-                               }
-
-                               /* compile all class methods */
-
-                               for (i = 0; i < c->methodscount; i++) {
-                                       m = &(c->methods[i]);
-
-                                       if (m->jcode != NULL) {
-                                               if (!jit_compile(m)) {
-                                                       fprintf(stderr, "Error compiling: ");
-                                                       utf_fprint_printable_ascii_classname(stderr, c->name);
-                                                       fprintf(stderr, ".");
-                                                       utf_fprint_printable_ascii(stderr, m->name);
-                                                       utf_fprint_printable_ascii(stderr, m->descriptor);
-                                                       fprintf(stderr, "\n");
-
-                                                       /* print out exception and cause */
-
-                                                       exceptions_print_current_exception();
-                                               }
-                                       }
-                               }
-                       }
-               }
-       }
-}
-#endif /* !defined(NDEBUG) */
-
-
-/* vm_compile_method ***********************************************************
-
-   Compile a specific method.
-
-*******************************************************************************/
-
-#if !defined(NDEBUG)
-static void vm_compile_method(char* mainname)
-{
-       methodinfo *m;
-
-       /* create, load and link the main class */
-
-       mainclass = load_class_bootstrap(utf_new_char(mainname));
-
-       if (mainclass == NULL)
-               exceptions_print_stacktrace();
-
-       if (!link_class(mainclass))
-               exceptions_print_stacktrace();
-
-       if (opt_signature != NULL) {
-               m = class_resolveclassmethod(mainclass,
-                                                                        utf_new_char(opt_method),
-                                                                        utf_new_char(opt_signature),
-                                                                        mainclass,
-                                                                        false);
-       }
-       else {
-               m = class_resolveclassmethod(mainclass,
-                                                                        utf_new_char(opt_method),
-                                                                        NULL,
-                                                                        mainclass,
-                                                                        false);
-       }
-
-       if (m == NULL)
-               vm_abort("vm_compile_method: java.lang.NoSuchMethodException: %s.%s",
-                                opt_method, opt_signature ? opt_signature : "");
-               
-       jit_compile(m);
-}
-#endif /* !defined(NDEBUG) */
-
-
-/* vm_call_array ***************************************************************
-
-   Calls a Java method with a variable number of arguments, passed via
-   an argument array.
-
-   ATTENTION: This function has to be used outside the nativeworld.
-
-*******************************************************************************/
-
-#define VM_CALL_ARRAY(name, type)                                 \
-static type vm_call##name##_array(methodinfo *m, uint64_t *array) \
-{                                                                 \
-       methoddesc *md;                                               \
-       void       *pv;                                               \
-       type        value;                                            \
-                                                                  \
-       assert(m->code != NULL);                                      \
-                                                                  \
-       md = m->parseddesc;                                           \
-       pv = m->code->entrypoint;                                     \
-                                                                  \
-       STATISTICS(count_calls_native_to_java++);                     \
-                                                                  \
-       value = asm_vm_call_method##name(pv, array, md->memuse);      \
-                                                                  \
-       return value;                                                 \
-}
-
-static java_handle_t *vm_call_array(methodinfo *m, uint64_t *array)
-{
-       methoddesc    *md;
-       void          *pv;
-       java_object_t *o;
-
-       assert(m->code != NULL);
-
-       md = m->parseddesc;
-       pv = m->code->entrypoint;
-
-       STATISTICS(count_calls_native_to_java++);
-
-       o = asm_vm_call_method(pv, array, md->memuse);
-
-       if (md->returntype.type == TYPE_VOID)
-               o = NULL;
-
-       return LLNI_WRAP(o);
-}
-
-VM_CALL_ARRAY(_int,    int32_t)
-VM_CALL_ARRAY(_long,   int64_t)
-VM_CALL_ARRAY(_float,  float)
-VM_CALL_ARRAY(_double, double)
-
-
-/* vm_call_method **************************************************************
-
-   Calls a Java method with a variable number of arguments.
-
-*******************************************************************************/
-
-#define VM_CALL_METHOD(name, type)                                  \
-type vm_call_method##name(methodinfo *m, java_handle_t *o, ...)     \
-{                                                                   \
-       va_list ap;                                                     \
-       type    value;                                                  \
-                                                                    \
-       va_start(ap, o);                                                \
-       value = vm_call_method##name##_valist(m, o, ap);                \
-       va_end(ap);                                                     \
-                                                                    \
-       return value;                                                   \
-}
-
-VM_CALL_METHOD(,        java_handle_t *)
-VM_CALL_METHOD(_int,    int32_t)
-VM_CALL_METHOD(_long,   int64_t)
-VM_CALL_METHOD(_float,  float)
-VM_CALL_METHOD(_double, double)
-
-
-/* vm_call_method_valist *******************************************************
-
-   Calls a Java method with a variable number of arguments, passed via
-   a va_list.
-
-*******************************************************************************/
-
-#define VM_CALL_METHOD_VALIST(name, type)                               \
-type vm_call_method##name##_valist(methodinfo *m, java_handle_t *o,     \
-                                                                  va_list ap)                          \
-{                                                                       \
-       uint64_t *array;                                                    \
-       type      value;                                                    \
-       int32_t   dumpmarker;                                               \
-                                                                        \
-       if (m->code == NULL)                                                \
-               if (!jit_compile(m))                                            \
-                       return 0;                                                   \
-                                                                        \
-       THREAD_NATIVEWORLD_EXIT;                                            \
-       DMARKER;                                                            \
-                                                                        \
-       array = argument_vmarray_from_valist(m, o, ap);                     \
-       value = vm_call##name##_array(m, array);                            \
-                                                                        \
-       DRELEASE;                                                           \
-       THREAD_NATIVEWORLD_ENTER;                                           \
-                                                                        \
-       return value;                                                       \
-}
-
-VM_CALL_METHOD_VALIST(,        java_handle_t *)
-VM_CALL_METHOD_VALIST(_int,    int32_t)
-VM_CALL_METHOD_VALIST(_long,   int64_t)
-VM_CALL_METHOD_VALIST(_float,  float)
-VM_CALL_METHOD_VALIST(_double, double)
-
-
-/* vm_call_method_jvalue *******************************************************
-
-   Calls a Java method with a variable number of arguments, passed via
-   a jvalue array.
-
-*******************************************************************************/
-
-#define VM_CALL_METHOD_JVALUE(name, type)                               \
-type vm_call_method##name##_jvalue(methodinfo *m, java_handle_t *o,     \
-                                                          const jvalue *args)                  \
-{                                                                       \
-       uint64_t *array;                                                    \
-       type      value;                                                    \
-       int32_t   dumpmarker;                                               \
-                                                                        \
-       if (m->code == NULL)                                                \
-               if (!jit_compile(m))                                            \
-                       return 0;                                                   \
-                                                                        \
-       THREAD_NATIVEWORLD_EXIT;                                            \
-       DMARKER;                                                            \
-                                                                        \
-       array = argument_vmarray_from_jvalue(m, o, args);                   \
-       value = vm_call##name##_array(m, array);                            \
-                                                                        \
-       DRELEASE;                                                           \
-       THREAD_NATIVEWORLD_ENTER;                                           \
-                                                                        \
-       return value;                                                       \
-}
-
-VM_CALL_METHOD_JVALUE(,        java_handle_t *)
-VM_CALL_METHOD_JVALUE(_int,    int32_t)
-VM_CALL_METHOD_JVALUE(_long,   int64_t)
-VM_CALL_METHOD_JVALUE(_float,  float)
-VM_CALL_METHOD_JVALUE(_double, double)
-
-
-/* vm_call_method_objectarray **************************************************
-
-   Calls a Java method with a variable number if arguments, passed via
-   an objectarray of boxed values. Returns a boxed value.
-
-*******************************************************************************/
-
-java_handle_t *vm_call_method_objectarray(methodinfo *m, java_handle_t *o,
-                                                                                 java_handle_objectarray_t *params)
-{
-       uint64_t      *array;
-       java_handle_t *xptr;
-       java_handle_t *ro;
-       imm_union      value;
-       int32_t        dumpmarker;
-
-       /* Prevent compiler warnings. */
-
-       ro = NULL;
-
-       /* compile methods which are not yet compiled */
-
-       if (m->code == NULL)
-               if (!jit_compile(m))
-                       return NULL;
-
-       /* leave the nativeworld */
-
-       THREAD_NATIVEWORLD_EXIT;
-
-       /* mark start of dump memory area */
-
-       DMARKER;
-
-       /* Fill the argument array from a object-array. */
-
-       array = argument_vmarray_from_objectarray(m, o, params);
-
-       if (array == NULL) {
-               /* release dump area */
-
-               DRELEASE;
-
-               /* enter the nativeworld again */
-
-               THREAD_NATIVEWORLD_ENTER;
-
-               exceptions_throw_illegalargumentexception();
-
-               return NULL;
-       }
-
-       switch (m->parseddesc->returntype.decltype) {
-       case PRIMITIVETYPE_VOID:
-               value.a = vm_call_array(m, array);
-               break;
-
-       case PRIMITIVETYPE_BOOLEAN:
-       case PRIMITIVETYPE_BYTE:
-       case PRIMITIVETYPE_CHAR:
-       case PRIMITIVETYPE_SHORT:
-       case PRIMITIVETYPE_INT:
-               value.i = vm_call_int_array(m, array);
-               break;
-
-       case PRIMITIVETYPE_LONG:
-               value.l = vm_call_long_array(m, array);
-               break;
-
-       case PRIMITIVETYPE_FLOAT:
-               value.f = vm_call_float_array(m, array);
-               break;
-
-       case PRIMITIVETYPE_DOUBLE:
-               value.d = vm_call_double_array(m, array);
-               break;
-
-       case TYPE_ADR:
-               ro = vm_call_array(m, array);
-               break;
-
-       default:
-               vm_abort("vm_call_method_objectarray: invalid return type %d", m->parseddesc->returntype.decltype);
-       }
-
-       /* release dump area */
-
-       DRELEASE;
-
-       /* enter the nativeworld again */
-
-       THREAD_NATIVEWORLD_ENTER;
-
-       /* box the return value if necesarry */
-
-       if (m->parseddesc->returntype.decltype != TYPE_ADR)
-               ro = Primitive_box(m->parseddesc->returntype.decltype, value);
-
-       /* check for an exception */
-
-       xptr = exceptions_get_exception();
-
-       if (xptr != NULL) {
-               /* clear exception pointer, we are calling JIT code again */
-
-               exceptions_clear_exception();
-
-               exceptions_throw_invocationtargetexception(xptr);
-       }
-
-       return ro;
-}
-
-
-/*
- * These are local overrides for various environment variables in Emacs.
- * Please do not remove this and leave it at the end of the file, where
- * Emacs will automagically detect them.
- * ---------------------------------------------------------------------
- * Local variables:
- * mode: c
- * indent-tabs-mode: t
- * c-basic-offset: 4
- * tab-width: 4
- * End:
- * vim:noexpandtab:sw=4:ts=4:
- */
diff --git a/src/vm/vm.cpp b/src/vm/vm.cpp
new file mode 100644 (file)
index 0000000..241500a
--- /dev/null
@@ -0,0 +1,2681 @@
+/* src/vm/vm.cpp - VM startup and shutdown functions
+
+   Copyright (C) 1996-2005, 2006, 2007, 2008
+   CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
+
+   This file is part of CACAO.
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2, or (at
+   your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA.
+
+*/
+
+
+#include "config.h"
+
+#include <stdint.h>
+
+#include <exception>
+
+#include <assert.h>
+#include <errno.h>
+#include <stdlib.h>
+
+#include "vm/types.h"
+
+#include "arch.h"
+#include "md-abi.h"
+
+#include "vm/jit/abi-asm.h"
+
+#include "mm/codememory.h"
+#include "mm/gc.hpp"
+#include "mm/memory.h"
+
+#include "native/jni.h"
+#include "native/llni.h"
+#include "native/localref.h"
+#include "native/native.h"
+
+#include "native/include/java_lang_Object.h"             /* required by j.l.C */
+#include "native/include/java_lang_String.h"             /* required by j.l.C */
+
+#if defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
+# include "native/include/java_nio_ByteBuffer.h"        /* required by j.l.CL */
+# include "native/include/java_lang_ClassLoader.h"       /* required by j.l.C */
+#endif
+
+#include "native/include/java_lang_Class.h"
+
+#include "native/vm/nativevm.h"
+
+#include "threads/lock-common.h"
+#include "threads/threadlist.h"
+#include "threads/thread.h"
+
+#include "toolbox/logging.h"
+
+#include "vm/array.h"
+
+#if defined(ENABLE_ASSERTION)
+#include "vm/assertion.h"
+#endif
+
+#include "vm/builtin.h"
+#include "vm/exceptions.h"
+#include "vm/finalizer.h"
+#include "vm/global.h"
+#include "vm/initialize.h"
+#include "vm/package.hpp"
+#include "vm/primitive.hpp"
+#include "vm/properties.h"
+#include "vm/signallocal.h"
+#include "vm/stringlocal.h"
+#include "vm/vm.hpp"
+
+#include "vm/jit/argument.h"
+#include "vm/jit/asmpart.h"
+#include "vm/jit/code.h"
+
+#if defined(ENABLE_DISASSEMBLER)
+# include "vm/jit/disass.h"
+#endif
+
+#include "vm/jit/jit.h"
+#include "vm/jit/methodtree.h"
+
+#if defined(ENABLE_PROFILING)
+# include "vm/jit/optimizing/profile.h"
+#endif
+
+#include "vm/jit/optimizing/recompile.h"
+
+#if defined(ENABLE_PYTHON)
+# include "vm/jit/python.h"
+#endif
+
+#include "vm/jit/trap.h"
+
+#include "vmcore/classcache.h"
+#include "vmcore/options.h"
+#include "vmcore/statistics.h"
+#include "vmcore/suck.h"
+#include "vmcore/system.h"
+
+#if defined(ENABLE_JVMTI)
+# include "native/jvmti/cacaodbg.h"
+#endif
+
+#if defined(ENABLE_VMLOG)
+#include <vmlog_cacao.h>
+#endif
+
+
+/**
+ * This is _the_ instance of the VM.
+ */
+VM* vm;
+
+
+/* global variables ***********************************************************/
+
+s4 vms = 0;                             /* number of VMs created              */
+
+static classinfo *mainclass = NULL;
+
+#if defined(ENABLE_INTRP)
+u1 *intrp_main_stack = NULL;
+#endif
+
+
+/* define heap sizes **********************************************************/
+
+#define HEAP_MAXSIZE      128 * 1024 * 1024 /* default 128MB                  */
+#define HEAP_STARTSIZE      2 * 1024 * 1024 /* default 2MB                    */
+#define STACK_SIZE               128 * 1024 /* default 64kB                   */
+
+
+/* define command line options ************************************************/
+
+enum {
+       OPT_FOO,
+
+       /* Java options */
+
+       OPT_JAR,
+
+       OPT_D32,
+       OPT_D64,
+
+       OPT_CLASSPATH,
+       OPT_D,
+
+       OPT_VERBOSE,
+
+       OPT_VERSION,
+       OPT_SHOWVERSION,
+       OPT_FULLVERSION,
+
+       OPT_HELP,
+       OPT_X,
+       OPT_XX,
+
+       OPT_EA,
+       OPT_DA,
+       OPT_EA_NOARG,
+       OPT_DA_NOARG,
+    
+
+       OPT_ESA,
+       OPT_DSA,
+
+       /* Java non-standard options */
+
+       OPT_JIT,
+       OPT_INTRP,
+
+       OPT_BOOTCLASSPATH,
+       OPT_BOOTCLASSPATH_A,
+       OPT_BOOTCLASSPATH_P,
+
+       OPT_BOOTCLASSPATH_C,
+
+#if defined(ENABLE_PROFILING)
+       OPT_PROF,
+       OPT_PROF_OPTION,
+#endif
+
+       OPT_MS,
+       OPT_MX,
+
+       /* CACAO options */
+
+       OPT_VERBOSE1,
+       OPT_NOIEEE,
+
+#if defined(ENABLE_STATISTICS)
+       OPT_TIME,
+       OPT_STAT,
+#endif
+
+       OPT_LOG,
+       OPT_CHECK,
+       OPT_LOAD,
+       OPT_SHOW,
+       OPT_DEBUGCOLOR,
+
+#if !defined(NDEBUG)
+       OPT_ALL,
+       OPT_METHOD,
+       OPT_SIGNATURE,
+#endif
+
+#if defined(ENABLE_VERIFIER)
+       OPT_NOVERIFY,
+#if defined(TYPECHECK_VERBOSE)
+       OPT_VERBOSETC,
+#endif
+#endif /* defined(ENABLE_VERIFIER) */
+
+       /* optimization options */
+
+#if defined(ENABLE_LOOP)
+       OPT_OLOOP,
+#endif
+       
+#if defined(ENABLE_IFCONV)
+       OPT_IFCONV,
+#endif
+
+#if defined(ENABLE_LSRA) || defined(ENABLE_SSA)
+       OPT_LSRA,
+#endif
+
+#if defined(ENABLE_INTRP)
+       /* interpreter options */
+
+       OPT_NO_DYNAMIC,
+       OPT_NO_REPLICATION,
+       OPT_NO_QUICKSUPER,
+       OPT_STATIC_SUPERS,
+       OPT_TRACE,
+#endif
+
+       OPT_SS,
+
+#ifdef ENABLE_JVMTI
+       OPT_DEBUG,
+       OPT_XRUNJDWP,
+       OPT_NOAGENT,
+       OPT_AGENTLIB,
+       OPT_AGENTPATH,
+#endif
+
+#if defined(ENABLE_DEBUG_FILTER)
+       OPT_FILTER_VERBOSECALL_INCLUDE,
+       OPT_FILTER_VERBOSECALL_EXCLUDE,
+       OPT_FILTER_SHOW_METHOD,
+#endif
+
+       DUMMY
+};
+
+
+opt_struct opts[] = {
+       { "foo",               false, OPT_FOO },
+
+       /* Java options */
+
+       { "jar",               false, OPT_JAR },
+
+       { "d32",               false, OPT_D32 },
+       { "d64",               false, OPT_D64 },
+       { "client",            false, OPT_IGNORE },
+       { "server",            false, OPT_IGNORE },
+       { "jvm",               false, OPT_IGNORE },
+       { "hotspot",           false, OPT_IGNORE },
+
+       { "classpath",         true,  OPT_CLASSPATH },
+       { "cp",                true,  OPT_CLASSPATH },
+       { "D",                 true,  OPT_D },
+       { "version",           false, OPT_VERSION },
+       { "showversion",       false, OPT_SHOWVERSION },
+       { "fullversion",       false, OPT_FULLVERSION },
+       { "help",              false, OPT_HELP },
+       { "?",                 false, OPT_HELP },
+       { "X",                 false, OPT_X },
+       { "XX:",               true,  OPT_XX },
+
+       { "ea:",               true,  OPT_EA },
+       { "da:",               true,  OPT_DA },
+       { "ea",                false, OPT_EA_NOARG },
+       { "da",                false, OPT_DA_NOARG },
+
+       { "enableassertions:",  true,  OPT_EA },
+       { "disableassertions:", true,  OPT_DA },
+       { "enableassertions",   false, OPT_EA_NOARG },
+       { "disableassertions",  false, OPT_DA_NOARG },
+
+       { "esa",                     false, OPT_ESA },
+       { "enablesystemassertions",  false, OPT_ESA },
+       { "dsa",                     false, OPT_DSA },
+       { "disablesystemassertions", false, OPT_DSA },
+
+       { "noasyncgc",         false, OPT_IGNORE },
+#if defined(ENABLE_VERIFIER)
+       { "noverify",          false, OPT_NOVERIFY },
+       { "Xverify:none",      false, OPT_NOVERIFY },
+#endif
+       { "v",                 false, OPT_VERBOSE1 },
+       { "verbose:",          true,  OPT_VERBOSE },
+
+#if defined(ENABLE_VERIFIER) && defined(TYPECHECK_VERBOSE)
+       { "verbosetc",         false, OPT_VERBOSETC },
+#endif
+#if defined(__ALPHA__)
+       { "noieee",            false, OPT_NOIEEE },
+#endif
+#if defined(ENABLE_STATISTICS)
+       { "time",              false, OPT_TIME },
+       { "stat",              false, OPT_STAT },
+#endif
+       { "log",               true,  OPT_LOG },
+       { "c",                 true,  OPT_CHECK },
+       { "l",                 false, OPT_LOAD },
+
+#if !defined(NDEBUG)
+       { "all",               false, OPT_ALL },
+       { "sig",               true,  OPT_SIGNATURE },
+#endif
+
+#if defined(ENABLE_LOOP)
+       { "oloop",             false, OPT_OLOOP },
+#endif
+#if defined(ENABLE_IFCONV)
+       { "ifconv",            false, OPT_IFCONV },
+#endif
+#if defined(ENABLE_LSRA)
+       { "lsra",              false, OPT_LSRA },
+#endif
+#if  defined(ENABLE_SSA)
+       { "lsra",              true, OPT_LSRA },
+#endif
+
+#if defined(ENABLE_INTRP)
+       /* interpreter options */
+
+       { "trace",             false, OPT_TRACE },
+       { "static-supers",     true,  OPT_STATIC_SUPERS },
+       { "no-dynamic",        false, OPT_NO_DYNAMIC },
+       { "no-replication",    false, OPT_NO_REPLICATION },
+       { "no-quicksuper",     false, OPT_NO_QUICKSUPER },
+#endif
+
+       /* JVMTI Agent Command Line Options */
+#ifdef ENABLE_JVMTI
+       { "agentlib:",         true,  OPT_AGENTLIB },
+       { "agentpath:",        true,  OPT_AGENTPATH },
+#endif
+
+       /* Java non-standard options */
+
+       { "Xjit",              false, OPT_JIT },
+       { "Xint",              false, OPT_INTRP },
+       { "Xbootclasspath:",   true,  OPT_BOOTCLASSPATH },
+       { "Xbootclasspath/a:", true,  OPT_BOOTCLASSPATH_A },
+       { "Xbootclasspath/p:", true,  OPT_BOOTCLASSPATH_P },
+       { "Xbootclasspath/c:", true,  OPT_BOOTCLASSPATH_C },
+
+#ifdef ENABLE_JVMTI
+       { "Xdebug",            false, OPT_DEBUG },
+       { "Xnoagent",          false, OPT_NOAGENT },
+       { "Xrunjdwp",          true,  OPT_XRUNJDWP },
+#endif 
+
+       { "Xms",               true,  OPT_MS },
+       { "ms",                true,  OPT_MS },
+       { "Xmx",               true,  OPT_MX },
+       { "mx",                true,  OPT_MX },
+       { "Xss",               true,  OPT_SS },
+       { "ss",                true,  OPT_SS },
+
+#if defined(ENABLE_PROFILING)
+       { "Xprof:",            true,  OPT_PROF_OPTION },
+       { "Xprof",             false, OPT_PROF },
+#endif
+
+       /* keep these at the end of the list */
+
+#if !defined(NDEBUG)
+       { "m",                 true,  OPT_METHOD },
+#endif
+
+       { "s",                 true,  OPT_SHOW },
+       { "debug-color",      false,  OPT_DEBUGCOLOR },
+
+#if defined(ENABLE_DEBUG_FILTER)
+       { "XXfi",              true,  OPT_FILTER_VERBOSECALL_INCLUDE },
+       { "XXfx",              true,  OPT_FILTER_VERBOSECALL_EXCLUDE },
+       { "XXfm",              true,  OPT_FILTER_SHOW_METHOD },
+#endif
+
+       { NULL,                false, 0 }
+};
+
+
+/* usage ***********************************************************************
+
+   Prints the correct usage syntax to stdout.
+
+*******************************************************************************/
+
+void usage(void)
+{
+       puts("Usage: cacao [-options] classname [arguments]");
+       puts("               (to run a class file)");
+       puts("   or  cacao [-options] -jar jarfile [arguments]");
+       puts("               (to run a standalone jar file)\n");
+
+       puts("where options include:");
+       puts("    -d32                     use 32-bit data model if available");
+       puts("    -d64                     use 64-bit data model if available");
+       puts("    -client                  compatibility (currently ignored)");
+       puts("    -server                  compatibility (currently ignored)");
+       puts("    -jvm                     compatibility (currently ignored)");
+       puts("    -hotspot                 compatibility (currently ignored)\n");
+
+       puts("    -cp <path>               specify a path to look for classes");
+       puts("    -classpath <path>        specify a path to look for classes");
+       puts("    -D<name>=<value>         add an entry to the property list");
+       puts("    -verbose[:class|gc|jni]  enable specific verbose output");
+       puts("    -version                 print product version and exit");
+       puts("    -fullversion             print jpackage-compatible product version and exit");
+       puts("    -showversion             print product version and continue");
+       puts("    -help, -?                print this help message");
+       puts("    -X                       print help on non-standard Java options");
+       puts("    -XX                      print help on debugging options");
+    puts("    -ea[:<packagename>...|:<classname>]");
+    puts("    -enableassertions[:<packagename>...|:<classname>]");
+       puts("                             enable assertions with specified granularity");
+       puts("    -da[:<packagename>...|:<classname>]");
+       puts("    -disableassertions[:<packagename>...|:<classname>]");
+       puts("                             disable assertions with specified granularity");
+       puts("    -esa | -enablesystemassertions");
+       puts("                             enable system assertions");
+       puts("    -dsa | -disablesystemassertions");
+       puts("                             disable system assertions");
+
+#ifdef ENABLE_JVMTI
+       puts("    -agentlib:<agent-lib-name>=<options>  library to load containg JVMTI agent");
+       puts ("                                         for jdwp help use: -agentlib:jdwp=help");
+       puts("    -agentpath:<path-to-agent>=<options>  path to library containg JVMTI agent");
+#endif
+
+       /* exit with error code */
+
+       exit(1);
+}   
+
+
+static void Xusage(void)
+{
+#if defined(ENABLE_JIT)
+       puts("    -Xjit                    JIT mode execution (default)");
+#endif
+#if defined(ENABLE_INTRP)
+       puts("    -Xint                    interpreter mode execution");
+#endif
+       puts("    -Xbootclasspath:<zip/jar files and directories separated by :>");
+    puts("                             value is set as bootstrap class path");
+       puts("    -Xbootclasspath/a:<zip/jar files and directories separated by :>");
+       puts("                             value is appended to the bootstrap class path");
+       puts("    -Xbootclasspath/p:<zip/jar files and directories separated by :>");
+       puts("                             value is prepended to the bootstrap class path");
+       puts("    -Xbootclasspath/c:<zip/jar files and directories separated by :>");
+       puts("                             value is used as Java core library, but the");
+       puts("                             hardcoded VM interface classes are prepended");
+       printf("    -Xms<size>               set the initial size of the heap (default: %dMB)\n", HEAP_STARTSIZE / 1024 / 1024);
+       printf("    -Xmx<size>               set the maximum size of the heap (default: %dMB)\n", HEAP_MAXSIZE / 1024 / 1024);
+       printf("    -Xss<size>               set the thread stack size (default: %dkB)\n", STACK_SIZE / 1024);
+
+#if defined(ENABLE_PROFILING)
+       puts("    -Xprof[:bb]              collect and print profiling data");
+#endif
+
+#if defined(ENABLE_JVMTI)
+    /* -Xdebug option depend on gnu classpath JDWP options. options: 
+        transport=dt_socket,address=<hostname:port>,server=(y|n),suspend(y|n) */
+       puts("    -Xdebug                  enable remote debugging\n");
+       puts("    -Xrunjdwp transport=[dt_socket|...],address=<hostname:port>,server=[y|n],suspend=[y|n]\n");
+       puts("                             enable remote debugging\n");
+#endif 
+
+       /* exit with error code */
+
+       exit(1);
+}   
+
+
+#if 0
+static void XXusage(void)
+{
+       puts("    -v                       write state-information");
+#if !defined(NDEBUG)
+       puts("    -verbose:jit             enable specific verbose output");
+       puts("    -debug-color             colored output for ANSI terms");
+#endif
+#ifdef TYPECHECK_VERBOSE
+       puts("    -verbosetc               write debug messages while typechecking");
+#endif
+#if defined(__ALPHA__)
+       puts("    -noieee                  don't use ieee compliant arithmetic");
+#endif
+#if defined(ENABLE_VERIFIER)
+       puts("    -noverify                don't verify classfiles");
+#endif
+#if defined(ENABLE_STATISTICS)
+       puts("    -time                    measure the runtime");
+       puts("    -stat                    detailed compiler statistics");
+#endif
+       puts("    -log logfile             specify a name for the logfile");
+       puts("    -c(heck)b(ounds)         don't check array bounds");
+       puts("            s(ync)           don't check for synchronization");
+#if defined(ENABLE_LOOP)
+       puts("    -oloop                   optimize array accesses in loops");
+#endif
+       puts("    -l                       don't start the class after loading");
+#if !defined(NDEBUG)
+       puts("    -all                     compile all methods, no execution");
+       puts("    -m                       compile only a specific method");
+       puts("    -sig                     specify signature for a specific method");
+#endif
+
+       puts("    -s...                    show...");
+       puts("      (c)onstants            the constant pool");
+       puts("      (m)ethods              class fields and methods");
+       puts("      (u)tf                  the utf - hash");
+       puts("      (i)ntermediate         intermediate representation");
+#if defined(ENABLE_DISASSEMBLER)
+       puts("      (a)ssembler            disassembled listing");
+       puts("      n(o)ps                 show NOPs in disassembler output");
+#endif
+       puts("      (d)atasegment          data segment listing");
+
+#if defined(ENABLE_IFCONV)
+       puts("    -ifconv                  use if-conversion");
+#endif
+#if defined(ENABLE_LSRA)
+       puts("    -lsra                    use linear scan register allocation");
+#endif
+#if defined(ENABLE_SSA)
+       puts("    -lsra:...                use linear scan register allocation (with SSA)");
+       puts("       (d)ead code elimination");
+       puts("       (c)opy propagation");
+#endif
+#if defined(ENABLE_DEBUG_FILTER)
+       puts("    -XXfi <regex>            begin of dynamic scope for verbosecall filter");
+       puts("    -XXfx <regex>            end of dynamic scope for verbosecall filter");
+       puts("    -XXfm <regex>            filter for show options");
+#endif
+       /* exit with error code */
+
+       exit(1);
+}
+#endif
+
+
+/* version *********************************************************************
+
+   Only prints cacao version information.
+
+*******************************************************************************/
+
+static void version(bool opt_exit)
+{
+       puts("java version \""JAVA_VERSION"\"");
+       puts("CACAO version "VERSION"\n");
+
+       puts("Copyright (C) 1996-2005, 2006, 2007, 2008");
+       puts("CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO");
+       puts("This is free software; see the source for copying conditions.  There is NO");
+       puts("warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.");
+
+       /* exit normally, if requested */
+
+       if (opt_exit)
+               exit(0);
+}
+
+
+/* fullversion *****************************************************************
+
+   Prints a Sun compatible version information (required e.g. by
+   jpackage, www.jpackage.org).
+
+*******************************************************************************/
+
+static void fullversion(void)
+{
+       puts("java full version \"cacao-"JAVA_VERSION"\"");
+
+       /* exit normally */
+
+       exit(0);
+}
+
+
+static void vm_printconfig(void)
+{
+       puts("Configure/Build options:\n");
+       puts("  ./configure: "VERSION_CONFIGURE_ARGS"");
+#if defined(__VERSION__)
+       puts("  CC         : "VERSION_CC" ("__VERSION__")");
+#else
+       puts("  CC         : "VERSION_CC"");
+#endif
+       puts("  CFLAGS     : "VERSION_CFLAGS"\n");
+
+       puts("Default variables:\n");
+       printf("  maximum heap size              : %d\n", HEAP_MAXSIZE);
+       printf("  initial heap size              : %d\n", HEAP_STARTSIZE);
+       printf("  stack size                     : %d\n", STACK_SIZE);
+
+#if defined(ENABLE_JRE_LAYOUT)
+       /* When we're building with JRE-layout, the default paths are the
+          same as the runtime paths. */
+#else
+# if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
+       puts("  gnu.classpath.boot.library.path: "JAVA_RUNTIME_LIBRARY_LIBDIR);
+       puts("  java.boot.class.path           : "CACAO_VM_ZIP":"JAVA_RUNTIME_LIBRARY_CLASSES"");
+# elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
+       puts("  sun.boot.library.path          : "JAVA_RUNTIME_LIBRARY_LIBDIR);
+       puts("  java.boot.class.path           : "JAVA_RUNTIME_LIBRARY_CLASSES);
+# endif
+#endif
+
+       puts("");
+
+       puts("Runtime variables:\n");
+       printf("  maximum heap size              : %d\n", opt_heapmaxsize);
+       printf("  initial heap size              : %d\n", opt_heapstartsize);
+       printf("  stack size                     : %d\n", opt_stacksize);
+
+#if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
+       printf("  gnu.classpath.boot.library.path: %s\n", properties_get("gnu.classpath.boot.library.path"));
+#elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
+       printf("  sun.boot.library.path          : %s\n", properties_get("sun.boot.library.path"));
+#endif
+
+       printf("  java.boot.class.path           : %s\n", properties_get("java.boot.class.path"));
+       printf("  java.class.path                : %s\n", properties_get("java.class.path"));
+}
+
+
+/* forward declarations *******************************************************/
+
+static char *vm_get_mainclass_from_jar(char *mainstring);
+#if !defined(NDEBUG)
+static void  vm_compile_all(void);
+static void  vm_compile_method(char* mainname);
+#endif
+
+
+/**
+ * Implementation for JNI_CreateJavaVM.  This function creates a VM
+ * object.
+ *
+ * @param p_vm
+ * @param p_env
+ * @param vm_args
+ *
+ * @return true on success, false otherwise.
+ */
+bool VM::create(JavaVM** p_vm, void** p_env, void* vm_args)
+{
+       JavaVMInitArgs* _vm_args;
+
+       // Get the arguments for the new JVM.
+       _vm_args = (JavaVMInitArgs *) vm_args;
+
+       // Instantiate a new VM.
+       try {
+               vm = new VM(_vm_args);
+       }
+       catch (std::exception e) {
+               // FIXME How can we delete the resources allocated?
+//             /* release allocated memory */
+//             FREE(env, _Jv_JNIEnv);
+//             FREE(vm, _Jv_JavaVM);
+
+               vm = NULL;
+
+               return false;
+       }
+
+       // Return the values.
+
+       *p_vm  = vm->get_javavm();
+       *p_env = vm->get_jnienv();
+
+       return true;
+}
+
+
+/**
+ * C wrapper for VM::create.
+ */
+extern "C" {
+       bool VM_create(JavaVM** p_vm, void** p_env, void* vm_args)
+       {
+               return VM::create(p_vm, p_env, vm_args);
+       }
+}
+
+
+/**
+ * VM constructor.
+ */
+VM::VM(JavaVMInitArgs* vm_args)
+{
+       // Very first thing to do: we are initializing.
+       _initializing = true;
+
+       // Make ourself globally visible.
+       // XXX Is this a good idea?
+       vm = this;
+
+       /* create and fill a JavaVM structure */
+
+       _javavm = new JavaVM();
+
+#if defined(ENABLE_JNI)
+       _javavm->functions = &_Jv_JNIInvokeInterface;
+#endif
+
+       /* get the VM and Env tables (must be set before vm_create) */
+       /* XXX JVMTI Agents needs a JavaVM  */
+
+       _jnienv = new JNIEnv();
+
+#if defined(ENABLE_JNI)
+       _jnienv->functions = &_Jv_JNINativeInterface;
+#endif
+
+       /* actually create the JVM */
+
+       int   len;
+       char *p;
+       char *boot_class_path;
+       char *class_path;
+       int   opt;
+       bool  opt_version;
+       bool  opt_exit;
+
+#if defined(ENABLE_JVMTI)
+       lt_dlhandle  handle;
+       char *libname, *agentarg;
+       bool jdwp,agentbypath;
+       jdwp = agentbypath = false;
+#endif
+
+#if defined(ENABLE_JNI)
+       /* Check the JNI version requested. */
+
+       if (!jni_version_check(vm_args->version))
+               throw std::exception();
+#endif
+
+       /* We only support 1 JVM instance. */
+
+       if (vms > 0)
+               throw std::exception();
+
+       /* Install the exit handler. */
+
+       if (atexit(vm_exit_handler))
+               vm_abort("atexit failed: %s\n", strerror(errno));
+
+       /* Set some options. */
+
+       opt_version       = false;
+       opt_exit          = false;
+
+       opt_noieee        = false;
+
+       opt_heapmaxsize   = HEAP_MAXSIZE;
+       opt_heapstartsize = HEAP_STARTSIZE;
+       opt_stacksize     = STACK_SIZE;
+
+       /* Initialize the properties list before command-line handling.
+          Otherwise -XX:+PrintConfig crashes. */
+
+       properties_init();
+
+       /* First of all, parse the -XX options. */
+
+#if defined(ENABLE_VMLOG)
+       vmlog_cacao_init_options();
+#endif
+
+       options_xx(vm_args);
+
+#if defined(ENABLE_VMLOG)
+       vmlog_cacao_init();
+#endif
+
+       /* We need to check if the actual size of a java.lang.Class object
+          is smaller or equal than the assumption made in
+          src/vmcore/class.h. */
+
+       if (sizeof(java_lang_Class) > sizeof(dummy_java_lang_Class))
+               vm_abort("vm_create: java_lang_Class structure is bigger than classinfo.object (%d > %d)", sizeof(java_lang_Class), sizeof(dummy_java_lang_Class));
+
+       /* set the VM starttime */
+
+       _starttime = builtin_currenttimemillis();
+
+#if defined(ENABLE_JVMTI)
+       /* initialize JVMTI related  **********************************************/
+       jvmti = false;
+#endif
+
+       /* Fill the properties before command-line handling. */
+
+       properties_set();
+
+       /* iterate over all passed options */
+
+       while ((opt = options_get(opts, vm_args)) != OPT_DONE) {
+               switch (opt) {
+               case OPT_FOO:
+                       opt_foo = true;
+                       break;
+
+               case OPT_IGNORE:
+                       break;
+                       
+               case OPT_JAR:
+                       opt_jar = true;
+                       break;
+
+               case OPT_D32:
+#if SIZEOF_VOID_P == 8
+                       puts("Running a 32-bit JVM is not supported on this platform.");
+                       exit(1);
+#endif
+                       break;
+
+               case OPT_D64:
+#if SIZEOF_VOID_P == 4
+                       puts("Running a 64-bit JVM is not supported on this platform.");
+                       exit(1);
+#endif
+                       break;
+
+               case OPT_CLASSPATH:
+                       /* Forget old classpath and set the argument as new
+                          classpath. */
+
+                       class_path = properties_get("java.class.path");
+
+                       p = MNEW(char, strlen(opt_arg) + strlen("0"));
+
+                       strcpy(p, opt_arg);
+
+#if defined(ENABLE_JAVASE)
+                       properties_add("java.class.path", p);
+#endif
+
+                       MFREE(class_path, char, strlen(class_path));
+                       break;
+
+               case OPT_D:
+                       for (unsigned int i = 0; i < strlen(opt_arg); i++) {
+                               if (opt_arg[i] == '=') {
+                                       opt_arg[i] = '\0';
+                                       properties_add(opt_arg, opt_arg + i + 1);
+                                       goto opt_d_done;
+                               }
+                       }
+
+                       /* if no '=' is given, just create an empty property */
+
+                       properties_add(opt_arg, "");
+
+               opt_d_done:
+                       break;
+
+               case OPT_BOOTCLASSPATH:
+                       /* Forget default bootclasspath and set the argument as
+                          new boot classpath. */
+
+                       boot_class_path = properties_get("sun.boot.class.path");
+
+                       p = MNEW(char, strlen(opt_arg) + strlen("0"));
+
+                       strcpy(p, opt_arg);
+
+                       properties_add("sun.boot.class.path", p);
+                       properties_add("java.boot.class.path", p);
+
+                       MFREE(boot_class_path, char, strlen(boot_class_path));
+                       break;
+
+               case OPT_BOOTCLASSPATH_A:
+                       /* Append to bootclasspath. */
+
+                       boot_class_path = properties_get("sun.boot.class.path");
+
+                       len = strlen(boot_class_path);
+
+                       // XXX (char*) quick hack
+                       p = (char*) MREALLOC(boot_class_path,
+                                                char,
+                                                len + strlen("0"),
+                                                len + strlen(":") +
+                                                strlen(opt_arg) + strlen("0"));
+
+                       strcat(p, ":");
+                       strcat(p, opt_arg);
+
+                       properties_add("sun.boot.class.path", p);
+                       properties_add("java.boot.class.path", p);
+                       break;
+
+               case OPT_BOOTCLASSPATH_P:
+                       /* Prepend to bootclasspath. */
+
+                       boot_class_path = properties_get("sun.boot.class.path");
+
+                       len = strlen(boot_class_path);
+
+                       p = MNEW(char, strlen(opt_arg) + strlen(":") + len + strlen("0"));
+
+                       strcpy(p, opt_arg);
+                       strcat(p, ":");
+                       strcat(p, boot_class_path);
+
+                       properties_add("sun.boot.class.path", p);
+                       properties_add("java.boot.class.path", p);
+
+                       MFREE(boot_class_path, char, len);
+                       break;
+
+               case OPT_BOOTCLASSPATH_C:
+                       /* Use as Java core library, but prepend VM interface
+                          classes. */
+
+                       boot_class_path = properties_get("sun.boot.class.path");
+
+                       len =
+                               strlen(CACAO_VM_ZIP) +
+                               strlen(":") +
+                               strlen(opt_arg) +
+                               strlen("0");
+
+                       p = MNEW(char, len);
+
+                       strcpy(p, CACAO_VM_ZIP);
+                       strcat(p, ":");
+                       strcat(p, opt_arg);
+
+                       properties_add("sun.boot.class.path", p);
+                       properties_add("java.boot.class.path", p);
+
+                       MFREE(boot_class_path, char, strlen(boot_class_path));
+                       break;
+
+#if defined(ENABLE_JVMTI)
+               case OPT_DEBUG:
+                       /* this option exists only for compatibility reasons */
+                       break;
+
+               case OPT_NOAGENT:
+                       /* I don't know yet what Xnoagent should do. This is only for 
+                          compatiblity with eclipse - motse */
+                       break;
+
+               case OPT_XRUNJDWP:
+                       agentbypath = true;
+                       jvmti       = true;
+                       jdwp        = true;
+
+                       len =
+                               strlen(CACAO_LIBDIR) +
+                               strlen("/libjdwp.so=") +
+                               strlen(opt_arg) +
+                               strlen("0");
+
+                       agentarg = MNEW(char, len);
+
+                       strcpy(agentarg, CACAO_LIBDIR);
+                       strcat(agentarg, "/libjdwp.so=");
+                       strcat(agentarg, &opt_arg[1]);
+                       break;
+
+               case OPT_AGENTPATH:
+                       agentbypath = true;
+
+               case OPT_AGENTLIB:
+                       jvmti = true;
+                       agentarg = opt_arg;
+                       break;
+#endif
+                       
+               case OPT_MX:
+               case OPT_MS:
+               case OPT_SS:
+                       {
+                               char c;
+                               int j;
+
+                               c = opt_arg[strlen(opt_arg) - 1];
+
+                               if ((c == 'k') || (c == 'K')) {
+                                       j = atoi(opt_arg) * 1024;
+
+                               } else if ((c == 'm') || (c == 'M')) {
+                                       j = atoi(opt_arg) * 1024 * 1024;
+
+                               } else
+                                       j = atoi(opt_arg);
+
+                               if (opt == OPT_MX)
+                                       opt_heapmaxsize = j;
+                               else if (opt == OPT_MS)
+                                       opt_heapstartsize = j;
+                               else
+                                       opt_stacksize = j;
+                       }
+                       break;
+
+               case OPT_VERBOSE1:
+                       opt_verbose = true;
+                       break;
+
+               case OPT_VERBOSE:
+                       if (strcmp("class", opt_arg) == 0) {
+                               opt_verboseclass = true;
+                       }
+                       else if (strcmp("gc", opt_arg) == 0) {
+                               opt_verbosegc = true;
+                       }
+                       else if (strcmp("jni", opt_arg) == 0) {
+                               opt_verbosejni = true;
+                       }
+#if !defined(NDEBUG)
+                       else if (strcmp("jit", opt_arg) == 0) {
+                               opt_verbose = true;
+                               loadverbose = true;
+                               initverbose = true;
+                               compileverbose = true;
+                       }
+#endif
+                       else {
+                               printf("Unknown -verbose option: %s\n", opt_arg);
+                               usage();
+                       }
+                       break;
+
+               case OPT_DEBUGCOLOR:
+                       opt_debugcolor = true;
+                       break;
+
+#if defined(ENABLE_VERIFIER) && defined(TYPECHECK_VERBOSE)
+               case OPT_VERBOSETC:
+                       opt_typecheckverbose = true;
+                       break;
+#endif
+                               
+               case OPT_VERSION:
+                       opt_version = true;
+                       opt_exit    = true;
+                       break;
+
+               case OPT_FULLVERSION:
+                       fullversion();
+                       break;
+
+               case OPT_SHOWVERSION:
+                       opt_version = true;
+                       break;
+
+               case OPT_NOIEEE:
+                       opt_noieee = true;
+                       break;
+
+#if defined(ENABLE_VERIFIER)
+               case OPT_NOVERIFY:
+                       opt_verify = false;
+                       break;
+#endif
+
+#if defined(ENABLE_STATISTICS)
+               case OPT_TIME:
+                       opt_getcompilingtime = true;
+                       opt_getloadingtime = true;
+                       break;
+                                       
+               case OPT_STAT:
+                       opt_stat = true;
+                       break;
+#endif
+                                       
+               case OPT_LOG:
+                       log_init(opt_arg);
+                       break;
+                       
+               case OPT_CHECK:
+                       for (unsigned int i = 0; i < strlen(opt_arg); i++) {
+                               switch (opt_arg[i]) {
+                               case 'b':
+                                       checkbounds = false;
+                                       break;
+                               case 's':
+                                       checksync = false;
+                                       break;
+                               default:
+                                       usage();
+                               }
+                       }
+                       break;
+                       
+               case OPT_LOAD:
+                       opt_run = false;
+                       makeinitializations = false;
+                       break;
+
+#if !defined(NDEBUG)
+               case OPT_ALL:
+                       compileall = true;
+                       opt_run = false;
+                       makeinitializations = false;
+                       break;
+
+               case OPT_METHOD:
+                       opt_run = false;
+                       opt_method = opt_arg;
+                       makeinitializations = false;
+                       break;
+
+               case OPT_SIGNATURE:
+                       opt_signature = opt_arg;
+                       break;
+#endif
+
+               case OPT_SHOW:       /* Display options */
+                       for (unsigned int i = 0; i < strlen(opt_arg); i++) {            
+                               switch (opt_arg[i]) {
+                               case 'c':
+                                       showconstantpool = true;
+                                       break;
+
+                               case 'u':
+                                       showutf = true;
+                                       break;
+
+                               case 'm':
+                                       showmethods = true;
+                                       break;
+
+                               case 'i':
+                                       opt_showintermediate = true;
+                                       compileverbose = true;
+                                       break;
+
+#if defined(ENABLE_DISASSEMBLER)
+                               case 'a':
+                                       opt_showdisassemble = true;
+                                       compileverbose = true;
+                                       break;
+
+                               case 'o':
+                                       opt_shownops = true;
+                                       break;
+#endif
+
+                               case 'd':
+                                       opt_showddatasegment = true;
+                                       break;
+
+                               default:
+                                       usage();
+                               }
+                       }
+                       break;
+                       
+#if defined(ENABLE_LOOP)
+               case OPT_OLOOP:
+                       opt_loops = true;
+                       break;
+#endif
+
+#if defined(ENABLE_IFCONV)
+               case OPT_IFCONV:
+                       opt_ifconv = true;
+                       break;
+#endif
+
+#if defined(ENABLE_LSRA)
+               case OPT_LSRA:
+                       opt_lsra = true;
+                       break;
+#endif
+#if  defined(ENABLE_SSA)
+               case OPT_LSRA:
+                       opt_lsra = true;
+                       for (i = 0; i < strlen(opt_arg); i++) {         
+                               switch (opt_arg[i]) {
+                               case 'c':
+                                       opt_ssa_cp = true;
+                                       break;
+
+                               case 'd':
+                                       opt_ssa_dce = true;
+                                       break;
+
+                               case ':':
+                                       break;
+
+                               default:
+                                       usage();
+                               }
+                       }
+                       break;
+#endif
+
+               case OPT_HELP:
+                       usage();
+                       break;
+
+               case OPT_X:
+                       Xusage();
+                       break;
+
+               case OPT_XX:
+                       /* Already parsed. */
+                       break;
+
+               case OPT_EA:
+#if defined(ENABLE_ASSERTION)
+                       assertion_ea_da(opt_arg, true);
+#endif
+                       break;
+
+               case OPT_DA:
+#if defined(ENABLE_ASSERTION)
+                       assertion_ea_da(opt_arg, false);
+#endif
+                       break;
+
+               case OPT_EA_NOARG:
+#if defined(ENABLE_ASSERTION)
+                       assertion_user_enabled = true;
+#endif
+                       break;
+
+               case OPT_DA_NOARG:
+#if defined(ENABLE_ASSERTION)
+                       assertion_user_enabled = false;
+#endif
+                       break;
+
+               case OPT_ESA:
+#if defined(ENABLE_ASSERTION)
+                       assertion_system_enabled = true;
+#endif
+                       break;
+
+               case OPT_DSA:
+#if defined(ENABLE_ASSERTION)
+                       assertion_system_enabled = false;
+#endif
+                       break;
+
+#if defined(ENABLE_PROFILING)
+               case OPT_PROF_OPTION:
+                       /* use <= to get the last \0 too */
+
+                       for (unsigned int i = 0, j = 0; i <= strlen(opt_arg); i++) {
+                               if (opt_arg[i] == ',')
+                                       opt_arg[i] = '\0';
+
+                               if (opt_arg[i] == '\0') {
+                                       if (strcmp("bb", opt_arg + j) == 0)
+                                               opt_prof_bb = true;
+
+                                       else {
+                                               printf("Unknown option: -Xprof:%s\n", opt_arg + j);
+                                               usage();
+                                       }
+
+                                       /* set k to next char */
+
+                                       j = i + 1;
+                               }
+                       }
+                       /* fall through */
+
+               case OPT_PROF:
+                       opt_prof = true;
+                       break;
+#endif
+
+               case OPT_JIT:
+#if defined(ENABLE_JIT)
+                       opt_jit = true;
+#else
+                       printf("-Xjit option not enabled.\n");
+                       exit(1);
+#endif
+                       break;
+
+               case OPT_INTRP:
+#if defined(ENABLE_INTRP)
+                       opt_intrp = true;
+#else
+                       printf("-Xint option not enabled.\n");
+                       exit(1);
+#endif
+                       break;
+
+#if defined(ENABLE_INTRP)
+               case OPT_STATIC_SUPERS:
+                       opt_static_supers = atoi(opt_arg);
+                       break;
+
+               case OPT_NO_DYNAMIC:
+                       opt_no_dynamic = true;
+                       break;
+
+               case OPT_NO_REPLICATION:
+                       opt_no_replication = true;
+                       break;
+
+               case OPT_NO_QUICKSUPER:
+                       opt_no_quicksuper = true;
+                       break;
+
+               case OPT_TRACE:
+                       vm_debug = true;
+                       break;
+#endif
+
+#if defined(ENABLE_DEBUG_FILTER)
+               case OPT_FILTER_VERBOSECALL_INCLUDE:
+                       opt_filter_verbosecall_include = opt_arg;
+                       break;
+
+               case OPT_FILTER_VERBOSECALL_EXCLUDE:
+                       opt_filter_verbosecall_exclude = opt_arg;
+                       break;
+
+               case OPT_FILTER_SHOW_METHOD:
+                       opt_filter_show_method = opt_arg;
+                       break;
+
+#endif
+               default:
+                       printf("Unknown option: %s\n",
+                                  vm_args->options[opt_index].optionString);
+                       usage();
+               }
+       }
+
+#if defined(ENABLE_JVMTI)
+       if (jvmti) {
+               jvmti_set_phase(JVMTI_PHASE_ONLOAD);
+               jvmti_agentload(agentarg, agentbypath, &handle, &libname);
+
+               if (jdwp)
+                       MFREE(agentarg, char, strlen(agentarg));
+
+               jvmti_set_phase(JVMTI_PHASE_PRIMORDIAL);
+       }
+#endif
+
+       /* initialize the garbage collector */
+
+       gc_init(opt_heapmaxsize, opt_heapstartsize);
+
+#if defined(ENABLE_THREADS)
+       /* BEFORE: threads_preinit */
+
+       threadlist_init();
+
+       /* AFTER: gc_init */
+
+       threads_preinit();
+       lock_init();
+#endif
+
+       /* install architecture dependent signal handlers */
+
+       if (!signal_init())
+               vm_abort("vm_create: signal_init failed");
+
+#if defined(ENABLE_INTRP)
+       /* Allocate main thread stack on the Java heap. */
+
+       if (opt_intrp) {
+               intrp_main_stack = GCMNEW(u1, opt_stacksize);
+               MSET(intrp_main_stack, 0, u1, opt_stacksize);
+       }
+#endif
+
+       /* AFTER: threads_preinit */
+
+       if (!string_init())
+               vm_abort("vm_create: string_init failed");
+
+       /* AFTER: threads_preinit */
+
+       utf8_init();
+
+       /* AFTER: thread_preinit */
+
+       if (!suck_init())
+               vm_abort("vm_create: suck_init failed");
+
+       suck_add_from_property("java.endorsed.dirs");
+
+       /* Now we have all options handled and we can print the version
+          information.
+
+          AFTER: suck_add_from_property("java.endorsed.dirs"); */
+
+       if (opt_version)
+               version(opt_exit);
+
+       /* AFTER: utf8_init */
+
+       boot_class_path = properties_get("sun.boot.class.path");
+       suck_add(boot_class_path);
+
+       /* initialize the classcache hashtable stuff: lock, hashtable
+          (must be done _after_ threads_preinit) */
+
+       if (!classcache_init())
+               vm_abort("vm_create: classcache_init failed");
+
+       /* Initialize the code memory management. */
+       /* AFTER: threads_preinit */
+
+       codememory_init();
+
+       /* initialize the finalizer stuff (must be done _after_
+          threads_preinit) */
+
+       if (!finalizer_init())
+               vm_abort("vm_create: finalizer_init failed");
+
+       /* Initialize the JIT compiler. */
+
+       jit_init();
+       code_init();
+       methodtree_init();
+
+#if defined(ENABLE_PYTHON)
+       pythonpass_init();
+#endif
+
+       /* BEFORE: loader_preinit */
+
+       Package::initialize();
+
+       /* AFTER: utf8_init, classcache_init */
+
+       loader_preinit();
+       linker_preinit();
+
+       /* AFTER: loader_preinit, linker_preinit */
+
+       primitive_init();
+
+       loader_init();
+       linker_init();
+
+       /* AFTER: loader_init, linker_init */
+
+       primitive_postinit();
+       method_init();
+
+#if defined(ENABLE_JIT)
+       trap_init();
+#endif
+
+       if (!builtin_init())
+               vm_abort("vm_create: builtin_init failed");
+
+       /* Initialize the native subsystem. */
+       /* BEFORE: threads_init */
+
+       if (!native_init())
+               vm_abort("vm_create: native_init failed");
+
+       /* Register the native methods implemented in the VM. */
+       /* BEFORE: threads_init */
+
+       nativevm_preinit();
+
+#if defined(ENABLE_JNI)
+       /* Initialize the JNI subsystem (must be done _before_
+          threads_init, as threads_init can call JNI methods
+          (e.g. NewGlobalRef). */
+
+       if (!jni_init())
+               vm_abort("vm_create: jni_init failed");
+#endif
+
+#if defined(ENABLE_JNI) || defined(ENABLE_HANDLES)
+       /* Initialize the local reference table for the main thread. */
+       /* BEFORE: threads_init */
+
+       if (!localref_table_init())
+               vm_abort("vm_create: localref_table_init failed");
+#endif
+
+       /* Iinitialize some important system classes. */
+       /* BEFORE: threads_init */
+
+       initialize_init();
+
+#if defined(ENABLE_THREADS)
+       threads_init();
+#endif
+
+       /* Initialize the native VM subsystem. */
+       /* AFTER: threads_init (at least for SUN's classes) */
+
+       nativevm_init();
+
+#if defined(ENABLE_PROFILING)
+       /* initialize profiling */
+
+       if (!profile_init())
+               vm_abort("vm_create: profile_init failed");
+#endif
+
+#if defined(ENABLE_THREADS)
+       /* initialize recompilation */
+
+       if (!recompile_init())
+               vm_abort("vm_create: recompile_init failed");
+
+       /* start the signal handler thread */
+
+#if defined(__LINUX__)
+       /* XXX Remove for exact-GC. */
+       if (threads_pthreads_implementation_nptl)
+#endif
+               if (!signal_start_thread())
+                       vm_abort("vm_create: signal_start_thread failed");
+
+       /* finally, start the finalizer thread */
+
+       if (!finalizer_start_thread())
+               vm_abort("vm_create: finalizer_start_thread failed");
+
+# if !defined(NDEBUG)
+       /* start the memory profiling thread */
+
+       if (opt_ProfileMemoryUsage || opt_ProfileGCMemoryUsage)
+               if (!memory_start_thread())
+                       vm_abort("vm_create: memory_start_thread failed");
+# endif
+
+       /* start the recompilation thread (must be done before the
+          profiling thread) */
+
+       if (!recompile_start_thread())
+               vm_abort("vm_create: recompile_start_thread failed");
+
+# if defined(ENABLE_PROFILING)
+       /* start the profile sampling thread */
+
+/*     if (opt_prof) */
+/*             if (!profile_start_thread()) */
+/*                     vm_abort("vm_create: profile_start_thread failed"); */
+# endif
+#endif
+
+#if defined(ENABLE_JVMTI)
+# if defined(ENABLE_GC_CACAO)
+       /* XXX this will not work with the new indirection cells for classloaders!!! */
+       assert(0);
+# endif
+       if (jvmti) {
+               /* add agent library to native library hashtable */
+               native_hashtable_library_add(utf_new_char(libname), class_java_lang_Object->classloader, handle);
+       }
+#endif
+
+       /* Increment the number of VMs. */
+
+       vms++;
+
+       // Initialization is done, VM is created.
+       _created      = true;
+       _initializing = false;
+       
+       /* Print the VM configuration after all stuff is set and the VM is
+          initialized. */
+
+       if (opt_PrintConfig)
+               vm_printconfig();
+}
+
+
+/* vm_run **********************************************************************
+
+   Runs the main-method of the passed class.
+
+*******************************************************************************/
+
+void vm_run(JavaVM *vm, JavaVMInitArgs *vm_args)
+{
+       char*                      option;
+       char*                      mainname;
+       char*                      p;
+       utf                       *mainutf;
+       classinfo                 *mainclass;
+       java_handle_t             *e;
+       methodinfo                *m;
+       java_handle_objectarray_t *oa; 
+       s4                         oalength;
+       utf                       *u;
+       java_handle_t             *s;
+       int                        status;
+
+       // Prevent compiler warnings.
+       oa = NULL;
+
+#if !defined(NDEBUG)
+       if (compileall) {
+               vm_compile_all();
+               return;
+       }
+#endif
+
+       /* Get the main class plus it's arguments. */
+
+       mainname = NULL;
+
+       if (opt_index < vm_args->nOptions) {
+               /* Get main-class argument. */
+
+               mainname = vm_args->options[opt_index].optionString;
+
+               /* If the main class argument is a jar file, put it into the
+                  classpath. */
+
+               if (opt_jar == true) {
+                       p = MNEW(char, strlen(mainname) + strlen("0"));
+
+                       strcpy(p, mainname);
+
+#if defined(ENABLE_JAVASE)
+                       properties_add("java.class.path", p);
+#endif
+               }
+               else {
+                       /* Replace dots with slashes in the class name. */
+
+                       for (unsigned int i = 0; i < strlen(mainname); i++)
+                               if (mainname[i] == '.')
+                                       mainname[i] = '/';
+               }
+
+               /* Build argument array.  Move index to first argument. */
+
+               opt_index++;
+
+               oalength = vm_args->nOptions - opt_index;
+
+               oa = builtin_anewarray(oalength, class_java_lang_String);
+
+               for (int i = 0; i < oalength; i++) {
+                       option = vm_args->options[opt_index + i].optionString;
+
+                       u = utf_new_char(option);
+                       s = javastring_new(u);
+
+                       array_objectarray_element_set(oa, i, s);
+               }
+       }
+
+       /* Do we have a main-class argument? */
+
+       if (mainname == NULL)
+               usage();
+
+#if !defined(NDEBUG)
+       if (opt_method != NULL) {
+               vm_compile_method(mainname);
+               return;
+       }
+#endif
+
+       /* set return value to OK */
+
+       status = 0;
+
+       if (opt_jar == true) {
+               /* open jar file with java.util.jar.JarFile */
+
+               mainname = vm_get_mainclass_from_jar(mainname);
+
+               if (mainname == NULL)
+                       vm_exit(1);
+       }
+
+       /* load the main class */
+
+       mainutf = utf_new_char(mainname);
+
+#if defined(ENABLE_JAVAME_CLDC1_1)
+       mainclass = load_class_bootstrap(mainutf);
+#else
+       mainclass = load_class_from_sysloader(mainutf);
+#endif
+
+       /* error loading class */
+
+       e = exceptions_get_and_clear_exception();
+
+       if ((e != NULL) || (mainclass == NULL)) {
+               exceptions_throw_noclassdeffounderror_cause(e);
+               exceptions_print_stacktrace(); 
+               vm_exit(1);
+       }
+
+       if (!link_class(mainclass)) {
+               exceptions_print_stacktrace();
+               vm_exit(1);
+       }
+                       
+       /* find the `main' method of the main class */
+
+       m = class_resolveclassmethod(mainclass,
+                                                                utf_new_char("main"), 
+                                                                utf_new_char("([Ljava/lang/String;)V"),
+                                                                class_java_lang_Object,
+                                                                false);
+
+       if (exceptions_get_exception()) {
+               exceptions_print_stacktrace();
+               vm_exit(1);
+       }
+
+       /* there is no main method or it isn't static */
+
+       if ((m == NULL) || !(m->flags & ACC_STATIC)) {
+               exceptions_clear_exception();
+               exceptions_throw_nosuchmethoderror(mainclass,
+                                                                                  utf_new_char("main"), 
+                                                                                  utf_new_char("([Ljava/lang/String;)V"));
+
+               exceptions_print_stacktrace();
+               vm_exit(1);
+       }
+
+#ifdef TYPEINFO_DEBUG_TEST
+       /* test the typeinfo system */
+       typeinfo_test();
+#endif
+
+#if defined(ENABLE_JVMTI)
+       jvmti_set_phase(JVMTI_PHASE_LIVE);
+#endif
+
+       /* set ThreadMXBean variables */
+
+//     _Jv_jvm->java_lang_management_ThreadMXBean_ThreadCount++;
+//     _Jv_jvm->java_lang_management_ThreadMXBean_TotalStartedThreadCount++;
+
+//     if (_Jv_jvm->java_lang_management_ThreadMXBean_ThreadCount >
+//             _Jv_jvm->java_lang_management_ThreadMXBean_PeakThreadCount)
+//             _Jv_jvm->java_lang_management_ThreadMXBean_PeakThreadCount =
+//                     _Jv_jvm->java_lang_management_ThreadMXBean_ThreadCount;
+#warning Move to C++
+
+       /* start the main thread */
+
+       (void) vm_call_method(m, NULL, oa);
+
+       /* exception occurred? */
+
+       if (exceptions_get_exception()) {
+               exceptions_print_stacktrace();
+               status = 1;
+       }
+
+#if defined(ENABLE_THREADS)
+    /* Detach the main thread so that it appears to have ended when
+          the application's main method exits. */
+
+       if (!thread_detach_current_thread())
+               vm_abort("vm_run: Could not detach main thread.");
+#endif
+
+       /* Destroy the JavaVM. */
+
+       (void) vm_destroy(vm);
+
+       /* And exit. */
+
+       vm_exit(status);
+}
+
+
+/* vm_destroy ******************************************************************
+
+   Unloads a Java VM and reclaims its resources.
+
+*******************************************************************************/
+
+int vm_destroy(JavaVM *vm)
+{
+#if defined(ENABLE_THREADS)
+       /* Create a a trivial new Java waiter thread called
+          "DestroyJavaVM". */
+
+       JavaVMAttachArgs args;
+
+       args.name  = "DestroyJavaVM";
+       args.group = NULL;
+
+       if (!thread_attach_current_thread(&args, false))
+               return 1;
+
+       /* Wait until we are the last non-daemon thread. */
+
+       threads_join_all_threads();
+#endif
+
+       /* VM is gone. */
+
+//     _created = false;
+#warning Move to C++
+
+       /* Everything is ok. */
+
+       return 0;
+}
+
+
+/* vm_exit *********************************************************************
+
+   Calls java.lang.System.exit(I)V to exit the JavaVM correctly.
+
+*******************************************************************************/
+
+void vm_exit(s4 status)
+{
+       methodinfo *m;
+
+       /* signal that we are exiting */
+
+//     _exiting = true;
+#warning Move to C++
+
+       assert(class_java_lang_System);
+       assert(class_java_lang_System->state & CLASS_LOADED);
+
+#if defined(ENABLE_JVMTI)
+       if (jvmti || (dbgcom!=NULL)) {
+               jvmti_set_phase(JVMTI_PHASE_DEAD);
+               if (jvmti) jvmti_agentunload();
+       }
+#endif
+
+       if (!link_class(class_java_lang_System)) {
+               exceptions_print_stacktrace();
+               exit(1);
+       }
+
+       /* call java.lang.System.exit(I)V */
+
+       m = class_resolveclassmethod(class_java_lang_System,
+                                                                utf_new_char("exit"),
+                                                                utf_int__void,
+                                                                class_java_lang_Object,
+                                                                true);
+       
+       if (m == NULL) {
+               exceptions_print_stacktrace();
+               exit(1);
+       }
+
+       /* call the exit function with passed exit status */
+
+       (void) vm_call_method(m, NULL, status);
+
+       /* If we had an exception, just ignore the exception and exit with
+          the proper code. */
+
+       vm_shutdown(status);
+}
+
+
+/* vm_shutdown *****************************************************************
+
+   Terminates the system immediately without freeing memory explicitly
+   (to be used only for abnormal termination).
+       
+*******************************************************************************/
+
+void vm_shutdown(s4 status)
+{
+       if (opt_verbose 
+#if defined(ENABLE_STATISTICS)
+               || opt_getcompilingtime || opt_stat
+#endif
+          ) 
+       {
+               log_text("CACAO terminated by shutdown");
+               dolog("Exit status: %d\n", (s4) status);
+
+       }
+
+#if defined(ENABLE_JVMTI)
+       /* terminate cacaodbgserver */
+       if (dbgcom!=NULL) {
+               mutex_lock(&dbgcomlock);
+               dbgcom->running=1;
+               mutex_unlock(&dbgcomlock);
+               jvmti_cacaodbgserver_quit();
+       }       
+#endif
+
+       exit(status);
+}
+
+
+/* vm_exit_handler *************************************************************
+
+   The exit_handler function is called upon program termination.
+
+   ATTENTION: Don't free system resources here! Some threads may still
+   be running as this is called from VMRuntime.exit(). The OS does the
+   cleanup for us.
+
+*******************************************************************************/
+
+void vm_exit_handler(void)
+{
+#if !defined(NDEBUG)
+       if (showmethods)
+               class_showmethods(mainclass);
+
+       if (showconstantpool)
+               class_showconstantpool(mainclass);
+
+       if (showutf)
+               utf_show();
+
+# if defined(ENABLE_PROFILING)
+       if (opt_prof)
+               profile_printstats();
+# endif
+#endif /* !defined(NDEBUG) */
+
+#if defined(ENABLE_RT_TIMING)
+       rt_timing_print_time_stats(stderr);
+#endif
+
+#if defined(ENABLE_CYCLES_STATS)
+       builtin_print_cycles_stats(stderr);
+       stacktrace_print_cycles_stats(stderr);
+#endif
+
+       if (opt_verbose 
+#if defined(ENABLE_STATISTICS)
+               || opt_getcompilingtime || opt_stat
+#endif
+          ) 
+       {
+               log_text("CACAO terminated");
+
+#if defined(ENABLE_STATISTICS)
+               if (opt_stat) {
+                       print_stats();
+#ifdef TYPECHECK_STATISTICS
+                       typecheck_print_statistics(get_logfile());
+#endif
+               }
+
+               if (opt_getcompilingtime)
+                       print_times();
+#endif /* defined(ENABLE_STATISTICS) */
+       }
+       /* vm_print_profile(stderr);*/
+}
+
+
+/* vm_abort ********************************************************************
+
+   Prints an error message and aborts the VM.
+
+   IN:
+       text ... error message to print
+
+*******************************************************************************/
+
+void vm_abort(const char *text, ...)
+{
+       va_list ap;
+
+       /* Print the log message. */
+
+       log_start();
+
+       va_start(ap, text);
+       log_vprint(text, ap);
+       va_end(ap);
+
+       log_finish();
+
+       /* Now abort the VM. */
+
+       system_abort();
+}
+
+
+/* vm_abort_errnum *************************************************************
+
+   Prints an error message, appends ":" plus the strerror-message of
+   errnum and aborts the VM.
+
+   IN:
+       errnum ... error number
+       text ..... error message to print
+
+*******************************************************************************/
+
+void vm_abort_errnum(int errnum, const char *text, ...)
+{
+       va_list ap;
+
+       /* Print the log message. */
+
+       log_start();
+
+       va_start(ap, text);
+       log_vprint(text, ap);
+       va_end(ap);
+
+       /* Print the strerror-message of errnum. */
+
+       log_print(": %s", system_strerror(errnum));
+
+       log_finish();
+
+       /* Now abort the VM. */
+
+       system_abort();
+}
+
+
+/* vm_abort_errno **************************************************************
+
+   Equal to vm_abort_errnum, but uses errno to get the error number.
+
+   IN:
+       text ... error message to print
+
+*******************************************************************************/
+
+void vm_abort_errno(const char *text, ...)
+{
+       va_list ap;
+
+       va_start(ap, text);
+       vm_abort_errnum(errno, text, ap);
+       va_end(ap);
+}
+
+
+/* vm_abort_disassemble ********************************************************
+
+   Prints an error message, disassemble the given code range (if
+   enabled) and aborts the VM.
+
+   IN:
+       pc.......PC to disassemble
+          count....number of instructions to disassemble
+
+*******************************************************************************/
+
+void vm_abort_disassemble(void *pc, int count, const char *text, ...)
+{
+       va_list ap;
+#if defined(ENABLE_DISASSEMBLER)
+       int     i;
+#endif
+
+       /* Print debug message. */
+
+       log_start();
+
+       va_start(ap, text);
+       log_vprint(text, ap);
+       va_end(ap);
+
+       log_finish();
+
+       /* Print the PC. */
+
+#if SIZEOF_VOID_P == 8
+       log_println("PC=0x%016lx", pc);
+#else
+       log_println("PC=0x%08x", pc);
+#endif
+
+#if defined(ENABLE_DISASSEMBLER)
+       log_println("machine instructions at PC:");
+
+       /* Disassemble the given number of instructions. */
+
+       for (i = 0; i < count; i++)
+               pc = disassinstr(pc);
+#endif
+
+       vm_abort("Aborting...");
+}
+
+
+/* vm_get_mainclass_from_jar ***************************************************
+
+   Gets the name of the main class from a JAR's manifest file.
+
+*******************************************************************************/
+
+static char *vm_get_mainclass_from_jar(char *mainname)
+{
+       classinfo     *c;
+       java_handle_t *o;
+       methodinfo    *m;
+       java_handle_t *s;
+
+       c = load_class_from_sysloader(utf_new_char("java/util/jar/JarFile"));
+
+       if (c == NULL) {
+               exceptions_print_stacktrace();
+               return NULL;
+       }
+
+       /* create JarFile object */
+
+       o = builtin_new(c);
+
+       if (o == NULL) {
+               exceptions_print_stacktrace();
+               return NULL;
+       }
+
+       m = class_resolveclassmethod(c,
+                                                                utf_init, 
+                                                                utf_java_lang_String__void,
+                                                                class_java_lang_Object,
+                                                                true);
+
+       if (m == NULL) {
+               exceptions_print_stacktrace();
+               return NULL;
+       }
+
+       s = javastring_new_from_ascii(mainname);
+
+       (void) vm_call_method(m, o, s);
+
+       if (exceptions_get_exception()) {
+               exceptions_print_stacktrace();
+               return NULL;
+       }
+
+       /* get manifest object */
+
+       m = class_resolveclassmethod(c,
+                                                                utf_new_char("getManifest"), 
+                                                                utf_new_char("()Ljava/util/jar/Manifest;"),
+                                                                class_java_lang_Object,
+                                                                true);
+
+       if (m == NULL) {
+               exceptions_print_stacktrace();
+               return NULL;
+       }
+
+       o = vm_call_method(m, o);
+
+       if (o == NULL) {
+               fprintf(stderr, "Could not get manifest from %s (invalid or corrupt jarfile?)\n", mainname);
+               return NULL;
+       }
+
+
+       /* get Main Attributes */
+
+       LLNI_class_get(o, c);
+
+       m = class_resolveclassmethod(c,
+                                                                utf_new_char("getMainAttributes"), 
+                                                                utf_new_char("()Ljava/util/jar/Attributes;"),
+                                                                class_java_lang_Object,
+                                                                true);
+
+       if (m == NULL) {
+               exceptions_print_stacktrace();
+               return NULL;
+       }
+
+       o = vm_call_method(m, o);
+
+       if (o == NULL) {
+               fprintf(stderr, "Could not get main attributes from %s (invalid or corrupt jarfile?)\n", mainname);
+               return NULL;
+       }
+
+
+       /* get property Main-Class */
+
+       LLNI_class_get(o, c);
+
+       m = class_resolveclassmethod(c,
+                                                                utf_new_char("getValue"), 
+                                                                utf_new_char("(Ljava/lang/String;)Ljava/lang/String;"),
+                                                                class_java_lang_Object,
+                                                                true);
+
+       if (m == NULL) {
+               exceptions_print_stacktrace();
+               return NULL;
+       }
+
+       s = javastring_new_from_ascii("Main-Class");
+
+       o = vm_call_method(m, o, s);
+
+       if (o == NULL) {
+               fprintf(stderr, "Failed to load Main-Class manifest attribute from\n");
+               fprintf(stderr, "%s\n", mainname);
+               return NULL;
+       }
+
+       return javastring_tochar(o);
+}
+
+
+/* vm_compile_all **************************************************************
+
+   Compile all methods found in the bootclasspath.
+
+*******************************************************************************/
+
+#if !defined(NDEBUG)
+static void vm_compile_all(void)
+{
+       classinfo              *c;
+       methodinfo             *m;
+       u4                      slot;
+       classcache_name_entry  *nmen;
+       classcache_class_entry *clsen;
+       s4                      i;
+
+       /* create all classes found in the bootclasspath */
+       /* XXX currently only works with zip/jar's */
+
+       loader_load_all_classes();
+
+       /* link all classes */
+
+       for (slot = 0; slot < hashtable_classcache.size; slot++) {
+               nmen = (classcache_name_entry *) hashtable_classcache.ptr[slot];
+
+               for (; nmen; nmen = nmen->hashlink) {
+                       /* iterate over all class entries */
+
+                       for (clsen = nmen->classes; clsen; clsen = clsen->next) {
+                               c = clsen->classobj;
+
+                               if (c == NULL)
+                                       continue;
+
+                               if (!(c->state & CLASS_LINKED)) {
+                                       if (!link_class(c)) {
+                                               fprintf(stderr, "Error linking: ");
+                                               utf_fprint_printable_ascii_classname(stderr, c->name);
+                                               fprintf(stderr, "\n");
+
+                                               /* print out exception and cause */
+
+                                               exceptions_print_current_exception();
+
+                                               /* goto next class */
+
+                                               continue;
+                                       }
+                               }
+
+                               /* compile all class methods */
+
+                               for (i = 0; i < c->methodscount; i++) {
+                                       m = &(c->methods[i]);
+
+                                       if (m->jcode != NULL) {
+                                               if (!jit_compile(m)) {
+                                                       fprintf(stderr, "Error compiling: ");
+                                                       utf_fprint_printable_ascii_classname(stderr, c->name);
+                                                       fprintf(stderr, ".");
+                                                       utf_fprint_printable_ascii(stderr, m->name);
+                                                       utf_fprint_printable_ascii(stderr, m->descriptor);
+                                                       fprintf(stderr, "\n");
+
+                                                       /* print out exception and cause */
+
+                                                       exceptions_print_current_exception();
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+}
+#endif /* !defined(NDEBUG) */
+
+
+/* vm_compile_method ***********************************************************
+
+   Compile a specific method.
+
+*******************************************************************************/
+
+#if !defined(NDEBUG)
+static void vm_compile_method(char* mainname)
+{
+       methodinfo *m;
+
+       /* create, load and link the main class */
+
+       mainclass = load_class_bootstrap(utf_new_char(mainname));
+
+       if (mainclass == NULL)
+               exceptions_print_stacktrace();
+
+       if (!link_class(mainclass))
+               exceptions_print_stacktrace();
+
+       if (opt_signature != NULL) {
+               m = class_resolveclassmethod(mainclass,
+                                                                        utf_new_char(opt_method),
+                                                                        utf_new_char(opt_signature),
+                                                                        mainclass,
+                                                                        false);
+       }
+       else {
+               m = class_resolveclassmethod(mainclass,
+                                                                        utf_new_char(opt_method),
+                                                                        NULL,
+                                                                        mainclass,
+                                                                        false);
+       }
+
+       if (m == NULL)
+               vm_abort("vm_compile_method: java.lang.NoSuchMethodException: %s.%s",
+                                opt_method, opt_signature ? opt_signature : "");
+               
+       jit_compile(m);
+}
+#endif /* !defined(NDEBUG) */
+
+
+/* vm_call_array ***************************************************************
+
+   Calls a Java method with a variable number of arguments, passed via
+   an argument array.
+
+   ATTENTION: This function has to be used outside the nativeworld.
+
+*******************************************************************************/
+
+#define VM_CALL_ARRAY(name, type)                                 \
+static type vm_call##name##_array(methodinfo *m, uint64_t *array) \
+{                                                                 \
+       methoddesc *md;                                               \
+       void       *pv;                                               \
+       type        value;                                            \
+                                                                  \
+       assert(m->code != NULL);                                      \
+                                                                  \
+       md = m->parseddesc;                                           \
+       pv = m->code->entrypoint;                                     \
+                                                                  \
+       STATISTICS(count_calls_native_to_java++);                     \
+                                                                  \
+       value = asm_vm_call_method##name(pv, array, md->memuse);      \
+                                                                  \
+       return value;                                                 \
+}
+
+static java_handle_t *vm_call_array(methodinfo *m, uint64_t *array)
+{
+       methoddesc    *md;
+       void          *pv;
+       java_object_t *o;
+
+       assert(m->code != NULL);
+
+       md = m->parseddesc;
+       pv = m->code->entrypoint;
+
+       STATISTICS(count_calls_native_to_java++);
+
+       o = asm_vm_call_method(pv, array, md->memuse);
+
+       if (md->returntype.type == TYPE_VOID)
+               o = NULL;
+
+       return LLNI_WRAP(o);
+}
+
+VM_CALL_ARRAY(_int,    int32_t)
+VM_CALL_ARRAY(_long,   int64_t)
+VM_CALL_ARRAY(_float,  float)
+VM_CALL_ARRAY(_double, double)
+
+
+/* vm_call_method **************************************************************
+
+   Calls a Java method with a variable number of arguments.
+
+*******************************************************************************/
+
+#define VM_CALL_METHOD(name, type)                                  \
+type vm_call_method##name(methodinfo *m, java_handle_t *o, ...)     \
+{                                                                   \
+       va_list ap;                                                     \
+       type    value;                                                  \
+                                                                    \
+       va_start(ap, o);                                                \
+       value = vm_call_method##name##_valist(m, o, ap);                \
+       va_end(ap);                                                     \
+                                                                    \
+       return value;                                                   \
+}
+
+VM_CALL_METHOD(,        java_handle_t *)
+VM_CALL_METHOD(_int,    int32_t)
+VM_CALL_METHOD(_long,   int64_t)
+VM_CALL_METHOD(_float,  float)
+VM_CALL_METHOD(_double, double)
+
+
+/* vm_call_method_valist *******************************************************
+
+   Calls a Java method with a variable number of arguments, passed via
+   a va_list.
+
+*******************************************************************************/
+
+#define VM_CALL_METHOD_VALIST(name, type)                               \
+type vm_call_method##name##_valist(methodinfo *m, java_handle_t *o,     \
+                                                                  va_list ap)                          \
+{                                                                       \
+       uint64_t *array;                                                    \
+       type      value;                                                    \
+       int32_t   dumpmarker;                                               \
+                                                                        \
+       if (m->code == NULL)                                                \
+               if (!jit_compile(m))                                            \
+                       return 0;                                                   \
+                                                                        \
+       THREAD_NATIVEWORLD_EXIT;                                            \
+       DMARKER;                                                            \
+                                                                        \
+       array = argument_vmarray_from_valist(m, o, ap);                     \
+       value = vm_call##name##_array(m, array);                            \
+                                                                        \
+       DRELEASE;                                                           \
+       THREAD_NATIVEWORLD_ENTER;                                           \
+                                                                        \
+       return value;                                                       \
+}
+
+VM_CALL_METHOD_VALIST(,        java_handle_t *)
+VM_CALL_METHOD_VALIST(_int,    int32_t)
+VM_CALL_METHOD_VALIST(_long,   int64_t)
+VM_CALL_METHOD_VALIST(_float,  float)
+VM_CALL_METHOD_VALIST(_double, double)
+
+
+/* vm_call_method_jvalue *******************************************************
+
+   Calls a Java method with a variable number of arguments, passed via
+   a jvalue array.
+
+*******************************************************************************/
+
+#define VM_CALL_METHOD_JVALUE(name, type)                               \
+type vm_call_method##name##_jvalue(methodinfo *m, java_handle_t *o,     \
+                                                          const jvalue *args)                  \
+{                                                                       \
+       uint64_t *array;                                                    \
+       type      value;                                                    \
+       int32_t   dumpmarker;                                               \
+                                                                        \
+       if (m->code == NULL)                                                \
+               if (!jit_compile(m))                                            \
+                       return 0;                                                   \
+                                                                        \
+       THREAD_NATIVEWORLD_EXIT;                                            \
+       DMARKER;                                                            \
+                                                                        \
+       array = argument_vmarray_from_jvalue(m, o, args);                   \
+       value = vm_call##name##_array(m, array);                            \
+                                                                        \
+       DRELEASE;                                                           \
+       THREAD_NATIVEWORLD_ENTER;                                           \
+                                                                        \
+       return value;                                                       \
+}
+
+VM_CALL_METHOD_JVALUE(,        java_handle_t *)
+VM_CALL_METHOD_JVALUE(_int,    int32_t)
+VM_CALL_METHOD_JVALUE(_long,   int64_t)
+VM_CALL_METHOD_JVALUE(_float,  float)
+VM_CALL_METHOD_JVALUE(_double, double)
+
+
+/* vm_call_method_objectarray **************************************************
+
+   Calls a Java method with a variable number if arguments, passed via
+   an objectarray of boxed values. Returns a boxed value.
+
+*******************************************************************************/
+
+java_handle_t *vm_call_method_objectarray(methodinfo *m, java_handle_t *o,
+                                                                                 java_handle_objectarray_t *params)
+{
+       uint64_t      *array;
+       java_handle_t *xptr;
+       java_handle_t *ro;
+       imm_union      value;
+       int32_t        dumpmarker;
+
+       /* Prevent compiler warnings. */
+
+       ro = NULL;
+
+       /* compile methods which are not yet compiled */
+
+       if (m->code == NULL)
+               if (!jit_compile(m))
+                       return NULL;
+
+       /* leave the nativeworld */
+
+       THREAD_NATIVEWORLD_EXIT;
+
+       /* mark start of dump memory area */
+
+       DMARKER;
+
+       /* Fill the argument array from a object-array. */
+
+       array = argument_vmarray_from_objectarray(m, o, params);
+
+       if (array == NULL) {
+               /* release dump area */
+
+               DRELEASE;
+
+               /* enter the nativeworld again */
+
+               THREAD_NATIVEWORLD_ENTER;
+
+               exceptions_throw_illegalargumentexception();
+
+               return NULL;
+       }
+
+       switch (m->parseddesc->returntype.decltype) {
+       case PRIMITIVETYPE_VOID:
+               value.a = vm_call_array(m, array);
+               break;
+
+       case PRIMITIVETYPE_BOOLEAN:
+       case PRIMITIVETYPE_BYTE:
+       case PRIMITIVETYPE_CHAR:
+       case PRIMITIVETYPE_SHORT:
+       case PRIMITIVETYPE_INT:
+               value.i = vm_call_int_array(m, array);
+               break;
+
+       case PRIMITIVETYPE_LONG:
+               value.l = vm_call_long_array(m, array);
+               break;
+
+       case PRIMITIVETYPE_FLOAT:
+               value.f = vm_call_float_array(m, array);
+               break;
+
+       case PRIMITIVETYPE_DOUBLE:
+               value.d = vm_call_double_array(m, array);
+               break;
+
+       case TYPE_ADR:
+               ro = vm_call_array(m, array);
+               break;
+
+       default:
+               vm_abort("vm_call_method_objectarray: invalid return type %d", m->parseddesc->returntype.decltype);
+       }
+
+       /* release dump area */
+
+       DRELEASE;
+
+       /* enter the nativeworld again */
+
+       THREAD_NATIVEWORLD_ENTER;
+
+       /* box the return value if necesarry */
+
+       if (m->parseddesc->returntype.decltype != TYPE_ADR)
+               ro = Primitive::box(m->parseddesc->returntype.decltype, value);
+
+       /* check for an exception */
+
+       xptr = exceptions_get_exception();
+
+       if (xptr != NULL) {
+               /* clear exception pointer, we are calling JIT code again */
+
+               exceptions_clear_exception();
+
+               exceptions_throw_invocationtargetexception(xptr);
+       }
+
+       return ro;
+}
+
+
+/* Legacy C interface *********************************************************/
+
+extern "C" {
+
+JavaVM* VM_get_javavm()      { return vm->get_javavm(); }
+JNIEnv* VM_get_jnienv()      { return vm->get_jnienv(); }
+bool    VM_is_initializing() { return vm->is_initializing(); }
+bool    VM_is_created()      { return vm->is_created(); }
+int64_t VM_get_starttime()   { return vm->get_starttime(); }
+
+}
+
+
+/*
+ * These are local overrides for various environment variables in Emacs.
+ * Please do not remove this and leave it at the end of the file, where
+ * Emacs will automagically detect them.
+ * ---------------------------------------------------------------------
+ * Local variables:
+ * mode: c++
+ * indent-tabs-mode: t
+ * c-basic-offset: 4
+ * tab-width: 4
+ * End:
+ * vim:noexpandtab:sw=4:ts=4:
+ */
diff --git a/src/vm/vm.h b/src/vm/vm.h
deleted file mode 100644 (file)
index a669d89..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-/* src/vm/vm.h - basic JVM functions
-
-   Copyright (C) 1996-2005, 2006, 2007, 2008
-   CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
-
-   This file is part of CACAO.
-
-   This program is free software; you can redistribute it and/or
-   modify it under the terms of the GNU General Public License as
-   published by the Free Software Foundation; either version 2, or (at
-   your option) any later version.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301, USA.
-
-*/
-
-
-#ifndef _VM_H
-#define _VM_H
-
-#include "config.h"
-
-#include <stdarg.h>
-#include <stdint.h>
-
-#include "vm/types.h"
-
-#include "native/jni.h"
-
-#include "vm/global.h"
-
-#include "vmcore/class.h"
-#include "vmcore/method.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* export global variables ****************************************************/
-
-extern _Jv_JavaVM *_Jv_jvm;
-extern _Jv_JNIEnv *_Jv_env;
-
-extern bool vm_initializing;
-extern bool vm_created;
-extern bool vm_exiting;
-
-#if defined(ENABLE_INTRP)
-extern u1 *intrp_main_stack;
-#endif
-
-
-/* function prototypes ********************************************************/
-
-void usage(void);
-
-bool vm_createjvm(JavaVM **p_vm, void **p_env, void *vm_args);
-bool vm_create(JavaVMInitArgs *vm_args);
-void vm_run(JavaVM *vm, JavaVMInitArgs *vm_args);
-s4   vm_destroy(JavaVM *vm);
-void vm_exit(s4 status);
-void vm_shutdown(s4 status);
-
-void vm_exit_handler(void);
-
-void vm_abort(const char *text, ...);
-void vm_abort_errnum(int errnum, const char *text, ...);
-void vm_abort_errno(const char *text, ...);
-void vm_abort_disassemble(void *pc, int count, const char *text, ...);
-
-/* Java method calling functions */
-
-java_handle_t *vm_call_method(methodinfo *m, java_handle_t *o, ...);
-java_handle_t *vm_call_method_valist(methodinfo *m, java_handle_t *o,
-                                                                                va_list ap);
-java_handle_t *vm_call_method_jvalue(methodinfo *m, java_handle_t *o,
-                                                                                const jvalue *args);
-
-int32_t vm_call_method_int(methodinfo *m, java_handle_t *o, ...);
-int32_t vm_call_method_int_valist(methodinfo *m, java_handle_t *o, va_list ap);
-int32_t vm_call_method_int_jvalue(methodinfo *m, java_handle_t *o, const jvalue *args);
-
-int64_t vm_call_method_long(methodinfo *m, java_handle_t *o, ...);
-int64_t vm_call_method_long_valist(methodinfo *m, java_handle_t *o, va_list ap);
-int64_t vm_call_method_long_jvalue(methodinfo *m, java_handle_t *o, const jvalue *args);
-
-float   vm_call_method_float(methodinfo *m, java_handle_t *o, ...);
-float   vm_call_method_float_valist(methodinfo *m, java_handle_t *o, va_list ap);
-float   vm_call_method_float_jvalue(methodinfo *m, java_handle_t *o, const jvalue *args);
-
-double  vm_call_method_double(methodinfo *m, java_handle_t *o, ...);
-double  vm_call_method_double_valist(methodinfo *m, java_handle_t *o, va_list ap);
-double  vm_call_method_double_jvalue(methodinfo *m, java_handle_t *o, const jvalue *args);
-
-java_handle_t *vm_call_method_objectarray(methodinfo *m, java_handle_t *o, java_handle_objectarray_t *params);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _VM_H */
-
-
-/*
- * These are local overrides for various environment variables in Emacs.
- * Please do not remove this and leave it at the end of the file, where
- * Emacs will automagically detect them.
- * ---------------------------------------------------------------------
- * Local variables:
- * mode: c
- * indent-tabs-mode: t
- * c-basic-offset: 4
- * tab-width: 4
- * End:
- * vim:noexpandtab:sw=4:ts=4:
- */
diff --git a/src/vm/vm.hpp b/src/vm/vm.hpp
new file mode 100644 (file)
index 0000000..bf944a0
--- /dev/null
@@ -0,0 +1,179 @@
+/* src/vm/vm.hpp - basic JVM functions
+
+   Copyright (C) 1996-2005, 2006, 2007, 2008
+   CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
+
+   This file is part of CACAO.
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2, or (at
+   your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA.
+
+*/
+
+
+#ifndef _VM_HPP
+#define _VM_HPP
+
+#include "config.h"
+
+#include <stdarg.h>
+#include <stdint.h>
+
+#include "vm/types.h"
+
+#include "native/jni.h"
+
+#include "vm/global.h"
+
+#include "vmcore/class.h"
+#include "vmcore/method.h"
+
+#ifdef __cplusplus
+
+/**
+ * Represent an instance of a VM.
+ */
+class VM {
+private:
+       // JNI variables.
+       JavaVM* _javavm;
+       JNIEnv* _jnienv;
+
+       // VM variables.
+       bool    _initializing;
+       bool    _created;
+       bool    _exiting;
+       int64_t _starttime;
+
+public:
+       // Constructor, Destructor.
+       VM(JavaVMInitArgs*);
+       ~VM();
+
+       // Static methods.
+       static bool create(JavaVM** p_vm, void** p_env, void* vm_args);
+
+       // Getters for private members.
+       JavaVM* get_javavm()      { return _javavm; }
+       JNIEnv* get_jnienv()      { return _jnienv; }
+       bool    is_initializing() { return _initializing; }
+       bool    is_created()      { return _created; }
+       bool    is_exiting()      { return _exiting; }
+       int64_t get_starttime()   { return _starttime; }
+};
+
+
+/**
+ * This is _the_ instance of the VM.
+ */
+extern VM* vm;
+
+#else
+
+JavaVM* VM_get_javavm();
+JNIEnv* VM_get_jnienv();
+bool    VM_is_initializing();
+bool    VM_is_created();
+int64_t VM_get_starttime();
+
+#endif
+
+/* These C methods are the exported interface. ********************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+bool VM_create(JavaVM** p_vm, void** p_env, void* vm_args);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+/* export global variables ****************************************************/
+
+#if defined(ENABLE_INTRP)
+extern u1 *intrp_main_stack;
+#endif
+
+
+/* function prototypes ********************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void usage(void);
+
+bool vm_create(JavaVMInitArgs *vm_args);
+void vm_run(JavaVM *vm, JavaVMInitArgs *vm_args);
+s4   vm_destroy(JavaVM *vm);
+void vm_exit(s4 status);
+void vm_shutdown(s4 status);
+
+void vm_exit_handler(void);
+
+void vm_abort(const char *text, ...);
+void vm_abort_errnum(int errnum, const char *text, ...);
+void vm_abort_errno(const char *text, ...);
+void vm_abort_disassemble(void *pc, int count, const char *text, ...);
+
+/* Java method calling functions */
+
+java_handle_t *vm_call_method(methodinfo *m, java_handle_t *o, ...);
+java_handle_t *vm_call_method_valist(methodinfo *m, java_handle_t *o,
+                                                                                va_list ap);
+java_handle_t *vm_call_method_jvalue(methodinfo *m, java_handle_t *o,
+                                                                                const jvalue *args);
+
+int32_t vm_call_method_int(methodinfo *m, java_handle_t *o, ...);
+int32_t vm_call_method_int_valist(methodinfo *m, java_handle_t *o, va_list ap);
+int32_t vm_call_method_int_jvalue(methodinfo *m, java_handle_t *o, const jvalue *args);
+
+int64_t vm_call_method_long(methodinfo *m, java_handle_t *o, ...);
+int64_t vm_call_method_long_valist(methodinfo *m, java_handle_t *o, va_list ap);
+int64_t vm_call_method_long_jvalue(methodinfo *m, java_handle_t *o, const jvalue *args);
+
+float   vm_call_method_float(methodinfo *m, java_handle_t *o, ...);
+float   vm_call_method_float_valist(methodinfo *m, java_handle_t *o, va_list ap);
+float   vm_call_method_float_jvalue(methodinfo *m, java_handle_t *o, const jvalue *args);
+
+double  vm_call_method_double(methodinfo *m, java_handle_t *o, ...);
+double  vm_call_method_double_valist(methodinfo *m, java_handle_t *o, va_list ap);
+double  vm_call_method_double_jvalue(methodinfo *m, java_handle_t *o, const jvalue *args);
+
+java_handle_t *vm_call_method_objectarray(methodinfo *m, java_handle_t *o, java_handle_objectarray_t *params);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _VM_HPP
+
+
+/*
+ * These are local overrides for various environment variables in Emacs.
+ * Please do not remove this and leave it at the end of the file, where
+ * Emacs will automagically detect them.
+ * ---------------------------------------------------------------------
+ * Local variables:
+ * mode: c++
+ * indent-tabs-mode: t
+ * c-basic-offset: 4
+ * tab-width: 4
+ * End:
+ * vim:noexpandtab:sw=4:ts=4:
+ */
index 01574f48921c210f1702b9f396113ee5e3ecae1a..13f7feef158792c04886633f78ac21c960648f4f 100644 (file)
@@ -36,7 +36,7 @@
 #include "vm/exceptions.h"
 #include "vm/jit_interface.h"
 #include "vm/primitive.hpp"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vmcore/descriptor.h"
 #include "vmcore/options.h"
index e1ee69c93cb5c164463f20e5d839a82377d7e1d3..677c98ccb5fa1e39c83fa8e3646359f71f1dc52c 100644 (file)
@@ -41,7 +41,7 @@
 #include "vm/global.h"
 #include "vm/primitive.hpp"
 #include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vmcore/annotation.h"
 #include "vmcore/class.h"
index 37e8daeb7d362077aa0b5ea88a392d0b2dea373e..625d81cadb74afe000f59f6ae99c1ac594ece284 100644 (file)
@@ -43,7 +43,7 @@
 #include "vm/exceptions.h"
 #include "vm/primitive.hpp"
 #include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit_interface.h"
 
index eaf99ca3df9eaf4eeb3d280a530a8a582154110f..a7935cdd99f3b26c76e0bc3657a69124ab57191d 100644 (file)
@@ -47,7 +47,7 @@
 #include "vm/primitive.hpp"
 #include "vm/resolve.h"
 #include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit_interface.h"
 
@@ -119,7 +119,7 @@ void loader_preinit(void)
 
        /* Load the most basic classes. */
 
-       assert(vm_initializing == true);
+       assert(VM_is_initializing() == true);
 
        class_java_lang_Object     = load_class_bootstrap(utf_java_lang_Object);
 
@@ -145,7 +145,7 @@ void loader_init(void)
 
        /* Load primitive-type wrapping classes. */
 
-       assert(vm_initializing == true);
+       assert(VM_is_initializing() == true);
 
 #if defined(ENABLE_JAVASE)
        class_java_lang_Void       = load_class_bootstrap(utf_java_lang_Void);
index d1fb1b29611c7f325089fd54a22f5add8c516199..61cfe429b323b33a00e123848278cb4e1b6853fb 100644 (file)
@@ -42,7 +42,7 @@
 #include "vm/exceptions.h"
 #include "vm/global.h"
 #include "vm/resolve.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/code.h"
 #include "vm/jit/methodheader.h"
index e9ae46fbcd763f25f93db60501fea452229bb28d..579b0394a66eea8dcaaae05b0d95207ddc578c3d 100644 (file)
@@ -34,7 +34,7 @@
 
 #include "native/jni.h"
 
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vmcore/options.h"
 #include "vmcore/system.h"
index 3e9baad4701dfab0d7a833a92448d1ecee42b79b..5f4cac830832c9759e76da40c42bca35e9884639 100644 (file)
@@ -30,7 +30,7 @@
 
 #include "vm/global.h"
 #include "vm/primitive.hpp"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vmcore/class.h"
 #include "vmcore/options.h"
index 933ceab0074736a8990945aaebec65e7aaf63436..da16fbe034846f06bdd1100c7cf1b108d3f6762e 100644 (file)
@@ -42,7 +42,7 @@
 
 #include "vm/exceptions.h"
 #include "vm/properties.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vmcore/loader.h"
 #include "vmcore/options.h"
index be474a9ef92a2c2632a9dcb77f965afa95b5c1a8..590417877b3ad68d4a6de3eeec7f4c7147b169f9 100644 (file)
@@ -57,7 +57,7 @@
 /* this should work on BSD */
 /* #include <sys/sysctl.h> */
 
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 
 /* system_mmap_anonymous *******************************************************
index c3644e22cc543e3ba6aa5e5ef0f05606437efc9a..5d1b353685d3a812d0b73159bd00164f87ee226b 100644 (file)
@@ -39,7 +39,7 @@
 #include "mm/memory.h"
 
 #include "vm/global.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vmcore/suck.h"
 #include "vmcore/utf8.h"