Initial revision of lua 'doc' function

This commit is contained in:
2021-12-15 23:03:43 -05:00
parent e0001127c7
commit 1cfdb4fa09
22 changed files with 301 additions and 199 deletions

View File

@@ -6,9 +6,10 @@ LuaSpecial LuaRegistry(LUA_REGISTRYINDEX);
LuaNilMarker LuaNil;
LuaNewTableMarker LuaNewTable;
LuaFunctionReg::LuaFunctionReg(const char *m, const char *n, lua_CFunction f) {
mode_ = m;
LuaFunctionReg::LuaFunctionReg(const char *n, const char *a, const char *d, lua_CFunction f) {
name_ = n;
args_ = a;
docs_ = d;
func_ = f;
next_ = LuaFunctionRegistry;
LuaFunctionRegistry = this;
@@ -22,6 +23,15 @@ LuaFunctionReg::List LuaFunctionReg::all() {
return result;
}
const LuaFunctionReg *LuaFunctionReg::lookup(lua_CFunction fn) {
for (const LuaFunctionReg *r = LuaFunctionRegistry; r != 0; r = r->next_) {
if (r->func_ == fn) {
return r;
}
}
return nullptr;
}
LuaFunctionReg *LuaFunctionReg::LuaFunctionRegistry;
bool LuaStack::issortablekey(LuaSlot s) const {
@@ -350,6 +360,31 @@ int LuaStack::rawlen(LuaSlot obj) const {
return lua_rawlen(L_, obj.index());
}
std::string LuaStack::get_function_name(LuaSlot fn) {
LuaVar globals, key, val, skey, sval;
LuaStack LS(L_, globals, key, val, skey, sval);
LS.getglobaltable(globals);
LS.set(key, LuaNil);
while (LS.next(globals, key, val)) {
if (LS.isstring(key)) {
if (LS.rawequal(val, fn)) {
return LS.ckstring(key);
}
if (LS.istable(val)) {
LS.set(skey, LuaNil);
while (LS.next(val, skey, sval)) {
if (LS.isstring(skey) && LS.rawequal(sval, fn)) {
std::string n1 = LS.ckstring(key);
std::string n2 = LS.ckstring(skey);
return n1 + "." + n2;
}
}
}
}
}
return "";
}
int LuaStack::gettabletype(LuaSlot tab) const {
uint16_t bits = lua_getflagbits(L_, tab.index());
return LUA_TT_GENERAL + (bits & 0x000F);