[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: LuaJIT and C++ exception
- From: Mike Pall <mikelu-1010@...>
- Date: Mon, 18 Oct 2010 15:48:43 +0200
Andrea wrote:
> The problem is that Visual Studio reports that the 2nd exception
> is unhandled and basically ignores it.
>
> This works fine with Lua (non jit).
Well, looks like the SEH chains got messed up on Windows/x86. :-(
Lua uses setjmp/longjmp from MSVC. Even though MSDN suggests that
mixing this with C++ exceptions is not safe, the longjmp from MSVC
cleans up the SEH chain. But I can't use setjmp/longjmp in LuaJIT.
As a workaround I tried manual unwinding of SEH chains, but that
didn't work at all. Neither does RtlUnwind() do the right thing on
x86 in this case. So I don't think I can provide an out-of-the-box
solution for this in LuaJIT.
> As soon as lua_error is in a function that contains try{}catch{}
> it fails. Mind you, lua_error is *outside* the try{}catch{},
> *not* in the catch, but still in the same function (like the
> link above).
MSVC optimizes functions with try/catch constructs by adding a
single SEH frame for the whole function. So even if you use
lua_error() outside of the catch, there's still an SEH frame
around it which needs to be cleaned up.
Your options are:
- Wrap the try/catch in a separate C++ function declared as
__declspec(noinline). Call that from a function without
try/catch and then run lua_error() from there.
- Use either Linux or Windows/x64 which have much better C++
exception handling interoperability.
--Mike