More work on redirect

This commit is contained in:
2026-06-02 18:34:03 -04:00
parent 6c9f75bfac
commit d951d2ab61
12 changed files with 298 additions and 201 deletions

View File

@@ -292,8 +292,8 @@ void SourceDB::update(const util::LuaSourceVec &source) {
// Clear all the classes in the registry classes table.
//
static void source_clear_globals(lua_State *L) {
LuaVar classname, classtab, key, globtab, classes;
LuaExtStack LS(L, classname, classtab, key, globtab, classes);
LuaVar classname, classtab, key, globtab, classes, funcnames;
LuaExtStack LS(L, classname, classtab, key, globtab, classes, funcnames);
LS.getglobaltable(globtab);
LS.cleartable(globtab, true);
@@ -306,8 +306,45 @@ static void source_clear_globals(lua_State *L) {
assert(LS.istable(classtab));
LS.cleartable(classtab, true);
}
LS.rawget(funcnames, LuaRegistry, "funcnames");
assert(LS.istable(funcnames));
LS.cleartable(funcnames, true);
}
void SourceDB::rebuild_funcnames() {
lua_State *L = lua_state_;
LuaVar globtab, funcnames, key, val, key2, val2;
LuaExtStack LS(L, globtab, funcnames, key, val, key2, val2);
LS.getglobaltable(globtab);
LS.rawget(funcnames, LuaRegistry, "funcnames");
// Top-level functions in the global environment.
LS.set(key, LuaNil);
while (LS.next(globtab, key, val) != 0) {
if (!LS.isstring(key)) continue;
if (LS.isfunction(val)) {
LS.rawset(funcnames, val, key);
}
}
// Functions one level deep inside class tables.
LS.set(key, LuaNil);
while (LS.next(globtab, key, val) != 0) {
if (!LS.isstring(key)) continue;
if (!LS.istable(val)) continue;
eng::string classname = LS.ckstring(key);
LS.set(key2, LuaNil);
while (LS.next(val, key2, val2) != 0) {
if (!LS.isstring(key2)) continue;
if (LS.isfunction(val2)) {
eng::string fullname = classname + "." + LS.ckstring(key2);
LS.rawset(funcnames, val2, fullname);
}
}
}
}
// Load all the 'LuaDefine' C functions into the lua state.
//
@@ -406,7 +443,7 @@ void SourceDB::rebuild_core() {
source_clear_globals(lua_state_);
source_load_cfunctions(lua_state_);
source_load_cconstants(lua_state_);
}
}
eng::string SourceDB::rebuild_module(const eng::string &mod) {
if (mod == "CORE") {