From 26e117e9bcc09926d654b5993d61acde6b5749db Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Tue, 4 Feb 2020 21:24:15 +0100 Subject: patch 8.2.0206: calling Vim9 function using default argument fails Problem: Calling Vim9 function using default argument fails. Solution: Give an appropriate error. (closes #5572) --- src/testdir/test_vim9_script.vim | 28 ++++++++++++++++++++++++++++ src/version.c | 2 ++ src/vim9compile.c | 8 +++++--- src/vim9execute.c | 7 +++++++ 4 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim index 2eeea54550..fee07083e6 100644 --- a/src/testdir/test_vim9_script.vim +++ b/src/testdir/test_vim9_script.vim @@ -131,6 +131,34 @@ def Test_call_varargs() assert_equal('one,two,three', MyVarargs('one', 'two', 'three')) enddef +"def Test_call_func_defined_later() +" call assert_equal('one', DefineLater('one')) +" call assert_fails('call NotDefined("one")', 'E99:') +"enddef + +func DefineLater(arg) + return a:arg +endfunc + +def MyDefaultArgs(name = 'string'): string + return name +enddef + +func Test_call_default_args_from_func() + " TODO: implement using default value for optional argument + "call assert_equal('string', MyDefaultArgs()) + call assert_fails('call MyDefaultArgs()', 'optional arguments not implemented yet') + call assert_equal('one', MyDefaultArgs('one')) + call assert_fails('call MyDefaultArgs("one", "two")', 'E118:') +endfunc + +def Test_call_default_args() + " TODO: implement using default value for optional argument + "assert_equal('string', MyDefaultArgs()) + assert_equal('one', MyDefaultArgs('one')) + assert_fails('call MyDefaultArgs("one", "two")', 'E118:') +enddef + def Test_return_type_wrong() " TODO: why is ! needed for Mac and FreeBSD? CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string') diff --git a/src/version.c b/src/version.c index 63461bd7cc..1b8a0a83b3 100644 --- a/src/version.c +++ b/src/version.c @@ -742,6 +742,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 206, /**/ 205, /**/ diff --git a/src/vim9compile.c b/src/vim9compile.c index 40411c4d3a..d7c7c8be83 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -1024,9 +1024,11 @@ generate_UCALL(cctx_T *cctx, char_u *name, int argcount) isn->isn_arg.ufunc.cuf_argcount = argcount; stack->ga_len -= argcount; // drop the arguments - - // drop the funcref/partial, get back the return value - ((type_T **)stack->ga_data)[stack->ga_len - 1] = &t_any; + if (ga_grow(stack, 1) == FAIL) + return FAIL; + // add return value + ((type_T **)stack->ga_data)[stack->ga_len] = &t_any; + ++stack->ga_len; return OK; } diff --git a/src/vim9execute.c b/src/vim9execute.c index e4aa7fe8d0..e84c70ef7d 100644 --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -362,6 +362,7 @@ call_def_function( int idx; int ret = FAIL; dfunc_T *dfunc; + int optcount = ufunc_argcount(ufunc) - argc; // Get pointer to item in the stack. #define STACK_TV(idx) (((typval_T *)ectx.ec_stack.ga_data) + idx) @@ -392,6 +393,12 @@ call_def_function( ectx.ec_frame = ectx.ec_stack.ga_len; initial_frame_ptr = ectx.ec_frame; +// TODO: Put omitted argument default values on the stack. + if (optcount > 0) + { + emsg("optional arguments not implemented yet"); + return FAIL; + } // dummy frame entries for (idx = 0; idx < STACK_FRAME_SIZE; ++idx) { -- cgit v1.2.3