static int boot_main(int argc, char *argv[] ) { neko_vm *vm; value args[2]; value mload, exc = NULL; char* root = getSwitch(argc,argv,"swroot"); char* rootFromBundle = root ? NULL : getSwitchFromBundle("swroot"); char* index = getSwitch(argc,argv,"swindex"); if(!index) index = getSwitchFromBundle("swindex"); #if OSX char* tmpRootBuffer = NULL; if (rootFromBundle) { if (stricmp("SW_BUNDLE_PARENT",rootFromBundle)==0) { // folder containing bundle is path: root = getBundleRoot(); strcat(root,"/.."); } else { // path is relative to bundle: root = tmpRootBuffer = malloc(FILENAME_MAX); sprintf(root,"%s/%s",getBundleRoot(),rootFromBundle); } } #endif // if root folder is specified, change the current directory: if( root ) { chdir(root); # if OSX if (tmpRootBuffer) free(tmpRootBuffer); # endif } // printf("boot-loader computed working folder: %s\n",root); // printf("boot-loader set working folder: %s\n",getcwd(NULL)); // initialize Neko Virtual Machine neko_global_init(&vm); vm = neko_vm_alloc(NULL); neko_vm_jit(vm,1); neko_vm_select(vm); mload = neko_default_loader(argv, argc); args[0] = alloc_string(index ? index : DEFAULT_INDEX); args[1] = mload; val_callEx(mload,val_field(mload,val_id("loadmodule")),args,2,&exc); if( exc != NULL ) report(vm,exc); vm = NULL; neko_global_free(); while(switches_count--) { free(switches[switches_count]); } if (switches) free(switches); return( exc != NULL ); }
int main( int argc, char *argv[] ) { neko_vm *vm; value mload; int r; _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_DELAY_FREE_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); neko_global_init(); vm = neko_vm_alloc(NULL); neko_vm_select(vm); # ifdef NEKO_STANDALONE neko_standalone_init(); # endif if( !neko_has_embedded_module(vm) ) { int jit = 1; int stats = 0; while( argc > 1 ) { if( strcmp(argv[1],"-interp") == 0 ) { argc--; argv++; jit = 0; continue; } if( strcmp(argv[1],"-stats") == 0 ) { argc--; argv++; stats = 1; neko_vm_set_stats(vm,neko_stats_measure,neko_stats_measure); neko_stats_measure(vm,"total",1); continue; } break; } # ifdef NEKO_POSIX if( jit ) { struct sigaction act; act.sa_sigaction = NULL; act.sa_handler = handle_signal; act.sa_flags = 0; sigemptyset(&act.sa_mask); sigaction(SIGSEGV,&act,NULL); } # endif neko_vm_jit(vm,jit); if( argc == 1 ) { # ifdef NEKO_STANDALONE report(vm,alloc_string("No embedded module in this executable"),0); # else printf("NekoVM %d.%d.%d (c)2005-2009 Motion-Twin\n Usage : neko <file>\n",NEKO_VERSION/100,(NEKO_VERSION/10)%10,NEKO_VERSION%10); # endif mload = NULL; r = 1; } else { mload = default_loader(argv+2,argc-2); r = execute_file(vm,argv[1],mload); } if( stats ) { value v; neko_stats_measure(vm,"total",0); v = neko_stats_build(vm); val_print(alloc_string("TOT\tTIME\tCOUNT\tNAME\n")); while( v != val_null ) { char buf[256]; value *s = val_array_ptr(v); int errors = val_int(s[4]); sprintf(buf,"%d\t%d\t%d\t%s%c", val_int(s[1]), val_int(s[2]), val_int(s[3]), val_string(s[0]), errors?' ':'\n'); if( errors ) sprintf(buf+strlen(buf),"ERRORS=%d\n",errors); val_print(alloc_string(buf)); v = s[5]; } } } else { mload = default_loader(argv+1,argc-1); r = neko_execute_self(vm,mload); } if( mload != NULL && val_field(mload,val_id("dump_prof")) != val_null ) val_ocall0(mload,val_id("dump_prof")); vm = NULL; mload = NULL; neko_vm_select(NULL); neko_global_free(); return r; }
void cleanup() { gtk_widget_destroy(hxLocalData.menu_item); g_free(hxLocalData.plugin_dir); neko_global_free(); }