1
0
forked from aniani/vim

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 "<SNR>" reference
            counted. (closes #9916, closes #9820)
This commit is contained in:
Bram Moolenaar
2022-03-11 18:54:17 +00:00
parent f52fac2ed9
commit fb43cfc2c6
3 changed files with 24 additions and 3 deletions

View File

@@ -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

View File

@@ -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 "<SNR>123_" literally or with K_SPECIAL.
* 2. Numbered functions and lambdas: "<lambda>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');
}
/*

View File

@@ -750,6 +750,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
4548,
/**/
4547,
/**/