diff --git a/src/modules/thread/LuaThread.cpp b/src/modules/thread/LuaThread.cpp index e372a6615..c46b69903 100644 --- a/src/modules/thread/LuaThread.cpp +++ b/src/modules/thread/LuaThread.cpp @@ -33,6 +33,8 @@ namespace thread LuaThread::LuaThread(const std::string &name, love::Data *code) : code(code) , name(name) + , args(0) + , nargs(0) { code->retain(); } @@ -40,6 +42,11 @@ LuaThread::LuaThread(const std::string &name, love::Data *code) LuaThread::~LuaThread() { code->release(); + + // No args should still exist at this point, + // but you never know. + for (int i = 0; i < nargs; ++i) + args[i]->release(); } void LuaThread::threadFunction() @@ -55,12 +62,37 @@ void LuaThread::threadFunction() if (luaL_loadbuffer(L, (const char *) code->getData(), code->getSize(), name.c_str()) != 0) error = luax_tostring(L, -1); else - if (lua_pcall(L, 0, 0, 0) != 0) + { + int pushedargs = nargs; + for (int i = 0; i < nargs; ++i) + { + args[i]->toLua(L); + args[i]->release(); + } + // Set both args and nargs to nil, + // prevents the deconstructor from + // accessing it again. + nargs = 0; + args = 0; + + if (lua_pcall(L, pushedargs, 0, 0) != 0) error = luax_tostring(L, -1); + } lua_close(L); this->release(); } +bool LuaThread::start(Variant **args, int nargs) +{ + for (int i = 0; i < this->nargs; ++i) + this->args[i]->release(); + + this->args = args; + this->nargs = nargs; + + return Threadable::start(); +} + const std::string &LuaThread::getError() { return error; diff --git a/src/modules/thread/LuaThread.h b/src/modules/thread/LuaThread.h index c887c4ce3..ba880abf8 100644 --- a/src/modules/thread/LuaThread.h +++ b/src/modules/thread/LuaThread.h @@ -25,8 +25,9 @@ #include // LOVE -#include #include +#include +#include #include namespace love @@ -41,10 +42,15 @@ public: void threadFunction(); const std::string &getError(); + bool start(Variant **args, int nargs); + private: love::Data *code; std::string name; std::string error; + + Variant **args; + int nargs; }; } // thread } // love diff --git a/src/modules/thread/wrap_LuaThread.cpp b/src/modules/thread/wrap_LuaThread.cpp index 068810302..5f6933d22 100644 --- a/src/modules/thread/wrap_LuaThread.cpp +++ b/src/modules/thread/wrap_LuaThread.cpp @@ -33,7 +33,17 @@ LuaThread *luax_checkthread(lua_State *L, int idx) int w_Thread_start(lua_State *L) { LuaThread *t = luax_checkthread(L, 1); - luax_pushboolean(L, t->start()); + int nargs = lua_gettop(L) - 1; + Variant **args = 0; + + if (nargs > 0) + { + args = new Variant*[nargs]; + for (int i = 0; i < nargs; ++i) + args[i] = Variant::fromLua(L, i+2); + } + + luax_pushboolean(L, t->start(args, nargs)); return 1; }