aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorludwig <ludwig@edf5b092-35ff-0310-97b2-ce42778d08ea>2008-03-24 21:20:55 +0000
committerludwig <ludwig@edf5b092-35ff-0310-97b2-ce42778d08ea>2008-03-24 21:20:55 +0000
commit07e86d96ebda4c67d32997bdba667af58023fcea (patch)
tree9f7097a58384fb58cc7b19cfded69c66f10a83b6
parent000148b66c80c177a2491bfc8b979415166d1e75 (diff)
downloadioquake3-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
-rw-r--r--code/qcommon/vm.c18
-rw-r--r--code/qcommon/vm_interpreted.c12
-rw-r--r--code/qcommon/vm_local.h2
-rw-r--r--code/qcommon/vm_x86_64.c2
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;