浏览代码

changed SEH exception handling on windows (fix stack overflow/access violation reports)

Nicolas Cannasse 3 年之前
父节点
当前提交
e3fb0c6979
共有 1 个文件被更改,包括 12 次插入7 次删除
  1. 12 7
      src/std/fun.c

+ 12 - 7
src/std/fun.c

@@ -434,13 +434,13 @@ DEFINE_PRIM(_DYN, call_method, _DYN _ARR);
 DEFINE_PRIM(_BOOL, is_prim_loaded, _DYN);
 
 #if defined(HL_VCC) && !defined(HL_XBO)
-static int throw_handler( int code ) {
-	switch( code ) {
+static LONG CALLBACK global_handler( PEXCEPTION_POINTERS inf ) {
+	switch( inf->ExceptionRecord->ExceptionCode ) {
 	case EXCEPTION_ACCESS_VIOLATION: hl_error("Access violation");
 	case EXCEPTION_STACK_OVERFLOW: hl_error("Stack overflow");
-	default: hl_error("Unknown runtime error");
+	default: break;
 	}
-	return EXCEPTION_CONTINUE_SEARCH;
+	return EXCEPTION_CONTINUE_SEARCH;
 }
 #endif
 
@@ -450,9 +450,14 @@ HL_PRIM vdynamic *hl_dyn_call_safe( vclosure *c, vdynamic **args, int nargs, boo
 	*isException = false;
 	hl_trap(trap, exc, on_exception);
 #	if defined(HL_VCC) && !defined(HL_XBO)
-	__try {
-		return hl_dyn_call(c,args,nargs);
-	} __except( throw_handler(GetExceptionCode()) ) {}
+	ULONG size = 32<<10;
+	SetThreadStackGuarantee(&size);
+	static bool first = true;
+	if( first ) {
+		first = false;
+		AddVectoredExceptionHandler(1,global_handler);
+	}
+	return hl_dyn_call(c,args,nargs);
 #	else
 	return hl_dyn_call(c,args,nargs);
 #	endif