From fb43cfc2c6a003b850343bfd27cb3059c734d7d4 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Fri, 11 Mar 2022 18:54:17 +0000 Subject: [PATCH] patch 8.2.4548: script-local function is deleted when used in a funcref Problem: Script-local function is deleted when used in a funcref. Solution: Do not consider a function starting with "" reference counted. (closes #9916, closes #9820) --- src/testdir/test_vim9_func.vim | 18 ++++++++++++++++++ src/userfunc.c | 7 ++++--- src/version.c | 2 ++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim index 85e8e9d3d..43fc68ef7 100644 --- a/src/testdir/test_vim9_func.vim +++ b/src/testdir/test_vim9_func.vim @@ -3717,6 +3717,24 @@ def Test_nested_closure_in_dict() v9.CheckScriptSuccess(lines) enddef +def Test_script_local_other_script() + var lines =<< trim END + function LegacyJob() + let FuncRef = function('s:close_cb') + endfunction + function s:close_cb(...) + endfunction + END + lines->writefile('Xlegacy.vim') + source Xlegacy.vim + g:LegacyJob() + g:LegacyJob() + g:LegacyJob() + + delfunc g:LegacyJob + delete('Xlegacy.vim') +enddef + def Test_check_func_arg_types() var lines =<< trim END vim9script diff --git a/src/userfunc.c b/src/userfunc.c index 42e1e89bc..6a5d84bfd 100644 --- a/src/userfunc.c +++ b/src/userfunc.c @@ -2215,8 +2215,9 @@ numbered_function(char_u *name) /* * There are two kinds of function names: - * 1. ordinary names, function defined with :function or :def - * 2. numbered functions and lambdas + * 1. ordinary names, function defined with :function or :def; + * can start with "123_" literally or with K_SPECIAL. + * 2. Numbered functions and lambdas: "123" * For the first we only count the name stored in func_hashtab as a reference, * using function() does not count as a reference, because the function is * looked up by name. @@ -2224,7 +2225,7 @@ numbered_function(char_u *name) int func_name_refcount(char_u *name) { - return numbered_function(name) || *name == '<'; + return numbered_function(name) || (name[0] == '<' && name[1] == 'l'); } /* diff --git a/src/version.c b/src/version.c index eec3622c5..2efc6bff3 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4548, /**/ 4547, /**/ -- 2.40.0