diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lua/common/je_lua.cpp | 47 | ||||
-rw-r--r-- | src/lua/common/je_lua.h | 5 | ||||
-rw-r--r-- | src/lua/common/je_lua_object.h | 4 | ||||
-rw-r--r-- | src/lua/modules/thread/je_lua_thread.cpp | 15 |
4 files changed, 56 insertions, 15 deletions
diff --git a/src/lua/common/je_lua.cpp b/src/lua/common/je_lua.cpp index b09004f..21d3fa6 100644 --- a/src/lua/common/je_lua.cpp +++ b/src/lua/common/je_lua.cpp @@ -2,6 +2,7 @@ #include "je_lua.h" +using namespace std; using namespace JinEngine::Math; namespace JinEngine @@ -17,16 +18,54 @@ namespace JinEngine LuaObject* luax_newinstance(lua_State* L, const char* type, SharedBase* shared) { - LuaObject* luaObj = static_cast<LuaObject*>(luax_newinstance(L, type, sizeof(LuaObject))); - luaObj->state = L; - luaObj->bind(shared); + LuaObject* obj = static_cast<LuaObject*>(luax_newinstance(L, type, sizeof(LuaObject))); + obj->state = L; + obj->bind(shared); // Add to objects_table, objects_table[shared] = luaObj luax_getobjectstable(L); luax_pushlightuserdata(L, shared); luax_pushvalue(L, -3); luax_settable(L, -3); luax_pop(L, 1); // Pop objects table. - return luaObj; + return obj; + } + + LuaObject* luax_newinstance(lua_State* L, LuaObject* src) + { + bool another = L != src->state; + if(another) + { + // Copy dependencies. + map<uint, SharedBase*>::iterator it = (*src->dependencies).begin(); + for (; it != (*src->dependencies).end(); ++it) + { + SharedBase* shr = it->second; + // Try get lua object. + luax_getobject(src->state, shr); + LuaObject* luaObj = (LuaObject*)luax_checktype(src->state, -1, shr->getType()); + luax_newinstance(L, luaObj); + } + } + SharedBase * shr = src->getSharedBase(); + LuaObject* obj = luax_newinstance(L, src->getObjectType(), shr); + (*obj->dependencies) = (*src->dependencies); + // Add to objects_table + luax_getobjectstable(L); + luax_pushlightuserdata(L, shr); + luax_pushvalue(L, -3); + luax_settable(L, -3); + luax_pop(L, 1); // Pop objects table. + // Set dependencies. + if (another) + { + map<uint, SharedBase*>::iterator it = (*obj->dependencies).begin(); + for (; it != (*obj->dependencies).end(); ++it) + { + SharedBase* dep = it->second; + luax_addreference(L, shr, dep); + } + } + return obj; } int luax_getobject(lua_State* L, SharedBase* shared) diff --git a/src/lua/common/je_lua.h b/src/lua/common/je_lua.h index b73ac3d..5f9ebb3 100644 --- a/src/lua/common/je_lua.h +++ b/src/lua/common/je_lua.h @@ -23,6 +23,11 @@ namespace JinEngine LuaObject* luax_newinstance(lua_State* L, const char* type, SharedBase* shared); /// + /// + /// + LuaObject* luax_newinstance(lua_State* L, LuaObject* src); + + /// /// Access lua object by object pointer. /// int luax_getobject(lua_State* L, SharedBase* shared); diff --git a/src/lua/common/je_lua_object.h b/src/lua/common/je_lua_object.h index 1d74de9..c2f0195 100644 --- a/src/lua/common/je_lua_object.h +++ b/src/lua/common/je_lua_object.h @@ -57,10 +57,6 @@ namespace JinEngine int getDependenciesCount(); - ////////////////////////////////////////////////////////////////////////////////////////////////////// - // - ////////////////////////////////////////////////////////////////////////////////////////////////////// - lua_State* state; SharedBase* object; diff --git a/src/lua/modules/thread/je_lua_thread.cpp b/src/lua/modules/thread/je_lua_thread.cpp index eea7e24..d99161f 100644 --- a/src/lua/modules/thread/je_lua_thread.cpp +++ b/src/lua/modules/thread/je_lua_thread.cpp @@ -80,14 +80,14 @@ namespace JinEngine } else if (luax_isuserdata(L, vp)) { - void* p = luax_touserdata(L, vp); - shared->send(slot, p); - } + LuaObject* luaObj = (LuaObject*)luax_touserdata(L, vp); + shared->send(slot, luaObj); + }/* else if (luax_islightuserdata(L, vp)) { void* p = luax_tolightuserdata(L, vp); shared->send(slot, p); - } + }*/ return 0; } @@ -125,7 +125,8 @@ namespace JinEngine case Thread::Variant::POINTER: LuaObject* p = (LuaObject*)v.pointer; - LuaObject* luaObj = luax_newinstance(L, p->getObjectType(), p->getSharedBase()); + // Create lua object from other lua_State. + LuaObject* luaObj = luax_newinstance(L, p); break; } @@ -157,8 +158,8 @@ namespace JinEngine case Thread::Variant::POINTER: LuaObject* p = (LuaObject*)v.pointer; - const char* objType = p->getObjectType(); - LuaObject* luaObj = luax_newinstance(L, objType, p->getSharedBase()); + // Create lua object from other lua_State. + LuaObject* luaObj = luax_newinstance(L, p->getObjectType(), p->getSharedBase()); break; } |