diff --git a/objects/client.c b/objects/client.c index 94897aad0..e21c2ab93 100644 --- a/objects/client.c +++ b/objects/client.c @@ -2343,13 +2343,11 @@ luaA_client_swap(lua_State *L) luaA_object_push(L, swap); lua_pushboolean(L, true); luaA_object_emit_signal(L, -4, "swapped", 2); - lua_pop(L, 2); luaA_object_push(L, swap); luaA_object_push(L, c); lua_pushboolean(L, false); luaA_object_emit_signal(L, -3, "swapped", 2); - lua_pop(L, 3); } return 0; diff --git a/tests/test-client-swap.lua b/tests/test-client-swap.lua new file mode 100644 index 000000000..6ed96828c --- /dev/null +++ b/tests/test-client-swap.lua @@ -0,0 +1,33 @@ +-- Test if client's c:swap() corrupts the Lua stack + +local runner = require("_runner") +local test_client = require("_client") + +runner.run_steps({ + -- Spawn two clients + function(count) + if count == 1 then + test_client() + test_client() + end + if #client.get() >= 2 then + return true + end + end, + + -- Swap them + function() + assert(#client.get() == 2, #client.get()) + local c1 = client.get()[1] + local c2 = client.get()[2] + + c2:swap(c1) + c1:swap(c2) + c1:swap(c2) + c1:swap(c2) + c2:swap(c1) + return true + end, +}) + +-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80