* src/vm/vm.c (HEAP_MAXSIZE): Changed to 128MB.
[cacao.git] / src / vm / vm.c
index 5447ac65531cfd673b7df36329fbe5f1189bcbea..748890fe6ef736cadbd47a132be8940317f5b5cd 100644 (file)
@@ -1,4 +1,4 @@
-/* src/vm/finalizer.c - finalizer linked list and thread
+/* src/vm/vm.c - VM startup and shutdown functions
 
    Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
    C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
@@ -26,9 +26,9 @@
 
    Authors: Christian Thalinger
 
-   Changes:
+   Changes: Martin Platter
 
-   $Id: finalizer.c 4357 2006-01-22 23:33:38Z twisti $
+   $Id: vm.c 4357 2006-01-22 23:33:38Z twisti $
 
 */
 
 #include "native/jni.h"
 #include "native/native.h"
 
-#if defined(USE_THREADS)
-# if defined(NATIVE_THREADS)
-#  include "threads/native/threads.h"
-# else
-#  include "threads/green/threads.h"
-#  include "threads/green/locks.h"
-# endif
+#if defined(ENABLE_THREADS)
+# include "threads/native/threads.h"
 #endif
 
 #include "vm/classcache.h"
 #include "vm/stringlocal.h"
 #include "vm/suck.h"
 #include "vm/vm.h"
+#include "vm/jit/jit.h"
 #include "vm/jit/asmpart.h"
 #include "vm/jit/profile/profile.h"
+#include "vm/rt-timing.h"
 
 #if defined(ENABLE_JVMTI)
 #include "native/jvmti/cacaodbg.h"
@@ -89,8 +86,6 @@ bool vm_exiting = false;
 u1 *intrp_main_stack = NULL;
 #endif
 
-void **stackbottom = NULL;
-
 char *mainstring = NULL;
 classinfo *mainclass = NULL;
 
@@ -102,9 +97,9 @@ bool startit = true;
 
 /* define heap sizes **********************************************************/
 
-#define HEAP_MAXSIZE      64 * 1024 * 1024  /* default 64MB                   */
-#define HEAP_STARTSIZE    2  * 1024 * 1024  /* default 2MB                    */
-#define STACK_SIZE              128 * 1024  /* default 128kB                  */
+#define HEAP_MAXSIZE      128 * 1024 * 1024 /* default 128MB                  */
+#define HEAP_STARTSIZE      2 * 1024 * 1024 /* default 2MB                    */
+#define STACK_SIZE                64 * 1024 /* default 64kB                   */
 
 
 /* define command line options ************************************************/
@@ -149,9 +144,9 @@ enum {
        OPT_VERBOSE1,
        OPT_NOIEEE,
        OPT_SOFTNULL,
-       OPT_TIME,
 
 #if defined(ENABLE_STATISTICS)
+       OPT_TIME,
        OPT_STAT,
 #endif
 
@@ -162,16 +157,21 @@ enum {
        OPT_SIGNATURE,
        OPT_SHOW,
        OPT_ALL,
-       OPT_OLOOP,
-       OPT_INLINING,
 
-       OPT_VERBOSETC,
+#if defined(ENABLE_VERIFIER)
        OPT_NOVERIFY,
-       OPT_LIBERALUTF,
+#if defined(TYPECHECK_VERBOSE)
+       OPT_VERBOSETC,
+#endif
+#endif /* defined(ENABLE_VERIFIER) */
        OPT_EAGER,
 
        /* optimization options */
 
+#if defined(ENABLE_LOOP)
+       OPT_OLOOP,
+#endif
+       
 #if defined(ENABLE_IFCONV)
        OPT_IFCONV,
 #endif
@@ -180,6 +180,10 @@ enum {
        OPT_LSRA,
 #endif
 
+#if defined(ENABLE_INLINING)
+       OPT_INLINING,
+#endif
+
 #if defined(ENABLE_INTRP)
        /* interpreter options */
 
@@ -226,20 +230,21 @@ opt_struct opts[] = {
        { "X",                 false, OPT_X },
 
        { "noasyncgc",         false, OPT_IGNORE },
+#if defined(ENABLE_VERIFIER)
        { "noverify",          false, OPT_NOVERIFY },
-       { "liberalutf",        false, OPT_LIBERALUTF },
+#endif
        { "v",                 false, OPT_VERBOSE1 },
        { "verbose:",          true,  OPT_VERBOSE },
 
-#ifdef TYPECHECK_VERBOSE
+#if defined(ENABLE_VERIFIER) && defined(TYPECHECK_VERBOSE)
        { "verbosetc",         false, OPT_VERBOSETC },
 #endif
 #if defined(__ALPHA__)
        { "noieee",            false, OPT_NOIEEE },
 #endif
        { "softnull",          false, OPT_SOFTNULL },
-       { "time",              false, OPT_TIME },
 #if defined(ENABLE_STATISTICS)
+       { "time",              false, OPT_TIME },
        { "stat",              false, OPT_STAT },
 #endif
        { "log",               true,  OPT_LOG },
@@ -248,7 +253,9 @@ opt_struct opts[] = {
        { "eager",             false, OPT_EAGER },
        { "sig",               true,  OPT_SIGNATURE },
        { "all",               false, OPT_ALL },
+#if defined(ENABLE_LOOP)
        { "oloop",             false, OPT_OLOOP },
+#endif
 #if defined(ENABLE_IFCONV)
        { "ifconv",            false, OPT_IFCONV },
 #endif
@@ -295,7 +302,9 @@ opt_struct opts[] = {
 
        /* keep these at the end of the list */
 
+#if defined(ENABLE_INLINING)
        { "i",                 true,  OPT_INLINING },
+#endif
        { "m",                 true,  OPT_METHOD },
        { "s",                 true,  OPT_SHOW },
 
@@ -347,17 +356,20 @@ void usage(void)
 #if defined(__ALPHA__)
        puts("    -noieee                  don't use ieee compliant arithmetic");
 #endif
+#if defined(ENABLE_VERIFIER)
        puts("    -noverify                don't verify classfiles");
-       puts("    -liberalutf              don't warn about overlong UTF-8 sequences");
+#endif
        puts("    -softnull                use software nullpointer check");
-       puts("    -time                    measure the runtime");
 #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");
-       puts("    -oloop                   optimize array accesses in loops"); 
+#if defined(ENABLE_LOOP)
+       puts("    -oloop                   optimize array accesses in loops");
+#endif
        puts("    -l                       don't start the class after loading");
        puts("    -eager                   perform eager class loading and linking");
        puts("    -all                     compile all methods, no execution");
@@ -371,11 +383,13 @@ void usage(void)
        puts("           m(ethods)         show class fields and methods");
        puts("           n(ative)          show disassembled native stubs");
        puts("           u(tf)             show the utf - hash");
+#if defined(ENABLE_INLINING)
        puts("    -i     n(line)           activate inlining");
        puts("           v(irtual)         inline virtual methods (uses/turns rt option on)");
        puts("           e(exception)      inline methods with exceptions");
        puts("           p(aramopt)        optimize argument renaming");
        puts("           o(utsiders)       inline methods of foreign classes");
+#endif /* defined(ENABLE_INLINING) */
 #if defined(ENABLE_IFCONV)
        puts("    -ifconv                  use if-conversion");
 #endif
@@ -403,9 +417,9 @@ static void Xusage(void)
        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("    -Xms<size>               set the initial size of the heap (default: 2MB)");
-       puts("    -Xmx<size>               set the maximum size of the heap (default: 64MB)");
-       puts("    -Xss<size>               set the thread stack size (default: 128kB)");
+       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);
        puts("    -Xprof[:bb]              collect and print profiling data");
 #if defined(ENABLE_JVMTI)
     /* -Xdebug option depend on gnu classpath JDWP options. options: 
@@ -454,7 +468,20 @@ static void version(void)
 #else
        puts("  CC         : "VERSION_CC"");
 #endif
-       puts("  CFLAGS     : "VERSION_CFLAGS"");
+       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);
+       puts("  java.boot.class.path: "CACAO_VM_ZIP_PATH":"CLASSPATH_GLIBJ_ZIP_PATH"");
+       puts("  java.library.path   : "CLASSPATH_LIBRARY_PATH"\n");
+
+       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);
+       printf("  java.boot.class.path: %s\n", bootclasspath);
 }
 
 
@@ -485,11 +512,18 @@ bool vm_create(JavaVMInitArgs *vm_args)
 {
        char *cp;
        s4    cplen;
-       u4    heapmaxsize;
-       u4    heapstartsize;
        s4    opt;
        s4    i, j, k;
 
+
+#if defined(ENABLE_JVMTI)
+       lt_dlhandle  handle;
+       char* libname;
+       bool agentbypath = false;;
+#endif
+       
+
+
        /* check the JNI version requested */
 
        switch (vm_args->version) {
@@ -555,17 +589,14 @@ bool vm_create(JavaVMInitArgs *vm_args)
        checknull  = false;
        opt_noieee = false;
 
-       heapmaxsize   = HEAP_MAXSIZE;
-       heapstartsize = HEAP_STARTSIZE;
-       opt_stacksize = STACK_SIZE;
+       opt_heapmaxsize   = HEAP_MAXSIZE;
+       opt_heapstartsize = HEAP_STARTSIZE;
+       opt_stacksize     = STACK_SIZE;
 
 
 #if defined(ENABLE_JVMTI)
        /* initialize JVMTI related  **********************************************/
-       jvmtibrkpt.brk=NULL;
-       jvmtibrkpt.num=0;
-       jvmtibrkpt.size=0;
-       jdwp = jvmti = dbgprocess = false;
+       jdwp = jvmti = false;
 #endif
 
        /* initialize properties before commandline handling */
@@ -574,6 +605,11 @@ bool vm_create(JavaVMInitArgs *vm_args)
                throw_cacao_exception_exit(string_java_lang_InternalError,
                                                                   "Unable to init properties");
 
+       /* add some default properties */
+
+       properties_add("java.endorsed.dirs", ""CACAO_PREFIX"/jre/lib/endorsed");
+
+
        /* iterate over all passed options */
 
        while ((opt = options_get(opts, vm_args)) != OPT_DONE) {
@@ -619,7 +655,7 @@ bool vm_create(JavaVMInitArgs *vm_args)
                        /* if no '=' is given, just create an empty property */
 
                        properties_add(opt_arg, "");
-                                       
+
                didit:
                        break;
 
@@ -692,7 +728,9 @@ bool vm_create(JavaVMInitArgs *vm_args)
                        }
                        
                        break;
+
                case OPT_AGENTPATH:
+                       agentbypath = true;
                case OPT_AGENTLIB:
                        jvmti=true;
                        agentarg = opt_arg;
@@ -716,9 +754,9 @@ bool vm_create(JavaVMInitArgs *vm_args)
                                        j = atoi(opt_arg);
 
                                if (opt == OPT_MX)
-                                       heapmaxsize = j;
+                                       opt_heapmaxsize = j;
                                else if (opt == OPT_MS)
-                                       heapstartsize = j;
+                                       opt_heapstartsize = j;
                                else
                                        opt_stacksize = j;
                        }
@@ -752,9 +790,9 @@ bool vm_create(JavaVMInitArgs *vm_args)
                                opt_verboseexception = true;
                        break;
 
-#ifdef TYPECHECK_VERBOSE
+#if defined(ENABLE_VERIFIER) && defined(TYPECHECK_VERBOSE)
                case OPT_VERBOSETC:
-                       typecheckverbose = true;
+                       opt_typecheckverbose = true;
                        break;
 #endif
                                
@@ -775,24 +813,22 @@ bool vm_create(JavaVMInitArgs *vm_args)
                        opt_noieee = true;
                        break;
 
+#if defined(ENABLE_VERIFIER)
                case OPT_NOVERIFY:
                        opt_verify = false;
                        break;
-
-               case OPT_LIBERALUTF:
-                       opt_liberalutf = true;
-                       break;
+#endif
 
                case OPT_SOFTNULL:
                        checknull = true;
                        break;
 
+#if defined(ENABLE_STATISTICS)
                case OPT_TIME:
-                       getcompilingtime = true;
-                       getloadingtime = true;
+                       opt_getcompilingtime = true;
+                       opt_getloadingtime = true;
                        break;
                                        
-#if defined(ENABLE_STATISTICS)
                case OPT_STAT:
                        opt_stat = true;
                        break;
@@ -877,10 +913,13 @@ bool vm_create(JavaVMInitArgs *vm_args)
                        }
                        break;
                        
+#if defined(ENABLE_LOOP)
                case OPT_OLOOP:
                        opt_loops = true;
                        break;
+#endif
 
+#if defined(ENABLE_INLINING)
                case OPT_INLINING:
                        for (j = 0; j < strlen(opt_arg); j++) {         
                                switch (opt_arg[j]) {
@@ -906,6 +945,7 @@ bool vm_create(JavaVMInitArgs *vm_args)
                                }
                        }
                        break;
+#endif /* defined(ENABLE_INLINING) */
 
 #if defined(ENABLE_IFCONV)
                case OPT_IFCONV:
@@ -1030,18 +1070,11 @@ bool vm_create(JavaVMInitArgs *vm_args)
        }
 
 #if defined(ENABLE_JVMTI)
-       /* The fork has to occure before threads a created because threads  are 
-          not forked correctly (see man pthread_atfork). Varibale dbgprocess 
-          stores information whether this is the debugger or debuggee process. */
-       if (jvmti || jdwp) {
-               set_jvmti_phase(JVMTI_PHASE_ONLOAD);
-               dbgprocess = cacaodbgfork();
-       }
-
-       if (dbgprocess && jvmti) { /* is this the parent/debugger process ? */
-               agentload(agentarg);
-               set_jvmti_phase(JVMTI_PHASE_PRIMORDIAL);
+       if (jvmti) {
+               jvmti_set_phase(JVMTI_PHASE_ONLOAD);
+               jvmti_agentload(agentarg, agentbypath, &handle, &libname);
        }
+       jvmti_set_phase(JVMTI_PHASE_PRIMORDIAL);
 #endif
 
 
@@ -1051,7 +1084,7 @@ bool vm_create(JavaVMInitArgs *vm_args)
 
        /* initialize the garbage collector */
 
-       gc_init(heapmaxsize, heapstartsize);
+       gc_init(opt_heapmaxsize, opt_heapstartsize);
 
 #if defined(ENABLE_INTRP)
        /* Allocate main thread stack on the Java heap. */
@@ -1062,12 +1095,9 @@ bool vm_create(JavaVMInitArgs *vm_args)
        }
 #endif
 
-#if defined(USE_THREADS)
-#if defined(NATIVE_THREADS)
+#if defined(ENABLE_THREADS)
        threads_preinit();
 #endif
-       initLocks();
-#endif
 
        /* initialize the string hashtable stuff: lock (must be done
           _after_ threads_preinit) */
@@ -1136,7 +1166,7 @@ bool vm_create(JavaVMInitArgs *vm_args)
        /* initialize the loader subsystems (must be done _after_
        classcache_init) */
 
-       if (!loader_init((u1 *) stackbottom))
+       if (!loader_init())
                throw_main_exception_exit();
 
        if (!linker_init())
@@ -1151,8 +1181,15 @@ bool vm_create(JavaVMInitArgs *vm_args)
        if (!builtin_init())
                throw_main_exception_exit();
 
-#if defined(USE_THREADS)
-       if (!threads_init((u1 *) stackbottom))
+       /* Initialize the JNI subsystem (must be done _before_
+          threads_init, as threads_init can call JNI methods
+          (e.g. NewGlobalRef). */
+
+       if (!jni_init())
+               throw_main_exception_exit();
+
+#if defined(ENABLE_THREADS)
+       if (!threads_init())
                throw_main_exception_exit();
 #endif
 
@@ -1164,11 +1201,6 @@ bool vm_create(JavaVMInitArgs *vm_args)
        if (!initialize_class(class_java_lang_System))
                throw_main_exception_exit();
 
-       /* JNI init creates a Java object (this means running Java code) */
-
-       if (!jni_init())
-               throw_main_exception_exit();
-
 #if defined(ENABLE_PROFILING)
        /* initialize profiling */
 
@@ -1176,7 +1208,7 @@ bool vm_create(JavaVMInitArgs *vm_args)
                throw_main_exception_exit();
 #endif
 
-#if defined(USE_THREADS)
+#if defined(ENABLE_THREADS)
        /* finally, start the finalizer thread */
 
        if (!finalizer_start_thread())
@@ -1188,6 +1220,13 @@ bool vm_create(JavaVMInitArgs *vm_args)
 /*             throw_main_exception_exit(); */
 #endif
 
+#if defined(ENABLE_JVMTI)
+       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++;
@@ -1210,12 +1249,8 @@ bool vm_create(JavaVMInitArgs *vm_args)
 
 s4 vm_destroy(JavaVM *vm)
 {
-#if defined(USE_THREADS)
-#if defined(NATIVE_THREADS)
-       joinAllThreads();
-#else
-       killThread(currentThread);
-#endif
+#if defined(ENABLE_THREADS)
+       threads_join_all_threads();
 #endif
 
        /* everything's ok */
@@ -1242,9 +1277,9 @@ void vm_exit(s4 status)
        assert(class_java_lang_System->state & CLASS_LOADED);
 
 #if defined(ENABLE_JVMTI)
-       if (dbgprocess) {
-               set_jvmti_phase(JVMTI_PHASE_DEAD);
-               if (jvmti) agentunload();
+       if (jvmti || (dbgcom!=NULL)) {
+               jvmti_set_phase(JVMTI_PHASE_DEAD);
+               if (jvmti) jvmti_agentunload();
        }
 #endif
 
@@ -1282,14 +1317,12 @@ void vm_exit(s4 status)
 
 void vm_shutdown(s4 status)
 {
-#if defined(ENABLE_JVMTI)
-       if (dbgprocess) {
-               set_jvmti_phase(JVMTI_PHASE_DEAD);
-               if (jvmti) agentunload();
-               ipcrm();
-       }
+       if (opt_verbose 
+#if defined(ENABLE_STATISTICS)
+               || opt_getcompilingtime || opt_stat
 #endif
-       if (opt_verbose || getcompilingtime || opt_stat) {
+          ) 
+       {
                log_text("CACAO terminated by shutdown");
                dolog("Exit status: %d\n", (s4) status);
        }
@@ -1310,12 +1343,6 @@ void vm_shutdown(s4 status)
 
 void vm_exit_handler(void)
 {
-#if defined(ENABLE_JVMTI)
-       if (jvmti && jdwp) set_jvmti_phase(JVMTI_PHASE_DEAD);
-       if (jvmti) agentunload();
-       ipcrm();
-#endif
-
 #if !defined(NDEBUG)
        if (showmethods)
                class_showmethods(mainclass);
@@ -1330,14 +1357,23 @@ void vm_exit_handler(void)
        if (opt_prof)
                profile_printstats();
 # endif
+#endif /* !defined(NDEBUG) */
+
+#if defined(ENABLE_RT_TIMING)
+       rt_timing_print_time_stats(stderr);
 #endif
 
-#if defined(USE_THREADS) && !defined(NATIVE_THREADS)
-       clear_thread_flags();           /* restores standard file descriptor
-                                      flags */
+#if defined(ENABLE_CYCLES_STATS)
+       builtin_print_cycles_stats(stderr);
+       stacktrace_print_cycles_stats(stderr);
 #endif
 
-       if (opt_verbose || getcompilingtime || opt_stat) {
+       if (opt_verbose 
+#if defined(ENABLE_STATISTICS)
+               || opt_getcompilingtime || opt_stat
+#endif
+          ) 
+       {
                log_text("CACAO terminated");
 
 #if defined(ENABLE_STATISTICS)
@@ -1350,14 +1386,40 @@ void vm_exit_handler(void)
 
                mem_usagelog(1);
 
-               if (getcompilingtime)
+               if (opt_getcompilingtime)
                        print_times();
-#endif
+#endif /* defined(ENABLE_STATISTICS) */
        }
        /* vm_print_profile(stderr);*/
 }
 
 
+/* vm_abort ********************************************************************
+
+   Prints an error message and aborts the VM.
+
+*******************************************************************************/
+
+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 */
+
+       abort();
+}
+
+
 /* vm_vmargs_from_valist *******************************************************
 
    XXX
@@ -1378,8 +1440,8 @@ static void vm_vmargs_from_valist(methodinfo *m, java_objectheader *o,
 
        if (o != NULL) {
                /* the `this' pointer */
-               vmargs[0].type = TYPE_ADR;
-               vmargs[0].data = (u8) (ptrint) o;
+               vmargs[0].type   = TYPE_ADR;
+               vmargs[0].data.l = (u8) (ptrint) o;
 
                paramtypes++;
                i++;
@@ -1393,34 +1455,34 @@ static void vm_vmargs_from_valist(methodinfo *m, java_objectheader *o,
                case PRIMITIVETYPE_CHAR:
                case PRIMITIVETYPE_SHORT: 
                case PRIMITIVETYPE_INT:
-                       vmargs[i].type = TYPE_INT;
-                       vmargs[i].data = (s8) va_arg(ap, s4);
+                       vmargs[i].type   = TYPE_INT;
+                       vmargs[i].data.l = (s8) va_arg(ap, s4);
                        break;
 
                case PRIMITIVETYPE_LONG:
-                       vmargs[i].type = TYPE_LNG;
-                       vmargs[i].data = (s8) va_arg(ap, s8);
+                       vmargs[i].type   = TYPE_LNG;
+                       vmargs[i].data.l = (s8) va_arg(ap, s8);
                        break;
 
                case PRIMITIVETYPE_FLOAT:
-                       vmargs[i].type = TYPE_FLT;
+                       vmargs[i].type   = TYPE_FLT;
 #if defined(__ALPHA__)
                        /* this keeps the assembler function much simpler */
 
-                       *((jdouble *) (&vmargs[i].data)) = (jdouble) va_arg(ap, jdouble);
+                       vmargs[i].data.d = (jdouble) va_arg(ap, jdouble);
 #else
-                       *((jfloat *) (&vmargs[i].data)) = (jfloat) va_arg(ap, jdouble);
+                       vmargs[i].data.f = (jfloat) va_arg(ap, jdouble);
 #endif
                        break;
 
                case PRIMITIVETYPE_DOUBLE:
-                       vmargs[i].type = TYPE_DBL;
-                       *((jdouble *) (&vmargs[i].data)) = (jdouble) va_arg(ap, jdouble);
+                       vmargs[i].type   = TYPE_DBL;
+                       vmargs[i].data.d = (jdouble) va_arg(ap, jdouble);
                        break;
 
                case TYPE_ADR: 
-                       vmargs[i].type = TYPE_ADR;
-                       vmargs[i].data = (u8) (ptrint) va_arg(ap, void*);
+                       vmargs[i].type   = TYPE_ADR;
+                       vmargs[i].data.l = (u8) (ptrint) va_arg(ap, void*);
                        break;
                }
        }
@@ -1448,8 +1510,8 @@ static void vm_vmargs_from_jvalue(methodinfo *m, java_objectheader *o,
 
        if (o != NULL) {
                /* the `this' pointer */
-               vmargs[0].type = TYPE_ADR;
-               vmargs[0].data = (u8) (ptrint) o;
+               vmargs[0].type   = TYPE_ADR;
+               vmargs[0].data.l = (u8) (ptrint) o;
 
                paramtypes++;
                i++;
@@ -1463,13 +1525,13 @@ static void vm_vmargs_from_jvalue(methodinfo *m, java_objectheader *o,
                case PRIMITIVETYPE_CHAR:
                case PRIMITIVETYPE_SHORT: 
                case PRIMITIVETYPE_INT:
-                       vmargs[i].type = TYPE_INT;
-                       vmargs[i].data = (s8) args[j].i;
+                       vmargs[i].type   = TYPE_INT;
+                       vmargs[i].data.l = (s8) args[j].i;
                        break;
 
                case PRIMITIVETYPE_LONG:
-                       vmargs[i].type = TYPE_LNG;
-                       vmargs[i].data = (s8) args[j].j;
+                       vmargs[i].type   = TYPE_LNG;
+                       vmargs[i].data.l = (s8) args[j].j;
                        break;
 
                case PRIMITIVETYPE_FLOAT:
@@ -1477,20 +1539,20 @@ static void vm_vmargs_from_jvalue(methodinfo *m, java_objectheader *o,
 #if defined(__ALPHA__)
                        /* this keeps the assembler function much simpler */
 
-                       *((jdouble *) (&vmargs[i].data)) = (jdouble) args[j].f;
+                       vmargs[i].data.d = (jdouble) args[j].f;
 #else
-                       *((jfloat *) (&vmargs[i].data)) = args[j].f;
+                       vmargs[i].data.f = args[j].f;
 #endif
                        break;
 
                case PRIMITIVETYPE_DOUBLE:
-                       vmargs[i].type = TYPE_DBL;
-                       *((jdouble *) (&vmargs[i].data)) = args[j].d;
+                       vmargs[i].type   = TYPE_DBL;
+                       vmargs[i].data.d = args[j].d;
                        break;
 
                case TYPE_ADR: 
-                       vmargs[i].type = TYPE_ADR;
-                       vmargs[i].data = (u8) (ptrint) args[j].l;
+                       vmargs[i].type   = TYPE_ADR;
+                       vmargs[i].data.l = (u8) (ptrint) args[j].l;
                        break;
                }
        }