]> gitweb.factorcode.org Git - factor.git/commitdiff
vm: die if we fault in a fault
authorJoe Groff <arcata@gmail.com>
Wed, 2 Nov 2011 01:22:46 +0000 (18:22 -0700)
committerJoe Groff <arcata@gmail.com>
Wed, 2 Nov 2011 20:23:16 +0000 (13:23 -0700)
vm/errors.cpp
vm/vm.cpp
vm/vm.hpp

index bbf02c2db20f0cdb0a6ce8c5aa4b32dc2ec0e78a..dcc3a54eb20e0342067b32feeb0fdf0654b47bf5 100755 (executable)
@@ -29,6 +29,8 @@ void out_of_memory()
 
 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();
@@ -57,6 +59,7 @@ void factor_vm::general_error(vm_error_type error, cell arg1, cell arg2)
 
                ctx->push(error_object);
 
+               faulting_p = false;
                unwind_native_frames(special_objects[ERROR_HANDLER_QUOT],
                        ctx->callstack_top);
        }
@@ -68,6 +71,7 @@ void factor_vm::general_error(vm_error_type error, cell arg1, cell arg2)
                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();
        }
 }
@@ -86,6 +90,8 @@ void factor_vm::memory_protection_error(cell addr)
 {
        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))
index 287db660e507bccc1ab3dca1bd8c0524855f1f78..0f921e76a090e0de0be72486f767141156e80e06 100755 (executable)
--- a/vm/vm.cpp
+++ b/vm/vm.cpp
@@ -18,7 +18,8 @@ factor_vm::factor_vm() :
        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();
 }
index a167e487e5f322a747e2d969e2ada1366480b275..f4c765d6450746b189355f570e985861bdc3925a 100755 (executable)
--- a/vm/vm.hpp
+++ b/vm/vm.hpp
@@ -134,6 +134,9 @@ struct factor_vm
        /* 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);