summaryrefslogtreecommitdiff
path: root/src/lj_err.c
diff options
context:
space:
mode:
authorMike Pall <mike>2013-05-15 18:48:06 +0200
committerMike Pall <mike>2013-05-15 18:48:06 +0200
commit1a5fd521b830a8aa17c12d2e707d167722e8c7b1 (patch)
treea0be7368eb957e64b98f4af7637b3a3cb0965469 /src/lj_err.c
parent23aa02fb51ea8d9f45bad9e533fcb277ad858064 (diff)
downloadluajit2-1a5fd521b830a8aa17c12d2e707d167722e8c7b1.tar.gz
Add partial support for building with MingW64 GCC 4.8-SEH.
Error handling works, C++ interoperability generally works. C++ destructors in libs compiled with G++ cause trouble (ok with MSVC).
Diffstat (limited to 'src/lj_err.c')
-rw-r--r--src/lj_err.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/src/lj_err.c b/src/lj_err.c
index 4a33a233..42cd12b4 100644
--- a/src/lj_err.c
+++ b/src/lj_err.c
@@ -385,12 +385,17 @@ typedef struct UndocumentedDispatcherContext {
ULONG Fill0;
} UndocumentedDispatcherContext;
-#ifdef _MSC_VER
/* Another wild guess. */
-extern __DestructExceptionObject(EXCEPTION_RECORD *rec, int nothrow);
+extern void __DestructExceptionObject(EXCEPTION_RECORD *rec, int nothrow);
+
+#ifdef MINGW_SDK_INIT
+/* Workaround for broken MinGW64 declaration. */
+VOID RtlUnwindEx_FIXED(PVOID,PVOID,PVOID,PVOID,PVOID,PVOID) asm("RtlUnwindEx");
+#define RtlUnwindEx RtlUnwindEx_FIXED
#endif
#define LJ_MSVC_EXCODE ((DWORD)0xe06d7363)
+#define LJ_GCC_EXCODE ((DWORD)0x20474343)
#define LJ_EXCODE ((DWORD)0xe24c4a00)
#define LJ_EXCODE_MAKE(c) (LJ_EXCODE | (DWORD)(c))
@@ -410,10 +415,9 @@ LJ_FUNCA EXCEPTION_DISPOSITION lj_err_unwind_win64(EXCEPTION_RECORD *rec,
} else {
void *cf2 = err_unwind(L, cf, 0);
if (cf2) { /* We catch it, so start unwinding the upper frames. */
- if (rec->ExceptionCode == LJ_MSVC_EXCODE) {
-#ifdef _MSC_VER
+ if (rec->ExceptionCode == LJ_MSVC_EXCODE ||
+ rec->ExceptionCode == LJ_GCC_EXCODE) {
__DestructExceptionObject(rec, 1);
-#endif
setstrV(L, L->top++, lj_err_str(L, LJ_ERR_ERRCPP));
} else if (!LJ_EXCODE_CHECK(rec->ExceptionCode)) {
/* Don't catch access violations etc. */
@@ -426,7 +430,7 @@ LJ_FUNCA EXCEPTION_DISPOSITION lj_err_unwind_win64(EXCEPTION_RECORD *rec,
RtlUnwindEx(cf, (void *)((cframe_unwind_ff(cf2) && errcode != LUA_YIELD) ?
lj_vm_unwind_ff_eh :
lj_vm_unwind_c_eh),
- rec, (void *)errcode, ctx, dispatch->HistoryTable);
+ rec, (void *)(uintptr_t)errcode, ctx, dispatch->HistoryTable);
/* RtlUnwindEx should never return. */
}
}