Change how class tables are created and recreated for greater robustness

This commit is contained in:
2023-03-17 13:31:10 -04:00
parent a8c780563f
commit 5ede3f507c
4 changed files with 71 additions and 46 deletions

View File

@@ -245,26 +245,24 @@ void SourceDB::update(const util::LuaSourceVec &source) {
LS.result();
}
// Delete everything from the global environment except
// the class tables.
// Delete everything from the global environment.
// Clear all the classes in the registry classes table.
//
static void source_clear_globals(lua_State *L) {
LuaVar classname, classtab, key, globtab;
LuaStack LS(L, classname, classtab, key, globtab);
LuaVar classname, classtab, key, globtab, classes;
LuaStack LS(L, classname, classtab, key, globtab, classes);
LS.getglobaltable(globtab);
LS.rawset(globtab, "_G", LuaNil);
LS.set(classname, LuaNil);
while (LS.next(globtab, classname, classtab) != 0) {
if (LS.rawequal(globtab, classtab)) {
LS.rawset(globtab, classname, LuaNil);
} else if (LS.istable(classtab)) {
LS.cleartable(classtab, true);
} else {
LS.rawset(globtab, classname, LuaNil);
}
}
LS.cleartable(globtab, true);
LS.rawset(globtab, "_G", globtab);
LS.rawget(classes, LuaRegistry, "classes");
assert(LS.istable(classes));
LS.set(classname, LuaNil);
while (LS.next(classes, classname, classtab) != 0) {
assert(LS.istable(classtab));
LS.cleartable(classtab, true);
}
LS.result();
}