summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-08-14 17:08:15 +0200
committerBram Moolenaar <Bram@vim.org>2020-08-14 17:08:15 +0200
commitc4ce36d48698669f81ec90f7c9dc9ab8c362e538 (patch)
tree2aa5e74f7d240f306be115de7445db048ea2fb8b /src
parentbc4c505166dc82911553206bb0c2133c6ac94aa1 (diff)
patch 8.2.1445: Vim9: function expanded name is cleared when sourcing againv8.2.1445
Problem: Vim9: function expanded name is cleared when sourcing a script again. Solution: Only clear the expanded name when deleting the function. (closes #6707)
Diffstat (limited to 'src')
-rw-r--r--src/testdir/test_vim9_script.vim23
-rw-r--r--src/userfunc.c4
-rw-r--r--src/version.c2
3 files changed, 28 insertions, 1 deletions
diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim
index b462e473d9..2b0a4adf21 100644
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -1796,6 +1796,29 @@ def Test_import_compile_error()
delete('Ximport.vim')
enddef
+def Test_func_redefine_error()
+ let lines = [
+ 'vim9script',
+ 'def Func()',
+ ' eval [][0]',
+ 'enddef',
+ 'Func()',
+ ]
+ writefile(lines, 'Xtestscript.vim')
+
+ for count in range(3)
+ try
+ source Xtestscript.vim
+ catch /E684/
+ # function name should contain <SNR> every time
+ assert_match('E684: list index out of range', v:exception)
+ assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
+ endtry
+ endfor
+
+ delete('Xtestscript.vim')
+enddef
+
def Test_func_overrules_import_fails()
let export_lines =<< trim END
vim9script
diff --git a/src/userfunc.c b/src/userfunc.c
index 68287ec600..6c57769929 100644
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -1090,7 +1090,6 @@ func_clear_items(ufunc_T *fp)
ga_clear_strings(&(fp->uf_args));
ga_clear_strings(&(fp->uf_def_args));
ga_clear_strings(&(fp->uf_lines));
- VIM_CLEAR(fp->uf_name_exp);
VIM_CLEAR(fp->uf_arg_types);
VIM_CLEAR(fp->uf_def_arg_idx);
VIM_CLEAR(fp->uf_va_name);
@@ -1146,7 +1145,10 @@ func_free(ufunc_T *fp, int force)
func_remove(fp);
if ((fp->uf_flags & FC_DEAD) == 0 || force)
+ {
+ VIM_CLEAR(fp->uf_name_exp);
vim_free(fp);
+ }
}
/*
diff --git a/src/version.c b/src/version.c
index 415a7cc77a..3ae2c72eab 100644
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1445,
+/**/
1444,
/**/
1443,