From: John L. <jla...@gm...> - 2013-07-20 18:26:34
|
On Fri, Jul 19, 2013 at 7:54 PM, Paul K <pau...@ya...> wrote: > Hi John, > > I've been looking into using twoface ABI mapper > (http://corsix.github.io/twoface/) to run ZeroBrane Studio on top of > Lua 5.2 without recompiling wxlua and luasocket (both are compiled for > Lua 5.1). For those not familiar with it, it allows to run Lua 5.2 > engine with modules compiled for Lua 5.1 without any changes to those > modules. In my case, I use it with ZBS that is compiled for Lua 5.1 > and can make it run with Lua 5.2 by replacing lua51.dll with a > different one (and adding lua52.dll). > > Interesting, but that means that they're emulating the removed functions and I wonder what their setfenv() does. > I have been able to run it with wxlua, but I ended up patching wxlua > in one place. For some reason when I ran it originally, I was getting > "wxLua: wxEvtHandler::Connect() in wxLuaEventCallback::OnEvent(), > callback function is not a Lua function." messages in more or less > random places. This error comes from an event handler check in > wxlcallb.cpp and it appears to be only active for Lua 5.1: > > #if LUA_VERSION_NUM < 502 > // lua_setfenv() is not in Lua 5.2 nor can you set an env for > a function anymore > wxlState.GetGlobals(); > if (wxlState.lua_SetFenv(-2) != 0) > #endif // LUA_VERSION_NUM < 502 > { > // Don't track the wxEvent since we don't own it and tracking > it > // causes clashes in the object registry table since many can > be > // created and deleted and the mem address is resused by C++. > wxlState.wxluaT_PushUserDataType(event, event_wxl_type, false); > wxlState.LuaPCall(1, 0); // one input no returns > } > #if LUA_VERSION_NUM < 502 > else > wxlState.wxlua_Error("wxLua: wxEvtHandler::Connect() in > wxLuaEventCallback::OnEvent(), callback function is not a Lua > function."); > #endif // LUA_VERSION_NUM < 502 > > I have never seen this error with 5.1 and am not sure what the purpose > of it is. Given that it doesn't even run for Lua 5.2, I completely > disabled this check and everything appears to be working as expected. > > It's there for backwards compatibility so that programs run as expected in 5.1, but in 5.2 things are a little different. See below. > Is there any reason for this check (especially given that it behaves > differently for lua 5.1 and 5.2) and is it possible to remove/disable > it? > > In < 5.2 wxLua used the globals as the environment for the callback function to give a uniform state. This was how it was before I took over wxLua and though it wasn't strictly necessary I didn't see any reason to change it. In 5.2 setfenv() function was removed and the environment for a function is set by the _ENV table which should be the first upvalue for the function. I believe that this is automatic so the 5.2 behavior should be more expected, but I haven't rigorously tested what happens with callbacks in modules or even if you swap out the _ENV before setting the callback. http://stackoverflow.com/questions/14290527/recreating-setfenv-in-lua-5-2 -------------------------------- Is there any way to detect when the twoface DLL is being used so that the code can take the 5.2 path? Or maybe compile wxLua for 5.2 and use woface to treat 5.1 as 5.2 instead of the other way around. Regards, John |