aboutsummaryrefslogtreecommitdiff
path: root/src/lua/thread/luaopen_thread.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lua/thread/luaopen_thread.cpp')
-rw-r--r--src/lua/thread/luaopen_thread.cpp51
1 files changed, 38 insertions, 13 deletions
diff --git a/src/lua/thread/luaopen_thread.cpp b/src/lua/thread/luaopen_thread.cpp
index 4c38899..b16a114 100644
--- a/src/lua/thread/luaopen_thread.cpp
+++ b/src/lua/thread/luaopen_thread.cpp
@@ -28,7 +28,7 @@ namespace jin
static inline Thread* checkThread(lua_State* L)
{
- Proxy* proxy = (Proxy*)luax_checktype(L, 1, TYPE_THREAD);
+ Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_THREAD_THREAD);
if (proxy != nullptr)
return (Thread*)proxy->object;
return nullptr;
@@ -41,8 +41,8 @@ namespace jin
luax_openlibs(L);
luaopen_jin(L);
luax_getglobal(L, MODULE_NAME);
- Proxy* proxy = (Proxy*)luax_newinstance(L, TYPE_THREAD, sizeof(Proxy));
- proxy->bind(thread);
+ Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_THREAD_THREAD, sizeof(Proxy));
+ proxy->bind(thread, JIN_THREAD_THREAD);
luax_setfield(L, -2, "_curThread");
luax_dostring(L, thread->code.c_str());
luax_close(L);
@@ -74,21 +74,32 @@ namespace jin
{
Thread* t = checkThread(L);
int slot = luax_checkinteger(L, 2);
- if (luax_isnumber(L, 3))
+ const int vp = 3;
+ if (luax_isnumber(L, vp))
{
- float real = luax_checknumber(L, 3);
+ float real = luax_checknumber(L, vp);
t->send(slot, real);
}
- else if (luax_isboolean(L, 3))
+ else if (luax_isboolean(L, vp))
{
- bool bol = luax_checkbool(L, 3);
+ bool bol = luax_checkbool(L, vp);
t->send(slot, bol);
}
- else if (luax_isstring(L, 3))
+ else if (luax_isstring(L, vp))
{
- const char* str = luax_checkstring(L, 3);
+ const char* str = luax_checkstring(L, vp);
t->send(slot, str);
}
+ else if (luax_isuserdata(L, vp))
+ {
+ void* p = luax_touserdata(L, vp);
+ t->send(slot, p);
+ }
+ else if (luax_islightuserdata(L, vp))
+ {
+ void* p = luax_tolightuserdata(L, vp);
+ t->send(slot, p);
+ }
return 0;
}
@@ -123,6 +134,13 @@ namespace jin
case thread::Thread::Variant::REAL:
luax_pushnumber(L, v.real);
break;
+
+ case thread::Thread::Variant::POINTER:
+ Proxy* p = (Proxy*)v.pointer;
+ Proxy* proxy = (Proxy*)luax_newinstance(L, p->type, sizeof(Proxy));
+ proxy->bind(p->object, p->type);
+ break;
+
}
return 1;
}
@@ -149,6 +167,13 @@ namespace jin
case thread::Thread::Variant::REAL:
luax_pushnumber(L, v.real);
break;
+
+ case thread::Thread::Variant::POINTER:
+ Proxy* p = (Proxy*)v.pointer;
+ Proxy* proxy = (Proxy*)luax_newinstance(L, p->type, sizeof(Proxy));
+ proxy->bind(p->object, p->type);
+ break;
+
}
return 1;
}
@@ -190,10 +215,10 @@ namespace jin
{ "isRunning", l_isRunning },
{ 0, 0 }
};
-
+
static int luaopen_Thread(lua_State* L)
{
- luax_newtype(L, TYPE_THREAD, thread_function);
+ luax_newtype(L, JIN_THREAD_THREAD, thread_function);
return 0;
}
@@ -203,9 +228,9 @@ namespace jin
{
const char* name = luax_checkstring(L, 1);
const char* code = luax_checkstring(L, 2);
- Proxy* proxy = (Proxy*)luax_newinstance(L, TYPE_THREAD, sizeof(Proxy));
+ Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_THREAD_THREAD, sizeof(Proxy));
Thread* thread = new Thread(name, code, Thread::threadRunner);
- proxy->bind(thread);
+ proxy->bind(thread, JIN_THREAD_THREAD);
return 1;
}