vm: die if we fault in a fault
							parent
							
								
									f645c82b8a
								
							
						
					
					
						commit
						4037c981eb
					
				| 
						 | 
				
			
			@ -29,6 +29,8 @@ void out_of_memory()
 | 
			
		|||
 | 
			
		||||
void factor_vm::general_error(vm_error_type error, cell arg1, cell arg2)
 | 
			
		||||
{
 | 
			
		||||
	faulting_p = true;
 | 
			
		||||
 | 
			
		||||
	/* Reset local roots before allocating anything */
 | 
			
		||||
	data_roots.clear();
 | 
			
		||||
	bignum_roots.clear();
 | 
			
		||||
| 
						 | 
				
			
			@ -57,6 +59,7 @@ void factor_vm::general_error(vm_error_type error, cell arg1, cell arg2)
 | 
			
		|||
 | 
			
		||||
		ctx->push(error_object);
 | 
			
		||||
 | 
			
		||||
		faulting_p = false;
 | 
			
		||||
		unwind_native_frames(special_objects[ERROR_HANDLER_QUOT],
 | 
			
		||||
			ctx->callstack_top);
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -68,6 +71,7 @@ void factor_vm::general_error(vm_error_type error, cell arg1, cell arg2)
 | 
			
		|||
		std::cout << "error: " << error << std::endl;
 | 
			
		||||
		std::cout << "arg 1: "; print_obj(arg1); std::cout << std::endl;
 | 
			
		||||
		std::cout << "arg 2: "; print_obj(arg2); std::cout << std::endl;
 | 
			
		||||
		faulting_p = false;
 | 
			
		||||
		factorbug();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -86,6 +90,8 @@ void factor_vm::memory_protection_error(cell addr)
 | 
			
		|||
{
 | 
			
		||||
	if(code->safepoint_p(addr))
 | 
			
		||||
		handle_safepoint();
 | 
			
		||||
	else if(faulting_p)
 | 
			
		||||
		fatal_error("Double fault", 0);
 | 
			
		||||
	else if(ctx->datastack_seg->underflow_p(addr))
 | 
			
		||||
		general_error(ERROR_DATASTACK_UNDERFLOW,false_object,false_object);
 | 
			
		||||
	else if(ctx->datastack_seg->overflow_p(addr))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,7 +18,8 @@ factor_vm::factor_vm() :
 | 
			
		|||
	fep_disabled(false),
 | 
			
		||||
	full_output(false),
 | 
			
		||||
	last_nano_count(0),
 | 
			
		||||
	signal_callstack_seg(NULL)
 | 
			
		||||
	signal_callstack_seg(NULL),
 | 
			
		||||
	faulting_p(false)
 | 
			
		||||
{
 | 
			
		||||
	primitive_reset_dispatch_stats();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue