From cfa05003be67344fbc79c338c2ac82f0accd979d Mon Sep 17 00:00:00 2001 From: chai Date: Thu, 22 Nov 2018 16:15:48 +0800 Subject: =?UTF-8?q?*=E4=BF=AE=E6=94=B9argc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lua/common/je_lua.cpp | 78 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 63 insertions(+), 15 deletions(-) (limited to 'src/lua/common/je_lua.cpp') 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; } -- cgit v1.1-26-g67d0