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
 }
 
 /*