namespace factor
{

/* Runtime errors */
enum vm_error_type
{
	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,
	ERROR_FP_TRAP,
};

void out_of_memory();
void fatal_error(const char* msg, cell tagged);
void critical_error(const char* msg, cell tagged);

PRIMITIVE(die);

void general_error(vm_error_type error, cell arg1, cell arg2, stack_frame *native_stack);
void not_implemented_error();
void fp_trap_error(unsigned int fpu_status, stack_frame *signal_callstack_top);

PRIMITIVE(call_clear);
PRIMITIVE(unimplemented);

/* Global variables used to pass fault handler state from signal handler to
user-space */
extern cell signal_number;
extern cell signal_fault_addr;
extern unsigned int signal_fpu_status;
extern stack_frame *signal_callstack_top;

void memory_signal_handler_impl();
void fp_signal_handler_impl();
void misc_signal_handler_impl();

}