void factor_vm::general_error(vm_error_type error, cell arg1, cell arg2)
{
+ faulting_p = true;
+
/* Reset local roots before allocating anything */
data_roots.clear();
bignum_roots.clear();
ctx->push(error_object);
+ faulting_p = false;
unwind_native_frames(special_objects[ERROR_HANDLER_QUOT],
ctx->callstack_top);
}
std::cout << "error: " << error << std::endl;
std::cout << "arg 1: "; print_obj(arg1); std::cout << std::endl;
std::cout << "arg 2: "; print_obj(arg2); std::cout << std::endl;
+ faulting_p = false;
factorbug();
}
}
{
if(code->safepoint_p(addr))
handle_safepoint();
+ else if(faulting_p)
+ fatal_error("Double fault", 0);
else if(ctx->datastack_seg->underflow_p(addr))
general_error(ERROR_DATASTACK_UNDERFLOW,false_object,false_object);
else if(ctx->datastack_seg->overflow_p(addr))
fep_disabled(false),
full_output(false),
last_nano_count(0),
- signal_callstack_seg(NULL)
+ signal_callstack_seg(NULL),
+ faulting_p(false)
{
primitive_reset_dispatch_stats();
}
/* Stack for signal handlers, only used on Unix */
segment *signal_callstack_seg;
+ /* Are we already handling a fault? Used to catch double memory faults */
+ bool faulting_p;
+
// contexts
context *new_context();
void init_context(context *ctx);