# HG changeset patch # User Bram Moolenaar # Date 1581023703 -3600 # Node ID 1cd6eab65ce0406eb637b534bf4994d22f74ba01 # Parent fcd98c9a13e49321007333e4d9fb8afb13f35904 patch 8.2.0226: compiling for loop not tested Commit: https://github.com/vim/vim/commit/04d0522046e79d0e13c1317ad34bf228722ec728 Author: Bram Moolenaar 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. diff --git a/src/testdir/test_vim9_disassemble.vim b/src/testdir/test_vim9_disassemble.vim --- 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 + let res: list + 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.*' + \ .. ' 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 diff --git a/src/version.c b/src/version.c --- 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, diff --git a/src/vim9compile.c b/src/vim9compile.c --- 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 != '=')