From 7bb19337348e09ed8c8d9f9d7dd3331b23ac08ef Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Thu, 24 Mar 2016 22:53:59 +0100 Subject: fix out-of-order d'tor which garbles the lua stack. --- gtk2_ardour/luainstance.cc | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) (limited to 'gtk2_ardour/luainstance.cc') diff --git a/gtk2_ardour/luainstance.cc b/gtk2_ardour/luainstance.cc index b0b3a9ff25..188c2c8a93 100644 --- a/gtk2_ardour/luainstance.cc +++ b/gtk2_ardour/luainstance.cc @@ -1319,18 +1319,43 @@ LuaCallback::connect_2 (enum LuaSignal::LuaSignal ls, T ref, PBD::Signal2 void LuaCallback::proxy_0 (enum LuaSignal::LuaSignal ls, T ref) { - luabridge::LuaRef rv ((*_lua_call)((int)ls, ref)); - if (! rv.cast ()) { drop_callback (); /* EMIT SIGNAL */} + bool ok = true; + { + const luabridge::LuaRef& rv ((*_lua_call)((int)ls, ref)); + if (! rv.cast ()) { + ok = false; + } + } + /* destroy LuaRef ^^ first before calling drop_callback() */ + if (!ok) { + drop_callback (); /* EMIT SIGNAL */ + } } template void LuaCallback::proxy_1 (enum LuaSignal::LuaSignal ls, T ref, C1 a1) { - luabridge::LuaRef rv ((*_lua_call)((int)ls, ref, a1)); - if (! rv.cast ()) { drop_callback (); /* EMIT SIGNAL */} + bool ok = true; + { + const luabridge::LuaRef& rv ((*_lua_call)((int)ls, ref, a1)); + if (! rv.cast ()) { + ok = false; + } + } + if (!ok) { + drop_callback (); /* EMIT SIGNAL */ + } } template void LuaCallback::proxy_2 (enum LuaSignal::LuaSignal ls, T ref, C1 a1, C2 a2) { - luabridge::LuaRef rv ((*_lua_call)((int)ls, ref, a1, a2)); - if (! rv.cast ()) { drop_callback (); /* EMIT SIGNAL */} + bool ok = true; + { + const luabridge::LuaRef& rv ((*_lua_call)((int)ls, ref, a1, a2)); + if (! rv.cast ()) { + ok = false; + } + } + if (!ok) { + drop_callback (); /* EMIT SIGNAL */ + } } -- cgit v1.2.3