summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-02-05 22:10:05 +0100
committerBram Moolenaar <Bram@vim.org>2020-02-05 22:10:05 +0100
commitff80cb6807d99db35cc928f151b87503b2928e19 (patch)
tree89d0ce116546e4fd5a6a3a0d8600d927024ca090
parenta78e9c61a0ded9c5302bc77e889aa1b3d3467f61 (diff)
patch 8.2.0216: several Vim9 instructions are not testedv8.2.0216
Problem: Several Vim9 instructions are not tested. Solution: Add more tests. Fix :disassamble output. Make catch with pattern work.
-rw-r--r--src/testdir/test_vim9_script.vim55
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c26
-rw-r--r--src/vim9execute.c2
4 files changed, 78 insertions, 7 deletions
diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim
index dc1c0b973f..b862d0c193 100644
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -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
diff --git a/src/version.c b/src/version.c
index 20a6be433d..45b4cc253f 100644
--- 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 */
/**/
+ 216,
+/**/
215,
/**/
214,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index 117bfd291b..12400a35d5 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -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;
diff --git a/src/vim9execute.c b/src/vim9execute.c
index e84c70ef7d..093fbad8e3 100644
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -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;