diff options
| -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;  | 
