Merge pull request #799 from nspcc-dev/fix/for

compiler: allow for loops with empty condition
This commit is contained in:
Roman Khimov 2020-03-26 15:23:13 +03:00 committed by GitHub
commit 2a262c6ef4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 3 deletions

View file

@ -781,10 +781,12 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor {
// Set label and walk the condition.
c.pushStackLabel(label, 0)
c.setLabel(fstart)
ast.Walk(c, n.Cond)
if n.Cond != nil {
ast.Walk(c, n.Cond)
// Jump if the condition is false
emit.Jmp(c.prog.BinWriter, opcode.JMPIFNOT, fend)
// Jump if the condition is false
emit.Jmp(c.prog.BinWriter, opcode.JMPIFNOT, fend)
}
// Walk body followed by the iterator (post stmt).
ast.Walk(c, n.Body)

View file

@ -374,6 +374,23 @@ func TestDec(t *testing.T) {
eval(t, src, big.NewInt(1))
}
func TestForLoopEmpty(t *testing.T) {
src := `
package foo
func Main() int {
x := 0
for {
x++
if x == 2 {
break
}
}
return x
}
`
eval(t, src, big.NewInt(2))
}
func TestForLoopBigIter(t *testing.T) {
src := `
package foo