]> granicus.if.org Git - vim/commitdiff
patch 8.2.1454: Vim9: failure invoking lambda with wrong arguments v8.2.1454
authorBram Moolenaar <Bram@vim.org>
Fri, 14 Aug 2020 20:16:33 +0000 (22:16 +0200)
committerBram Moolenaar <Bram@vim.org>
Fri, 14 Aug 2020 20:16:33 +0000 (22:16 +0200)
Problem:    Vim9: failure invoking lambda with wrong arguments.
Solution:   Handle invalid arguments.  Add a test.

src/testdir/test_vim9_expr.vim
src/version.c
src/vim9compile.c
src/vim9execute.c

index 48c1cf2191a69f85e5e20c036ae21ebbba933198..fb07586bc26c7b8e765de8422fe7d9382aa20623 100644 (file)
@@ -1584,6 +1584,14 @@ def Test_expr7_lambda()
 
   call CheckDefFailure(["filter([1, 2], {k,v -> 1})"], 'E1069:')
   call CheckDefFailure(["let L = {a -> a + b}"], 'E1001:')
+
+  assert_equal('xxxyyy', 'xxx'->{a, b -> a .. b}('yyy'))
+
+  CheckDefExecFailure(["let s = 'asdf'->{a -> a}('x')"],
+        'E1106: one argument too many')
+  CheckDefExecFailure(["let s = 'asdf'->{a -> a}('x', 'y')"],
+        'E1106: 2 arguments too many')
+  CheckDefFailure(["echo 'asdf'->{a -> a}(x)"], 'E1001:')
 enddef
 
 def Test_expr7_lambda_vim9script()
index cebea645820cbe46c8788c0863fd979afa86153a..e6d929e1a8005f297e3bb3bfe26cdd65990ce33a 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1454,
 /**/
     1453,
 /**/
index bdb0f064e63c72318b9223f6f30fcd9490e9b2c3..5c4547d08da05f380dc84cddae46a6e217ff35c3 100644 (file)
@@ -1361,6 +1361,9 @@ generate_CALL(cctx_T *cctx, ufunc_T *ufunc, int pushed_argcount)
                    continue;
                expected = ufunc->uf_arg_types[i];
            }
+           else if (ufunc->uf_va_type == NULL)
+               // possibly a lambda
+               expected = &t_any;
            else
                expected = ufunc->uf_va_type->tt_member;
            actual = ((type_T **)stack->ga_data)[stack->ga_len - argcount + i];
index c87ac79e30ca4f6a04c6112f5f7d400cc51dbb73..0f7f18c3329819710c817176e8603bf7dbdb896a 100644 (file)
@@ -206,7 +206,10 @@ call_dfunc(int cdf_idx, int argcount_arg, ectx_T *ectx)
     arg_to_add = ufunc->uf_args.ga_len - argcount;
     if (arg_to_add < 0)
     {
-       iemsg("Argument count wrong?");
+       if (arg_to_add == -1)
+           emsg(_("E1106: one argument too many"));
+       else
+           semsg(_("E1106: %d arguments too many"), -arg_to_add);
        return FAIL;
     }
     if (ga_grow(&ectx->ec_stack, arg_to_add + 3