Add error-check for yield-in-pcall to traceback_pcall

This commit is contained in:
2022-04-25 17:21:54 -04:00
parent 9aec7c5299
commit 214734b627
3 changed files with 6 additions and 4 deletions

View File

@@ -1,6 +1,7 @@
#include "traceback.hpp"
#include <cstring>
#include <cassert>
#define TRACEBACK_LEVELS1 12
#define TRACEBACK_LEVELS2 10
@@ -88,7 +89,9 @@ eng::string traceback_pcall(lua_State *L, int narg, int nret) {
if ((msg == NULL) || (msg[0] == 0)) {
msg = "unknown error";
}
return msg;
eng::string result = msg;
assert(result != "attempt to yield from outside a coroutine");
return result;
}
return "";
}

View File

@@ -25,7 +25,8 @@ int traceback_coroutine(lua_State *L);
// Similar to lua_pcall, except that it automatically supplies
// traceback_coroutine as a message handler. It also automatically
// returns any error message. Returns empty string if there's
// no error.
// no error. Also checks for a yield inside a pcall, which is
// not allowed, and does an assert-fail in that case.
//
eng::string traceback_pcall(lua_State *L, int narg, int nret);

View File

@@ -304,7 +304,6 @@ eng::string World::probe_lua(int64_t actor_id, const eng::string &lua) {
(*ostream) << std::endl;
}
} else {
assert(msg != "attempt to yield from outside a coroutine");
(*ostream) << msg << std::endl;
}
@@ -366,7 +365,6 @@ void World::update_gui(int64_t actor_id, int64_t place_id, Gui *gui) {
Gui::store_global_pointer(L, nullptr);
if (!msg.empty()) {
gui->clear(0);
assert(msg != "attempt to yield from outside a coroutine");
std::cerr << msg << std::endl;
LS.result();
return;