diff options
author | ludwig <ludwig@edf5b092-35ff-0310-97b2-ce42778d08ea> | 2008-03-24 21:20:55 +0000 |
---|---|---|
committer | ludwig <ludwig@edf5b092-35ff-0310-97b2-ce42778d08ea> | 2008-03-24 21:20:55 +0000 |
commit | 07e86d96ebda4c67d32997bdba667af58023fcea (patch) | |
tree | 9f7097a58384fb58cc7b19cfded69c66f10a83b6 /code/qcommon | |
parent | 000148b66c80c177a2491bfc8b979415166d1e75 (diff) | |
download | ioquake3-aero-07e86d96ebda4c67d32997bdba667af58023fcea.tar.gz ioquake3-aero-07e86d96ebda4c67d32997bdba667af58023fcea.zip |
use vm->callLevel to count recursive calls to VM_Call
Throw an error if vm->callLevel is set and VM_Free is called.
git-svn-id: svn://svn.icculus.org/quake3/trunk@1274 edf5b092-35ff-0310-97b2-ce42778d08ea
Diffstat (limited to 'code/qcommon')
-rw-r--r-- | code/qcommon/vm.c | 18 | ||||
-rw-r--r-- | code/qcommon/vm_interpreted.c | 12 | ||||
-rw-r--r-- | code/qcommon/vm_local.h | 2 | ||||
-rw-r--r-- | code/qcommon/vm_x86_64.c | 2 |
4 files changed, 18 insertions, 16 deletions
diff --git a/code/qcommon/vm.c b/code/qcommon/vm.c index ecc29c1..919f09c 100644 --- a/code/qcommon/vm.c +++ b/code/qcommon/vm.c @@ -608,6 +608,15 @@ VM_Free */ void VM_Free( vm_t *vm ) { + if(!vm) { + return; + } + + if(vm->callLevel) { + Com_Error( ERR_FATAL, "VM_Free(%s) on running vm", vm->name ); + return; + } + if(vm->destroy) vm->destroy(vm); @@ -635,13 +644,8 @@ void VM_Free( vm_t *vm ) { void VM_Clear(void) { int i; for (i=0;i<MAX_VM; i++) { - if ( vmTable[i].dllHandle ) { - Sys_UnloadDll( vmTable[i].dllHandle ); - } - Com_Memset( &vmTable[i], 0, sizeof( vm_t ) ); + VM_Free(&vmTable[i]); } - currentVM = NULL; - lastVM = NULL; } void *VM_ArgPtr( intptr_t intValue ) { @@ -722,6 +726,7 @@ intptr_t QDECL VM_Call( vm_t *vm, int callnum, ... ) { Com_Printf( "VM_Call( %d )\n", callnum ); } + ++vm->callLevel; // if we have a dll loaded, call it directly if ( vm->entryPoint ) { //rcg010207 - see dissertation at top of VM_DllSyscall() in this file. @@ -765,6 +770,7 @@ intptr_t QDECL VM_Call( vm_t *vm, int callnum, ... ) { r = VM_CallInterpreted( vm, &a.callnum ); #endif } + --vm->callLevel; if ( oldVM != NULL ) currentVM = oldVM; diff --git a/code/qcommon/vm_interpreted.c b/code/qcommon/vm_interpreted.c index 3a41e6b..897da68 100644 --- a/code/qcommon/vm_interpreted.c +++ b/code/qcommon/vm_interpreted.c @@ -376,8 +376,6 @@ int VM_CallInterpreted( vm_t *vm, int *args ) { *(int *)&image[ programStack + 4 ] = 0; // return stack *(int *)&image[ programStack ] = -1; // will terminate the loop on return - vm->callLevel = 0; - VM_Debug(0); // vm_debugLevel=2; @@ -516,7 +514,7 @@ nextInstruction2: if ( programCounter < 0 ) { // system call int r; - int temp; +// int temp; #ifdef DEBUG_VM int stomped; @@ -525,7 +523,7 @@ nextInstruction2: } #endif // save the stack to allow recursive VM entry - temp = vm->callLevel; +// temp = vm->callLevel; vm->programStack = programStack - 4; #ifdef DEBUG_VM stomped = *(int *)&image[ programStack + 4 ]; @@ -558,7 +556,7 @@ nextInstruction2: opStack++; *opStack = r; programCounter = *(int *)&image[ programStack ]; - vm->callLevel = temp; +// vm->callLevel = temp; #ifdef DEBUG_VM if ( vm_debugLevel ) { Com_Printf( "%s<--- %s\n", DEBUGSTR, VM_ValueToSymbol( vm, programCounter ) ); @@ -599,7 +597,7 @@ nextInstruction2: // vm_debugLevel = 2; // VM_StackTrace( vm, programCounter, programStack ); } - vm->callLevel++; +// vm->callLevel++; } #endif goto nextInstruction; @@ -614,7 +612,7 @@ nextInstruction2: #ifdef DEBUG_VM profileSymbol = VM_ValueToFunctionSymbol( vm, programCounter ); if ( vm_debugLevel ) { - vm->callLevel--; +// vm->callLevel--; Com_Printf( "%s<--- %s\n", DEBUGSTR, VM_ValueToSymbol( vm, programCounter ) ); } #endif diff --git a/code/qcommon/vm_local.h b/code/qcommon/vm_local.h index 8e81b36..d7e3f41 100644 --- a/code/qcommon/vm_local.h +++ b/code/qcommon/vm_local.h @@ -156,7 +156,7 @@ struct vm_s { int numSymbols; struct vmSymbol_s *symbols; - int callLevel; // for debug indenting + int callLevel; // counts recursive VM_Call int breakFunction; // increment breakCount on function entry to this int breakCount; diff --git a/code/qcommon/vm_x86_64.c b/code/qcommon/vm_x86_64.c index c0fbfb0..21fa979 100644 --- a/code/qcommon/vm_x86_64.c +++ b/code/qcommon/vm_x86_64.c @@ -1069,7 +1069,6 @@ int VM_CallCompiled( vm_t *vm, int *args ) { currentVM = vm; - ++vm->callLevel; // Com_Printf("entering %s level %d, call %d, arg1 = 0x%x\n", vm->name, vm->callLevel, args[0], args[1]); // interpret the code @@ -1131,7 +1130,6 @@ int VM_CallCompiled( vm_t *vm, int *args ) { } // Com_Printf("exiting %s level %d\n", vm->name, vm->callLevel); - --vm->callLevel; vm->programStack = stackOnEntry; return *(int *)opStack; |