fix out-of-order d'tor which garbles the lua stack.
authorRobin Gareus <robin@gareus.org>
Thu, 24 Mar 2016 21:53:59 +0000 (22:53 +0100)
committerRobin Gareus <robin@gareus.org>
Thu, 24 Mar 2016 21:54:20 +0000 (22:54 +0100)
gtk2_ardour/luainstance.cc

index b0b3a9ff25b62e7ecabba49b91bfccc1b3d2778b..188c2c8a935370c5f0dce94434bc3ef865724320 100644 (file)
@@ -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 */
+       }
 }