# HG changeset patch # User Bram Moolenaar # Date 1608924603 -3600 # Node ID 9b86957ddd953085b816e8cb6948767ec6815c63 # Parent 1d0b46988d16aa253ca7f532c006aeea1480ae99 patch 8.2.2218: Vim9: failure if passing more args to lambda than expected Commit: https://github.com/vim/vim/commit/fc0e8f5c3ef51c86cfa4a51f92b264ef79962b9d Author: Bram Moolenaar Date: Fri Dec 25 20:24:51 2020 +0100 patch 8.2.2218: Vim9: failure if passing more args to lambda than expected Problem: Vim9: failure if passing more arguments to a lambda than expected. Solution: Only put expected arguments on the stack. (closes https://github.com/vim/vim/issues/7548) diff --git a/src/testdir/test_vim9_builtin.vim b/src/testdir/test_vim9_builtin.vim --- a/src/testdir/test_vim9_builtin.vim +++ b/src/testdir/test_vim9_builtin.vim @@ -321,6 +321,11 @@ def Test_filter_return_type() res->assert_equal(6) enddef +def Test_filter_missing_argument() + var dict = {aa: [1], ab: [2], ac: [3], de: [4]} + var res = dict->filter({k -> k =~ 'a' && k !~ 'b'}) + res->assert_equal({aa: [1], ac: [3]}) +enddef def Test_garbagecollect() garbagecollect(true) diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2218, +/**/ 2217, /**/ 2216, diff --git a/src/vim9execute.c b/src/vim9execute.c --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -1020,8 +1020,11 @@ call_def_function( ga_init2(&ectx.ec_trystack, sizeof(trycmd_T), 10); ga_init2(&ectx.ec_funcrefs, sizeof(partial_T *), 10); - // Put arguments on the stack. - for (idx = 0; idx < argc; ++idx) + // Put arguments on the stack, but no more than what the function expects. + // A lambda can be called with more arguments than it uses. + for (idx = 0; idx < argc + && (ufunc->uf_va_name != NULL || idx < ufunc->uf_args.ga_len); + ++idx) { if (ufunc->uf_arg_types != NULL && idx < ufunc->uf_args.ga_len && check_typval_type(ufunc->uf_arg_types[idx], &argv[idx],