forked from aniani/vim
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.
This commit is contained in:
@@ -325,5 +325,37 @@ def Test_compile_and_or()
|
|||||||
\, instr)
|
\, instr)
|
||||||
enddef
|
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
|
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
|
||||||
|
@@ -742,6 +742,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
226,
|
||||||
/**/
|
/**/
|
||||||
225,
|
225,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -3427,13 +3427,51 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// variables are always initialized
|
// variables are always initialized
|
||||||
// TODO: support more types
|
|
||||||
if (ga_grow(instr, 1) == FAIL)
|
if (ga_grow(instr, 1) == FAIL)
|
||||||
goto theend;
|
goto theend;
|
||||||
if (type->tt_type == VAR_STRING)
|
switch (type->tt_type)
|
||||||
generate_PUSHS(cctx, vim_strsave((char_u *)""));
|
{
|
||||||
else
|
case VAR_BOOL:
|
||||||
generate_PUSHNR(cctx, 0);
|
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 != '=')
|
if (oplen > 0 && *op != '=')
|
||||||
|
Reference in New Issue
Block a user