Patch 8.2.0565
Problem: Vim9: tests contain superfluous line continuation.
Solution: Remove line continuation no longer needed. Skip empty lines.
Files: src/vim9compile.c, src/testdir/test_vim9_script.vim,
src/testdir/test_vim9_disassemble.vim
*** ../vim-8.2.0564/src/vim9compile.c 2020-04-12 21:52:56.875998374 +0200
--- src/vim9compile.c 2020-04-12 22:48:23.664511069 +0200
***************
*** 2065,2071 ****
line = ((char_u **)cctx->ctx_ufunc->uf_lines.ga_data)[cctx->ctx_lnum];
SOURCING_LNUM = cctx->ctx_ufunc->uf_script_ctx.sc_lnum
+ cctx->ctx_lnum + 1;
! } while (line == NULL);
return line;
}
--- 2065,2071 ----
line = ((char_u **)cctx->ctx_ufunc->uf_lines.ga_data)[cctx->ctx_lnum];
SOURCING_LNUM = cctx->ctx_ufunc->uf_script_ctx.sc_lnum
+ cctx->ctx_lnum + 1;
! } while (line == NULL || *skipwhite(line) == NUL);
return line;
}
*** ../vim-8.2.0564/src/testdir/test_vim9_script.vim 2020-04-12
20:19:12.643818971 +0200
--- src/testdir/test_vim9_script.vim 2020-04-12 22:31:51.647099276 +0200
***************
*** 599,605 ****
return valtwo
enddef
END
! writefile(lines + morelines, 'Xreload.vim')
source Xreload.vim
source Xreload.vim
source Xreload.vim
--- 599,606 ----
return valtwo
enddef
END
! writefile(lines + morelines,
! 'Xreload.vim')
source Xreload.vim
source Xreload.vim
source Xreload.vim
***************
*** 653,667 ****
assert_equal(9876, g:imported_abs)
assert_equal(8888, g:imported_after)
! assert_match('<SNR>\d\+_UseExported.*'
! \ .. 'g:imported_abs = exported.*'
! \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
! \ .. '1 STOREG g:imported_abs.*'
! \ .. 'exported = 8888.*'
! \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
! \ .. 'g:imported_after = exported.*'
! \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
! \ .. '5 STOREG g:imported_after.*',
g:import_disassembled)
unlet g:imported_abs
unlet g:import_disassembled
--- 654,668 ----
assert_equal(9876, g:imported_abs)
assert_equal(8888, g:imported_after)
! assert_match('<SNR>\d\+_UseExported.*' ..
! 'g:imported_abs = exported.*' ..
! '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
! '1 STOREG g:imported_abs.*' ..
! 'exported = 8888.*' ..
! '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
! 'g:imported_after = exported.*' ..
! '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
! '5 STOREG g:imported_after.*',
g:import_disassembled)
unlet g:imported_abs
unlet g:import_disassembled
***************
*** 913,926 ****
enddef
def Test_for_loop_fails()
! call CheckDefFailure(['for # in range(5)'], 'E690:')
! call CheckDefFailure(['for i In range(5)'], 'E690:')
! call CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
! call CheckScriptFailure(['def Func(arg)', 'for arg in range(5)', 'enddef'],
'E1006:')
! call CheckDefFailure(['for i in "text"'], 'E1024:')
! call CheckDefFailure(['for i in xxx'], 'E1001:')
! call CheckDefFailure(['endfor'], 'E588:')
! call CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
enddef
def Test_while_loop()
--- 914,927 ----
enddef
def Test_for_loop_fails()
! CheckDefFailure(['for # in range(5)'], 'E690:')
! CheckDefFailure(['for i In range(5)'], 'E690:')
! CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
! CheckScriptFailure(['def Func(arg)', 'for arg in range(5)', 'enddef'],
'E1006:')
! CheckDefFailure(['for i in "text"'], 'E1024:')
! CheckDefFailure(['for i in xxx'], 'E1001:')
! CheckDefFailure(['endfor'], 'E588:')
! CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
enddef
def Test_while_loop()
***************
*** 940,952 ****
enddef
def Test_while_loop_fails()
! call CheckDefFailure(['while xxx'], 'E1001:')
! call CheckDefFailure(['endwhile'], 'E588:')
! call CheckDefFailure(['continue'], 'E586:')
! call CheckDefFailure(['if true', 'continue'], 'E586:')
! call CheckDefFailure(['break'], 'E587:')
! call CheckDefFailure(['if true', 'break'], 'E587:')
! call CheckDefFailure(['while 1', 'echo 3'], 'E170:')
enddef
def Test_interrupt_loop()
--- 941,953 ----
enddef
def Test_while_loop_fails()
! CheckDefFailure(['while xxx'], 'E1001:')
! CheckDefFailure(['endwhile'], 'E588:')
! CheckDefFailure(['continue'], 'E586:')
! CheckDefFailure(['if true', 'continue'], 'E586:')
! CheckDefFailure(['break'], 'E587:')
! CheckDefFailure(['if true', 'break'], 'E587:')
! CheckDefFailure(['while 1', 'echo 3'], 'E170:')
enddef
def Test_interrupt_loop()
*** ../vim-8.2.0564/src/testdir/test_vim9_disassemble.vim 2020-04-05
17:07:59.418556237 +0200
--- src/testdir/test_vim9_disassemble.vim 2020-04-12 22:52:17.375899612
+0200
***************
*** 31,47 ****
assert_fails('disass <XX>foo', 'E475:')
let res = execute('disass s:ScriptFuncLoad')
! assert_match('<SNR>\d*_ScriptFuncLoad.*'
! \ .. 'buffers.*'
! \ .. ' EXEC \+buffers.*'
! \ .. ' LOAD arg\[-1\].*'
! \ .. ' LOAD $0.*'
! \ .. ' LOADV v:version.*'
! \ .. ' LOADS s:scriptvar from .*test_vim9_disassemble.vim.*'
! \ .. ' LOADG g:globalvar.*'
! \ .. ' LOADENV $ENVVAR.*'
! \ .. ' LOADREG @z.*'
! \, res)
enddef
def s:ScriptFuncPush()
--- 31,47 ----
assert_fails('disass <XX>foo', 'E475:')
let res = execute('disass s:ScriptFuncLoad')
! assert_match('<SNR>\d*_ScriptFuncLoad.*' ..
! 'buffers.*' ..
! ' EXEC \+buffers.*' ..
! ' LOAD arg\[-1\].*' ..
! ' LOAD $0.*' ..
! ' LOADV v:version.*' ..
! ' LOADS s:scriptvar from .*test_vim9_disassemble.vim.*' ..
! ' LOADG g:globalvar.*' ..
! ' LOADENV $ENVVAR.*' ..
! ' LOADREG @z.*',
! res)
enddef
def s:ScriptFuncPush()
***************
*** 55,73 ****
def Test_disassemble_push()
let res = execute('disass s:ScriptFuncPush')
! assert_match('<SNR>\d*_ScriptFuncPush.*'
! \ .. 'localbool = true.*'
! \ .. ' PUSH v:true.*'
! \ .. 'localspec = v:none.*'
! \ .. ' PUSH v:none.*'
! \ .. 'localblob = 0z1234.*'
! \ .. ' PUSHBLOB 0z1234.*'
! \, res)
if has('float')
! assert_match('<SNR>\d*_ScriptFuncPush.*'
! \ .. 'localfloat = 1.234.*'
! \ .. ' PUSHF 1.234.*'
! \, res)
endif
enddef
--- 55,73 ----
def Test_disassemble_push()
let res = execute('disass s:ScriptFuncPush')
! assert_match('<SNR>\d*_ScriptFuncPush.*' ..
! 'localbool = true.*' ..
! ' PUSH v:true.*' ..
! 'localspec = v:none.*' ..
! ' PUSH v:none.*' ..
! 'localblob = 0z1234.*' ..
! ' PUSHBLOB 0z1234.*',
! res)
if has('float')
! assert_match('<SNR>\d*_ScriptFuncPush.*' ..
! 'localfloat = 1.234.*' ..
! ' PUSHF 1.234.*',
! res)
endif
enddef
***************
*** 86,111 ****
def Test_disassemble_store()
let res = execute('disass s:ScriptFuncStore')
! assert_match('<SNR>\d*_ScriptFuncStore.*'
! \ .. 'let localnr = 1.*'
! \ .. 'localnr = 2.*'
! \ .. ' STORE 2 in $0.*'
! \ .. 'let localstr = ''abc''.*'
! \ .. 'localstr = ''xyz''.*'
! \ .. ' STORE $1.*'
! \ .. 'v:char = ''abc''.*'
! \ .. 'STOREV v:char.*'
! \ .. 's:scriptvar = ''sv''.*'
! \ .. ' STORES s:scriptvar in .*test_vim9_disassemble.vim.*'
! \ .. 'g:globalvar = ''gv''.*'
! \ .. ' STOREG g:globalvar.*'
! \ .. '&tabstop = 8.*'
! \ .. ' STOREOPT &tabstop.*'
! \ .. '$ENVVAR = ''ev''.*'
! \ .. ' STOREENV $ENVVAR.*'
! \ .. '@z = ''rv''.*'
! \ .. ' STOREREG @z.*'
! \, res)
enddef
def s:ScriptFuncTry()
--- 86,111 ----
def Test_disassemble_store()
let res = execute('disass s:ScriptFuncStore')
! assert_match('<SNR>\d*_ScriptFuncStore.*' ..
! 'let localnr = 1.*' ..
! 'localnr = 2.*' ..
! ' STORE 2 in $0.*' ..
! 'let localstr = ''abc''.*' ..
! 'localstr = ''xyz''.*' ..
! ' STORE $1.*' ..
! 'v:char = ''abc''.*' ..
! 'STOREV v:char.*' ..
! 's:scriptvar = ''sv''.*' ..
! ' STORES s:scriptvar in .*test_vim9_disassemble.vim.*' ..
! 'g:globalvar = ''gv''.*' ..
! ' STOREG g:globalvar.*' ..
! '&tabstop = 8.*' ..
! ' STOREOPT &tabstop.*' ..
! '$ENVVAR = ''ev''.*' ..
! ' STOREENV $ENVVAR.*' ..
! '@z = ''rv''.*' ..
! ' STOREREG @z.*',
! res)
enddef
def s:ScriptFuncTry()
***************
*** 120,141 ****
def Test_disassemble_try()
let res = execute('disass s:ScriptFuncTry')
! assert_match('<SNR>\d*_ScriptFuncTry.*'
! \ .. 'try.*'
! \ .. 'TRY catch -> \d\+, finally -> \d\+.*'
! \ .. 'catch /fail/.*'
! \ .. ' JUMP -> \d\+.*'
! \ .. ' PUSH v:exception.*'
! \ .. ' PUSHS "fail".*'
! \ .. ' COMPARESTRING =\~.*'
! \ .. ' JUMP_IF_FALSE -> \d\+.*'
! \ .. ' CATCH.*'
! \ .. 'finally.*'
! \ .. ' PUSHS "end".*'
! \ .. ' THROW.*'
! \ .. 'endtry.*'
! \ .. ' ENDTRY.*'
! \, res)
enddef
def s:ScriptFuncNew()
--- 120,141 ----
def Test_disassemble_try()
let res = execute('disass s:ScriptFuncTry')
! assert_match('<SNR>\d*_ScriptFuncTry.*' ..
! 'try.*' ..
! 'TRY catch -> \d\+, finally -> \d\+.*' ..
! 'catch /fail/.*' ..
! ' JUMP -> \d\+.*' ..
! ' PUSH v:exception.*' ..
! ' PUSHS "fail".*' ..
! ' COMPARESTRING =\~.*' ..
! ' JUMP_IF_FALSE -> \d\+.*' ..
! ' CATCH.*' ..
! 'finally.*' ..
! ' PUSHS "end".*' ..
! ' THROW.*' ..
! 'endtry.*' ..
! ' ENDTRY.*',
! res)
enddef
def s:ScriptFuncNew()
***************
*** 145,163 ****
def Test_disassemble_new()
let res = execute('disass s:ScriptFuncNew')
! assert_match('<SNR>\d*_ScriptFuncNew.*'
! \ .. 'let ll = \[1, "two", 333].*'
! \ .. 'PUSHNR 1.*'
! \ .. 'PUSHS "two".*'
! \ .. 'PUSHNR 333.*'
! \ .. 'NEWLIST size 3.*'
! \ .. 'let dd = #{one: 1, two: "val"}.*'
! \ .. 'PUSHS "one".*'
! \ .. 'PUSHNR 1.*'
! \ .. 'PUSHS "two".*'
! \ .. 'PUSHS "val".*'
! \ .. 'NEWDICT size 2.*'
! \, res)
enddef
def FuncWithArg(arg)
--- 145,163 ----
def Test_disassemble_new()
let res = execute('disass s:ScriptFuncNew')
! assert_match('<SNR>\d*_ScriptFuncNew.*' ..
! 'let ll = \[1, "two", 333].*' ..
! 'PUSHNR 1.*' ..
! 'PUSHS "two".*' ..
! 'PUSHNR 333.*' ..
! 'NEWLIST size 3.*' ..
! 'let dd = #{one: 1, two: "val"}.*' ..
! 'PUSHS "one".*' ..
! 'PUSHNR 1.*' ..
! 'PUSHS "two".*' ..
! 'PUSHS "val".*' ..
! 'NEWDICT size 2.*',
! res)
enddef
def FuncWithArg(arg)
***************
*** 190,228 ****
def Test_disassemble_call()
let res = execute('disass s:ScriptFuncCall')
! assert_match('<SNR>\d\+_ScriptFuncCall.*'
! \ .. 'changenr().*'
! \ .. ' BCALL changenr(argc 0).*'
! \ .. 'char2nr("abc").*'
! \ .. ' PUSHS "abc".*'
! \ .. ' BCALL char2nr(argc 1).*'
! \ .. 'Test_disassemble_new().*'
! \ .. ' DCALL Test_disassemble_new(argc 0).*'
! \ .. 'FuncWithArg(343).*'
! \ .. ' PUSHNR 343.*'
! \ .. ' DCALL FuncWithArg(argc 1).*'
! \ .. 'ScriptFuncNew().*'
! \ .. ' DCALL <SNR>\d\+_ScriptFuncNew(argc 0).*'
! \ .. 's:ScriptFuncNew().*'
! \ .. ' DCALL <SNR>\d\+_ScriptFuncNew(argc 0).*'
! \ .. 'UserFunc().*'
! \ .. ' UCALL UserFunc(argc 0).*'
! \ .. 'UserFuncWithArg("foo").*'
! \ .. ' PUSHS "foo".*'
! \ .. ' UCALL UserFuncWithArg(argc 1).*'
! \ .. 'let FuncRef = function("UserFunc").*'
! \ .. 'FuncRef().*'
! \ .. ' LOAD $\d.*'
! \ .. ' PCALL (argc 0).*'
! \ .. 'let FuncRefWithArg = function("UserFuncWithArg").*'
! \ .. 'FuncRefWithArg("bar").*'
! \ .. ' PUSHS "bar".*'
! \ .. ' LOAD $\d.*'
! \ .. ' PCALL (argc 1).*'
! \ .. 'return "yes".*'
! \ .. ' PUSHS "yes".*'
! \ .. ' RETURN.*'
! \, res)
enddef
--- 190,228 ----
def Test_disassemble_call()
let res = execute('disass s:ScriptFuncCall')
! assert_match('<SNR>\d\+_ScriptFuncCall.*' ..
! 'changenr().*' ..
! ' BCALL changenr(argc 0).*' ..
! 'char2nr("abc").*' ..
! ' PUSHS "abc".*' ..
! ' BCALL char2nr(argc 1).*' ..
! 'Test_disassemble_new().*' ..
! ' DCALL Test_disassemble_new(argc 0).*' ..
! 'FuncWithArg(343).*' ..
! ' PUSHNR 343.*' ..
! ' DCALL FuncWithArg(argc 1).*' ..
! 'ScriptFuncNew().*' ..
! ' DCALL <SNR>\d\+_ScriptFuncNew(argc 0).*' ..
! 's:ScriptFuncNew().*' ..
! ' DCALL <SNR>\d\+_ScriptFuncNew(argc 0).*' ..
! 'UserFunc().*' ..
! ' UCALL UserFunc(argc 0).*' ..
! 'UserFuncWithArg("foo").*' ..
! ' PUSHS "foo".*' ..
! ' UCALL UserFuncWithArg(argc 1).*' ..
! 'let FuncRef = function("UserFunc").*' ..
! 'FuncRef().*' ..
! ' LOAD $\d.*' ..
! ' PCALL (argc 0).*' ..
! 'let FuncRefWithArg = function("UserFuncWithArg").*' ..
! 'FuncRefWithArg("bar").*' ..
! ' PUSHS "bar".*' ..
! ' LOAD $\d.*' ..
! ' PCALL (argc 1).*' ..
! 'return "yes".*' ..
! ' PUSHS "yes".*' ..
! ' RETURN.*',
! res)
enddef
***************
*** 238,253 ****
def Test_disassemble_pcall()
let res = execute('disass s:ScriptPCall')
! assert_match('<SNR>\d\+_ScriptPCall.*'
! \ .. 'RefThis()("text").*'
! \ .. '\d DCALL RefThis(argc 0).*'
! \ .. '\d PUSHS "text".*'
! \ .. '\d PCALL top (argc 1).*'
! \ .. '\d PCALL end.*'
! \ .. '\d DROP.*'
! \ .. '\d PUSHNR 0.*'
! \ .. '\d RETURN.*'
! \, res)
enddef
--- 238,253 ----
def Test_disassemble_pcall()
let res = execute('disass s:ScriptPCall')
! assert_match('<SNR>\d\+_ScriptPCall.*' ..
! 'RefThis()("text").*' ..
! '\d DCALL RefThis(argc 0).*' ..
! '\d PUSHS "text".*' ..
! '\d PCALL top (argc 1).*' ..
! '\d PCALL end.*' ..
! '\d DROP.*' ..
! '\d PUSHNR 0.*' ..
! '\d RETURN.*',
! res)
enddef
***************
*** 261,285 ****
def Test_disassemble_update_instr()
let res = execute('disass FuncWithForwardCall')
! assert_match('FuncWithForwardCall.*'
! \ .. 'return DefinedLater("yes").*'
! \ .. '\d PUSHS "yes".*'
! \ .. '\d UCALL DefinedLater(argc 1).*'
! \ .. '\d CHECKTYPE string stack\[-1].*'
! \ .. '\d RETURN.*'
! \, res)
" Calling the function will change UCALL into the faster DCALL
assert_equal('yes', FuncWithForwardCall())
res = execute('disass FuncWithForwardCall')
! assert_match('FuncWithForwardCall.*'
! \ .. 'return DefinedLater("yes").*'
! \ .. '\d PUSHS "yes".*'
! \ .. '\d DCALL DefinedLater(argc 1).*'
! \ .. '\d CHECKTYPE string stack\[-1].*'
! \ .. '\d RETURN.*'
! \, res)
enddef
--- 261,285 ----
def Test_disassemble_update_instr()
let res = execute('disass FuncWithForwardCall')
! assert_match('FuncWithForwardCall.*' ..
! 'return DefinedLater("yes").*' ..
! '\d PUSHS "yes".*' ..
! '\d UCALL DefinedLater(argc 1).*' ..
! '\d CHECKTYPE string stack\[-1].*' ..
! '\d RETURN.*',
! res)
" Calling the function will change UCALL into the faster DCALL
assert_equal('yes', FuncWithForwardCall())
res = execute('disass FuncWithForwardCall')
! assert_match('FuncWithForwardCall.*' ..
! 'return DefinedLater("yes").*' ..
! '\d PUSHS "yes".*' ..
! '\d DCALL DefinedLater(argc 1).*' ..
! '\d CHECKTYPE string stack\[-1].*' ..
! '\d RETURN.*',
! res)
enddef
***************
*** 289,301 ****
def Test_disassemble_call_default()
let res = execute('disass FuncWithDefault')
! assert_match('FuncWithDefault.*'
! \ .. '\d PUSHS "default".*'
! \ .. '\d STORE arg\[-1].*'
! \ .. 'return arg.*'
! \ .. '\d LOAD arg\[-1].*'
! \ .. '\d RETURN.*'
! \, res)
enddef
--- 289,301 ----
def Test_disassemble_call_default()
let res = execute('disass FuncWithDefault')
! assert_match('FuncWithDefault.*' ..
! '\d PUSHS "default".*' ..
! '\d STORE arg\[-1].*' ..
! 'return arg.*' ..
! '\d LOAD arg\[-1].*' ..
! '\d RETURN.*',
! res)
enddef
***************
*** 330,360 ****
def Test_disassemble_const_expr()
assert_equal("\nyes", execute('call HasEval()'))
let instr = execute('disassemble HasEval')
! assert_match('HasEval.*'
! \ .. 'if has("eval").*'
! \ .. ' PUSHS "yes".*'
! \, instr)
assert_notmatch('JUMP', instr)
assert_equal("\nno", execute('call HasNothing()'))
instr = execute('disassemble HasNothing')
! assert_match('HasNothing.*'
! \ .. 'if has("nothing").*'
! \ .. 'else.*'
! \ .. ' PUSHS "no".*'
! \, instr)
assert_notmatch('PUSHS "yes"', instr)
assert_notmatch('JUMP', instr)
assert_equal("\neval", execute('call HasSomething()'))
instr = execute('disassemble HasSomething')
! assert_match('HasSomething.*'
! \ .. 'if has("nothing").*'
! \ .. 'elseif has("something").*'
! \ .. 'elseif has("eval").*'
! \ .. ' PUSHS "eval".*'
! \ .. 'elseif has("less").*'
! \, instr)
assert_notmatch('PUSHS "nothing"', instr)
assert_notmatch('PUSHS "something"', instr)
assert_notmatch('PUSHS "less"', instr)
--- 330,360 ----
def Test_disassemble_const_expr()
assert_equal("\nyes", execute('call HasEval()'))
let instr = execute('disassemble HasEval')
! assert_match('HasEval.*' ..
! 'if has("eval").*' ..
! ' PUSHS "yes".*',
! instr)
assert_notmatch('JUMP', instr)
assert_equal("\nno", execute('call HasNothing()'))
instr = execute('disassemble HasNothing')
! assert_match('HasNothing.*' ..
! 'if has("nothing").*' ..
! 'else.*' ..
! ' PUSHS "no".*',
! instr)
assert_notmatch('PUSHS "yes"', instr)
assert_notmatch('JUMP', instr)
assert_equal("\neval", execute('call HasSomething()'))
instr = execute('disassemble HasSomething')
! assert_match('HasSomething.*' ..
! 'if has("nothing").*' ..
! 'elseif has("something").*' ..
! 'elseif has("eval").*' ..
! ' PUSHS "eval".*' ..
! 'elseif has("less").*',
! instr)
assert_notmatch('PUSHS "nothing"', instr)
assert_notmatch('PUSHS "something"', instr)
assert_notmatch('PUSHS "less"', instr)
***************
*** 369,389 ****
def Test_disassemble_function()
let instr = execute('disassemble WithFunc')
! assert_match('WithFunc.*'
! \ .. 'let Funky1: func.*'
! \ .. '0 PUSHFUNC "\[none]".*'
! \ .. '1 STORE $0.*'
! \ .. 'let Funky2: func = function("len").*'
! \ .. '2 PUSHS "len".*'
! \ .. '3 BCALL function(argc 1).*'
! \ .. '4 STORE $1.*'
! \ .. 'let Party2: func = funcref("UserFunc").*'
! \ .. '\d PUSHS "UserFunc".*'
! \ .. '\d BCALL funcref(argc 1).*'
! \ .. '\d STORE $2.*'
! \ .. '\d PUSHNR 0.*'
! \ .. '\d RETURN.*'
! \, instr)
enddef
if has('channel')
--- 369,389 ----
def Test_disassemble_function()
let instr = execute('disassemble WithFunc')
! assert_match('WithFunc.*' ..
! 'let Funky1: func.*' ..
! '0 PUSHFUNC "\[none]".*' ..
! '1 STORE $0.*' ..
! 'let Funky2: func = function("len").*' ..
! '2 PUSHS "len".*' ..
! '3 BCALL function(argc 1).*' ..
! '4 STORE $1.*' ..
! 'let Party2: func = funcref("UserFunc").*' ..
! '\d PUSHS "UserFunc".*' ..
! '\d BCALL funcref(argc 1).*' ..
! '\d STORE $2.*' ..
! '\d PUSHNR 0.*' ..
! '\d RETURN.*',
! instr)
enddef
if has('channel')
***************
*** 398,417 ****
CheckFeature channel
let instr = execute('disassemble WithChannel')
! assert_match('WithChannel.*'
! \ .. 'let job1: job.*'
! \ .. '\d PUSHJOB "no process".*'
! \ .. '\d STORE $0.*'
! \ .. 'let job2: job = job_start("donothing").*'
! \ .. '\d PUSHS "donothing".*'
! \ .. '\d BCALL job_start(argc 1).*'
! \ .. '\d STORE $1.*'
! \ .. 'let chan1: channel.*'
! \ .. '\d PUSHCHANNEL 0.*'
! \ .. '\d STORE $2.*'
! \ .. '\d PUSHNR 0.*'
! \ .. '\d RETURN.*'
! \, instr)
enddef
def WithLambda(): string
--- 398,417 ----
CheckFeature channel
let instr = execute('disassemble WithChannel')
! assert_match('WithChannel.*' ..
! 'let job1: job.*' ..
! '\d PUSHJOB "no process".*' ..
! '\d STORE $0.*' ..
! 'let job2: job = job_start("donothing").*' ..
! '\d PUSHS "donothing".*' ..
! '\d BCALL job_start(argc 1).*' ..
! '\d STORE $1.*' ..
! 'let chan1: channel.*' ..
! '\d PUSHCHANNEL 0.*' ..
! '\d STORE $2.*' ..
! '\d PUSHNR 0.*' ..
! '\d RETURN.*',
! instr)
enddef
def WithLambda(): string
***************
*** 422,435 ****
def Test_disassemble_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
--- 422,435 ----
def Test_disassemble_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
***************
*** 444,464 ****
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
def ForLoop(): list<number>
--- 444,464 ----
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
def ForLoop(): list<number>
***************
*** 472,496 ****
def Test_disassemble_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
let g:number = 42
--- 472,496 ----
def Test_disassemble_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
let g:number = 42
***************
*** 520,572 ****
def Test_disassemble_computing()
let instr = execute('disassemble Computing')
! assert_match('Computing.*'
! \ .. 'let nr = 3.*'
! \ .. '\d STORE 3 in $0.*'
! \ .. 'let nrres = nr + 7.*'
! \ .. '\d LOAD $0.*'
! \ .. '\d PUSHNR 7.*'
! \ .. '\d OPNR +.*'
! \ .. '\d STORE $1.*'
! \ .. 'nrres = nr - 7.*'
! \ .. '\d OPNR -.*'
! \ .. 'nrres = nr \* 7.*'
! \ .. '\d OPNR \*.*'
! \ .. 'nrres = nr / 7.*'
! \ .. '\d OPNR /.*'
! \ .. 'nrres = nr % 7.*'
! \ .. '\d OPNR %.*'
! \ .. 'let anyres = g:number + 7.*'
! \ .. '\d LOADG g:number.*'
! \ .. '\d PUSHNR 7.*'
! \ .. '\d OPANY +.*'
! \ .. '\d STORE $2.*'
! \ .. 'anyres = g:number - 7.*'
! \ .. '\d OPANY -.*'
! \ .. 'anyres = g:number \* 7.*'
! \ .. '\d OPANY \*.*'
! \ .. 'anyres = g:number / 7.*'
! \ .. '\d OPANY /.*'
! \ .. 'anyres = g:number % 7.*'
! \ .. '\d OPANY %.*'
! \, instr)
if has('float')
! assert_match('Computing.*'
! \ .. 'let fl = 3.0.*'
! \ .. '\d PUSHF 3.0.*'
! \ .. '\d STORE $3.*'
! \ .. 'let flres = fl + 7.0.*'
! \ .. '\d LOAD $3.*'
! \ .. '\d PUSHF 7.0.*'
! \ .. '\d OPFLOAT +.*'
! \ .. '\d STORE $4.*'
! \ .. 'flres = fl - 7.0.*'
! \ .. '\d OPFLOAT -.*'
! \ .. 'flres = fl \* 7.0.*'
! \ .. '\d OPFLOAT \*.*'
! \ .. 'flres = fl / 7.0.*'
! \ .. '\d OPFLOAT /.*'
! \, instr)
endif
enddef
--- 520,572 ----
def Test_disassemble_computing()
let instr = execute('disassemble Computing')
! assert_match('Computing.*' ..
! 'let nr = 3.*' ..
! '\d STORE 3 in $0.*' ..
! 'let nrres = nr + 7.*' ..
! '\d LOAD $0.*' ..
! '\d PUSHNR 7.*' ..
! '\d OPNR +.*' ..
! '\d STORE $1.*' ..
! 'nrres = nr - 7.*' ..
! '\d OPNR -.*' ..
! 'nrres = nr \* 7.*' ..
! '\d OPNR \*.*' ..
! 'nrres = nr / 7.*' ..
! '\d OPNR /.*' ..
! 'nrres = nr % 7.*' ..
! '\d OPNR %.*' ..
! 'let anyres = g:number + 7.*' ..
! '\d LOADG g:number.*' ..
! '\d PUSHNR 7.*' ..
! '\d OPANY +.*' ..
! '\d STORE $2.*' ..
! 'anyres = g:number - 7.*' ..
! '\d OPANY -.*' ..
! 'anyres = g:number \* 7.*' ..
! '\d OPANY \*.*' ..
! 'anyres = g:number / 7.*' ..
! '\d OPANY /.*' ..
! 'anyres = g:number % 7.*' ..
! '\d OPANY %.*',
! instr)
if has('float')
! assert_match('Computing.*' ..
! 'let fl = 3.0.*' ..
! '\d PUSHF 3.0.*' ..
! '\d STORE $3.*' ..
! 'let flres = fl + 7.0.*' ..
! '\d LOAD $3.*' ..
! '\d PUSHF 7.0.*' ..
! '\d OPFLOAT +.*' ..
! '\d STORE $4.*' ..
! 'flres = fl - 7.0.*' ..
! '\d OPFLOAT -.*' ..
! 'flres = fl \* 7.0.*' ..
! '\d OPFLOAT \*.*' ..
! 'flres = fl / 7.0.*' ..
! '\d OPFLOAT /.*',
! instr)
endif
enddef
***************
*** 577,598 ****
def Test_disassemble_add_list_blob()
let instr = execute('disassemble AddListBlob')
! assert_match('AddListBlob.*'
! \ .. 'let reslist = \[1, 2] + \[3, 4].*'
! \ .. '\d PUSHNR 1.*'
! \ .. '\d PUSHNR 2.*'
! \ .. '\d NEWLIST size 2.*'
! \ .. '\d PUSHNR 3.*'
! \ .. '\d PUSHNR 4.*'
! \ .. '\d NEWLIST size 2.*'
! \ .. '\d ADDLIST.*'
! \ .. '\d STORE $.*.*'
! \ .. 'let resblob = 0z1122 + 0z3344.*'
! \ .. '\d PUSHBLOB 0z1122.*'
! \ .. '\d PUSHBLOB 0z3344.*'
! \ .. '\d ADDBLOB.*'
! \ .. '\d STORE $.*'
! \, instr)
enddef
let g:aa = 'aa'
--- 577,598 ----
def Test_disassemble_add_list_blob()
let instr = execute('disassemble AddListBlob')
! assert_match('AddListBlob.*' ..
! 'let reslist = \[1, 2] + \[3, 4].*' ..
! '\d PUSHNR 1.*' ..
! '\d PUSHNR 2.*' ..
! '\d NEWLIST size 2.*' ..
! '\d PUSHNR 3.*' ..
! '\d PUSHNR 4.*' ..
! '\d NEWLIST size 2.*' ..
! '\d ADDLIST.*' ..
! '\d STORE $.*.*' ..
! 'let resblob = 0z1122 + 0z3344.*' ..
! '\d PUSHBLOB 0z1122.*' ..
! '\d PUSHBLOB 0z3344.*' ..
! '\d ADDBLOB.*' ..
! '\d STORE $.*',
! instr)
enddef
let g:aa = 'aa'
***************
*** 603,616 ****
def Test_disassemble_concat()
let instr = execute('disassemble ConcatString')
! assert_match('ConcatString.*'
! \ .. 'let res = g:aa .. "bb".*'
! \ .. '\d LOADG g:aa.*'
! \ .. '\d PUSHS "bb".*'
! \ .. '\d 2STRING stack\[-2].*'
! \ .. '\d CONCAT.*'
! \ .. '\d STORE $.*'
! \, instr)
assert_equal('aabb', ConcatString())
enddef
--- 603,616 ----
def Test_disassemble_concat()
let instr = execute('disassemble ConcatString')
! assert_match('ConcatString.*' ..
! 'let res = g:aa .. "bb".*' ..
! '\d LOADG g:aa.*' ..
! '\d PUSHS "bb".*' ..
! '\d 2STRING stack\[-2].*' ..
! '\d CONCAT.*' ..
! '\d STORE $.*',
! instr)
assert_equal('aabb', ConcatString())
enddef
***************
*** 622,640 ****
def Test_disassemble_list_index()
let instr = execute('disassemble ListIndex')
! assert_match('ListIndex.*'
! \ .. 'let l = \[1, 2, 3].*'
! \ .. '\d PUSHNR 1.*'
! \ .. '\d PUSHNR 2.*'
! \ .. '\d PUSHNR 3.*'
! \ .. '\d NEWLIST size 3.*'
! \ .. '\d STORE $0.*'
! \ .. 'let res = l\[1].*'
! \ .. '\d LOAD $0.*'
! \ .. '\d PUSHNR 1.*'
! \ .. '\d INDEX.*'
! \ .. '\d STORE $1.*'
! \, instr)
assert_equal(2, ListIndex())
enddef
--- 622,640 ----
def Test_disassemble_list_index()
let instr = execute('disassemble ListIndex')
! assert_match('ListIndex.*' ..
! 'let l = \[1, 2, 3].*' ..
! '\d PUSHNR 1.*' ..
! '\d PUSHNR 2.*' ..
! '\d PUSHNR 3.*' ..
! '\d NEWLIST size 3.*' ..
! '\d STORE $0.*' ..
! 'let res = l\[1].*' ..
! '\d LOAD $0.*' ..
! '\d PUSHNR 1.*' ..
! '\d INDEX.*' ..
! '\d STORE $1.*',
! instr)
assert_equal(2, ListIndex())
enddef
***************
*** 646,662 ****
def Test_disassemble_dict_member()
let instr = execute('disassemble DictMember')
! assert_match('DictMember.*'
! \ .. 'let d = #{item: 1}.*'
! \ .. '\d PUSHS "item".*'
! \ .. '\d PUSHNR 1.*'
! \ .. '\d NEWDICT size 1.*'
! \ .. '\d STORE $0.*'
! \ .. 'let res = d.item.*'
! \ .. '\d LOAD $0.*'
! \ .. '\d MEMBER item.*'
! \ .. '\d STORE $1.*'
! \, instr)
call assert_equal(1, DictMember())
enddef
--- 646,662 ----
def Test_disassemble_dict_member()
let instr = execute('disassemble DictMember')
! assert_match('DictMember.*' ..
! 'let d = #{item: 1}.*' ..
! '\d PUSHS "item".*' ..
! '\d PUSHNR 1.*' ..
! '\d NEWDICT size 1.*' ..
! '\d STORE $0.*' ..
! 'let res = d.item.*' ..
! '\d LOAD $0.*' ..
! '\d MEMBER item.*' ..
! '\d STORE $1.*',
! instr)
call assert_equal(1, DictMember())
enddef
***************
*** 669,686 ****
def Test_disassemble_negate_number()
let instr = execute('disassemble NegateNumber')
! assert_match('NegateNumber.*'
! \ .. 'let nr = 9.*'
! \ .. '\d STORE 9 in $0.*'
! \ .. 'let plus = +nr.*'
! \ .. '\d LOAD $0.*'
! \ .. '\d CHECKNR.*'
! \ .. '\d STORE $1.*'
! \ .. 'let res = -nr.*'
! \ .. '\d LOAD $0.*'
! \ .. '\d NEGATENR.*'
! \ .. '\d STORE $2.*'
! \, instr)
call assert_equal(-9, NegateNumber())
enddef
--- 669,686 ----
def Test_disassemble_negate_number()
let instr = execute('disassemble NegateNumber')
! assert_match('NegateNumber.*' ..
! 'let nr = 9.*' ..
! '\d STORE 9 in $0.*' ..
! 'let plus = +nr.*' ..
! '\d LOAD $0.*' ..
! '\d CHECKNR.*' ..
! '\d STORE $1.*' ..
! 'let res = -nr.*' ..
! '\d LOAD $0.*' ..
! '\d NEGATENR.*' ..
! '\d STORE $2.*',
! instr)
call assert_equal(-9, NegateNumber())
enddef
***************
*** 693,801 ****
def Test_disassemble_invert_bool()
let instr = execute('disassemble InvertBool')
! assert_match('InvertBool.*'
! \ .. 'let flag = true.*'
! \ .. '\d PUSH v:true.*'
! \ .. '\d STORE $0.*'
! \ .. 'let invert = !flag.*'
! \ .. '\d LOAD $0.*'
! \ .. '\d INVERT (!val).*'
! \ .. '\d STORE $1.*'
! \ .. 'let res = !!flag.*'
! \ .. '\d LOAD $0.*'
! \ .. '\d 2BOOL (!!val).*'
! \ .. '\d STORE $2.*'
! \, instr)
call assert_equal(true, InvertBool())
enddef
def Test_disassemble_compare()
" TODO: COMPAREFUNC
let cases = [
! \ ['true == false', 'COMPAREBOOL =='],
! \ ['true != false', 'COMPAREBOOL !='],
! \ ['v:none == v:null', 'COMPARESPECIAL =='],
! \ ['v:none != v:null', 'COMPARESPECIAL !='],
! \
! \ ['111 == 222', 'COMPARENR =='],
! \ ['111 != 222', 'COMPARENR !='],
! \ ['111 > 222', 'COMPARENR >'],
! \ ['111 < 222', 'COMPARENR <'],
! \ ['111 >= 222', 'COMPARENR >='],
! \ ['111 <= 222', 'COMPARENR <='],
! \ ['111 =~ 222', 'COMPARENR =\~'],
! \ ['111 !~ 222', 'COMPARENR !\~'],
! \
! \ ['"xx" != "yy"', 'COMPARESTRING !='],
! \ ['"xx" > "yy"', 'COMPARESTRING >'],
! \ ['"xx" < "yy"', 'COMPARESTRING <'],
! \ ['"xx" >= "yy"', 'COMPARESTRING >='],
! \ ['"xx" <= "yy"', 'COMPARESTRING <='],
! \ ['"xx" =~ "yy"', 'COMPARESTRING =\~'],
! \ ['"xx" !~ "yy"', 'COMPARESTRING !\~'],
! \ ['"xx" is "yy"', 'COMPARESTRING is'],
! \ ['"xx" isnot "yy"', 'COMPARESTRING isnot'],
! \
! \ ['0z11 == 0z22', 'COMPAREBLOB =='],
! \ ['0z11 != 0z22', 'COMPAREBLOB !='],
! \ ['0z11 is 0z22', 'COMPAREBLOB is'],
! \ ['0z11 isnot 0z22', 'COMPAREBLOB isnot'],
! \
! \ ['[1,2] == [3,4]', 'COMPARELIST =='],
! \ ['[1,2] != [3,4]', 'COMPARELIST !='],
! \ ['[1,2] is [3,4]', 'COMPARELIST is'],
! \ ['[1,2] isnot [3,4]', 'COMPARELIST isnot'],
! \
! \ ['#{a:1} == #{x:2}', 'COMPAREDICT =='],
! \ ['#{a:1} != #{x:2}', 'COMPAREDICT !='],
! \ ['#{a:1} is #{x:2}', 'COMPAREDICT is'],
! \ ['#{a:1} isnot #{x:2}', 'COMPAREDICT isnot'],
! \
! \ ['{->33} == {->44}', 'COMPAREFUNC =='],
! \ ['{->33} != {->44}', 'COMPAREFUNC !='],
! \ ['{->33} is {->44}', 'COMPAREFUNC is'],
! \ ['{->33} isnot {->44}', 'COMPAREFUNC isnot'],
! \
! \ ['77 == g:xx', 'COMPAREANY =='],
! \ ['77 != g:xx', 'COMPAREANY !='],
! \ ['77 > g:xx', 'COMPAREANY >'],
! \ ['77 < g:xx', 'COMPAREANY <'],
! \ ['77 >= g:xx', 'COMPAREANY >='],
! \ ['77 <= g:xx', 'COMPAREANY <='],
! \ ['77 =~ g:xx', 'COMPAREANY =\~'],
! \ ['77 !~ g:xx', 'COMPAREANY !\~'],
! \ ['77 is g:xx', 'COMPAREANY is'],
! \ ['77 isnot g:xx', 'COMPAREANY isnot'],
! \ ]
if has('float')
cases->extend([
! \ ['1.1 == 2.2', 'COMPAREFLOAT =='],
! \ ['1.1 != 2.2', 'COMPAREFLOAT !='],
! \ ['1.1 > 2.2', 'COMPAREFLOAT >'],
! \ ['1.1 < 2.2', 'COMPAREFLOAT <'],
! \ ['1.1 >= 2.2', 'COMPAREFLOAT >='],
! \ ['1.1 <= 2.2', 'COMPAREFLOAT <='],
! \ ['1.1 =~ 2.2', 'COMPAREFLOAT =\~'],
! \ ['1.1 !~ 2.2', 'COMPAREFLOAT !\~'],
! \ ])
endif
let nr = 1
for case in cases
writefile(['def TestCase' .. nr .. '()',
! \ ' if ' .. case[0],
! \ ' echo 42'
! \ ' endif',
! \ 'enddef'], 'Xdisassemble')
source Xdisassemble
let instr = execute('disassemble TestCase' .. nr)
! assert_match('TestCase' .. nr .. '.*'
! \ .. 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*'
! \ .. '\d \(PUSH\|FUNCREF\).*'
! \ .. '\d \(PUSH\|FUNCREF\|LOADG\).*'
! \ .. '\d ' .. case[1] .. '.*'
! \ .. '\d JUMP_IF_FALSE -> \d\+.*'
! \, instr)
nr += 1
endfor
--- 693,801 ----
def Test_disassemble_invert_bool()
let instr = execute('disassemble InvertBool')
! assert_match('InvertBool.*' ..
! 'let flag = true.*' ..
! '\d PUSH v:true.*' ..
! '\d STORE $0.*' ..
! 'let invert = !flag.*' ..
! '\d LOAD $0.*' ..
! '\d INVERT (!val).*' ..
! '\d STORE $1.*' ..
! 'let res = !!flag.*' ..
! '\d LOAD $0.*' ..
! '\d 2BOOL (!!val).*' ..
! '\d STORE $2.*',
! instr)
call assert_equal(true, InvertBool())
enddef
def Test_disassemble_compare()
" TODO: COMPAREFUNC
let cases = [
! ['true == false', 'COMPAREBOOL =='],
! ['true != false', 'COMPAREBOOL !='],
! ['v:none == v:null', 'COMPARESPECIAL =='],
! ['v:none != v:null', 'COMPARESPECIAL !='],
!
! ['111 == 222', 'COMPARENR =='],
! ['111 != 222', 'COMPARENR !='],
! ['111 > 222', 'COMPARENR >'],
! ['111 < 222', 'COMPARENR <'],
! ['111 >= 222', 'COMPARENR >='],
! ['111 <= 222', 'COMPARENR <='],
! ['111 =~ 222', 'COMPARENR =\~'],
! ['111 !~ 222', 'COMPARENR !\~'],
!
! ['"xx" != "yy"', 'COMPARESTRING !='],
! ['"xx" > "yy"', 'COMPARESTRING >'],
! ['"xx" < "yy"', 'COMPARESTRING <'],
! ['"xx" >= "yy"', 'COMPARESTRING >='],
! ['"xx" <= "yy"', 'COMPARESTRING <='],
! ['"xx" =~ "yy"', 'COMPARESTRING =\~'],
! ['"xx" !~ "yy"', 'COMPARESTRING !\~'],
! ['"xx" is "yy"', 'COMPARESTRING is'],
! ['"xx" isnot "yy"', 'COMPARESTRING isnot'],
!
! ['0z11 == 0z22', 'COMPAREBLOB =='],
! ['0z11 != 0z22', 'COMPAREBLOB !='],
! ['0z11 is 0z22', 'COMPAREBLOB is'],
! ['0z11 isnot 0z22', 'COMPAREBLOB isnot'],
!
! ['[1,2] == [3,4]', 'COMPARELIST =='],
! ['[1,2] != [3,4]', 'COMPARELIST !='],
! ['[1,2] is [3,4]', 'COMPARELIST is'],
! ['[1,2] isnot [3,4]', 'COMPARELIST isnot'],
!
! ['#{a:1} == #{x:2}', 'COMPAREDICT =='],
! ['#{a:1} != #{x:2}', 'COMPAREDICT !='],
! ['#{a:1} is #{x:2}', 'COMPAREDICT is'],
! ['#{a:1} isnot #{x:2}', 'COMPAREDICT isnot'],
!
! ['{->33} == {->44}', 'COMPAREFUNC =='],
! ['{->33} != {->44}', 'COMPAREFUNC !='],
! ['{->33} is {->44}', 'COMPAREFUNC is'],
! ['{->33} isnot {->44}', 'COMPAREFUNC isnot'],
!
! ['77 == g:xx', 'COMPAREANY =='],
! ['77 != g:xx', 'COMPAREANY !='],
! ['77 > g:xx', 'COMPAREANY >'],
! ['77 < g:xx', 'COMPAREANY <'],
! ['77 >= g:xx', 'COMPAREANY >='],
! ['77 <= g:xx', 'COMPAREANY <='],
! ['77 =~ g:xx', 'COMPAREANY =\~'],
! ['77 !~ g:xx', 'COMPAREANY !\~'],
! ['77 is g:xx', 'COMPAREANY is'],
! ['77 isnot g:xx', 'COMPAREANY isnot'],
! ]
if has('float')
cases->extend([
! ['1.1 == 2.2', 'COMPAREFLOAT =='],
! ['1.1 != 2.2', 'COMPAREFLOAT !='],
! ['1.1 > 2.2', 'COMPAREFLOAT >'],
! ['1.1 < 2.2', 'COMPAREFLOAT <'],
! ['1.1 >= 2.2', 'COMPAREFLOAT >='],
! ['1.1 <= 2.2', 'COMPAREFLOAT <='],
! ['1.1 =~ 2.2', 'COMPAREFLOAT =\~'],
! ['1.1 !~ 2.2', 'COMPAREFLOAT !\~'],
! ])
endif
let nr = 1
for case in cases
writefile(['def TestCase' .. nr .. '()',
! ' if ' .. case[0],
! ' echo 42'
! ' endif',
! 'enddef'], 'Xdisassemble')
source Xdisassemble
let instr = execute('disassemble TestCase' .. nr)
! assert_match('TestCase' .. nr .. '.*' ..
! 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
! '\d \(PUSH\|FUNCREF\).*' ..
! '\d \(PUSH\|FUNCREF\|LOADG\).*' ..
! '\d ' .. case[1] .. '.*' ..
! '\d JUMP_IF_FALSE -> \d\+.*',
! instr)
nr += 1
endfor
***************
*** 805,843 ****
def Test_disassemble_compare_const()
let cases = [
! \ ['"xx" == "yy"', false],
! \ ['"aa" == "aa"', true],
! \ ['has("eval") ? true : false', true],
! \ ['has("asdf") ? true : false', false],
! \ ]
let nr = 1
for case in cases
writefile(['def TestCase' .. nr .. '()',
! \ ' if ' .. case[0],
! \ ' echo 42'
! \ ' endif',
! \ 'enddef'], 'Xdisassemble')
source Xdisassemble
let instr = execute('disassemble TestCase' .. nr)
if case[1]
" condition true, "echo 42" executed
! assert_match('TestCase' .. nr .. '.*'
! \ .. 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*'
! \ .. '\d PUSHNR 42.*'
! \ .. '\d ECHO 1.*'
! \ .. '\d PUSHNR 0.*'
! \ .. '\d RETURN.*'
! \, instr)
else
" condition false, function just returns
! assert_match('TestCase' .. nr .. '.*'
! \ .. 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*'
! \ .. 'echo 42[ \n]*'
! \ .. 'endif[ \n]*'
! \ .. '\s*\d PUSHNR 0.*'
! \ .. '\d RETURN.*'
! \, instr)
endif
nr += 1
--- 805,843 ----
def Test_disassemble_compare_const()
let cases = [
! ['"xx" == "yy"', false],
! ['"aa" == "aa"', true],
! ['has("eval") ? true : false', true],
! ['has("asdf") ? true : false', false],
! ]
let nr = 1
for case in cases
writefile(['def TestCase' .. nr .. '()',
! ' if ' .. case[0],
! ' echo 42'
! ' endif',
! 'enddef'], 'Xdisassemble')
source Xdisassemble
let instr = execute('disassemble TestCase' .. nr)
if case[1]
" condition true, "echo 42" executed
! assert_match('TestCase' .. nr .. '.*' ..
! 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
! '\d PUSHNR 42.*' ..
! '\d ECHO 1.*' ..
! '\d PUSHNR 0.*' ..
! '\d RETURN.*',
! instr)
else
" condition false, function just returns
! assert_match('TestCase' .. nr .. '.*' ..
! 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
! 'echo 42[ \n]*' ..
! 'endif[ \n]*' ..
! '\s*\d PUSHNR 0.*' ..
! '\d RETURN.*',
! instr)
endif
nr += 1
***************
*** 856,882 ****
def Test_disassemble_execute()
let res = execute('disass s:Execute')
! assert_match('\<SNR>\d*_Execute.*'
! \ .. "execute 'help vim9.txt'.*"
! \ .. '\d PUSHS "help vim9.txt".*'
! \ .. '\d EXECUTE 1.*'
! \ .. "let cmd = 'help vim9.txt'.*"
! \ .. '\d PUSHS "help vim9.txt".*'
! \ .. '\d STORE $0.*'
! \ .. 'execute cmd.*'
! \ .. '\d LOAD $0.*'
! \ .. '\d EXECUTE 1.*'
! \ .. "let tag = 'vim9.txt'.*"
! \ .. '\d PUSHS "vim9.txt".*'
! \ .. '\d STORE $1.*'
! \ .. "execute 'help ' .. tag.*"
! \ .. '\d PUSHS "help ".*'
! \ .. '\d LOAD $1.*'
! \ .. '\d CONCAT.*'
! \ .. '\d EXECUTE 1.*'
! \ .. '\d PUSHNR 0.*'
! \ .. '\d RETURN'
! \, res)
enddef
def SomeStringArg(arg: string)
--- 856,882 ----
def Test_disassemble_execute()
let res = execute('disass s:Execute')
! assert_match('\<SNR>\d*_Execute.*' ..
! "execute 'help vim9.txt'.*" ..
! '\d PUSHS "help vim9.txt".*' ..
! '\d EXECUTE 1.*' ..
! "let cmd = 'help vim9.txt'.*" ..
! '\d PUSHS "help vim9.txt".*' ..
! '\d STORE $0.*' ..
! 'execute cmd.*' ..
! '\d LOAD $0.*' ..
! '\d EXECUTE 1.*' ..
! "let tag = 'vim9.txt'.*" ..
! '\d PUSHS "vim9.txt".*' ..
! '\d STORE $1.*' ..
! "execute 'help ' .. tag.*" ..
! '\d PUSHS "help ".*' ..
! '\d LOAD $1.*' ..
! '\d CONCAT.*' ..
! '\d EXECUTE 1.*' ..
! '\d PUSHNR 0.*' ..
! '\d RETURN',
! res)
enddef
def SomeStringArg(arg: string)
***************
*** 893,914 ****
def Test_display_func()
let res1 = execute('function SomeStringArg')
! assert_match('.* def SomeStringArg(arg: string).*'
! \ .. ' echo arg.*'
! \ .. ' enddef'
! \, res1)
let res2 = execute('function SomeAnyArg')
! assert_match('.* def SomeAnyArg(arg: any).*'
! \ .. ' echo arg.*'
! \ .. ' enddef'
! \, res2)
let res3 = execute('function SomeStringArgAndReturn')
! assert_match('.* def SomeStringArgAndReturn(arg: string): string.*'
! \ .. ' return arg.*'
! \ .. ' enddef'
! \, res3)
enddef
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
--- 893,914 ----
def Test_display_func()
let res1 = execute('function SomeStringArg')
! assert_match('.* def SomeStringArg(arg: string).*' ..
! ' echo arg.*' ..
! ' enddef',
! res1)
let res2 = execute('function SomeAnyArg')
! assert_match('.* def SomeAnyArg(arg: any).*' ..
! ' echo arg.*' ..
! ' enddef',
! res2)
let res3 = execute('function SomeStringArgAndReturn')
! assert_match('.* def SomeStringArgAndReturn(arg: string): string.*' ..
! ' return arg.*' ..
! ' enddef',
! res3)
enddef
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
*** ../vim-8.2.0564/src/version.c 2020-04-12 22:22:27.060446273 +0200
--- src/version.c 2020-04-12 22:53:22.311730304 +0200
***************
*** 740,741 ****
--- 740,743 ----
{ /* Add new patch number below this line */
+ /**/
+ 565,
/**/
--
System administrators are just like women: You can't live with them and you
can't live without them.
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/vim_dev/202004122054.03CKsRv9014197%40masaka.moolenaar.net.