Patch 8.2.2590

9 views
Skip to first unread message

Bram Moolenaar

unread,
Mar 11, 2021, 2:04:56 PM3/11/21
to vim...@googlegroups.com

Patch 8.2.2590
Problem: Vim9: default argument value may cause internal error.
Solution: Hide later function arguments when compiling the expression.
(closes #7948)
Files: src/vim9compile.c, src/testdir/test_vim9_func.vim


*** ../vim-8.2.2589/src/vim9compile.c 2021-03-10 19:04:04.218736962 +0100
--- src/vim9compile.c 2021-03-11 20:00:14.234378887 +0100
***************
*** 8199,8204 ****
--- 8199,8205 ----
{
int count = ufunc->uf_def_args.ga_len;
int first_def_arg = ufunc->uf_args.ga_len - count;
+ int uf_args_len = ufunc->uf_args.ga_len;
int i;
char_u *arg;
int off = STACK_FRAME_SIZE + (ufunc->uf_va_name != NULL ? 1 : 0);
***************
*** 8211,8226 ****
ufunc->uf_def_arg_idx = ALLOC_CLEAR_MULT(int, count + 1);
if (ufunc->uf_def_arg_idx == NULL)
goto erret;
for (i = 0; i < count; ++i)
{
garray_T *stack = &cctx.ctx_type_stack;
type_T *val_type;
int arg_idx = first_def_arg + i;
where_T where;

ufunc->uf_def_arg_idx[i] = instr->ga_len;
arg = ((char_u **)(ufunc->uf_def_args.ga_data))[i];
! if (compile_expr0(&arg, &cctx) == FAIL)
goto erret;

// If no type specified use the type of the default value.
--- 8212,8235 ----
ufunc->uf_def_arg_idx = ALLOC_CLEAR_MULT(int, count + 1);
if (ufunc->uf_def_arg_idx == NULL)
goto erret;
+ SOURCING_LNUM = 0; // line number unknown
for (i = 0; i < count; ++i)
{
garray_T *stack = &cctx.ctx_type_stack;
type_T *val_type;
int arg_idx = first_def_arg + i;
where_T where;
+ int r;
+
+ // Make sure later arguments are not found.
+ ufunc->uf_args.ga_len = i;

ufunc->uf_def_arg_idx[i] = instr->ga_len;
arg = ((char_u **)(ufunc->uf_def_args.ga_data))[i];
! r = compile_expr0(&arg, &cctx);
!
! ufunc->uf_args.ga_len = uf_args_len;
! if (r == FAIL)
goto erret;

// If no type specified use the type of the default value.
*** ../vim-8.2.2589/src/testdir/test_vim9_func.vim 2021-03-06 22:33:09.013928670 +0100
--- src/testdir/test_vim9_func.vim 2021-03-11 20:01:44.730223422 +0100
***************
*** 311,316 ****
--- 311,324 ----
delfunc g:Func
CheckScriptFailure(['def Func(arg: number = "text")', 'enddef', 'defcompile'], 'E1013: Argument 1: type mismatch, expected number but got string')
delfunc g:Func
+
+ var lines =<< trim END
+ vim9script
+ def Func(a = b == 0 ? 1 : 2, b = 0)
+ enddef
+ defcompile
+ END
+ CheckScriptFailure(lines, 'E1001: Variable not found: b')
enddef

def FuncWithComment( # comment
*** ../vim-8.2.2589/src/version.c 2021-03-10 22:27:44.597737046 +0100
--- src/version.c 2021-03-11 19:56:59.338840512 +0100
***************
*** 752,753 ****
--- 752,755 ----
{ /* Add new patch number below this line */
+ /**/
+ 2590,
/**/

--
ARTHUR: You are indeed brave Sir knight, but the fight is mine.
BLACK KNIGHT: Had enough?
ARTHUR: You stupid bastard. You havn't got any arms left.
"Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD

/// Bram Moolenaar -- Br...@Moolenaar.net -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
Reply all
Reply to author
Forward
0 new messages