diff options
author | chai <chaifix@163.com> | 2018-11-22 16:15:48 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2018-11-22 16:15:48 +0800 |
commit | cfa05003be67344fbc79c338c2ac82f0accd979d (patch) | |
tree | 3ed1fa8cdeaf6210b1fd6271f28af24ab41ee55a /src/lua/common | |
parent | a0a1e1609fd65c2fe103cfe5a4532b7ccd492c7f (diff) |
*修改argc
Diffstat (limited to 'src/lua/common')
-rw-r--r-- | src/lua/common/je_lua.cpp | 78 | ||||
-rw-r--r-- | src/lua/common/je_lua.h | 19 | ||||
-rw-r--r-- | src/lua/common/je_lua_common.h | 3 | ||||
-rw-r--r-- | src/lua/common/je_lua_shared.hpp | 5 |
4 files changed, 87 insertions, 18 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; } diff --git a/src/lua/common/je_lua.h b/src/lua/common/je_lua.h index e053718..753230e 100644 --- a/src/lua/common/je_lua.h +++ b/src/lua/common/je_lua.h @@ -3,15 +3,27 @@ #include "LuaJIT/lua.hpp" #include "libraries/luax/luax.h" +#include "je_lua_shared.hpp" #include "je_lua_proxy.h" #include "je_lua_reference.h" -#include "je_lua_shared.hpp" namespace JinEngine { namespace Lua { + // Lua state singleton. + class LuaState + { + public: + static lua_State * get(); + static void set(lua_State* L); + + private: + static lua_State * mL; + + }; + /// /// /// @@ -25,6 +37,11 @@ namespace JinEngine /// /// /// + void luax_removeobject(lua_State* L, SharedBase* shared); + + /// + /// + /// int luax_getobjectstable(lua_State* L); /// diff --git a/src/lua/common/je_lua_common.h b/src/lua/common/je_lua_common.h index 5b217a2..cdd4f36 100644 --- a/src/lua/common/je_lua_common.h +++ b/src/lua/common/je_lua_common.h @@ -1,9 +1,8 @@ #ifndef __JIN_M_TYPES_H #define __JIN_M_TYPES_H +#include "je_lua.h" #include "je_lua_port.h" -#include "je_lua_proxy.h" -#include "je_lua_shared.hpp" #include "je_lua_error.h" #include "je_lua_reference.h" diff --git a/src/lua/common/je_lua_shared.hpp b/src/lua/common/je_lua_shared.hpp index 7bb3f76..59e945d 100644 --- a/src/lua/common/je_lua_shared.hpp +++ b/src/lua/common/je_lua_shared.hpp @@ -1,6 +1,8 @@ #ifndef __JIN_COMMON_SHARED_H__ #define __JIN_COMMON_SHARED_H__ +//#include "je_lua.h" + #include <map> #include <vector> @@ -144,6 +146,9 @@ namespace JinEngine // Make shared only be able created with new. ~Shared() { + // Delete object mapping. + luax_removeobject(LuaState::get(), this); + // T* obj = static_cast<T*>(mObject); delete obj; } |