|
@@ -36,6 +36,7 @@ love::Type LuaThread::type("Thread", &Threadable::type);
|
|
LuaThread::LuaThread(const std::string &name, love::Data *code)
|
|
LuaThread::LuaThread(const std::string &name, love::Data *code)
|
|
: code(code)
|
|
: code(code)
|
|
, name(name)
|
|
, name(name)
|
|
|
|
+ , haserror(false)
|
|
{
|
|
{
|
|
threadName = name;
|
|
threadName = name;
|
|
}
|
|
}
|
|
@@ -47,6 +48,7 @@ LuaThread::~LuaThread()
|
|
void LuaThread::threadFunction()
|
|
void LuaThread::threadFunction()
|
|
{
|
|
{
|
|
error.clear();
|
|
error.clear();
|
|
|
|
+ haserror = false;
|
|
|
|
|
|
lua_State *L = luaL_newstate();
|
|
lua_State *L = luaL_newstate();
|
|
luaL_openlibs(L);
|
|
luaL_openlibs(L);
|
|
@@ -70,7 +72,10 @@ void LuaThread::threadFunction()
|
|
int tracebackidx = lua_gettop(L);
|
|
int tracebackidx = lua_gettop(L);
|
|
|
|
|
|
if (luaL_loadbuffer(L, (const char *) code->getData(), code->getSize(), name.c_str()) != 0)
|
|
if (luaL_loadbuffer(L, (const char *) code->getData(), code->getSize(), name.c_str()) != 0)
|
|
|
|
+ {
|
|
error = luax_tostring(L, -1);
|
|
error = luax_tostring(L, -1);
|
|
|
|
+ haserror = true;
|
|
|
|
+ }
|
|
else
|
|
else
|
|
{
|
|
{
|
|
int pushedargs = (int) args.size();
|
|
int pushedargs = (int) args.size();
|
|
@@ -81,18 +86,27 @@ void LuaThread::threadFunction()
|
|
args.clear();
|
|
args.clear();
|
|
|
|
|
|
if (lua_pcall(L, pushedargs, 0, tracebackidx) != 0)
|
|
if (lua_pcall(L, pushedargs, 0, tracebackidx) != 0)
|
|
|
|
+ {
|
|
error = luax_tostring(L, -1);
|
|
error = luax_tostring(L, -1);
|
|
|
|
+ haserror = true;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
lua_close(L);
|
|
lua_close(L);
|
|
|
|
|
|
- if (!error.empty())
|
|
|
|
|
|
+ if (haserror)
|
|
onError();
|
|
onError();
|
|
}
|
|
}
|
|
|
|
|
|
bool LuaThread::start(const std::vector<Variant> &args)
|
|
bool LuaThread::start(const std::vector<Variant> &args)
|
|
{
|
|
{
|
|
|
|
+ if (isRunning())
|
|
|
|
+ return false;
|
|
|
|
+
|
|
this->args = args;
|
|
this->args = args;
|
|
|
|
+ error.clear();
|
|
|
|
+ haserror = false;
|
|
|
|
+
|
|
return Threadable::start();
|
|
return Threadable::start();
|
|
}
|
|
}
|
|
|
|
|
|
@@ -103,9 +117,6 @@ const std::string &LuaThread::getError() const
|
|
|
|
|
|
void LuaThread::onError()
|
|
void LuaThread::onError()
|
|
{
|
|
{
|
|
- if (error.empty())
|
|
|
|
- return;
|
|
|
|
-
|
|
|
|
auto eventmodule = Module::getInstance<event::Event>(Module::M_EVENT);
|
|
auto eventmodule = Module::getInstance<event::Event>(Module::M_EVENT);
|
|
if (!eventmodule)
|
|
if (!eventmodule)
|
|
return;
|
|
return;
|