# HG changeset patch # User Bram Moolenaar # Date 1580661003 -3600 # Node ID 9fcdeaa18bd15ed6f411647c9249acf13c82d8e5 # Parent 669bd4306d67ee67bceab8c659a430d4d919b40b patch 8.2.0199: Vim9 script commands not sufficiently tested Commit: https://github.com/vim/vim/commit/0f18b6d17baa7d33f209a3184726a162c2bb7ed8 Author: Bram Moolenaar Date: Sun Feb 2 17:22:27 2020 +0100 patch 8.2.0199: Vim9 script commands not sufficiently tested Problem: Vim9 script commands not sufficiently tested. Solution: Add more tests. Fix script-local function use. diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim --- a/src/testdir/test_vim9_script.vim +++ b/src/testdir/test_vim9_script.vim @@ -106,7 +106,7 @@ def Test_call_ufunc_count() Increment() " works with and without :call assert_equal(4, g:counter) - call assert_equal(4, g:counter) + assert_equal(4, g:counter) unlet g:counter enddef @@ -354,7 +354,7 @@ def Test_fixed_size_list() l->remove(0) l->add(5) l->insert(99, 1) - call assert_equal([2, 99, 3, 4, 5], l) + assert_equal([2, 99, 3, 4, 5], l) enddef " Test that inside :function a Python function can be defined, :def is not @@ -387,15 +387,52 @@ enddef def Test_compile_const_expr() assert_equal("\nyes", execute('call HasEval()')) let instr = execute('disassemble HasEval') - call assert_match('PUSHS "yes"', instr) - call assert_notmatch('PUSHS "no"', instr) - call assert_notmatch('JUMP', instr) + assert_match('PUSHS "yes"', instr) + assert_notmatch('PUSHS "no"', instr) + assert_notmatch('JUMP', instr) assert_equal("\nno", execute('call HasNothing()')) instr = execute('disassemble HasNothing') - call assert_notmatch('PUSHS "yes"', instr) - call assert_match('PUSHS "no"', instr) - call assert_notmatch('JUMP', instr) + assert_notmatch('PUSHS "yes"', instr) + assert_match('PUSHS "no"', instr) + assert_notmatch('JUMP', instr) +enddef + +func NotCompiled() + echo "not" +endfunc + +let s:scriptvar = 4 +let g:globalvar = 'g' + +def s:ScriptFunc(arg: string) + let local = 1 + buffers + echo arg + echo local + echo v:version + echo s:scriptvar + echo g:globalvar + echo &tabstop + echo $ENVVAR + echo @z +enddef + +def Test_disassemble() + assert_fails('disass NoFunc', 'E1061:') + assert_fails('disass NotCompiled', 'E1062:') + + let res = execute('disass s:ScriptFunc') + assert_match('\d*_ScriptFunc.*' + \ .. 'buffers.*' + \ .. ' EXEC \+buffers.*' + \ .. ' LOAD arg\[-1\].*' + \ .. ' LOAD $0.*' + \ .. ' LOADV v:version.*' + \ .. ' LOADS s:scriptvar from .*test_vim9_script.vim.*' + \ .. ' LOADG g:globalvar.*' + \ .. ' LOADENV $ENVVAR.*' + \ .. ' LOADREG @z.*', res) enddef diff --git a/src/userfunc.c b/src/userfunc.c --- a/src/userfunc.c +++ b/src/userfunc.c @@ -1060,6 +1060,8 @@ call_user_func( if (fp->uf_dfunc_idx >= 0) { estack_push_ufunc(ETYPE_UFUNC, fp, 1); + save_current_sctx = current_sctx; + current_sctx = fp->uf_script_ctx; // Execute the compiled function. call_def_function(fp, argcount, argvars, rettv); @@ -1067,6 +1069,7 @@ call_user_func( current_funccal = fc->caller; estack_pop(); + current_sctx = save_current_sctx; free_funccal(fc); return; } diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -743,6 +743,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 199, +/**/ 198, /**/ 197, diff --git a/src/vim9execute.c b/src/vim9execute.c --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -1502,21 +1502,26 @@ failed: ex_disassemble(exarg_T *eap) { #ifdef DISASSEMBLE - ufunc_T *ufunc = find_func(eap->arg, NULL); + char_u *fname; + ufunc_T *ufunc; dfunc_T *dfunc; isn_T *instr; int current; int line_idx = 0; int prev_current = 0; + fname = trans_function_name(&eap->arg, FALSE, + TFN_INT | TFN_QUIET | TFN_NO_AUTOLOAD | TFN_NO_DEREF, NULL, NULL); + ufunc = find_func(fname, NULL); + vim_free(fname); if (ufunc == NULL) { - semsg("Cannot find function %s", eap->arg); + semsg("E1061: Cannot find function %s", eap->arg); return; } if (ufunc->uf_dfunc_idx < 0) { - semsg("Function %s is not compiled", eap->arg); + semsg("E1062: Function %s is not compiled", eap->arg); return; } if (ufunc->uf_name_exp != NULL)