From 5d96ddc52a8775092d0aaccf40b34b6a6c56b870 Mon Sep 17 00:00:00 2001 From: kyren Date: Wed, 28 Feb 2018 14:43:15 -0500 Subject: [PATCH] Temporary fix for #71. Remove when rust #48251 is fixed in stable. --- Cargo.toml | 19 +++++++++++++++---- lua/luaconf.h | 12 +++++++++--- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index d61c140..d14518b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,10 +18,21 @@ default = ["builtin-lua"] # specialized version of lua into your binary, you can disable this feature to # do that, but care must be taken. `rlua` makes at least the following # assumptions about the linked lua library: -# * LUA_INTEGER is long long -# * LUA_NUMBER as double -# * LUA_EXTRASPACE is sizeof(void*) -# * LUAI_MAXSTACK is 1000000 +# * LUA_INTEGER is long long +# * LUA_NUMBER as double +# * LUA_EXTRASPACE is sizeof(void*) +# * LUAI_MAXSTACK is 1000000 +# * LUAI_THROW / LUAI_TRY are defined so that they are compatible with jumping +# over Rust stack frames. Rust is, as of the discussion around +# https://github.com/rust-lang/rust/issues/48251, intended to be compatible in +# at least a limited way with C libraries that use setjmp / longjmp error +# handling, but there are some caveats. The linked bug prevents calling into +# C APIs which use setjmp / longjmp handling *at all* on windows with at least +# the 1.24.0 version of the rust compiler, and it remains to be seen but +# potentially the 1.24.1 and 1.25 versions as well. Eventually the fix for +# this will make it into stable rust, but until then there is a fix in the +# bundled version of Lua to use __intrinsic_setjmp on windows instead of +# setjmp to avoid unwinding and triggering rust issue #48251. builtin-lua = ["gcc"] [dependencies] diff --git a/lua/luaconf.h b/lua/luaconf.h index f37bea0..d44d207 100644 --- a/lua/luaconf.h +++ b/lua/luaconf.h @@ -775,9 +775,15 @@ ** without modifying the main part of the file. */ - - - +/* +** rlua modification - fix for #71, temporary until the fix for +** https://github.com/rust-lang/rust/issues/48251 is in stable rust +*/ +#if defined(LUA_USE_WINDOWS) + #define LUAI_THROW(L,c) longjmp((c)->b, 1) + #define LUAI_TRY(L,c,a) if (__intrinsic_setjmp((c)->b, NULL) == 0) { a } + #define luai_jmpbuf jmp_buf +#endif #endif