From: Bram Moolenaar Date: Fri, 25 Dec 2020 19:24:51 +0000 (+0100) Subject: patch 8.2.2218: Vim9: failure if passing more args to lambda than expected X-Git-Tag: v8.2.2218 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fc0e8f5c3ef51c86cfa4a51f92b264ef79962b9d;p=vim 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 #7548) --- diff --git a/src/testdir/test_vim9_builtin.vim b/src/testdir/test_vim9_builtin.vim index 0f03d1f5c..4abdcdba6 100644 --- 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 index f48c2afd3..90ef966cc 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 2218, /**/ 2217, /**/ diff --git a/src/vim9execute.c b/src/vim9execute.c index 4d8899167..b3abee9ef 100644 --- 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],