To: vim_dev@googlegroups.com Subject: Patch 8.2.3105 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.3105 Problem: Vim9: type of partial is wrong when it has arguments. Solution: Subtract arguments from the count. (issue #8492) Files: src/vim9type.c, src/userfunc.c, src/testdir/test_vim9_assign.vim *** ../vim-8.2.3104/src/vim9type.c 2021-07-04 18:28:09.779780571 +0200 --- src/vim9type.c 2021-07-04 20:00:21.288051881 +0200 *************** *** 355,361 **** --- 355,374 ---- if (ufunc->uf_func_type == NULL) set_function_type(ufunc); if (ufunc->uf_func_type != NULL) + { + if (tv->v_type == VAR_PARTIAL + && tv->vval.v_partial->pt_argc > 0) + { + type = get_type_ptr(type_gap); + if (type == NULL) + return NULL; + *type = *ufunc->uf_func_type; + type->tt_argcount -= tv->vval.v_partial->pt_argc; + type->tt_min_argcount -= tv->vval.v_partial->pt_argc; + return type; + } return ufunc->uf_func_type; + } } } *** ../vim-8.2.3104/src/userfunc.c 2021-07-03 16:33:12.513916467 +0200 --- src/userfunc.c 2021-07-04 20:14:23.230230089 +0200 *************** *** 3103,3108 **** --- 3103,3109 ---- int argv_clear = 0; int argv_base = 0; partial_T *partial = funcexe->partial; + type_T check_type; // Initialize rettv so that it is safe for caller to invoke clear_tv(rettv) // even when call_func() returns FAIL. *************** *** 3146,3151 **** --- 3147,3162 ---- argv[i + argv_clear] = argvars_in[i]; argvars = argv; argcount = partial->pt_argc + argcount_in; + + if (funcexe->check_type != NULL) + { + // Now funcexe->check_type is missing the added arguments, make + // a copy of the type with the correction. + check_type = *funcexe->check_type; + funcexe->check_type = &check_type; + check_type.tt_argcount += partial->pt_argc; + check_type.tt_min_argcount += partial->pt_argc; + } } } *** ../vim-8.2.3104/src/testdir/test_vim9_assign.vim 2021-07-04 18:28:09.779780571 +0200 --- src/testdir/test_vim9_assign.vim 2021-07-04 20:17:11.041868449 +0200 *************** *** 661,673 **** CheckDefExecAndScriptFailure(lines, 'E1012:', 5) enddef ! def PartFunc(b: bool): string return 'done' enddef def Test_assignment_partial() ! var Partial: func(): string = function(PartFunc, [true]) ! assert_equal('done', Partial()) enddef def Test_assignment_list_any_index() --- 661,676 ---- CheckDefExecAndScriptFailure(lines, 'E1012:', 5) enddef ! def PartFuncBool(b: bool): string return 'done' enddef def Test_assignment_partial() ! var lines =<< trim END ! var Partial: func(): string = function(PartFuncBool, [true]) ! assert_equal('done', Partial()) ! END ! CheckDefAndScriptSuccess(lines) enddef def Test_assignment_list_any_index() *** ../vim-8.2.3104/src/version.c 2021-07-04 18:28:09.779780571 +0200 --- src/version.c 2021-07-04 20:01:39.147882528 +0200 *************** *** 757,758 **** --- 757,760 ---- { /* Add new patch number below this line */ + /**/ + 3105, /**/ -- From "know your smileys": |-P Reaction to unusually ugly C code /// 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 ///