summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-02-06 21:27:08 +0100
committerBram Moolenaar <Bram@vim.org>2020-02-06 21:27:08 +0100
commit777770fbb0f3c091cbfa22572b953c0723355710 (patch)
treefeeae88484dc8eb12306aed90b7c5389e46820df
parent158906cffc62bc82bc38198c2104967f2a70542c (diff)
patch 8.2.0225: compiling lambda not tested yetv8.2.0225
Problem: compiling lambda not tested yet. Solution: Add test for lambda and funcref. Drop unused instruction arg.
-rw-r--r--src/testdir/test_vim9_disassemble.vim47
-rw-r--r--src/version.c2
-rw-r--r--src/vim9.h1
-rw-r--r--src/vim9execute.c12
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
}
/*