]> granicus.if.org Git - vim/commitdiff
patch 8.2.0226: compiling for loop not tested v8.2.0226
authorBram Moolenaar <Bram@vim.org>
Thu, 6 Feb 2020 21:06:54 +0000 (22:06 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 6 Feb 2020 21:06:54 +0000 (22:06 +0100)
Problem:    Compiling for loop not tested.
Solution:   Add a test.  Make variable initialization work for more types.

src/testdir/test_vim9_disassemble.vim
src/version.c
src/vim9compile.c

index 20ad602f419e41f44363708a19338b7f1ff1cb29..d9a2ad455f4b1bbf4611a06be3853108da818cfb 100644 (file)
@@ -325,5 +325,37 @@ def Test_compile_and_or()
         \, instr)
 enddef
 
+def ForLoop(): list<number>
+  let res: list<number>
+  for i in range(3)
+    res->add(i)
+  endfor
+  return res
+enddef
+
+def Test_compile_for_loop()
+  assert_equal([0, 1, 2], ForLoop())
+  let instr = execute('disassemble ForLoop')
+  assert_match('ForLoop.*'
+        \ .. 'let res: list<number>.*'
+        \ .. ' NEWLIST size 0.*'
+        \ .. '\d STORE $0.*'
+        \ .. 'for i in range(3).*'
+        \ .. '\d STORE -1 in $1.*'
+        \ .. '\d PUSHNR 3.*'
+        \ .. '\d BCALL range(argc 1).*'
+        \ .. '\d FOR $1 -> \d\+.*'
+        \ .. '\d STORE $2.*'
+        \ .. 'res->add(i).*'
+        \ .. '\d LOAD $0.*'
+        \ .. '\d LOAD $2.*'
+        \ .. '\d BCALL add(argc 2).*'
+        \ .. '\d DROP.*'
+        \ .. 'endfor.*'
+        \ .. '\d JUMP -> \d\+.*'
+        \ .. '\d DROP.*'
+        \, instr)
+enddef
+
 
 " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
index 9b5682c1d131a37d96332a4c86945417b53e09fa..4b03add2a92c8648c10b0386ff5c446aba2e39bb 100644 (file)
@@ -742,6 +742,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    226,
 /**/
     225,
 /**/
index 1c76c8adb2aca2614f29dc4d6d31a3e4db5bf637..0c72168f1bbec35f594311ca09ca1b0993f14fc4 100644 (file)
@@ -3427,13 +3427,51 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
     else
     {
        // variables are always initialized
-       // TODO: support more types
        if (ga_grow(instr, 1) == FAIL)
            goto theend;
-       if (type->tt_type == VAR_STRING)
-           generate_PUSHS(cctx, vim_strsave((char_u *)""));
-       else
-           generate_PUSHNR(cctx, 0);
+       switch (type->tt_type)
+       {
+           case VAR_BOOL:
+               generate_PUSHBOOL(cctx, VVAL_FALSE);
+               break;
+           case VAR_SPECIAL:
+               generate_PUSHSPEC(cctx, VVAL_NONE);
+               break;
+           case VAR_FLOAT:
+#ifdef FEAT_FLOAT
+               generate_PUSHF(cctx, 0.0);
+#endif
+               break;
+           case VAR_STRING:
+               generate_PUSHS(cctx, NULL);
+               break;
+           case VAR_BLOB:
+               generate_PUSHBLOB(cctx, NULL);
+               break;
+           case VAR_FUNC:
+               // generate_PUSHS(cctx, NULL); TODO
+               break;
+           case VAR_PARTIAL:
+               // generate_PUSHS(cctx, NULL); TODO
+               break;
+           case VAR_LIST:
+               generate_NEWLIST(cctx, 0);
+               break;
+           case VAR_DICT:
+               generate_NEWDICT(cctx, 0);
+               break;
+           case VAR_JOB:
+               // generate_PUSHS(cctx, NULL); TODO
+               break;
+           case VAR_CHANNEL:
+               // generate_PUSHS(cctx, NULL); TODO
+               break;
+           case VAR_NUMBER:
+           case VAR_UNKNOWN:
+           case VAR_VOID:
+               generate_PUSHNR(cctx, 0);
+               break;
+       }
     }
 
     if (oplen > 0 && *op != '=')