aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lua/common/je_lua.cpp47
-rw-r--r--src/lua/common/je_lua.h5
-rw-r--r--src/lua/common/je_lua_object.h4
-rw-r--r--src/lua/modules/thread/je_lua_thread.cpp15
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;
}