aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Makefile3
-rw-r--r--src/lj_ccall.c4
-rw-r--r--src/lj_ccallback.c4
-rw-r--r--src/lj_err.c16
4 files changed, 16 insertions, 11 deletions
diff --git a/src/Makefile b/src/Makefile
index 278324a1..84b3355d 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -487,7 +487,8 @@ TARGET_DEP= $(LIB_VMDEF) $(LUAJIT_SO)
487 487
488ifeq (Windows,$(TARGET_SYS)) 488ifeq (Windows,$(TARGET_SYS))
489 TARGET_DYNCC= $(STATIC_CC) 489 TARGET_DYNCC= $(STATIC_CC)
490 LJVM_MODE= coffasm 490 LJVM_MODE= peobj
491 LJVM_BOUT= $(LJVM_O)
491 LUAJIT_T= luajit.exe 492 LUAJIT_T= luajit.exe
492 ifeq (cygwin,$(HOST_MSYS)) 493 ifeq (cygwin,$(HOST_MSYS))
493 LUAJIT_SO= cyg$(TARGET_DLLNAME) 494 LUAJIT_SO= cyg$(TARGET_DLLNAME)
diff --git a/src/lj_ccall.c b/src/lj_ccall.c
index 6196364a..92c52252 100644
--- a/src/lj_ccall.c
+++ b/src/lj_ccall.c
@@ -103,9 +103,9 @@
103/* Windows/x64 argument registers are strictly positional (use ngpr). */ 103/* Windows/x64 argument registers are strictly positional (use ngpr). */
104#define CCALL_HANDLE_REGARG \ 104#define CCALL_HANDLE_REGARG \
105 if (isfp) { \ 105 if (isfp) { \
106 if (ngpr < 4) { dp = &cc->fpr[ngpr++]; nfpr = ngpr; goto done; } \ 106 if (ngpr < maxgpr) { dp = &cc->fpr[ngpr++]; nfpr = ngpr; goto done; } \
107 } else { \ 107 } else { \
108 if (ngpr < 4) { dp = &cc->gpr[ngpr++]; goto done; } \ 108 if (ngpr < maxgpr) { dp = &cc->gpr[ngpr++]; goto done; } \
109 } 109 }
110 110
111#elif LJ_TARGET_X64 111#elif LJ_TARGET_X64
diff --git a/src/lj_ccallback.c b/src/lj_ccallback.c
index a3a0d798..00109923 100644
--- a/src/lj_ccallback.c
+++ b/src/lj_ccallback.c
@@ -286,9 +286,9 @@ void lj_ccallback_mcode_free(CTState *cts)
286/* Windows/x64 argument registers are strictly positional (use ngpr). */ 286/* Windows/x64 argument registers are strictly positional (use ngpr). */
287#define CALLBACK_HANDLE_REGARG \ 287#define CALLBACK_HANDLE_REGARG \
288 if (isfp) { \ 288 if (isfp) { \
289 if (ngpr < 4) { sp = &cts->cb.fpr[ngpr++]; nfpr = ngpr; goto done; } \ 289 if (ngpr < maxgpr) { sp = &cts->cb.fpr[ngpr++]; UNUSED(nfpr); goto done; } \
290 } else { \ 290 } else { \
291 if (ngpr < 4) { sp = &cts->cb.gpr[ngpr++]; goto done; } \ 291 if (ngpr < maxgpr) { sp = &cts->cb.gpr[ngpr++]; goto done; } \
292 } 292 }
293 293
294#elif LJ_TARGET_X64 294#elif LJ_TARGET_X64
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 {
385 ULONG Fill0; 385 ULONG Fill0;
386} UndocumentedDispatcherContext; 386} UndocumentedDispatcherContext;
387 387
388#ifdef _MSC_VER
389/* Another wild guess. */ 388/* Another wild guess. */
390extern __DestructExceptionObject(EXCEPTION_RECORD *rec, int nothrow); 389extern void __DestructExceptionObject(EXCEPTION_RECORD *rec, int nothrow);
390
391#ifdef MINGW_SDK_INIT
392/* Workaround for broken MinGW64 declaration. */
393VOID RtlUnwindEx_FIXED(PVOID,PVOID,PVOID,PVOID,PVOID,PVOID) asm("RtlUnwindEx");
394#define RtlUnwindEx RtlUnwindEx_FIXED
391#endif 395#endif
392 396
393#define LJ_MSVC_EXCODE ((DWORD)0xe06d7363) 397#define LJ_MSVC_EXCODE ((DWORD)0xe06d7363)
398#define LJ_GCC_EXCODE ((DWORD)0x20474343)
394 399
395#define LJ_EXCODE ((DWORD)0xe24c4a00) 400#define LJ_EXCODE ((DWORD)0xe24c4a00)
396#define LJ_EXCODE_MAKE(c) (LJ_EXCODE | (DWORD)(c)) 401#define LJ_EXCODE_MAKE(c) (LJ_EXCODE | (DWORD)(c))
@@ -410,10 +415,9 @@ LJ_FUNCA EXCEPTION_DISPOSITION lj_err_unwind_win64(EXCEPTION_RECORD *rec,
410 } else { 415 } else {
411 void *cf2 = err_unwind(L, cf, 0); 416 void *cf2 = err_unwind(L, cf, 0);
412 if (cf2) { /* We catch it, so start unwinding the upper frames. */ 417 if (cf2) { /* We catch it, so start unwinding the upper frames. */
413 if (rec->ExceptionCode == LJ_MSVC_EXCODE) { 418 if (rec->ExceptionCode == LJ_MSVC_EXCODE ||
414#ifdef _MSC_VER 419 rec->ExceptionCode == LJ_GCC_EXCODE) {
415 __DestructExceptionObject(rec, 1); 420 __DestructExceptionObject(rec, 1);
416#endif
417 setstrV(L, L->top++, lj_err_str(L, LJ_ERR_ERRCPP)); 421 setstrV(L, L->top++, lj_err_str(L, LJ_ERR_ERRCPP));
418 } else if (!LJ_EXCODE_CHECK(rec->ExceptionCode)) { 422 } else if (!LJ_EXCODE_CHECK(rec->ExceptionCode)) {
419 /* Don't catch access violations etc. */ 423 /* Don't catch access violations etc. */
@@ -426,7 +430,7 @@ LJ_FUNCA EXCEPTION_DISPOSITION lj_err_unwind_win64(EXCEPTION_RECORD *rec,
426 RtlUnwindEx(cf, (void *)((cframe_unwind_ff(cf2) && errcode != LUA_YIELD) ? 430 RtlUnwindEx(cf, (void *)((cframe_unwind_ff(cf2) && errcode != LUA_YIELD) ?
427 lj_vm_unwind_ff_eh : 431 lj_vm_unwind_ff_eh :
428 lj_vm_unwind_c_eh), 432 lj_vm_unwind_c_eh),
429 rec, (void *)errcode, ctx, dispatch->HistoryTable); 433 rec, (void *)(uintptr_t)errcode, ctx, dispatch->HistoryTable);
430 /* RtlUnwindEx should never return. */ 434 /* RtlUnwindEx should never return. */
431 } 435 }
432 } 436 }