61 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			61 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
| /* Runtime errors */
 | |
| typedef enum
 | |
| {
 | |
| 	ERROR_EXPIRED = 0,
 | |
| 	ERROR_IO,
 | |
| 	ERROR_NOT_IMPLEMENTED,
 | |
| 	ERROR_TYPE,
 | |
| 	ERROR_DIVIDE_BY_ZERO,
 | |
| 	ERROR_SIGNAL,
 | |
| 	ERROR_ARRAY_SIZE,
 | |
| 	ERROR_C_STRING,
 | |
| 	ERROR_FFI,
 | |
| 	ERROR_HEAP_SCAN,
 | |
| 	ERROR_UNDEFINED_SYMBOL,
 | |
| 	ERROR_DS_UNDERFLOW,
 | |
| 	ERROR_DS_OVERFLOW,
 | |
| 	ERROR_RS_UNDERFLOW,
 | |
| 	ERROR_RS_OVERFLOW,
 | |
| 	ERROR_MEMORY,
 | |
| } F_ERRORTYPE;
 | |
| 
 | |
| void out_of_memory(void);
 | |
| void fatal_error(char* msg, CELL tagged);
 | |
| void critical_error(char* msg, CELL tagged);
 | |
| void primitive_die(void);
 | |
| 
 | |
| void throw_error(CELL error, F_STACK_FRAME *native_stack);
 | |
| void general_error(F_ERRORTYPE error, CELL arg1, CELL arg2, F_STACK_FRAME *native_stack);
 | |
| void divide_by_zero_error(F_STACK_FRAME *native_stack);
 | |
| void memory_protection_error(CELL addr, F_STACK_FRAME *native_stack);
 | |
| void signal_error(int signal, F_STACK_FRAME *native_stack);
 | |
| void type_error(CELL type, CELL tagged);
 | |
| void not_implemented_error(void);
 | |
| 
 | |
| void primitive_throw(void);
 | |
| void primitive_call_clear(void);
 | |
| 
 | |
| INLINE void type_check(CELL type, CELL tagged)
 | |
| {
 | |
| 	if(type_of(tagged) != type) type_error(type,tagged);
 | |
| }
 | |
| 
 | |
| #define DEFINE_UNTAG(type,check,name) \
 | |
| 	INLINE type *untag_##name(CELL obj) \
 | |
| 	{ \
 | |
| 		type_check(check,obj); \
 | |
| 		return untag_object(obj); \
 | |
| 	}
 | |
| 
 | |
| /* Global variables used to pass fault handler state from signal handler to
 | |
| user-space */
 | |
| CELL signal_number;
 | |
| CELL signal_fault_addr;
 | |
| void *signal_callstack_top;
 | |
| 
 | |
| void memory_signal_handler_impl(void);
 | |
| void divide_by_zero_signal_handler_impl(void);
 | |
| void misc_signal_handler_impl(void);
 | |
| 
 | |
| void primitive_unimplemented(void);
 |