Mercurial > vim
changeset 19334:61646c189622 v8.2.0225
patch 8.2.0225: compiling lambda not tested yet
Commit: https://github.com/vim/vim/commit/777770fbb0f3c091cbfa22572b953c0723355710
Author: Bram Moolenaar <Bram@vim.org>
Date: Thu Feb 6 21:27:08 2020 +0100
patch 8.2.0225: compiling lambda not tested yet
Problem: compiling lambda not tested yet.
Solution: Add test for lambda and funcref. Drop unused instruction arg.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Thu, 06 Feb 2020 21:30:03 +0100 |
parents | 2de8257d69b8 |
children | fcd98c9a13e4 |
files | src/testdir/test_vim9_disassemble.vim src/version.c src/vim9.h src/vim9execute.c |
diffstat | 4 files changed, 52 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- 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
--- 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,
--- 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
--- 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 } /*