patch 9.0.0484: in :def function all closures in loop get the same variables
Problem: In a :def function all closures in a loop get the same variables.
Solution: Add ENDLOOP at break, continue and return if needed.
diff --git a/src/testdir/test_vim9_disassemble.vim b/src/testdir/test_vim9_disassemble.vim
index 07e4936..67cd909 100644
--- a/src/testdir/test_vim9_disassemble.vim
+++ b/src/testdir/test_vim9_disassemble.vim
@@ -976,6 +976,85 @@
lres)
enddef
+def s:ClosureInLoop()
+ for i in range(5)
+ var ii = i
+ continue
+ break
+ if g:val
+ return
+ endif
+ g:Ref = () => ii
+ continue
+ break
+ if g:val
+ return
+ endif
+ endfor
+enddef
+
+" Mainly check that ENDLOOP is only produced after a closure was created.
+def Test_disassemble_closure_in_loop()
+ var res = execute('disass s:ClosureInLoop')
+ assert_match('<SNR>\d\+_ClosureInLoop\_s*' ..
+ 'for i in range(5)\_s*' ..
+ '\d\+ STORE -1 in $0\_s*' ..
+ '\d\+ PUSHNR 5\_s*' ..
+ '\d\+ BCALL range(argc 1)\_s*' ..
+ '\d\+ FOR $0 -> \d\+\_s*' ..
+ '\d\+ STORE $2\_s*' ..
+
+ 'var ii = i\_s*' ..
+ '\d\+ LOAD $2\_s*' ..
+ '\d\+ STORE $3\_s*' ..
+
+ 'continue\_s*' ..
+ '\d\+ JUMP -> \d\+\_s*' ..
+
+ 'break\_s*' ..
+ '\d\+ JUMP -> \d\+\_s*' ..
+
+ 'if g:val\_s*' ..
+ '\d\+ LOADG g:val\_s*' ..
+ '\d\+ COND2BOOL\_s*' ..
+ '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
+
+ ' return\_s*' ..
+ '\d\+ PUSHNR 0\_s*' ..
+ '\d\+ RETURN\_s*' ..
+
+ 'endif\_s*' ..
+ 'g:Ref = () => ii\_s*' ..
+ '\d\+ FUNCREF <lambda>4 var $3 - $3\_s*' ..
+ '\d\+ STOREG g:Ref\_s*' ..
+
+ 'continue\_s*' ..
+ '\d\+ ENDLOOP $1 save $3 - $3\_s*' ..
+ '\d\+ JUMP -> \d\+\_s*' ..
+
+ 'break\_s*' ..
+ '\d\+ ENDLOOP $1 save $3 - $3\_s*' ..
+ '\d\+ JUMP -> \d\+\_s*' ..
+
+ 'if g:val\_s*' ..
+ '\d\+ LOADG g:val\_s*' ..
+ '\d\+ COND2BOOL\_s*' ..
+ '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
+
+ ' return\_s*' ..
+ '\d\+ PUSHNR 0\_s*' ..
+ '\d\+ ENDLOOP $1 save $3 - $3\_s*' ..
+ '\d\+ RETURN\_s*' ..
+
+ 'endif\_s*' ..
+ 'endfor\_s*' ..
+ '\d\+ ENDLOOP $1 save $3 - $3\_s*' ..
+ '\d\+ JUMP -> \d\+\_s*' ..
+ '\d\+ DROP\_s*' ..
+ '\d\+ RETURN void',
+ res)
+enddef
+
def EchoArg(arg: string): string
return arg
enddef