]> granicus.if.org Git - vim/commitdiff
patch 8.2.0225: compiling lambda not tested yet v8.2.0225
authorBram Moolenaar <Bram@vim.org>
Thu, 6 Feb 2020 20:27:08 +0000 (21:27 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 6 Feb 2020 20:27:08 +0000 (21:27 +0100)
Problem:    compiling lambda not tested yet.
Solution:   Add test for lambda and funcref. Drop unused instruction arg.

src/testdir/test_vim9_disassemble.vim
src/version.c
src/vim9.h
src/vim9execute.c

index b011342976229783ab817635bdb121ab88ab8019..20ad602f419e41f44363708a19338b7f1ff1cb29 100644 (file)
@@ -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
index 3cb8bc29fa8419941a0c9bc5c79ec0ab688f58cb..9b5682c1d131a37d96332a4c86945417b53e09fa 100644 (file)
@@ -742,6 +742,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    225,
 /**/
     224,
 /**/
index a9f0710438c17adfc213fda3213930ce40d5c643..a97796505fa196b573bb0e95eb0e9f5dc83069b2 100644 (file)
@@ -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
index d40320122eabad56fca834eed31de7e731994b8b..1b45bf99376e350679fae8cfcf3aa9bdfab873de 100644 (file)
@@ -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
 }
 
 /*