To: vim_dev@googlegroups.com Subject: Patch 8.2.2590 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ 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 -- Bram@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 ///