diff options
Diffstat (limited to 'src/lua/thread/luaopen_Thread.cpp')
-rw-r--r-- | src/lua/thread/luaopen_Thread.cpp | 51 |
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; } |