Fix crash when cancelling automation scripts

When cancelling an automation macro from the progress dialog, the dialog
throws a UserCancelException. If the macro still runs to the end
afterwards (instead of calling aegisub.cancel or causing an exception),
the two return values are left on the stack. This causes assertion errors
due to check_stack when those are enabled.
This commit is contained in:
arch1t3cht 2022-09-13 22:41:18 +02:00
parent 5a0bfdd775
commit a394aefd1a
1 changed files with 23 additions and 17 deletions

View File

@ -624,27 +624,33 @@ namespace {
{
bool failed = false;
BackgroundScriptRunner bsr(parent, title);
bsr.Run([&](ProgressSink *ps) {
LuaProgressSink lps(L, ps, can_open_config);
try {
bsr.Run([&](ProgressSink *ps) {
LuaProgressSink lps(L, ps, can_open_config);
// Insert our error handler under the function to call
lua_pushcclosure(L, add_stack_trace, 0);
lua_insert(L, -nargs - 2);
// Insert our error handler under the function to call
lua_pushcclosure(L, add_stack_trace, 0);
lua_insert(L, -nargs - 2);
if (lua_pcall(L, nargs, nresults, -nargs - 2)) {
if (!lua_isnil(L, -1)) {
// if the call failed, log the error here
ps->Log("\n\nLua reported a runtime error:\n");
ps->Log(get_string_or_default(L, -1));
if (lua_pcall(L, nargs, nresults, -nargs - 2)) {
if (!lua_isnil(L, -1)) {
// if the call failed, log the error here
ps->Log("\n\nLua reported a runtime error:\n");
ps->Log(get_string_or_default(L, -1));
}
lua_pop(L, 2);
failed = true;
}
lua_pop(L, 2);
failed = true;
}
else
lua_remove(L, -nresults - 1);
else
lua_remove(L, -nresults - 1);
lua_gc(L, LUA_GCCOLLECT, 0);
});
lua_gc(L, LUA_GCCOLLECT, 0);
});
} catch (agi::UserCancelException const&) {
if (!failed)
lua_pop(L, 2);
throw;
}
if (failed)
throw agi::UserCancelException("Script threw an error");
}