changeset 19281:9fcdeaa18bd1 v8.2.0199

patch 8.2.0199: Vim9 script commands not sufficiently tested Commit: https://github.com/vim/vim/commit/0f18b6d17baa7d33f209a3184726a162c2bb7ed8 Author: Bram Moolenaar <Bram@vim.org> 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.
author Bram Moolenaar <Bram@vim.org>
date Sun, 02 Feb 2020 17:30:03 +0100
parents 669bd4306d67
children 0d513180baa1
files src/testdir/test_vim9_script.vim src/userfunc.c src/version.c src/vim9execute.c
diffstat 4 files changed, 58 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- 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('<SNR>\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
 
 
--- 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;
     }
--- 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,
--- 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)