Lua: Guard against Lua returning non-string error
Turns out that if Lua throws e.g. a table as error, tostring (and tolstring) returns NULL. And trying to print NULL into message stream causes it to hang). Guard against tolstring returning NULL, and print (null) instead of trying to print the NULL pointer.
This commit is contained in:
parent
1b582c8fbd
commit
f537f4943c
4 changed files with 20 additions and 5 deletions
|
@ -318,6 +318,20 @@ public:
|
|||
(stringfmt() << "argument #" << argindex << " to " << fname << " must be string").throwex();
|
||||
return std::string(f, f + len);
|
||||
}
|
||||
/**
|
||||
* Read slot as string.
|
||||
*
|
||||
* Parameter argindex: The stack index.
|
||||
* Returns: The string.
|
||||
*/
|
||||
std::string as_string(int argindex)
|
||||
{
|
||||
if(isnone(argindex)) return "(none)";
|
||||
size_t len;
|
||||
const char* f = lua_tolstring(lua_handle, argindex, &len);
|
||||
if(!f) return "(null)";
|
||||
return std::string(f, f + len);
|
||||
}
|
||||
/**
|
||||
* Get a boolean argument.
|
||||
*
|
||||
|
|
|
@ -37,7 +37,7 @@ public:
|
|||
int r = L.pcall(1, 0, 0);
|
||||
std::string err;
|
||||
if(r == LUA_ERRRUN)
|
||||
err = L.get_string(-1, "Lua command callback");
|
||||
err = L.as_string(-1);
|
||||
else if(r == LUA_ERRMEM)
|
||||
err = "Out of memory";
|
||||
else if(r == LUA_ERRERR)
|
||||
|
|
|
@ -533,8 +533,7 @@ bool lua_state::run_lua_fragment()
|
|||
return false;
|
||||
int t = L.load(read_lua_fragment, &luareader_fragment, "run_lua_fragment", "t");
|
||||
if(t == LUA_ERRSYNTAX) {
|
||||
messages << "Can't run Lua: Internal syntax error: " << L.tostring(-1)
|
||||
<< std::endl;
|
||||
messages << "Can't run Lua: Internal syntax error: " << L.as_string(-1) << std::endl;
|
||||
L.pop(1);
|
||||
return false;
|
||||
}
|
||||
|
@ -547,7 +546,9 @@ bool lua_state::run_lua_fragment()
|
|||
int r = L.pcall(0, 0, 0);
|
||||
recursive_flag = false;
|
||||
if(r == LUA_ERRRUN) {
|
||||
messages << "Error running Lua hunk: " << L.tostring(-1) << std::endl;
|
||||
auto msgptr = L.tostring(-1);
|
||||
if(!msgptr) msgptr = "(null)";
|
||||
messages << "Error running Lua hunk: " << L.as_string(-1) << std::endl;
|
||||
L.pop(1);
|
||||
result = false;
|
||||
}
|
||||
|
|
|
@ -178,7 +178,7 @@ namespace
|
|||
if(!ret) return;
|
||||
switch(ret) {
|
||||
case LUA_ERRRUN:
|
||||
messages << "Error in Lua memory callback: " << L.get_string(-1, "errhnd") << std::endl;
|
||||
messages << "Error in Lua memory callback: " << L.as_string(-1) << std::endl;
|
||||
L.pop(1);
|
||||
return;
|
||||
case LUA_ERRMEM:
|
||||
|
|
Loading…
Add table
Reference in a new issue