To: vim_dev@googlegroups.com Subject: Patch 8.2.3945 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.3945 Problem: Vim9: partial variable argument types are wrong, leading to a crash. Solution: When adjusting the argument count also adjust the argument types. (closes #9433) Files: src/vim9type.c, src/userfunc.c, src/testdir/test_vim9_assign.vim *** ../vim-8.2.3944/src/vim9type.c 2021-12-22 13:18:36.145009230 +0000 --- src/vim9type.c 2021-12-30 13:19:08.412738176 +0000 *************** *** 371,376 **** --- 371,388 ---- *type = *ufunc->uf_func_type; type->tt_argcount -= tv->vval.v_partial->pt_argc; type->tt_min_argcount -= tv->vval.v_partial->pt_argc; + if (type->tt_argcount == 0) + type->tt_args = NULL; + else + { + int i; + + func_type_add_arg_types(type, type->tt_argcount, + type_gap); + for (i = 0; i < type->tt_argcount; ++i) + type->tt_args[i] = ufunc->uf_func_type->tt_args[ + i + tv->vval.v_partial->pt_argc]; + } return type; } return ufunc->uf_func_type; *************** *** 464,469 **** --- 476,484 ---- type_T *actual_type; int res = FAIL; + if (expected == NULL) + return OK; // didn't expect anything. + // For some values there is no type, assume an error will be given later // for an invalid value. if ((actual_tv->v_type == VAR_FUNC && actual_tv->vval.v_string == NULL) *** ../vim-8.2.3944/src/userfunc.c 2021-12-28 20:59:51.979937080 +0000 --- src/userfunc.c 2021-12-30 12:39:46.211628619 +0000 *************** *** 3326,3331 **** --- 3326,3332 ---- int argv_base = 0; partial_T *partial = funcexe->fe_partial; type_T check_type; + type_T *check_type_args[MAX_FUNC_ARGS]; // Initialize rettv so that it is safe for caller to invoke clear_tv(rettv) // even when call_func() returns FAIL. *************** *** 3377,3382 **** --- 3378,3388 ---- // make a copy of the type with the correction. check_type = *funcexe->fe_check_type; funcexe->fe_check_type = &check_type; + check_type.tt_args = check_type_args; + CLEAR_FIELD(check_type_args); + for (i = 0; i < check_type.tt_argcount; ++i) + check_type_args[i + partial->pt_argc] = + check_type.tt_args[i]; check_type.tt_argcount += partial->pt_argc; check_type.tt_min_argcount += partial->pt_argc; } *** ../vim-8.2.3944/src/testdir/test_vim9_assign.vim 2021-12-19 18:33:17.321954811 +0000 --- src/testdir/test_vim9_assign.vim 2021-12-30 13:10:07.613177668 +0000 *************** *** 847,852 **** --- 847,882 ---- Ref() END CheckScriptSuccess(lines) + + lines =<< trim END + vim9script + + var nres: any + var sres: any + def Func(n: number, s = '') + nres = n + sres = s + enddef + + var n: number + var Ref = function(Func, [n]) + Ref('x') + assert_equal(0, nres) + assert_equal('x', sres) + END + CheckScriptSuccess(lines) + + lines =<< trim END + vim9script + + def Func(n: number, s = '') + enddef + + var n: number + var Ref = function(Func, [n]) + Ref(0) + END + CheckScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected string but got number') enddef def Test_assignment_list_any_index() *** ../vim-8.2.3944/src/version.c 2021-12-30 11:40:49.936654054 +0000 --- src/version.c 2021-12-30 13:24:56.472357340 +0000 *************** *** 751,752 **** --- 751,754 ---- { /* Add new patch number below this line */ + /**/ + 3945, /**/ -- hundred-and-one symptoms of being an internet addict: 151. You find yourself engaged to someone you've never actually met, except through e-mail. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///