6 void factorvm::out_of_memory()
8 print_string("Out of memory\n\n");
13 void fatal_error(const char* msg, cell tagged)
15 print_string("fatal_error: "); print_string(msg);
16 print_string(": "); print_cell_hex(tagged); nl();
20 void factorvm::critical_error(const char* msg, cell tagged)
22 print_string("You have triggered a bug in Factor. Please report.\n");
23 print_string("critical_error: "); print_string(msg);
24 print_string(": "); print_cell_hex(tagged); nl();
28 void factorvm::throw_error(cell error, stack_frame *callstack_top)
30 /* If the error handler is set, we rewind any C stack frames and
31 pass the error to user-space. */
32 if(userenv[BREAK_ENV] != F)
34 /* If error was thrown during heap scan, we re-enable the GC */
37 /* Reset local roots */
41 /* If we had an underflow or overflow, stack pointers might be
47 /* Errors thrown from C code pass NULL for this parameter.
48 Errors thrown from Factor code, or signal handlers, pass the
49 actual stack pointer at the time, since the saved pointer is
50 not necessarily up to date at that point. */
53 callstack_top = fix_callstack_top(callstack_top,
54 stack_chain->callstack_bottom);
57 callstack_top = stack_chain->callstack_top;
59 throw_impl(userenv[BREAK_ENV],callstack_top,this);
61 /* Error was thrown in early startup before error handler is set, just
65 print_string("You have triggered a bug in Factor. Please report.\n");
66 print_string("early_error: ");
73 void factorvm::general_error(vm_error_type error, cell arg1, cell arg2, stack_frame *callstack_top)
75 throw_error(allot_array_4(userenv[ERROR_ENV],
76 tag_fixnum(error),arg1,arg2),callstack_top);
80 void factorvm::type_error(cell type, cell tagged)
82 general_error(ERROR_TYPE,tag_fixnum(type),tagged,NULL);
85 void factorvm::not_implemented_error()
87 general_error(ERROR_NOT_IMPLEMENTED,F,F,NULL);
91 /* Test if 'fault' is in the guard page at the top or bottom (depending on
92 offset being 0 or -1) of area+area_size */
93 bool factorvm::in_page(cell fault, cell area, cell area_size, int offset)
95 int pagesize = getpagesize();
97 area += offset * pagesize;
99 return fault >= area && fault <= area + pagesize;
102 void factorvm::memory_protection_error(cell addr, stack_frame *native_stack)
104 if(in_page(addr, ds_bot, 0, -1))
105 general_error(ERROR_DS_UNDERFLOW,F,F,native_stack);
106 else if(in_page(addr, ds_bot, ds_size, 0))
107 general_error(ERROR_DS_OVERFLOW,F,F,native_stack);
108 else if(in_page(addr, rs_bot, 0, -1))
109 general_error(ERROR_RS_UNDERFLOW,F,F,native_stack);
110 else if(in_page(addr, rs_bot, rs_size, 0))
111 general_error(ERROR_RS_OVERFLOW,F,F,native_stack);
112 else if(in_page(addr, nursery.end, 0, 0))
113 critical_error("allot_object() missed GC check",0);
115 general_error(ERROR_MEMORY,allot_cell(addr),F,native_stack);
118 void factorvm::signal_error(int signal, stack_frame *native_stack)
120 general_error(ERROR_SIGNAL,tag_fixnum(signal),F,native_stack);
123 void factorvm::divide_by_zero_error()
125 general_error(ERROR_DIVIDE_BY_ZERO,F,F,NULL);
128 void factorvm::fp_trap_error(unsigned int fpu_status, stack_frame *signal_callstack_top)
130 general_error(ERROR_FP_TRAP,tag_fixnum(fpu_status),F,signal_callstack_top);
133 inline void factorvm::vmprim_call_clear()
135 throw_impl(dpop(),stack_chain->callstack_bottom,this);
138 PRIMITIVE(call_clear)
140 PRIMITIVE_GETVM()->vmprim_call_clear();
143 /* For testing purposes */
144 inline void factorvm::vmprim_unimplemented()
146 not_implemented_error();
149 PRIMITIVE(unimplemented)
151 PRIMITIVE_GETVM()->vmprim_unimplemented();
154 void factorvm::memory_signal_handler_impl()
156 memory_protection_error(signal_fault_addr,signal_callstack_top);
159 void memory_signal_handler_impl()
161 SIGNAL_VM_PTR()->memory_signal_handler_impl();
164 void factorvm::misc_signal_handler_impl()
166 signal_error(signal_number,signal_callstack_top);
169 void misc_signal_handler_impl()
171 SIGNAL_VM_PTR()->misc_signal_handler_impl();
174 void factorvm::fp_signal_handler_impl()
176 fp_trap_error(signal_fpu_status,signal_callstack_top);
179 void fp_signal_handler_impl()
181 SIGNAL_VM_PTR()->fp_signal_handler_impl();