@@ -4,18 +4,21 @@ use crate::trampoline::Trampoline;
44use std:: cell:: Cell ;
55use std:: ffi:: c_void;
66use std:: ptr:: { self , NonNull } ;
7- use wasmer_runtime_core:: error:: { RuntimeError , RuntimeResult } ;
87use wasmer_runtime_core:: typed_func:: WasmTrapInfo ;
98use wasmer_runtime_core:: vm:: Ctx ;
109use wasmer_runtime_core:: vm:: Func ;
1110use wasmer_win_exception_handler:: CallProtectedData ;
1211pub use wasmer_win_exception_handler:: _call_protected;
1312use winapi:: shared:: minwindef:: DWORD ;
1413use winapi:: um:: minwinbase:: {
15- EXCEPTION_ACCESS_VIOLATION , EXCEPTION_FLT_DENORMAL_OPERAND , EXCEPTION_FLT_DIVIDE_BY_ZERO ,
14+ EXCEPTION_ACCESS_VIOLATION , EXCEPTION_ARRAY_BOUNDS_EXCEEDED , EXCEPTION_BREAKPOINT ,
15+ EXCEPTION_DATATYPE_MISALIGNMENT , EXCEPTION_FLT_DENORMAL_OPERAND , EXCEPTION_FLT_DIVIDE_BY_ZERO ,
1616 EXCEPTION_FLT_INEXACT_RESULT , EXCEPTION_FLT_INVALID_OPERATION , EXCEPTION_FLT_OVERFLOW ,
17- EXCEPTION_FLT_STACK_CHECK , EXCEPTION_FLT_UNDERFLOW , EXCEPTION_ILLEGAL_INSTRUCTION ,
18- EXCEPTION_INT_DIVIDE_BY_ZERO , EXCEPTION_INT_OVERFLOW , EXCEPTION_STACK_OVERFLOW ,
17+ EXCEPTION_FLT_STACK_CHECK , EXCEPTION_FLT_UNDERFLOW , EXCEPTION_GUARD_PAGE ,
18+ EXCEPTION_ILLEGAL_INSTRUCTION , EXCEPTION_INT_DIVIDE_BY_ZERO , EXCEPTION_INT_OVERFLOW ,
19+ EXCEPTION_INVALID_HANDLE , EXCEPTION_IN_PAGE_ERROR , EXCEPTION_NONCONTINUABLE_EXCEPTION ,
20+ EXCEPTION_POSSIBLE_DEADLOCK , EXCEPTION_PRIV_INSTRUCTION , EXCEPTION_SINGLE_STEP ,
21+ EXCEPTION_STACK_OVERFLOW ,
1922} ;
2023
2124thread_local ! {
@@ -43,7 +46,7 @@ pub fn call_protected(
4346 }
4447
4548 let CallProtectedData {
46- code : signum ,
49+ code,
4750 exception_address,
4851 instruction_pointer,
4952 } = result. unwrap_err ( ) ;
@@ -53,7 +56,7 @@ pub fn call_protected(
5356 srcloc : _,
5457 } ) = handler_data. lookup ( instruction_pointer as _ )
5558 {
56- Err ( CallProtError :: Trap ( match signum as DWORD {
59+ Err ( CallProtError :: Trap ( match code as DWORD {
5760 EXCEPTION_ACCESS_VIOLATION => WasmTrapInfo :: MemoryOutOfBounds ,
5861 EXCEPTION_ILLEGAL_INSTRUCTION => match trapcode {
5962 TrapCode :: BadSignature => WasmTrapInfo :: IncorrectCallIndirectSignature ,
@@ -70,7 +73,7 @@ pub fn call_protected(
7073 _ => WasmTrapInfo :: Unknown ,
7174 } ) )
7275 } else {
73- let signal = match signum as DWORD {
76+ let signal = match code as DWORD {
7477 EXCEPTION_FLT_DENORMAL_OPERAND
7578 | EXCEPTION_FLT_DIVIDE_BY_ZERO
7679 | EXCEPTION_FLT_INEXACT_RESULT
@@ -80,10 +83,26 @@ pub fn call_protected(
8083 | EXCEPTION_FLT_UNDERFLOW => "floating-point exception" ,
8184 EXCEPTION_ILLEGAL_INSTRUCTION => "illegal instruction" ,
8285 EXCEPTION_ACCESS_VIOLATION => "segmentation violation" ,
83- _ => "unkown trapped signal" ,
86+ EXCEPTION_DATATYPE_MISALIGNMENT => "datatype misalignment" ,
87+ EXCEPTION_BREAKPOINT => "breakpoint" ,
88+ EXCEPTION_SINGLE_STEP => "single step" ,
89+ EXCEPTION_ARRAY_BOUNDS_EXCEEDED => "array bounds exceeded" ,
90+ EXCEPTION_INT_DIVIDE_BY_ZERO => "int div by zero" ,
91+ EXCEPTION_INT_OVERFLOW => "int overflow" ,
92+ EXCEPTION_PRIV_INSTRUCTION => "priv instruction" ,
93+ EXCEPTION_IN_PAGE_ERROR => "in page error" ,
94+ EXCEPTION_NONCONTINUABLE_EXCEPTION => "non continuable exception" ,
95+ EXCEPTION_STACK_OVERFLOW => "stack overflow" ,
96+ EXCEPTION_GUARD_PAGE => "guard page" ,
97+ EXCEPTION_INVALID_HANDLE => "invalid handle" ,
98+ EXCEPTION_POSSIBLE_DEADLOCK => "possible deadlock" ,
99+ _ => "unknown exception code" ,
84100 } ;
85101
86- let s = format ! ( "unknown trap at {} - {}" , exception_address, signal) ;
102+ let s = format ! (
103+ "unhandled trap at {:x} - code #{:x}: {}" ,
104+ exception_address, code, signal,
105+ ) ;
87106
88107 Err ( CallProtError :: Error ( Box :: new ( s) ) )
89108 }
0 commit comments