aboutsummaryrefslogtreecommitdiff
path: root/src/lua/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/lua/common')
-rw-r--r--src/lua/common/je_lua.cpp78
-rw-r--r--src/lua/common/je_lua.h19
-rw-r--r--src/lua/common/je_lua_common.h3
-rw-r--r--src/lua/common/je_lua_shared.hpp5
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;
}