mirror of
https://github.com/neovim/neovim
synced 2025-07-15 16:51:49 +00:00
fix(lua)!: do not use typed table for empty dict
Problem: Empty dictionaries are converted into typed tables of the form `{ [true] = 6}` instead of an empty dictionary representation `{}`. This leads to incorrect table representation, along with failure in JSON encoding of such tables as currently tables with only string and number type keys can be encoded. Solution: The typed table logic has been removed from `nlua_push_Dictionary`. The typed table logic is required only for float value conversions which is already handled in `nlua_push_Float`. So, it is(was) no longer required here. Fixes neovim/neovim#29218
This commit is contained in:
@ -69,7 +69,8 @@ LSP
|
||||
|
||||
LUA
|
||||
|
||||
• TODO
|
||||
• API functions now consistently return an empty dictionary as
|
||||
|vim.empty_dict()|. Earlier, a |lua-special-tbl| was sometimes used.
|
||||
|
||||
OPTIONS
|
||||
|
||||
|
@ -703,14 +703,10 @@ void nlua_push_Boolean(lua_State *lstate, const Boolean b, int flags)
|
||||
void nlua_push_Dictionary(lua_State *lstate, const Dictionary dict, int flags)
|
||||
FUNC_ATTR_NONNULL_ALL
|
||||
{
|
||||
if (dict.size == 0 && (flags & kNluaPushSpecial)) {
|
||||
nlua_create_typed_table(lstate, 0, 0, kObjectTypeDictionary);
|
||||
} else {
|
||||
lua_createtable(lstate, 0, (int)dict.size);
|
||||
if (dict.size == 0 && !(flags & kNluaPushSpecial)) {
|
||||
nlua_pushref(lstate, nlua_global_refs->empty_dict_ref);
|
||||
lua_setmetatable(lstate, -2);
|
||||
}
|
||||
lua_createtable(lstate, 0, (int)dict.size);
|
||||
if (dict.size == 0) {
|
||||
nlua_pushref(lstate, nlua_global_refs->empty_dict_ref);
|
||||
lua_setmetatable(lstate, -2);
|
||||
}
|
||||
for (size_t i = 0; i < dict.size; i++) {
|
||||
nlua_push_String(lstate, dict.items[i].key, flags);
|
||||
|
@ -1500,6 +1500,8 @@ describe('API', function()
|
||||
eq('Dictionary is locked', pcall_err(request, 'nvim_set_vvar', 'nosuchvar', 42))
|
||||
api.nvim_set_vvar('errmsg', 'set by API')
|
||||
eq('set by API', api.nvim_get_vvar('errmsg'))
|
||||
api.nvim_set_vvar('completed_item', { word = 'a', user_data = vim.empty_dict() })
|
||||
eq({}, api.nvim_get_vvar('completed_item')['user_data'])
|
||||
api.nvim_set_vvar('errmsg', 42)
|
||||
eq('42', eval('v:errmsg'))
|
||||
api.nvim_set_vvar('oldfiles', { 'one', 'two' })
|
||||
|
@ -1205,8 +1205,7 @@ describe('lua stdlib', function()
|
||||
]])
|
||||
eq(true, exec_lua([[return next(vim.fn.FooFunc(3)) == nil ]]))
|
||||
eq(3, eval('g:test'))
|
||||
-- compat: nvim_call_function uses "special" value for empty dict
|
||||
eq(true, exec_lua([[return next(vim.api.nvim_call_function("FooFunc", {5})) == true ]]))
|
||||
eq(true, exec_lua([[return vim.tbl_isempty(vim.api.nvim_call_function("FooFunc", {5}))]]))
|
||||
eq(5, eval('g:test'))
|
||||
|
||||
eq({ 2, 'foo', true }, exec_lua([[return vim.fn.VarArg(2, "foo", true)]]))
|
||||
|
Reference in New Issue
Block a user