mirror of
https://github.com/love2d/love.git
synced 2026-08-12 08:30:56 +02:00
@@ -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<Variant> &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<event::Event>(Module::M_EVENT);
|
||||
if (!eventmodule)
|
||||
return;
|
||||
|
||||
@@ -46,6 +46,7 @@ public:
|
||||
virtual ~LuaThread();
|
||||
void threadFunction();
|
||||
const std::string &getError() const;
|
||||
bool hasError() const { return haserror; }
|
||||
|
||||
bool start(const std::vector<Variant> &args);
|
||||
|
||||
@@ -56,6 +57,7 @@ private:
|
||||
StrongRef<love::Data> code;
|
||||
std::string name;
|
||||
std::string error;
|
||||
bool haserror;
|
||||
|
||||
std::vector<Variant> args;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user