diff options
Diffstat (limited to 'src')
27 files changed, 110 insertions, 59 deletions
diff --git a/src/3rdparty/buildvm/buildvm.exe b/src/3rdparty/buildvm/buildvm.exe Binary files differindex 32a8f53..d5ad537 100644 --- a/src/3rdparty/buildvm/buildvm.exe +++ b/src/3rdparty/buildvm/buildvm.exe diff --git a/src/3rdparty/minilua/minilua.exe b/src/3rdparty/minilua/minilua.exe Binary files differindex a245b88..44e9416 100644 --- a/src/3rdparty/minilua/minilua.exe +++ b/src/3rdparty/minilua/minilua.exe 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; } diff --git a/src/lua/jin.cpp b/src/lua/jin.cpp index f4fcb61..39291ac 100644 --- a/src/lua/jin.cpp +++ b/src/lua/jin.cpp @@ -67,6 +67,8 @@ namespace JinEngine /* register jin module, keep it on the top of stack */ LUA_EXPORT int luaopen_jin(lua_State* L) { + LuaState::set(L); + luax_globaltable(L, MODULE_NAME); // Register values. diff --git a/src/lua/jin.h b/src/lua/jin.h index 9042704..473ead7 100644 --- a/src/lua/jin.h +++ b/src/lua/jin.h @@ -2,10 +2,10 @@ * Copyright (C) 2016~2018 chai */ -#ifndef __JIN_M_JIN_H -#define __JIN_M_JIN_H -#include "common/je_lua.h" +#ifndef __JIN_M_JIN_H__ +#define __JIN_M_JIN_H__ +#include "common/je_lua.h" #include "common/je_lua_common.h" #define MODULE_NAME "jin" @@ -33,4 +33,4 @@ namespace JinEngine } // namespace JinEngine } // namespace Lua -#endif // __JIN_M_JIN_H
\ No newline at end of file +#endif // __JIN_M_JIN_H__
\ No newline at end of file diff --git a/src/lua/libraries/luax/luax.h b/src/lua/libraries/luax/luax.h index fc2b21e..0055176 100644 --- a/src/lua/libraries/luax/luax.h +++ b/src/lua/libraries/luax/luax.h @@ -123,6 +123,9 @@ inline float luax_rawgetnumberthenpop(lua_State* L, int i, int k) #define luax_pushlightuserdata lua_pushlightuserdata #define luax_pushnil lua_pushnil #define luax_pushvalue lua_pushvalue +#define luax_pushliteral lua_pushliteral + +#define luax_setmetatable lua_setmetatable //inline void luax_pushuserdata(lua_State* L, void* p) //{ diff --git a/src/lua/modules/graphics/je_lua_animation.cpp b/src/lua/modules/graphics/je_lua_animation.cpp index d054761..cd048e3 100644 --- a/src/lua/modules/graphics/je_lua_animation.cpp +++ b/src/lua/modules/graphics/je_lua_animation.cpp @@ -1,5 +1,4 @@ #include "common/je_lua_proxy.h" - #include "common/je_lua_common.h" #include "libjin/jin.h" diff --git a/src/lua/modules/graphics/je_lua_animator.cpp b/src/lua/modules/graphics/je_lua_animator.cpp index 857d375..843204d 100644 --- a/src/lua/modules/graphics/je_lua_animator.cpp +++ b/src/lua/modules/graphics/je_lua_animator.cpp @@ -1,5 +1,4 @@ #include "common/je_lua_proxy.h" - #include "common/je_lua_common.h" #include "libjin/jin.h" diff --git a/src/lua/modules/graphics/je_lua_canvas.cpp b/src/lua/modules/graphics/je_lua_canvas.cpp index 5cbcf98..80ee155 100644 --- a/src/lua/modules/graphics/je_lua_canvas.cpp +++ b/src/lua/modules/graphics/je_lua_canvas.cpp @@ -1,5 +1,4 @@ #include "common/je_lua_proxy.h" - #include "common/je_lua_common.h" #include "libjin/jin.h" #include "je_lua_canvas.h" diff --git a/src/lua/modules/graphics/je_lua_graphics.cpp b/src/lua/modules/graphics/je_lua_graphics.cpp index cc67055..82793be 100644 --- a/src/lua/modules/graphics/je_lua_graphics.cpp +++ b/src/lua/modules/graphics/je_lua_graphics.cpp @@ -3,7 +3,6 @@ #include "libjin/jin.h" #include "common/je_lua_proxy.h" - #include "common/je_lua_common.h" #include "je_lua_canvas.h" @@ -794,9 +793,9 @@ namespace JinEngine // newAnimation([frames table, loop, speed]) LUA_IMPLEMENT int l_newAnimation(lua_State* L) { - int args = luax_gettop(L); + int argc = luax_gettop(L); Shared<Animation>* shrAnimation = new Shared<Animation>(new Animation(), Jin_Lua_Animation); - if (args >= 3) + if (argc >= 3) { if (!luax_istable(L, 1)) { @@ -825,9 +824,9 @@ namespace JinEngine // newAnimator([animation]) LUA_IMPLEMENT int l_newAnimator(lua_State* L) { - int args = luax_gettop(L); + int argc = luax_gettop(L); Shared<Animator>* shrAniamtor = new Shared<Animator>(new Animator(), Jin_Lua_Animator); - if (args >= 1) + if (argc >= 1) { Proxy* pxyAnimation = (Proxy*)luax_checktype(L, 1, Jin_Lua_Animation); Shared<Animation>& shrAnimtion = pxyAnimation->getShared<Animation>(); diff --git a/src/lua/modules/graphics/je_lua_page.cpp b/src/lua/modules/graphics/je_lua_page.cpp index c3fdc7e..c119991 100644 --- a/src/lua/modules/graphics/je_lua_page.cpp +++ b/src/lua/modules/graphics/je_lua_page.cpp @@ -1,5 +1,4 @@ #include "common/je_lua_proxy.h" - #include "common/je_lua_common.h" #include "libjin/jin.h" diff --git a/src/lua/modules/graphics/je_lua_shader.cpp b/src/lua/modules/graphics/je_lua_shader.cpp index cfe2260..ca4d6f6 100644 --- a/src/lua/modules/graphics/je_lua_shader.cpp +++ b/src/lua/modules/graphics/je_lua_shader.cpp @@ -1,5 +1,4 @@ #include "common/je_lua_proxy.h" - #include "common/je_lua_common.h" #include "libjin/jin.h" diff --git a/src/lua/modules/graphics/je_lua_sprite.cpp b/src/lua/modules/graphics/je_lua_sprite.cpp index 01ba103..018a43d 100644 --- a/src/lua/modules/graphics/je_lua_sprite.cpp +++ b/src/lua/modules/graphics/je_lua_sprite.cpp @@ -1,5 +1,4 @@ #include "common/je_lua_proxy.h" - #include "common/je_lua_common.h" #include "libjin/jin.h" diff --git a/src/lua/modules/graphics/je_lua_spritesheet.cpp b/src/lua/modules/graphics/je_lua_spritesheet.cpp index 57b610c..362a78d 100644 --- a/src/lua/modules/graphics/je_lua_spritesheet.cpp +++ b/src/lua/modules/graphics/je_lua_spritesheet.cpp @@ -66,12 +66,12 @@ namespace JinEngine int w = luax_checkinteger(L, 5); int h = luax_checkinteger(L, 6); vector<Sprite*> sprs; - int args = luax_gettop(L); - if (args == 6) + int argc = luax_gettop(L); + if (argc == 6) { sprs = ss->createSprites(count, r, c, w, h, Origin::TopLeft); } - else if (args >= 8) + else if (argc >= 8) { int ox = luax_checkinteger(L, 7); int oy = luax_checkinteger(L, 8); @@ -79,7 +79,7 @@ namespace JinEngine int offy = luax_optinteger(L, 10, 0); sprs = ss->createSprites(count, r, c, w, h, ox, oy, offx, offy); } - else if (args >= 7) + else if (argc >= 7) { int o = luax_checkinteger(L, 7); Origin origin = static_cast<Origin>(o); diff --git a/src/lua/modules/graphics/je_lua_text.cpp b/src/lua/modules/graphics/je_lua_text.cpp index 6509e73..adeed35 100644 --- a/src/lua/modules/graphics/je_lua_text.cpp +++ b/src/lua/modules/graphics/je_lua_text.cpp @@ -1,5 +1,4 @@ #include "common/je_lua_proxy.h" - #include "common/je_lua_common.h" #include "libjin/jin.h" diff --git a/src/lua/modules/graphics/je_lua_texture.cpp b/src/lua/modules/graphics/je_lua_texture.cpp index 5402a99..a8676f1 100644 --- a/src/lua/modules/graphics/je_lua_texture.cpp +++ b/src/lua/modules/graphics/je_lua_texture.cpp @@ -1,5 +1,4 @@ #include "common/je_lua_proxy.h" - #include "common/je_lua_common.h" #include "libjin/jin.h" #include "je_lua_texture.h" diff --git a/src/lua/modules/graphics/je_lua_texture_font.cpp b/src/lua/modules/graphics/je_lua_texture_font.cpp index 61c559b..6c62ee2 100644 --- a/src/lua/modules/graphics/je_lua_texture_font.cpp +++ b/src/lua/modules/graphics/je_lua_texture_font.cpp @@ -1,5 +1,4 @@ #include "common/je_lua_proxy.h" - #include "common/je_lua_common.h" #include "libjin/jin.h" diff --git a/src/lua/modules/graphics/je_lua_ttf.cpp b/src/lua/modules/graphics/je_lua_ttf.cpp index 7fea04b..fb4b0df 100644 --- a/src/lua/modules/graphics/je_lua_ttf.cpp +++ b/src/lua/modules/graphics/je_lua_ttf.cpp @@ -1,5 +1,4 @@ #include "common/je_lua_proxy.h" - #include "common/je_lua_common.h" #include "libjin/jin.h" diff --git a/src/lua/modules/graphics/je_lua_ttf_data.cpp b/src/lua/modules/graphics/je_lua_ttf_data.cpp index aa2280f..8042d69 100644 --- a/src/lua/modules/graphics/je_lua_ttf_data.cpp +++ b/src/lua/modules/graphics/je_lua_ttf_data.cpp @@ -1,5 +1,4 @@ #include "common/je_lua_proxy.h" - #include "common/je_lua_common.h" #include "libjin/jin.h" diff --git a/src/lua/modules/net/je_lua_buffer.cpp b/src/lua/modules/net/je_lua_buffer.cpp index 582eec9..5442e14 100644 --- a/src/lua/modules/net/je_lua_buffer.cpp +++ b/src/lua/modules/net/je_lua_buffer.cpp @@ -1,5 +1,4 @@ #include "common/je_lua_proxy.h" - #include "common/je_lua_common.h" #include "libjin/jin.h" #include "je_lua_buffer.h" diff --git a/src/lua/modules/net/je_lua_net.cpp b/src/lua/modules/net/je_lua_net.cpp index 456bcf8..4b5513a 100644 --- a/src/lua/modules/net/je_lua_net.cpp +++ b/src/lua/modules/net/je_lua_net.cpp @@ -1,5 +1,4 @@ #include "common/je_lua_proxy.h" - #include "libjin/jin.h" #include "common/je_lua_common.h" diff --git a/src/lua/modules/net/je_lua_socket.cpp b/src/lua/modules/net/je_lua_socket.cpp index 94e1275..3eed91f 100644 --- a/src/lua/modules/net/je_lua_socket.cpp +++ b/src/lua/modules/net/je_lua_socket.cpp @@ -1,5 +1,4 @@ #include "common/je_lua_proxy.h" - #include "common/je_lua_common.h" #include "libjin/jin.h" #include "je_lua_buffer.h" diff --git a/src/lua/modules/time/je_lua_time.cpp b/src/lua/modules/time/je_lua_time.cpp index 6ad4935..4eb579f 100644 --- a/src/lua/modules/time/je_lua_time.cpp +++ b/src/lua/modules/time/je_lua_time.cpp @@ -3,7 +3,6 @@ #include "common/je_lua_proxy.h" #include "libjin/jin.h" - #include "je_lua_timer.h" using namespace JinEngine::Time; @@ -34,7 +33,8 @@ namespace JinEngine LUA_IMPLEMENT int l_newTimer(lua_State* L) { - Proxy* proxy = luax_newinstance(L, Jin_Lua_Timer, new Shared<Timer>(new Timer(), Jin_Lua_Timer)); + Shared<Timer>* shrTimer = new Shared<Timer>(new Timer(), Jin_Lua_Timer); + luax_newinstance(L, Jin_Lua_Timer, shrTimer); return 1; } diff --git a/src/lua/modules/time/je_lua_timer.cpp b/src/lua/modules/time/je_lua_timer.cpp index 6dc6798..ccb902a 100644 --- a/src/lua/modules/time/je_lua_timer.cpp +++ b/src/lua/modules/time/je_lua_timer.cpp @@ -1,4 +1,3 @@ - #include "common/je_lua_callback.h" #include "common/je_lua_common.h" #include "je_lua_timer.h" @@ -39,15 +38,13 @@ namespace JinEngine { int n = luax_gettop(L); SharedTimer shared = checkTimer(L); - Timer* timer = shared.getObject(); float s = luax_checknumber(L, 2); LuaCallback* func = new LuaCallback(L); func->setFunc(3); for(int i = 4; i <= n; ++i) func->pushParam(i); - Timer::Handler* handler = timer->every(s, timerCallback, func, finishCallback); + Timer::Handler* handler = shared->every(s, timerCallback, func, finishCallback); Shared<Timer::Handler>* shrHandler = new Shared<Timer::Handler>(handler, Jin_Lua_Handler); - shrHandler->retain(); Proxy* proxy = luax_newinstance(L, Jin_Lua_Handler, shrHandler); return 1; } @@ -57,15 +54,13 @@ namespace JinEngine { int n = luax_gettop(L); SharedTimer shared = checkTimer(L); - Timer* timer = shared.getObject(); float s = luax_checknumber(L, 2); LuaCallback* func = new LuaCallback(L); func->setFunc(3); for (int i = 4; i <= n; ++i) func->pushParam(i); - Timer::Handler* handler = timer->after(s, timerCallback, func, finishCallback); + Timer::Handler* handler = shared->after(s, timerCallback, func, finishCallback); Shared<Timer::Handler>* shrHandler = new Shared<Timer::Handler>(handler, Jin_Lua_Handler); - shrHandler->retain(); Proxy* proxy = luax_newinstance(L, Jin_Lua_Handler, shrHandler); return 1; } @@ -75,16 +70,14 @@ namespace JinEngine { int n = luax_gettop(L); SharedTimer shared = checkTimer(L); - Timer* timer = shared.getObject(); float s = luax_checknumber(L, 2); int count = luax_checkinteger(L, 3); LuaCallback* func = new LuaCallback(L); func->setFunc(4); for (int i = 5; i <= n; ++i) func->pushParam(i); - Timer::Handler* handler = timer->repeat(s, count, timerCallback, func, finishCallback); + Timer::Handler* handler = shared->repeat(s, count, timerCallback, func, finishCallback); Shared<Timer::Handler>* shrHandler = new Shared<Timer::Handler>(handler, Jin_Lua_Handler); - shrHandler->retain(); Proxy* proxy = luax_newinstance(L, Jin_Lua_Handler, shrHandler); return 1; } @@ -92,9 +85,8 @@ namespace JinEngine LUA_IMPLEMENT int l_update(lua_State* L) { SharedTimer shared = checkTimer(L); - Timer* timer = shared.getObject(); float s = luax_checknumber(L, 2); - timer->update(s); + shared->update(s); return 0; } |