From 264fbc0ace0b701ac6fa8fe217d42950c8fd79c3 Mon Sep 17 00:00:00 2001 From: Yi Ming Date: Wed, 6 May 2026 04:32:20 +0800 Subject: [PATCH] fix(lua): avoid `__index` when deciding if a table is a list #39556 Problem: When a table has `__index`, `vim.islist` is unreliable. Solution: Index using `rawget`. --- runtime/lua/vim/_core/shared.lua | 2 +- test/functional/lua/vim_spec.lua | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/runtime/lua/vim/_core/shared.lua b/runtime/lua/vim/_core/shared.lua index 6df4c85ae7..893171e3a2 100644 --- a/runtime/lua/vim/_core/shared.lua +++ b/runtime/lua/vim/_core/shared.lua @@ -960,7 +960,7 @@ function vim.islist(t) for _ in pairs(t--[[@as table]]) do - if t[j] == nil then + if rawget(t, j) == nil then return false end j = j + 1 diff --git a/test/functional/lua/vim_spec.lua b/test/functional/lua/vim_spec.lua index ce5341ad15..cdd643b80a 100644 --- a/test/functional/lua/vim_spec.lua +++ b/test/functional/lua/vim_spec.lua @@ -969,6 +969,17 @@ describe('lua stdlib', function() eq(false, exec_lua('return vim.islist({1, 2, nil, 4})')) eq(false, exec_lua('return vim.islist({nil, 2, 3, 4})')) eq(false, exec_lua('return vim.islist({1, [1.5]=2, [3]=3})')) + eq( + false, + exec_lua([[ + local t = setmetatable({ 1, [3] = 3 }, { + __index = function() + return 2 + end, + }) + return vim.islist(t) + ]]) + ) end) it('vim.tbl_isempty', function()