From e512eff37b3e7bdf5a6444a4fc10b6f591a5edce Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Fri, 15 Apr 2022 23:31:57 -0300 Subject: [PATCH] Fix love.threaderror when the error message is empty. Fixes #1775 --- src/modules/thread/LuaThread.cpp | 19 +++++++++++++++---- src/modules/thread/LuaThread.h | 2 ++ src/modules/thread/wrap_LuaThread.cpp | 7 +++---- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/modules/thread/LuaThread.cpp b/src/modules/thread/LuaThread.cpp index 05e6c2770..d052d31c5 100644 --- a/src/modules/thread/LuaThread.cpp +++ b/src/modules/thread/LuaThread.cpp @@ -36,6 +36,7 @@ love::Type LuaThread::type("Thread", &Threadable::type); LuaThread::LuaThread(const std::string &name, love::Data *code) : code(code) , name(name) + , haserror(false) { threadName = name; } @@ -47,6 +48,7 @@ LuaThread::~LuaThread() void LuaThread::threadFunction() { error.clear(); + haserror = false; lua_State *L = luaL_newstate(); luaL_openlibs(L); @@ -70,7 +72,10 @@ void LuaThread::threadFunction() int tracebackidx = lua_gettop(L); if (luaL_loadbuffer(L, (const char *) code->getData(), code->getSize(), name.c_str()) != 0) + { error = luax_tostring(L, -1); + haserror = true; + } else { int pushedargs = (int) args.size(); @@ -81,18 +86,27 @@ void LuaThread::threadFunction() args.clear(); if (lua_pcall(L, pushedargs, 0, tracebackidx) != 0) + { error = luax_tostring(L, -1); + haserror = true; + } } lua_close(L); - if (!error.empty()) + if (haserror) onError(); } bool LuaThread::start(const std::vector &args) { + if (isRunning()) + return false; + this->args = args; + error.clear(); + haserror = false; + return Threadable::start(); } @@ -103,9 +117,6 @@ const std::string &LuaThread::getError() const void LuaThread::onError() { - if (error.empty()) - return; - auto eventmodule = Module::getInstance(Module::M_EVENT); if (!eventmodule) return; diff --git a/src/modules/thread/LuaThread.h b/src/modules/thread/LuaThread.h index e8d625cb7..9e707b784 100644 --- a/src/modules/thread/LuaThread.h +++ b/src/modules/thread/LuaThread.h @@ -46,6 +46,7 @@ class LuaThread : public Threadable virtual ~LuaThread(); void threadFunction(); const std::string &getError() const; + bool hasError() const { return haserror; } bool start(const std::vector &args); @@ -56,6 +57,7 @@ class LuaThread : public Threadable StrongRef code; std::string name; std::string error; + bool haserror; std::vector args; diff --git a/src/modules/thread/wrap_LuaThread.cpp b/src/modules/thread/wrap_LuaThread.cpp index db71f9ca1..5d569710d 100644 --- a/src/modules/thread/wrap_LuaThread.cpp +++ b/src/modules/thread/wrap_LuaThread.cpp @@ -63,11 +63,10 @@ int w_Thread_wait(lua_State *L) int w_Thread_getError(lua_State *L) { LuaThread *t = luax_checkthread(L, 1); - std::string err = t->getError(); - if (err.empty()) - lua_pushnil(L); + if (t->hasError()) + luax_pushstring(L, t->getError()); else - luax_pushstring(L, err); + lua_pushnil(L); return 1; }