]> gitweb.factorcode.org Git - factor.git/blobdiff - vm/os-windows-nt.cpp
Split data out into separate vm-data struct
[factor.git] / vm / os-windows-nt.cpp
index ee00e1434a893f15a7e16e69fbd87fbc99446a87..988ce60a8a62ffd8f6f3e03b7775b479d82aebd2 100755 (executable)
@@ -39,21 +39,20 @@ s64 current_micros()
                - EPOCH_OFFSET) / 10;
 }
 
-FACTOR_STDCALL LONG exception_handler(PEXCEPTION_POINTERS pe)
+LONG factorvm::exception_handler(PEXCEPTION_POINTERS pe)
 {
-       factorvm *myvm = SIGNAL_VM_PTR();
        PEXCEPTION_RECORD e = (PEXCEPTION_RECORD)pe->ExceptionRecord;
        CONTEXT *c = (CONTEXT*)pe->ContextRecord;
 
-       if(myvm->in_code_heap_p(c->EIP))
-               myvm->signal_callstack_top = (stack_frame *)c->ESP;
+       if(in_code_heap_p(c->EIP))
+               signal_callstack_top = (stack_frame *)c->ESP;
        else
-               myvm->signal_callstack_top = NULL;
+               signal_callstack_top = NULL;
 
     switch (e->ExceptionCode) {
     case EXCEPTION_ACCESS_VIOLATION:
-               myvm->signal_fault_addr = e->ExceptionInformation[1];
-               c->EIP = (cell)memory_signal_handler_impl;
+               signal_fault_addr = e->ExceptionInformation[1];
+               c->EIP = (cell)factor::memory_signal_handler_impl;
        break;
 
        case STATUS_FLOAT_DENORMAL_OPERAND:
@@ -65,10 +64,10 @@ FACTOR_STDCALL LONG exception_handler(PEXCEPTION_POINTERS pe)
        case STATUS_FLOAT_UNDERFLOW:
        case STATUS_FLOAT_MULTIPLE_FAULTS:
        case STATUS_FLOAT_MULTIPLE_TRAPS:
-               myvm->signal_fpu_status = fpu_status(X87SW(c) | MXCSR(c));
+               signal_fpu_status = fpu_status(X87SW(c) | MXCSR(c));
                X87SW(c) = 0;
                MXCSR(c) &= 0xffffffc0;
-               c->EIP = (cell)fp_signal_handler_impl;
+               c->EIP = (cell)factor::fp_signal_handler_impl;
                break;
        case 0x40010006:
                /* If the Widcomm bluetooth stack is installed, the BTTray.exe
@@ -79,24 +78,30 @@ FACTOR_STDCALL LONG exception_handler(PEXCEPTION_POINTERS pe)
                enabled. Don't really have any idea what this exception means. */
                break;
        default:
-               myvm->signal_number = e->ExceptionCode;
-               c->EIP = (cell)misc_signal_handler_impl;
+               signal_number = e->ExceptionCode;
+               c->EIP = (cell)factor::misc_signal_handler_impl;
                break;
        }
        return EXCEPTION_CONTINUE_EXECUTION;
 }
 
+
+FACTOR_STDCALL LONG exception_handler(PEXCEPTION_POINTERS pe)
+{
+       return SIGNAL_VM_PTR()->exception_handler(pe);
+}
+
 bool handler_added = 0;
 
 void factorvm::c_to_factor_toplevel(cell quot)
 {
        if(!handler_added){
-               if(!AddVectoredExceptionHandler(0, (PVECTORED_EXCEPTION_HANDLER)exception_handler))
+               if(!AddVectoredExceptionHandler(0, (PVECTORED_EXCEPTION_HANDLER)factor::exception_handler))
                        fatal_error("AddVectoredExceptionHandler failed", 0);
                handler_added = 1;
        }
        c_to_factor(quot,this);
-       RemoveVectoredExceptionHandler((void *)exception_handler);
+       RemoveVectoredExceptionHandler((void *)factor::exception_handler);
 }
 
 void factorvm::open_console()