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