6 void factor_vm::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 factor_vm::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 factor_vm::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 factor_vm::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);
79 void factor_vm::type_error(cell type, cell tagged)
81 general_error(ERROR_TYPE,tag_fixnum(type),tagged,NULL);
84 void factor_vm::not_implemented_error()
86 general_error(ERROR_NOT_IMPLEMENTED,F,F,NULL);
89 /* Test if 'fault' is in the guard page at the top or bottom (depending on
90 offset being 0 or -1) of area+area_size */
91 bool factor_vm::in_page(cell fault, cell area, cell area_size, int offset)
93 int pagesize = getpagesize();
95 area += offset * pagesize;
97 return fault >= area && fault <= area + pagesize;
100 void factor_vm::memory_protection_error(cell addr, stack_frame *native_stack)
102 if(in_page(addr, ds_bot, 0, -1))
103 general_error(ERROR_DS_UNDERFLOW,F,F,native_stack);
104 else if(in_page(addr, ds_bot, ds_size, 0))
105 general_error(ERROR_DS_OVERFLOW,F,F,native_stack);
106 else if(in_page(addr, rs_bot, 0, -1))
107 general_error(ERROR_RS_UNDERFLOW,F,F,native_stack);
108 else if(in_page(addr, rs_bot, rs_size, 0))
109 general_error(ERROR_RS_OVERFLOW,F,F,native_stack);
110 else if(in_page(addr, nursery.end, 0, 0))
111 critical_error("allot_object() missed GC check",0);
113 general_error(ERROR_MEMORY,allot_cell(addr),F,native_stack);
116 void factor_vm::signal_error(int signal, stack_frame *native_stack)
118 general_error(ERROR_SIGNAL,tag_fixnum(signal),F,native_stack);
121 void factor_vm::divide_by_zero_error()
123 general_error(ERROR_DIVIDE_BY_ZERO,F,F,NULL);
126 void factor_vm::fp_trap_error(unsigned int fpu_status, stack_frame *signal_callstack_top)
128 general_error(ERROR_FP_TRAP,tag_fixnum(fpu_status),F,signal_callstack_top);
131 inline void factor_vm::primitive_call_clear()
133 throw_impl(dpop(),stack_chain->callstack_bottom,this);
136 PRIMITIVE_FORWARD(call_clear)
138 /* For testing purposes */
139 inline void factor_vm::primitive_unimplemented()
141 not_implemented_error();
144 PRIMITIVE_FORWARD(unimplemented)
146 void factor_vm::memory_signal_handler_impl()
148 memory_protection_error(signal_fault_addr,signal_callstack_top);
151 void memory_signal_handler_impl()
153 SIGNAL_VM_PTR()->memory_signal_handler_impl();
156 void factor_vm::misc_signal_handler_impl()
158 signal_error(signal_number,signal_callstack_top);
161 void misc_signal_handler_impl()
163 SIGNAL_VM_PTR()->misc_signal_handler_impl();
166 void factor_vm::fp_signal_handler_impl()
168 fp_trap_error(signal_fpu_status,signal_callstack_top);
171 void fp_signal_handler_impl()
173 SIGNAL_VM_PTR()->fp_signal_handler_impl();