diff options
-rw-r--r-- | src/nvim/eval.c | 2 | ||||
-rw-r--r-- | src/nvim/eval/userfunc.c | 3 | ||||
-rw-r--r-- | test/functional/lua/luaeval_spec.lua | 37 |
3 files changed, 41 insertions, 1 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c index b0f7aefc7b..007b16568f 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -2630,7 +2630,7 @@ static int may_call_simple_func(const char *arg, typval_T *rettv) if (parens != NULL && *skipwhite(parens + 2) == NUL) { if (strnequal(arg, "v:lua.", 6)) { const char *p = arg + 6; - if (skip_luafunc_name(p) == parens) { + if (p != parens && skip_luafunc_name(p) == parens) { r = call_simple_luafunc(p, (size_t)(parens - p), rettv); } } else { diff --git a/src/nvim/eval/userfunc.c b/src/nvim/eval/userfunc.c index f7ce5334f0..d2bae72531 100644 --- a/src/nvim/eval/userfunc.c +++ b/src/nvim/eval/userfunc.c @@ -1779,6 +1779,9 @@ theend: int call_simple_luafunc(const char *funcname, size_t len, typval_T *rettv) FUNC_ATTR_NONNULL_ALL { + rettv->v_type = VAR_NUMBER; // default rettv is number zero + rettv->vval.v_number = 0; + typval_T argvars[1]; argvars[0].v_type = VAR_UNKNOWN; nlua_typval_call(funcname, len, argvars, 0, rettv); diff --git a/test/functional/lua/luaeval_spec.lua b/test/functional/lua/luaeval_spec.lua index 2f137e280c..f3db729c09 100644 --- a/test/functional/lua/luaeval_spec.lua +++ b/test/functional/lua/luaeval_spec.lua @@ -13,6 +13,7 @@ local fn = n.fn local clear = n.clear local eval = n.eval local feed = n.feed +local assert_alive = n.assert_alive local NIL = vim.NIL local eq = t.eq @@ -558,5 +559,41 @@ describe('v:lua', function() eq("Vim:E107: Missing parentheses: v:lua", pcall_err(eval, "'bad'->v:lua")) eq("Vim:E1085: Not a callable type: v:lua", pcall_err(eval, "'bad'->v:lua()")) eq([[Vim:E15: Invalid expression: "v:lua.()"]], pcall_err(eval, "'bad'->v:lua.()")) + + eq("Vim:E1085: Not a callable type: v:lua", pcall_err(eval, "v:lua()")) + eq([[Vim:E15: Invalid expression: "v:lua.()"]], pcall_err(eval, "v:lua.()")) + end) + + describe('invalid use in fold text', function() + before_each(function() + feed('ifoo<CR>bar<Esc>') + command('1,2fold') + end) + + it('with missing function name when used as simple function', function() + api.nvim_set_option_value('debug', 'throw', {}) + eq( + [[Vim(eval):E15: Invalid expression: "v:lua.()"]], + pcall_err(command, 'set foldtext=v:lua.() | eval foldtextresult(1)') + ) + end) + + it('with missing function name when used in expression', function() + api.nvim_set_option_value('debug', 'throw', {}) + eq( + [[Vim(eval):E15: Invalid expression: "+v:lua.()"]], + pcall_err(command, 'set foldtext=+v:lua.() | eval foldtextresult(1)') + ) + end) + + it('with non-existent function when used as simple function', function() + command('set foldtext=v:lua.NoSuchFunc() | eval foldtextresult(1)') + assert_alive() + end) + + it('with non-existent function when used in expression', function() + command('set foldtext=+v:lua.NoSuchFunc() | eval foldtextresult(1)') + assert_alive() + end) end) end) |