]> granicus.if.org Git - vim/commitdiff
patch 8.2.0216: several Vim9 instructions are not tested v8.2.0216
authorBram Moolenaar <Bram@vim.org>
Wed, 5 Feb 2020 21:10:05 +0000 (22:10 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 5 Feb 2020 21:10:05 +0000 (22:10 +0100)
Problem:    Several Vim9 instructions are not tested.
Solution:   Add more tests. Fix :disassamble output. Make catch with pattern
            work.

src/testdir/test_vim9_script.vim
src/version.c
src/vim9compile.c
src/vim9execute.c

index dc1c0b973fb86c2a69c7852b14ae9a7286d370be..b862d0c19324191265c13e09a1619edea3eecf83 100644 (file)
@@ -474,6 +474,15 @@ def s:ScriptFuncLoad(arg: string)
   echo @z
 enddef
 
+def s:ScriptFuncPush()
+  let localbool = true
+  let localspec = v:none
+  let localblob = 0z1234
+  if has('float')
+    let localfloat = 1.234
+  endif
+enddef
+
 def s:ScriptFuncStore()
   let localnr = 1
   localnr = 2
@@ -487,6 +496,16 @@ def s:ScriptFuncStore()
   @z = 'rv'
 enddef
 
+def s:ScriptFuncTry()
+  try
+    echo 'yes'
+  catch /fail/
+    echo 'no'
+  finally
+    echo 'end'
+  endtry
+enddef
+
 def Test_disassemble()
   assert_fails('disass NoFunc', 'E1061:')
   assert_fails('disass NotCompiled', 'E1062:')
@@ -504,9 +523,22 @@ def Test_disassemble()
         \ .. ' LOADREG @z.*'
         \, res)
 
-  " TODO:
-  " v:char =
-  " s:scriptvar =
+  res = execute('disass s:ScriptFuncPush')
+  assert_match('<SNR>\d*_ScriptFuncPush.*'
+        \ .. 'localbool = true.*'
+        \ .. ' PUSH v:true.*'
+        \ .. 'localspec = v:none.*'
+        \ .. ' PUSH v:none.*'
+        \ .. 'localblob = 0z1234.*'
+        \ .. ' PUSHBLOB 0z1234.*'
+        \, res)
+  if has('float')
+  assert_match('<SNR>\d*_ScriptFuncPush.*'
+        \ .. 'localfloat = 1.234.*'
+        \ .. ' PUSHF 1.234.*'
+        \, res)
+  endif
+
   res = execute('disass s:ScriptFuncStore')
   assert_match('<SNR>\d*_ScriptFuncStore.*'
         \ .. 'localnr = 2.*'
@@ -526,6 +558,23 @@ def Test_disassemble()
         \ .. '@z = ''rv''.*'
         \ .. ' STOREREG @z.*'
         \, res)
+
+  res = execute('disass s:ScriptFuncTry')
+  assert_match('<SNR>\d*_ScriptFuncTry.*'
+        \ .. 'try.*'
+        \ .. 'TRY catch -> \d\+, finally -> \d\+.*'
+        \ .. 'catch /fail/.*'
+        \ .. ' JUMP -> \d\+.*'
+        \ .. ' PUSH v:exception.*'
+        \ .. ' PUSHS "fail".*'
+        \ .. ' COMPARESTRING =\~.*'
+        \ .. ' JUMP_IF_FALSE -> \d\+.*'
+        \ .. ' CATCH.*'
+        \ .. 'finally.*'
+        \ .. ' PUSHS "end".*'
+        \ .. 'endtry.*'
+        \ .. ' ENDTRY.*'
+        \, res)
 enddef
 
 
index 20a6be433daf89a0ab345ae964bb978125d52f74..45b4cc253fba6b545d7541680b5451032bf2fe07 100644 (file)
@@ -742,6 +742,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    216,
 /**/
     215,
 /**/
index 117bfd291b408addb73df30314d92655db1d9181..12400a35d54102092fa42c73d966d7c97ad0d032 100644 (file)
@@ -4369,13 +4369,33 @@ compile_catch(char_u *arg, cctx_T *cctx UNUSED)
     }
     else
     {
+       char_u *end;
+       char_u *pat;
+       char_u *tofree = NULL;
+       size_t len;
+
        // Push v:exception, push {expr} and MATCH
        generate_instr_type(cctx, ISN_PUSHEXC, &t_string);
 
-       if (compile_expr1(&p, cctx) == FAIL)
-           return NULL;
+       end = skip_regexp(p + 1, *p, TRUE, &tofree);
+       if (*end != *p)
+       {
+           semsg(_("E1067: Separator mismatch: %s"), p);
+           vim_free(tofree);
+           return FAIL;
+       }
+       if (tofree == NULL)
+           len = end - (p + 1);
+       else
+           len = end - (tofree + 1);
+       pat = vim_strnsave(p + 1, len);
+       vim_free(tofree);
+       p += len + 2;
+       if (pat == NULL)
+           return FAIL;
+       if (generate_PUSHS(cctx, pat) == FAIL)
+           return FAIL;
 
-       // TODO: check for strings?
        if (generate_COMPARE(cctx, EXPR_MATCH, FALSE) == FAIL)
            return NULL;
 
index e84c70ef7db9487d6030aa4efad612670fc0abae..093fbad8e3a7da90c56ee6e744b3be0603c25a81 100644 (file)
@@ -1726,7 +1726,7 @@ ex_disassemble(exarg_T *eap)
                    char_u      *tofree;
 
                    r = blob2string(iptr->isn_arg.blob, &tofree, numbuf);
-                   smsg("%4d PUSHBLOB \"%s\"", current, r);
+                   smsg("%4d PUSHBLOB %s", current, r);
                    vim_free(tofree);
                }
                break;