# HG changeset patch # User Bram Moolenaar # Date 1614977102 -3600 # Node ID d6489b4eb14e271d24b9b757700a72a9dd74ea09 # Parent 1a3bde5292682ea08b70d98223fda2644b73309f patch 8.2.2572: Vim9: crash when getting the types for a legacy function Commit: https://github.com/vim/vim/commit/18062fcad648540369db5989aac297431119e037 Author: Bram Moolenaar Date: Fri Mar 5 21:35:47 2021 +0100 patch 8.2.2572: Vim9: crash when getting the types for a legacy function Problem: Vim9: crash when getting the types for a legacy function. Solution: Initialize the type list growarray. (closes https://github.com/vim/vim/issues/7929) diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim --- a/src/testdir/test_vim9_func.vim +++ b/src/testdir/test_vim9_func.vim @@ -739,6 +739,19 @@ def Test_lambda_uses_assigned_var() 'x = filter(["bbb"], (_, v) => v =~ x)']) enddef +def Test_pass_legacy_lambda_to_def_func() + var lines =<< trim END + vim9script + func Foo() + eval s:Bar({x -> 0}) + endfunc + def Bar(y: any) + enddef + Foo() + END + CheckScriptSuccess(lines) +enddef + " Default arg and varargs def MyDefVarargs(one: string, two = 'foo', ...rest: list): string var res = one .. ',' .. two diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2572, +/**/ 2571, /**/ 2570, diff --git a/src/vim9compile.c b/src/vim9compile.c --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -274,7 +274,7 @@ arg_exists( * Lookup a script-local variable in the current script, possibly defined in a * block that contains the function "cctx->ctx_ufunc". * "cctx" is NULL at the script level. - * if "len" is <= 0 "name" must be NUL terminated. + * If "len" is <= 0 "name" must be NUL terminated. * Return NULL when not found. */ static sallvar_T * @@ -8730,6 +8730,8 @@ set_function_type(ufunc_T *ufunc) // The type is included in "tt_args". if (argcount > 0 || varargs) { + if (ufunc->uf_type_list.ga_itemsize == 0) + ga_init2(&ufunc->uf_type_list, sizeof(type_T *), 10); ufunc->uf_func_type = alloc_func_type(ufunc->uf_ret_type, argcount, &ufunc->uf_type_list); // Add argument types to the function type.