aboutsummaryrefslogtreecommitdiff
path: root/src/lua/common/je_lua.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lua/common/je_lua.cpp')
-rw-r--r--src/lua/common/je_lua.cpp78
1 files changed, 63 insertions, 15 deletions
diff --git a/src/lua/common/je_lua.cpp b/src/lua/common/je_lua.cpp
index 748606b..2011e15 100644
--- a/src/lua/common/je_lua.cpp
+++ b/src/lua/common/je_lua.cpp
@@ -5,6 +5,18 @@ namespace JinEngine
namespace Lua
{
+ lua_State * LuaState::mL = nullptr;
+
+ void LuaState::set(lua_State* L)
+ {
+ mL = L;
+ }
+
+ lua_State* LuaState::get()
+ {
+ return mL;
+ }
+
///
/// Lua objects table. Map object to proxy, like objects_table[object] = proxy.
///
@@ -33,45 +45,81 @@ namespace JinEngine
return proxy;
}
- int luax_getobject(lua_State* L, SharedBase* shadred)
+ int luax_getobject(lua_State* L, SharedBase* shared)
{
luax_getobjectstable(L);
- luax_pushlightuserdata(L, shadred);
+ luax_pushlightuserdata(L, shared);
luax_gettable(L, -2);
luax_remove(L, -2); // Remove objects table on stack.
return 1;
}
- int luax_getregistrytable(lua_State* L, const char* tbl)
+ void luax_removeobject(lua_State* L, SharedBase* shared)
{
- luax_getfield(L, LUA_REGISTRYINDEX, tbl);
+ luax_getobjectstable(L);
+ luax_pushlightuserdata(L, shared);
+ luax_pushnil(L);
+ luax_settable(L, -3);
+ luax_pop(L, 1);
+ }
+
+ int luax_getobjectstable(lua_State* L)
+ {
+ luax_getfield(L, LUA_REGISTRYINDEX, Jin_Lua_Objects_Table);
// If no such table, add one.
if (luax_isnil(L, -1) || !luax_istable(L, -1))
{
luax_pop(L, 1);
luax_newtable(L);
- luax_pushstring(L, tbl);
- luax_pushvalue(L, -2);
- luax_settable(L, LUA_REGISTRYINDEX);
- }
- return 1;
- }
- int luax_getobjectstable(lua_State* L)
- {
- luax_getregistrytable(L, Jin_Lua_Objects_Table);
+ // metatable
+ luax_newtable(L);
+ // weak table
+ luax_pushliteral(L, "v");
+ luax_setfield(L, -2, "__mode");
+ // setmetatable(newtable, metatable)
+ luax_setmetatable(L, -2);
+
+ luax_pushvalue(L, -1);
+ luax_setfield(L, LUA_REGISTRYINDEX, Jin_Lua_Objects_Table);
+ }
return 1;
}
int luax_getmodulestable(lua_State* L)
{
- luax_getregistrytable(L, Jin_Lua_Modules_Table);
+ luax_getfield(L, LUA_REGISTRYINDEX, Jin_Lua_Modules_Table);
+ // If no such table, add one.
+ if (luax_isnil(L, -1) || !luax_istable(L, -1))
+ {
+ luax_pop(L, 1);
+ luax_newtable(L);
+
+ // metatable
+ luax_newtable(L);
+ // weak table
+ luax_pushliteral(L, "v");
+ luax_setfield(L, -2, "__mode");
+ // setmetatable(newtable, metatable)
+ luax_setmetatable(L, -2);
+
+ luax_pushvalue(L, -1);
+ luax_setfield(L, LUA_REGISTRYINDEX, Jin_Lua_Modules_Table);
+ }
return 1;
}
int luax_getreferencestable(lua_State* L)
{
- luax_getregistrytable(L, Jin_Lua_Reference_Table);
+ luax_getfield(L, LUA_REGISTRYINDEX, Jin_Lua_Reference_Table);
+ // If no such table, add one.
+ if (luax_isnil(L, -1) || !luax_istable(L, -1))
+ {
+ luax_pop(L, 1);
+ luax_newtable(L);
+ luax_pushvalue(L, -1);
+ luax_setfield(L, LUA_REGISTRYINDEX, Jin_Lua_Reference_Table);
+ }
return 1;
}