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 "traceback.hpp"
#include <cstring> #include <cstring>
#include <cassert>
#define TRACEBACK_LEVELS1 12 #define TRACEBACK_LEVELS1 12
#define TRACEBACK_LEVELS2 10 #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)) { if ((msg == NULL) || (msg[0] == 0)) {
msg = "unknown error"; msg = "unknown error";
} }
return msg; eng::string result = msg;
assert(result != "attempt to yield from outside a coroutine");
return result;
} }
return ""; return "";
} }

View File

@@ -25,7 +25,8 @@ int traceback_coroutine(lua_State *L);
// Similar to lua_pcall, except that it automatically supplies // Similar to lua_pcall, except that it automatically supplies
// traceback_coroutine as a message handler. It also automatically // traceback_coroutine as a message handler. It also automatically
// returns any error message. Returns empty string if there's // 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); 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; (*ostream) << std::endl;
} }
} else { } else {
assert(msg != "attempt to yield from outside a coroutine");
(*ostream) << msg << std::endl; (*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); Gui::store_global_pointer(L, nullptr);
if (!msg.empty()) { if (!msg.empty()) {
gui->clear(0); gui->clear(0);
assert(msg != "attempt to yield from outside a coroutine");
std::cerr << msg << std::endl; std::cerr << msg << std::endl;
LS.result(); LS.result();
return; return;