diff options
-rw-r--r-- | src/testdir/test_vim9_disassemble.vim | 47 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9.h | 1 | ||||
-rw-r--r-- | src/vim9execute.c | 12 |
4 files changed, 52 insertions, 10 deletions
diff --git a/src/testdir/test_vim9_disassemble.vim b/src/testdir/test_vim9_disassemble.vim index b011342976..20ad602f41 100644 --- a/src/testdir/test_vim9_disassemble.vim +++ b/src/testdir/test_vim9_disassemble.vim @@ -278,5 +278,52 @@ def Test_compile_const_expr() assert_notmatch('JUMP', instr) enddef +def WithLambda(): string + let F = {a -> "X" .. a .. "X"} + return F("x") +enddef + +def Test_compile_lambda() + assert_equal("XxX", WithLambda()) + let instr = execute('disassemble WithLambda') + assert_match('WithLambda.*' + \ .. 'let F = {a -> "X" .. a .. "X"}.*' + \ .. ' FUNCREF <lambda>\d\+.*' + \ .. 'PUSHS "x".*' + \ .. ' LOAD $0.*' + \ .. ' PCALL (argc 1).*' + \ .. ' CHECKTYPE string stack\[-1].*' + \, instr) +enddef + +def AndOr(arg): string + if arg == 1 && arg != 2 || arg == 4 + return 'yes' + endif + return 'no' +enddef + +def Test_compile_and_or() + assert_equal("yes", AndOr(1)) + assert_equal("no", AndOr(2)) + assert_equal("yes", AndOr(4)) + let instr = execute('disassemble AndOr') + assert_match('AndOr.*' + \ .. 'if arg == 1 && arg != 2 || arg == 4.*' + \ .. '\d LOAD arg\[-1].*' + \ .. '\d PUSHNR 1.*' + \ .. '\d COMPAREANY ==.*' + \ .. '\d JUMP_AND_KEEP_IF_FALSE -> \d\+.*' + \ .. '\d LOAD arg\[-1].*' + \ .. '\d PUSHNR 2.*' + \ .. '\d COMPAREANY !=.*' + \ .. '\d JUMP_AND_KEEP_IF_TRUE -> \d\+.*' + \ .. '\d LOAD arg\[-1].*' + \ .. '\d PUSHNR 4.*' + \ .. '\d COMPAREANY ==.*' + \ .. '\d JUMP_IF_FALSE -> \d\+.*' + \, instr) +enddef + " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker diff --git a/src/version.c b/src/version.c index 3cb8bc29fa..9b5682c1d1 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 */ /**/ + 225, +/**/ 224, /**/ 223, diff --git a/src/vim9.h b/src/vim9.h index a9f0710438..a97796505f 100644 --- a/src/vim9.h +++ b/src/vim9.h @@ -130,7 +130,6 @@ typedef struct { typedef enum { JUMP_ALWAYS, - JUMP_IF_TRUE, // pop and jump if true JUMP_IF_FALSE, // pop and jump if false JUMP_AND_KEEP_IF_TRUE, // jump if top of stack is true, drop if not JUMP_AND_KEEP_IF_FALSE, // jump if top of stack is false, drop if not diff --git a/src/vim9execute.c b/src/vim9execute.c index d40320122e..1b45bf9937 100644 --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -1001,8 +1001,7 @@ call_def_function( if (when == JUMP_IF_FALSE || when == JUMP_AND_KEEP_IF_FALSE) jump = !jump; - if (when == JUMP_IF_FALSE || when == JUMP_IF_TRUE - || !jump) + if (when == JUMP_IF_FALSE || !jump) { // drop the value from the stack clear_tv(tv); @@ -1583,15 +1582,14 @@ failed: return ret; } -#define DISASSEMBLE 1 - /* * ":dissassemble". + * We don't really need this at runtime, but we do have tests that require it, + * so always include this. */ void ex_disassemble(exarg_T *eap) { -#ifdef DISASSEMBLE char_u *fname; ufunc_T *ufunc; dfunc_T *dfunc; @@ -1840,9 +1838,6 @@ ex_disassemble(exarg_T *eap) case JUMP_ALWAYS: when = "JUMP"; break; - case JUMP_IF_TRUE: - when = "JUMP_IF_TRUE"; - break; case JUMP_AND_KEEP_IF_TRUE: when = "JUMP_AND_KEEP_IF_TRUE"; break; @@ -1997,7 +1992,6 @@ ex_disassemble(exarg_T *eap) case ISN_DROP: smsg("%4d DROP", current); break; } } -#endif } /* |