diff options
Diffstat (limited to 'code/qcommon/vm.c')
| -rw-r--r-- | code/qcommon/vm.c | 18 | 
1 files changed, 12 insertions, 6 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; | 
