aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua/vim/shared.lua
diff options
context:
space:
mode:
authorphanium <91544758+phanen@users.noreply.github.com>2025-02-10 00:40:43 +0800
committerGitHub <noreply@github.com>2025-02-09 08:40:43 -0800
commitcd3855fb2be78e2dc2d2ca4b8e950d9d9d9081bb (patch)
treed381f66592e4dce8c188e16a1cc5a5531b14cd4b /runtime/lua/vim/shared.lua
parent8c2571991ad748b0ee71529951e1502e553aa8ba (diff)
downloadrneovim-cd3855fb2be78e2dc2d2ca4b8e950d9d9d9081bb.tar.gz
rneovim-cd3855fb2be78e2dc2d2ca4b8e950d9d9d9081bb.tar.bz2
rneovim-cd3855fb2be78e2dc2d2ca4b8e950d9d9d9081bb.zip
fix(lua): vim.tbl_get({}, nil, 1) should return nil #32218
Problem: `vim.tbl_get(tbl, nil, 1)` returns `tbl` itself. In this case, `keys` is not empty, but `ipairs` skips the iteration: local keys = { nil, 1 } assert(#keys == 2) for i, k in ipairs(keys) do assert(false, 'unreachable') end Solution: Use `select("#", ...)` and `select(i, ...)` to ensure consistency for count and iteration.
Diffstat (limited to 'runtime/lua/vim/shared.lua')
-rw-r--r--runtime/lua/vim/shared.lua10
1 files changed, 5 insertions, 5 deletions
diff --git a/runtime/lua/vim/shared.lua b/runtime/lua/vim/shared.lua
index f19533f474..04a40830f7 100644
--- a/runtime/lua/vim/shared.lua
+++ b/runtime/lua/vim/shared.lua
@@ -526,15 +526,15 @@ end
---@param ... any Optional keys (0 or more, variadic) via which to index the table
---@return any # Nested value indexed by key (if it exists), else nil
function vim.tbl_get(o, ...)
- local keys = { ... }
- if #keys == 0 then
+ local nargs = select('#', ...)
+ if nargs == 0 then
return nil
end
- for i, k in ipairs(keys) do
- o = o[k] --- @type any
+ for i = 1, nargs do
+ o = o[select(i, ...)] --- @type any
if o == nil then
return nil
- elseif type(o) ~= 'table' and next(keys, i) then
+ elseif type(o) ~= 'table' and i ~= nargs then
return nil
end
end