6 void fatal_error(const char *msg, cell tagged)
8 std::cout << "fatal_error: " << msg;
9 std::cout << ": " << std::hex << tagged << std::dec;
10 std::cout << std::endl;
14 void critical_error(const char *msg, cell tagged)
16 std::cout << "You have triggered a bug in Factor. Please report.\n";
17 std::cout << "critical_error: " << msg;
18 std::cout << ": " << std::hex << tagged << std::dec;
19 std::cout << std::endl;
20 tls_vm()->factorbug();
25 std::cout << "Out of memory\n\n";
26 tls_vm()->dump_generations();
30 void factor_vm::throw_error(cell error, stack_frame *callstack_top)
32 /* If the error handler is set, we rewind any C stack frames and
33 pass the error to user-space. */
34 if(!current_gc && to_boolean(userenv[BREAK_ENV]))
36 /* If error was thrown during heap scan, we re-enable the GC */
39 /* Reset local roots */
43 /* If we had an underflow or overflow, stack pointers might be
49 /* Errors thrown from C code pass NULL for this parameter.
50 Errors thrown from Factor code, or signal handlers, pass the
51 actual stack pointer at the time, since the saved pointer is
52 not necessarily up to date at that point. */
54 callstack_top = fix_callstack_top(callstack_top,ctx->callstack_bottom);
56 callstack_top = ctx->callstack_top;
58 throw_impl(userenv[BREAK_ENV],callstack_top,this);
60 /* Error was thrown in early startup before error handler is set, just
64 std::cout << "You have triggered a bug in Factor. Please report.\n";
65 std::cout << "early_error: ";
67 std::cout << std::endl;
72 void factor_vm::general_error(vm_error_type error, cell arg1, cell arg2, stack_frame *callstack_top)
74 throw_error(allot_array_4(userenv[ERROR_ENV],
75 tag_fixnum(error),arg1,arg2),callstack_top);
78 void factor_vm::type_error(cell type, cell tagged)
80 general_error(ERROR_TYPE,tag_fixnum(type),tagged,NULL);
83 void factor_vm::not_implemented_error()
85 general_error(ERROR_NOT_IMPLEMENTED,false_object,false_object,NULL);
88 /* Test if 'fault' is in the guard page at the top or bottom (depending on
89 offset being 0 or -1) of area+area_size */
90 bool factor_vm::in_page(cell fault, cell area, cell area_size, int offset)
92 int pagesize = getpagesize();
94 area += offset * pagesize;
96 return fault >= area && fault <= area + pagesize;
99 void factor_vm::memory_protection_error(cell addr, stack_frame *native_stack)
101 if(in_page(addr, ds_bot, 0, -1))
102 general_error(ERROR_DS_UNDERFLOW,false_object,false_object,native_stack);
103 else if(in_page(addr, ds_bot, ds_size, 0))
104 general_error(ERROR_DS_OVERFLOW,false_object,false_object,native_stack);
105 else if(in_page(addr, rs_bot, 0, -1))
106 general_error(ERROR_RS_UNDERFLOW,false_object,false_object,native_stack);
107 else if(in_page(addr, rs_bot, rs_size, 0))
108 general_error(ERROR_RS_OVERFLOW,false_object,false_object,native_stack);
109 else if(in_page(addr, nursery.end, 0, 0))
110 critical_error("allot_object() missed GC check",0);
112 general_error(ERROR_MEMORY,allot_cell(addr),false_object,native_stack);
115 void factor_vm::signal_error(int signal, stack_frame *native_stack)
117 general_error(ERROR_SIGNAL,allot_cell(signal),false_object,native_stack);
120 void factor_vm::divide_by_zero_error()
122 general_error(ERROR_DIVIDE_BY_ZERO,false_object,false_object,NULL);
125 void factor_vm::fp_trap_error(unsigned int fpu_status, stack_frame *signal_callstack_top)
127 general_error(ERROR_FP_TRAP,tag_fixnum(fpu_status),false_object,signal_callstack_top);
130 void factor_vm::primitive_call_clear()
132 throw_impl(dpop(),ctx->callstack_bottom,this);
135 /* For testing purposes */
136 void factor_vm::primitive_unimplemented()
138 not_implemented_error();
141 void factor_vm::memory_signal_handler_impl()
143 memory_protection_error(signal_fault_addr,signal_callstack_top);
146 void memory_signal_handler_impl()
148 tls_vm()->memory_signal_handler_impl();
151 void factor_vm::misc_signal_handler_impl()
153 signal_error(signal_number,signal_callstack_top);
156 void misc_signal_handler_impl()
158 tls_vm()->misc_signal_handler_impl();
161 void factor_vm::fp_signal_handler_impl()
163 fp_trap_error(signal_fpu_status,signal_callstack_top);
166 void fp_signal_handler_impl()
168 tls_vm()->fp_signal_handler_impl();