Skip to content

Commit

Permalink
Fix love.threaderror when the error message is empty.
Browse files Browse the repository at this point in the history
Fixes #1775
  • Loading branch information
slime73 committed Apr 16, 2022
1 parent c35356c commit e512eff
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 8 deletions.
19 changes: 15 additions & 4 deletions src/modules/thread/LuaThread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand All @@ -47,6 +48,7 @@ LuaThread::~LuaThread()
void LuaThread::threadFunction()
{
error.clear();
haserror = false;

lua_State *L = luaL_newstate();
luaL_openlibs(L);
Expand All @@ -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();
Expand All @@ -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<Variant> &args)
{
if (isRunning())
return false;

this->args = args;
error.clear();
haserror = false;

return Threadable::start();
}

Expand All @@ -103,9 +117,6 @@ const std::string &LuaThread::getError() const

void LuaThread::onError()
{
if (error.empty())
return;

auto eventmodule = Module::getInstance<event::Event>(Module::M_EVENT);
if (!eventmodule)
return;
Expand Down
2 changes: 2 additions & 0 deletions src/modules/thread/LuaThread.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<Variant> &args);

Expand All @@ -56,6 +57,7 @@ class LuaThread : public Threadable
StrongRef<love::Data> code;
std::string name;
std::string error;
bool haserror;

std::vector<Variant> args;

Expand Down
7 changes: 3 additions & 4 deletions src/modules/thread/wrap_LuaThread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down

0 comments on commit e512eff

Please sign in to comment.