Clean the Lua context after a script has run

This commit is contained in:
Matthias Schiffer 2014-09-28 20:41:37 +02:00
parent a5f288ca3f
commit 36d4c9298f

View file

@ -44,13 +44,7 @@ class ScriptContext {
private: private:
lua_State *L; lua_State *L;
public: void setupEnv() {
ScriptContext(const ScriptContext &other) = delete;
ScriptContext(ScriptContext &&other) = delete;
ScriptContext & operator=(const ScriptContext &other) = delete;
ScriptContext & operator=(ScriptContext &&other) = delete;
ScriptContext() {
const std::pair<const char *, lua_CFunction> libs[] = { const std::pair<const char *, lua_CFunction> libs[] = {
{"_G", luaopen_base}, {"_G", luaopen_base},
{"bit32", luaopen_bit32}, {"bit32", luaopen_bit32},
@ -59,8 +53,6 @@ public:
{"table", luaopen_table}, {"table", luaopen_table},
}; };
L = luaL_newstate();
for (auto &lib : libs) { for (auto &lib : libs) {
luaL_requiref(L, lib.first, lib.second, 1); luaL_requiref(L, lib.first, lib.second, 1);
lua_pop(L, 1); lua_pop(L, 1);
@ -70,6 +62,35 @@ public:
lua_pushnil(L); lua_pushnil(L);
lua_setglobal(L, f); lua_setglobal(L, f);
} }
}
void cleanupEnv() {
lua_pushglobaltable(L);
lua_pushnil(L);
lua_setmetatable(L, -2);
lua_pushnil(L);
while (lua_next(L, -2) != 0) {
lua_pop(L, 1);
lua_pushvalue(L, -1);
lua_pushnil(L);
lua_rawset(L, -4);
}
lua_pop(L, 1);
}
public:
ScriptContext(const ScriptContext &other) = delete;
ScriptContext(ScriptContext &&other) = delete;
ScriptContext & operator=(const ScriptContext &other) = delete;
ScriptContext & operator=(ScriptContext &&other) = delete;
ScriptContext() {
L = luaL_newstate();
lua_newtable(L); lua_newtable(L);
lua_rawsetp(L, LUA_REGISTRYINDEX, this); lua_rawsetp(L, LUA_REGISTRYINDEX, this);
@ -90,10 +111,15 @@ public:
} }
void run(const std::string &name) { void run(const std::string &name) {
setupEnv();
lua_rawgetp(L, LUA_REGISTRYINDEX, this); lua_rawgetp(L, LUA_REGISTRYINDEX, this);
lua_getfield(L, -1, name.c_str()); lua_getfield(L, -1, name.c_str());
lua_remove(L, -2); lua_remove(L, -2);
lua_call(L, 0, 0); lua_call(L, 0, 0);
cleanupEnv();
} }
}; };