changeset 19336:1cd6eab65ce0 v8.2.0226

patch 8.2.0226: compiling for loop not tested Commit: https://github.com/vim/vim/commit/04d0522046e79d0e13c1317ad34bf228722ec728 Author: Bram Moolenaar <Bram@vim.org> Date: Thu Feb 6 22:06:54 2020 +0100 patch 8.2.0226: compiling for loop not tested Problem: Compiling for loop not tested. Solution: Add a test. Make variable initialization work for more types.
author Bram Moolenaar <Bram@vim.org>
date Thu, 06 Feb 2020 22:15:03 +0100
parents fcd98c9a13e4
children 3c9d338aaaeb
files src/testdir/test_vim9_disassemble.vim src/version.c src/vim9compile.c
diffstat 3 files changed, 77 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_vim9_disassemble.vim
+++ b/src/testdir/test_vim9_disassemble.vim
@@ -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
--- 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 */
 /**/
+    226,
+/**/
     225,
 /**/
     224,
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -3427,13 +3427,51 @@ compile_assignment(char_u *arg, exarg_T 
     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 != '=')