Did you check docs and existing issues?
Neovim version (nvim -v)
0.12.1
Operating system/version
Linux
Describe the bug
Due to combination of lazy.nvim resolution logic and LuaJIT __index nesting limit, lazy.nvim fails to start when more than 99 plugin definitions have child specs (or dependencies?) for the same plugin. In practice, this happens in AstroNvim with lots of astrocommunity packs loaded.
Stacktrace with max(i) > 100:
Error in /app/nvim/init.lua:
E5113: Lua chunk: ...m/.repro/data/nvim/lazy/lazy.nvim/lua/lazy/core/meta.lua:214: loop in gettable
stack traceback:
...m/.repro/data/nvim/lazy/lazy.nvim/lua/lazy/core/meta.lua:214: in function '_rebuild'
...m/.repro/data/nvim/lazy/lazy.nvim/lua/lazy/core/meta.lua:155: in function 'rebuild'
...m/.repro/data/nvim/lazy/lazy.nvim/lua/lazy/core/meta.lua:348: in function 'resolve'
....repro/data/nvim/lazy/lazy.nvim/lua/lazy/core/plugin.lua:54: in function 'parse'
....repro/data/nvim/lazy/lazy.nvim/lua/lazy/core/plugin.lua:335: in function 'load'
....repro/data/nvim/lazy/lazy.nvim/lua/lazy/core/loader.lua:37: in function 'setup'
...neovim/.repro/data/nvim/lazy/lazy.nvim/lua/lazy/init.lua:102: in function 'setup'
...eovim/.repro/data/nvim/lazy/lazy.nvim/lua/lazy/minit.lua:64: in function 'setup'
...eovim/.repro/data/nvim/lazy/lazy.nvim/lua/lazy/minit.lua:103: in function 'repro'
/app/nvim/init.lua:18: in main chunk
Stacktrace with max(i) == 100:
Error in /app/nvim/init.lua:
E5113: Lua chunk: ...m/.repro/data/nvim/lazy/lazy.nvim/lua/lazy/core/meta.lua:267: loop in gettable
stack traceback:
...m/.repro/data/nvim/lazy/lazy.nvim/lua/lazy/core/meta.lua:267: in function 'fix_cond'
...m/.repro/data/nvim/lazy/lazy.nvim/lua/lazy/core/meta.lua:352: in function 'resolve'
....repro/data/nvim/lazy/lazy.nvim/lua/lazy/core/plugin.lua:54: in function 'parse'
....repro/data/nvim/lazy/lazy.nvim/lua/lazy/core/plugin.lua:335: in function 'load'
....repro/data/nvim/lazy/lazy.nvim/lua/lazy/core/loader.lua:37: in function 'setup'
...neovim/.repro/data/nvim/lazy/lazy.nvim/lua/lazy/init.lua:102: in function 'setup'
...eovim/.repro/data/nvim/lazy/lazy.nvim/lua/lazy/minit.lua:64: in function 'setup'
...eovim/.repro/data/nvim/lazy/lazy.nvim/lua/lazy/minit.lua:103: in function 'repro'
/app/nvim/init.lua:18: in main chunk
Issue is gone when Neovim is built with patched LuaJIT:
diff --git a/src/lj_def.h b/src/lj_def.h
index 9293e6fb..cb75b24f 100644
--- a/src/lj_def.h
+++ b/src/lj_def.h
@@ -68,7 +68,7 @@ typedef unsigned int uintptr_t;
#define LJ_MAX_LOCVAR 200 /* Max. # of local variables. */
#define LJ_MAX_UPVAL 120 /* Max. # of upvalues. */
-#define LJ_MAX_IDXCHAIN 100 /* __index/__newindex chain limit. */
+#define LJ_MAX_IDXCHAIN 300 /* __index/__newindex chain limit. */
#define LJ_STACK_EXTRA (5+3*LJ_FR2) /* Extra stack space (metamethods). */
#if defined(__powerpc64__) && _CALL_ELF != 2
Real use-case tree looks like this:
lazynvim_debug.txt
Steps To Reproduce
Expected Behavior
Ideally, lazy.nvim should be able to handle unlimited amount of child specs.
Repro
vim.env.LAZY_STDPATH = ".repro"
load(vim.fn.system("curl -s https://raw.githubusercontent.com/folke/lazy.nvim/main/bootstrap.lua"))()
local specs = {}
local plugin = [[
return {"folke/noice.nvim", specs = {
{
"AstroNvim/astrocore",
opts = {}
}
}}
]]
for i = 1, 100 do
table.insert(specs, load(plugin)())
end
require("lazy.minit").repro({
spec = specs,
})
EDIT: Small fix in repro code.
Did you check docs and existing issues?
Neovim version (nvim -v)
0.12.1
Operating system/version
Linux
Describe the bug
Due to combination of lazy.nvim resolution logic and LuaJIT __index nesting limit, lazy.nvim fails to start when more than 99 plugin definitions have child
specs(ordependencies?) for the same plugin. In practice, this happens in AstroNvim with lots of astrocommunity packs loaded.Stacktrace with
max(i) > 100:Stacktrace with
max(i) == 100:Issue is gone when Neovim is built with patched LuaJIT:
Real use-case tree looks like this:
lazynvim_debug.txt
Steps To Reproduce
Expected Behavior
Ideally, lazy.nvim should be able to handle unlimited amount of child specs.
Repro
EDIT: Small fix in repro code.