mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
Merge pull request #17459 from rktjmp/lua-error-tostring
feat: __tostring lua errors if possible before showing in messages
This commit is contained in:
commit
c1b98cfa5e
@ -92,7 +92,22 @@ static void nlua_error(lua_State *const lstate, const char *const msg)
|
|||||||
FUNC_ATTR_NONNULL_ALL
|
FUNC_ATTR_NONNULL_ALL
|
||||||
{
|
{
|
||||||
size_t len;
|
size_t len;
|
||||||
const char *const str = lua_tolstring(lstate, -1, &len);
|
const char *str = NULL;
|
||||||
|
|
||||||
|
if (luaL_getmetafield(lstate, -1, "__tostring")) {
|
||||||
|
if (lua_isfunction(lstate, -1) && luaL_callmeta(lstate, -2, "__tostring")) {
|
||||||
|
// call __tostring, convert the result and pop result.
|
||||||
|
str = lua_tolstring(lstate, -1, &len);
|
||||||
|
lua_pop(lstate, 1);
|
||||||
|
}
|
||||||
|
// pop __tostring.
|
||||||
|
lua_pop(lstate, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!str) {
|
||||||
|
// defer to lua default conversion, this will render tables as [NULL].
|
||||||
|
str = lua_tolstring(lstate, -1, &len);
|
||||||
|
}
|
||||||
|
|
||||||
msg_ext_set_kind("lua_error");
|
msg_ext_set_kind("lua_error");
|
||||||
semsg_multiline(msg, (int)len, str);
|
semsg_multiline(msg, (int)len, str);
|
||||||
|
@ -61,6 +61,44 @@ describe('print', function()
|
|||||||
eq('Vim(lua):E5108: Error executing lua E5114: Error while converting print argument #2: <Unknown error: lua_tolstring returned NULL for tostring result>',
|
eq('Vim(lua):E5108: Error executing lua E5114: Error while converting print argument #2: <Unknown error: lua_tolstring returned NULL for tostring result>',
|
||||||
pcall_err(command, 'lua print("foo", v_tblout, "bar")'))
|
pcall_err(command, 'lua print("foo", v_tblout, "bar")'))
|
||||||
end)
|
end)
|
||||||
|
it('coerces error values into strings', function()
|
||||||
|
write_file(fname, [[
|
||||||
|
function string_error() error("my mistake") end
|
||||||
|
function number_error() error(1234) end
|
||||||
|
function nil_error() error(nil) end
|
||||||
|
function table_error() error({message = "my mistake"}) end
|
||||||
|
function custom_error()
|
||||||
|
local err = {message = "my mistake", code = 11234}
|
||||||
|
setmetatable(err, {
|
||||||
|
__tostring = function(t)
|
||||||
|
return "Internal Error [" .. t.code .. "] " .. t.message
|
||||||
|
end
|
||||||
|
})
|
||||||
|
error(err)
|
||||||
|
end
|
||||||
|
function bad_custom_error()
|
||||||
|
local err = {message = "my mistake", code = 11234}
|
||||||
|
setmetatable(err, {
|
||||||
|
-- intentionally not a function, downstream programmer has made an mistake
|
||||||
|
__tostring = "Internal Error [" .. err.code .. "] " .. err.message
|
||||||
|
})
|
||||||
|
error(err)
|
||||||
|
end
|
||||||
|
]])
|
||||||
|
eq('', exec_capture('luafile ' .. fname))
|
||||||
|
eq('Vim(lua):E5108: Error executing lua Xtest-functional-lua-overrides-luafile:0: my mistake',
|
||||||
|
pcall_err(command, 'lua string_error()'))
|
||||||
|
eq('Vim(lua):E5108: Error executing lua Xtest-functional-lua-overrides-luafile:0: 1234',
|
||||||
|
pcall_err(command, 'lua number_error()'))
|
||||||
|
eq('Vim(lua):E5108: Error executing lua [NULL]',
|
||||||
|
pcall_err(command, 'lua nil_error()'))
|
||||||
|
eq('Vim(lua):E5108: Error executing lua [NULL]',
|
||||||
|
pcall_err(command, 'lua table_error()'))
|
||||||
|
eq('Vim(lua):E5108: Error executing lua Internal Error [11234] my mistake',
|
||||||
|
pcall_err(command, 'lua custom_error()'))
|
||||||
|
eq('Vim(lua):E5108: Error executing lua [NULL]',
|
||||||
|
pcall_err(command, 'lua bad_custom_error()'))
|
||||||
|
end)
|
||||||
it('prints strings with NULs and NLs correctly', function()
|
it('prints strings with NULs and NLs correctly', function()
|
||||||
meths.set_option('more', true)
|
meths.set_option('more', true)
|
||||||
eq('abc ^@ def\nghi^@^@^@jkl\nTEST\n\n\nT\n',
|
eq('abc ^@ def\nghi^@^@^@jkl\nTEST\n\n\nT\n',
|
||||||
|
Loading…
Reference in New Issue
Block a user