diff options
author | Mike Pall <mike> | 2013-05-15 18:48:06 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2013-05-15 18:48:06 +0200 |
commit | 1a5fd521b830a8aa17c12d2e707d167722e8c7b1 (patch) | |
tree | a0be7368eb957e64b98f4af7637b3a3cb0965469 /src/lj_err.c | |
parent | 23aa02fb51ea8d9f45bad9e533fcb277ad858064 (diff) | |
download | luajit2-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.c | 16 |
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. */ } } |