diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-02-05 22:10:05 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-02-05 22:10:05 +0100 |
commit | ff80cb6807d99db35cc928f151b87503b2928e19 (patch) | |
tree | 89d0ce116546e4fd5a6a3a0d8600d927024ca090 /src | |
parent | a78e9c61a0ded9c5302bc77e889aa1b3d3467f61 (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.
Diffstat (limited to 'src')
-rw-r--r-- | src/testdir/test_vim9_script.vim | 55 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9compile.c | 26 | ||||
-rw-r--r-- | src/vim9execute.c | 2 |
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; |