summaryrefslogtreecommitdiff
path: root/gtk2_ardour/luainstance.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2016-03-24 22:53:59 +0100
committerRobin Gareus <robin@gareus.org>2016-03-24 22:54:20 +0100
commit7bb19337348e09ed8c8d9f9d7dd3331b23ac08ef (patch)
tree3c59182e19eda46ceca3d16713c1049e128df2c7 /gtk2_ardour/luainstance.cc
parente0dedcf6e182d5dc2ce6a75e35c6480a32548c8d (diff)
fix out-of-order d'tor which garbles the lua stack.
Diffstat (limited to 'gtk2_ardour/luainstance.cc')
-rw-r--r--gtk2_ardour/luainstance.cc37
1 files changed, 31 insertions, 6 deletions
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,
template <typename T> void
LuaCallback::proxy_0 (enum LuaSignal::LuaSignal ls, T ref) {
- luabridge::LuaRef rv ((*_lua_call)((int)ls, ref));
- if (! rv.cast<bool> ()) { drop_callback (); /* EMIT SIGNAL */}
+ bool ok = true;
+ {
+ const luabridge::LuaRef& rv ((*_lua_call)((int)ls, ref));
+ if (! rv.cast<bool> ()) {
+ ok = false;
+ }
+ }
+ /* destroy LuaRef ^^ first before calling drop_callback() */
+ if (!ok) {
+ drop_callback (); /* EMIT SIGNAL */
+ }
}
template <typename T, typename C1> void
LuaCallback::proxy_1 (enum LuaSignal::LuaSignal ls, T ref, C1 a1) {
- luabridge::LuaRef rv ((*_lua_call)((int)ls, ref, a1));
- if (! rv.cast<bool> ()) { drop_callback (); /* EMIT SIGNAL */}
+ bool ok = true;
+ {
+ const luabridge::LuaRef& rv ((*_lua_call)((int)ls, ref, a1));
+ if (! rv.cast<bool> ()) {
+ ok = false;
+ }
+ }
+ if (!ok) {
+ drop_callback (); /* EMIT SIGNAL */
+ }
}
template <typename T, typename C1, typename C2> 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<bool> ()) { drop_callback (); /* EMIT SIGNAL */}
+ bool ok = true;
+ {
+ const luabridge::LuaRef& rv ((*_lua_call)((int)ls, ref, a1, a2));
+ if (! rv.cast<bool> ()) {
+ ok = false;
+ }
+ }
+ if (!ok) {
+ drop_callback (); /* EMIT SIGNAL */
+ }
}