}
lua_settop(L, 2); // Return the effect itself.
+
+ // Make sure Lua doesn't garbage-collect it away.
+ lua_pushvalue(L, -1);
+ luaL_ref(L, LUA_REGISTRYINDEX); // TODO: leak?
+
return 1;
}
lua_getglobal(L, "num_channels");
if (lua_pcall(L, 0, 1, 0) != 0) {
- fprintf(stderr, "error running function `num_channels': %s", lua_tostring(L, -1));
+ fprintf(stderr, "error running function `num_channels': %s\n", lua_tostring(L, -1));
exit(1);
}
lua_pushnumber(L, height);
if (lua_pcall(L, 4, 2, 0) != 0) {
- fprintf(stderr, "error running function `get_chain': %s", lua_tostring(L, -1));
+ fprintf(stderr, "error running function `get_chain': %s\n", lua_tostring(L, -1));
exit(1);
}
// Set up state, including connecting signals.
lua_rawgeti(L, LUA_REGISTRYINDEX, funcref);
- lua_pcall(L, 0, 0, 0);
+ if (lua_pcall(L, 0, 0, 0) != 0) {
+ fprintf(stderr, "error running chain setup callback: %s\n", lua_tostring(L, -1));
+ exit(1);
+ }
});
}
lua_pushnumber(L, t);
if (lua_pcall(L, 2, 0, 0) != 0) {
- fprintf(stderr, "error running function `transition_clicked': %s", lua_tostring(L, -1));
+ fprintf(stderr, "error running function `transition_clicked': %s\n", lua_tostring(L, -1));
exit(1);
}
}