Change how class tables are created and recreated for greater robustness
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user