2020-12-05 18:57:53 -05:00
|
|
|
#include "luastack.hpp"
|
2020-11-27 13:21:07 -05:00
|
|
|
#include "globaldb.hpp"
|
|
|
|
|
|
2021-01-12 14:14:38 -05:00
|
|
|
|
2021-12-15 23:03:43 -05:00
|
|
|
LuaDefine(global, "globalname", "get a table where global data can be stored") {
|
2020-11-27 13:21:07 -05:00
|
|
|
LuaArg globalname;
|
|
|
|
|
LuaRet globaltab;
|
|
|
|
|
LuaVar globaldb;
|
|
|
|
|
LuaStack LS(L, globalname, globaltab, globaldb);
|
|
|
|
|
|
2021-08-31 20:03:33 -04:00
|
|
|
// Get a pointer to the globaldb.
|
2021-02-10 16:22:24 -05:00
|
|
|
LS.rawget(globaldb, LuaRegistry, "globaldb");
|
2020-11-27 13:21:07 -05:00
|
|
|
if (!LS.istable(globaldb)) {
|
2021-12-21 13:00:11 -05:00
|
|
|
return lua_yield(L, 0); // donotpredict
|
2020-11-27 13:21:07 -05:00
|
|
|
}
|
|
|
|
|
|
2021-01-12 14:14:38 -05:00
|
|
|
LS.checkstring(globalname);
|
|
|
|
|
|
2020-11-27 13:21:07 -05:00
|
|
|
// Get the globaltab from the globaldb, sanity check it.
|
|
|
|
|
LS.rawget(globaltab, globaldb, globalname);
|
|
|
|
|
if (LS.istable(globaltab)) {
|
|
|
|
|
return LS.result();
|
|
|
|
|
} else if (!LS.isnil(globaltab)) {
|
2021-01-02 13:31:18 -05:00
|
|
|
luaL_error(L, "%s is not a global", LS.ckstring(globalname).c_str());
|
2020-11-27 13:21:07 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Create a new globaltab and store it in the globaldb.
|
|
|
|
|
LS.newtable(globaltab);
|
|
|
|
|
LS.rawset(globaldb, globalname, globaltab);
|
2021-02-10 16:22:24 -05:00
|
|
|
LS.rawset(globaltab, "__global", globalname);
|
2021-08-23 23:34:30 -04:00
|
|
|
LS.settabletype(globaltab, LUA_TT_GLOBALDB);
|
2020-11-27 13:21:07 -05:00
|
|
|
return LS.result();
|
|
|
|
|
}
|