X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fvm%2Fvm.c;h=748890fe6ef736cadbd47a132be8940317f5b5cd;hb=db03146bc8f0eab0971cedc0c2b119e8737531dc;hp=e213786ec442680e86ad4248b3b6ac5fff3f57dd;hpb=7eb9565b4da854fc6ced7220cb19040df0033573;p=cacao.git diff --git a/src/vm/vm.c b/src/vm/vm.c index e213786ec..748890fe6 100644 --- a/src/vm/vm.c +++ b/src/vm/vm.c @@ -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 $ */ @@ -45,13 +45,8 @@ #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" @@ -65,13 +60,18 @@ #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" +#endif /* Invocation API variables ***************************************************/ -JavaVM *_Jv_jvm; /* denotes a Java VM */ +_Jv_JavaVM *_Jv_jvm; /* denotes a Java VM */ _Jv_JNIEnv *_Jv_env; /* pointer to native method interface */ @@ -86,8 +86,6 @@ bool vm_exiting = false; u1 *intrp_main_stack = NULL; #endif -void **stackbottom = NULL; - char *mainstring = NULL; classinfo *mainclass = NULL; @@ -99,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 ************************************************/ @@ -146,9 +144,9 @@ enum { OPT_VERBOSE1, OPT_NOIEEE, OPT_SOFTNULL, - OPT_TIME, #if defined(ENABLE_STATISTICS) + OPT_TIME, OPT_STAT, #endif @@ -159,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 @@ -177,6 +180,10 @@ enum { OPT_LSRA, #endif +#if defined(ENABLE_INLINING) + OPT_INLINING, +#endif + #if defined(ENABLE_INTRP) /* interpreter options */ @@ -191,6 +198,8 @@ enum { #ifdef ENABLE_JVMTI OPT_DEBUG, + OPT_XRUNJDWP, + OPT_NOAGENT, OPT_AGENTLIB, OPT_AGENTPATH, #endif @@ -221,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 }, @@ -243,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 @@ -276,6 +288,8 @@ opt_struct opts[] = { { "Xbootclasspath/p:", true, OPT_BOOTCLASSPATH_P }, #ifdef ENABLE_JVMTI { "Xdebug", false, OPT_DEBUG }, + { "Xnoagent", false, OPT_NOAGENT }, + { "Xrunjdwp", true, OPT_XRUNJDWP }, #endif { "Xms", true, OPT_MS }, { "ms", true, OPT_MS }, @@ -288,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 }, @@ -306,7 +322,7 @@ void usage(void) { puts("Usage: cacao [-options] classname [arguments]"); puts(" (to run a class file)"); - puts(" cacao [-options] -jar jarfile [arguments]"); + puts(" or cacao [-options] -jar jarfile [arguments]"); puts(" (to run a standalone jar file)\n"); puts("Java options:"); @@ -340,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"); @@ -364,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 @@ -396,12 +417,16 @@ static void Xusage(void) puts(" value is appended to the bootstrap class path"); puts(" -Xbootclasspath/p:"); puts(" value is prepended to the bootstrap class path"); - puts(" -Xms set the initial size of the heap (default: 2MB)"); - puts(" -Xmx set the maximum size of the heap (default: 64MB)"); - puts(" -Xss set the thread stack size (default: 128kB)"); + printf(" -Xms set the initial size of the heap (default: %dMB)\n", HEAP_STARTSIZE / 1024 / 1024); + printf(" -Xmx set the maximum size of the heap (default: %dMB)\n", HEAP_MAXSIZE / 1024 / 1024); + printf(" -Xss set the thread stack size (default: %dkB)\n", STACK_SIZE / 1024); puts(" -Xprof[:bb] collect and print profiling data"); #if defined(ENABLE_JVMTI) - puts(" -Xdebug enable remote debugging"); + /* -Xdebug option depend on gnu classpath JDWP options. options: + transport=dt_socket,address=,server=(y|n),suspend(y|n) */ + puts(" -Xdebug enable remote debugging\n"); + puts(" -Xrunjdwp transport=[dt_socket|...],address=,server=[y|n],suspend=[y|n]\n"); + puts(" enable remote debugging\n"); #endif /* exit with error code */ @@ -438,8 +463,25 @@ static void version(void) puts("Configure/Build options:\n"); puts(" ./configure: "VERSION_CONFIGURE_ARGS""); +#if defined(__VERSION__) puts(" CC : "VERSION_CC" ("__VERSION__")"); - puts(" CFLAGS : "VERSION_CFLAGS""); +#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); + 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); } @@ -470,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) { @@ -499,6 +548,7 @@ bool vm_create(JavaVMInitArgs *vm_args) nogc_init(HEAP_MAXSIZE, HEAP_STARTSIZE); #endif + /* set the bootclasspath */ cp = getenv("BOOTCLASSPATH"); @@ -539,9 +589,15 @@ 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 **********************************************/ + jdwp = jvmti = false; +#endif /* initialize properties before commandline handling */ @@ -549,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) { @@ -594,7 +655,7 @@ bool vm_create(JavaVMInitArgs *vm_args) /* if no '=' is given, just create an empty property */ properties_add(opt_arg, ""); - + didit: break; @@ -638,15 +699,41 @@ bool vm_create(JavaVMInitArgs *vm_args) #if defined(ENABLE_JVMTI) case OPT_DEBUG: - dbg = true; + jdwp=true; + 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: transport = opt_arg; + j=0; + while (transport[j]!='=') j++; + j++; + while (jnOptions) { mainstring = vm_args->options[opt_index++].optionString; - if (opt_jar == true) { + /* Put the jar file into the classpath (if any). */ - /* prepend the jar file to the classpath (if any) */ + if (opt_jar == true) { + /* free old classpath */ - if (opt_jar == true) { - /* put jarfile in classpath */ + MFREE(classpath, char, strlen(classpath)); - cp = classpath; + /* put jarfile into classpath */ - classpath = MNEW(char, strlen(mainstring) + strlen(":") + - strlen(classpath) + strlen("0")); + classpath = MNEW(char, strlen(mainstring) + strlen("0")); - strcpy(classpath, mainstring); - strcat(classpath, ":"); - strcat(classpath, cp); + strcpy(classpath, mainstring); - MFREE(cp, char, strlen(cp)); + } else { + /* replace .'s with /'s in classname */ - } else { - /* replace .'s with /'s in classname */ - - for (i = strlen(mainstring) - 1; i >= 0; i--) - if (mainstring[i] == '.') - mainstring[i] = '/'; - } + for (i = strlen(mainstring) - 1; i >= 0; i--) + if (mainstring[i] == '.') + mainstring[i] = '/'; } } +#if defined(ENABLE_JVMTI) + if (jvmti) { + jvmti_set_phase(JVMTI_PHASE_ONLOAD); + jvmti_agentload(agentarg, agentbypath, &handle, &libname); + } + jvmti_set_phase(JVMTI_PHASE_PRIMORDIAL); +#endif + /* initialize this JVM ****************************************************/ @@ -993,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. */ @@ -1004,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) */ @@ -1078,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()) @@ -1093,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 @@ -1106,17 +1201,14 @@ 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 */ if (!profile_init()) throw_main_exception_exit(); - -#if defined(USE_THREADS) +#endif + +#if defined(ENABLE_THREADS) /* finally, start the finalizer thread */ if (!finalizer_start_thread()) @@ -1128,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++; @@ -1150,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 */ @@ -1182,8 +1277,10 @@ void vm_exit(s4 status) assert(class_java_lang_System->state & CLASS_LOADED); #if defined(ENABLE_JVMTI) - set_jvmti_phase(JVMTI_PHASE_DEAD); - agentunload(); + if (jvmti || (dbgcom!=NULL)) { + jvmti_set_phase(JVMTI_PHASE_DEAD); + if (jvmti) jvmti_agentunload(); + } #endif if (!link_class(class_java_lang_System)) @@ -1197,20 +1294,17 @@ void vm_exit(s4 status) class_java_lang_Object, true); - if (!m) + if (m == NULL) throw_main_exception_exit(); /* call the exit function with passed exit status */ - (void) vm_call_method(m, NULL, (void *) (ptrint) status); + (void) vm_call_method(m, NULL, status); - /* this should never happen */ + /* If we had an exception, just ignore the exception and exit with + the proper code. */ - if (*exceptionptr) - throw_exception_exit(); - - throw_cacao_exception_exit(string_java_lang_InternalError, - "System.exit(I)V returned without exception"); + vm_shutdown(status); } @@ -1223,11 +1317,12 @@ void vm_exit(s4 status) void vm_shutdown(s4 status) { -#if defined(ENABLE_JVMTI) - agentunload(); + 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); } @@ -1258,16 +1353,27 @@ void vm_exit_handler(void) 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(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) @@ -1280,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 @@ -1308,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++; @@ -1323,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; } } @@ -1378,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++; @@ -1393,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: @@ -1407,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; } }