fix crash on empty conditional branch statement (if_cc { } )

This commit is contained in:
Irmen de Jong 2022-11-23 02:14:48 +01:00
parent f870e4965a
commit e2f20ebf94
4 changed files with 30 additions and 6 deletions

View File

@ -794,7 +794,7 @@ $repeatLabel lda $counterVar
if(stmt.truepart.isEmpty() && stmt.elsepart.isNotEmpty()) if(stmt.truepart.isEmpty() && stmt.elsepart.isNotEmpty())
throw AssemblyError("only else part contains code, shoud have been switched already") throw AssemblyError("only else part contains code, shoud have been switched already")
val jump = stmt.truepart.statements.first() as? Jump val jump = stmt.truepart.statements.firstOrNull() as? Jump
if(jump!=null) { if(jump!=null) {
// branch with only a jump (goto) // branch with only a jump (goto)
val instruction = branchInstruction(stmt.condition, false) val instruction = branchInstruction(stmt.condition, false)
@ -812,11 +812,13 @@ $repeatLabel lda $counterVar
translate(stmt.elsepart) translate(stmt.elsepart)
} else { } else {
if(stmt.elsepart.isEmpty()) { if(stmt.elsepart.isEmpty()) {
if(stmt.truepart.isNotEmpty()) {
val instruction = branchInstruction(stmt.condition, true) val instruction = branchInstruction(stmt.condition, true)
val elseLabel = program.makeLabel("branch_else") val elseLabel = program.makeLabel("branch_else")
out(" $instruction $elseLabel") out(" $instruction $elseLabel")
translate(stmt.truepart) translate(stmt.truepart)
out(elseLabel) out(elseLabel)
}
} else { } else {
val instruction = branchInstruction(stmt.condition, true) val instruction = branchInstruction(stmt.condition, true)
val elseLabel = program.makeLabel("branch_else") val elseLabel = program.makeLabel("branch_else")

View File

@ -8,6 +8,8 @@ import prog8.ast.base.FatalAstException
import prog8.ast.expressions.* import prog8.ast.expressions.*
import prog8.ast.statements.AnonymousScope import prog8.ast.statements.AnonymousScope
import prog8.ast.statements.Assignment import prog8.ast.statements.Assignment
import prog8.ast.statements.ConditionalBranch
import prog8.ast.statements.IfElse
import prog8.ast.walk.AstWalker import prog8.ast.walk.AstWalker
import prog8.ast.walk.IAstModification import prog8.ast.walk.IAstModification
import prog8.code.core.* import prog8.code.core.*
@ -219,5 +221,22 @@ internal class VariousCleanups(val program: Program, val errors: IErrorReporter,
} }
return noModifications return noModifications
} }
override fun after(branch: ConditionalBranch, parent: Node): Iterable<IAstModification> {
if(branch.truepart.isEmpty() && branch.elsepart.isEmpty()) {
errors.warn("removing empty conditional branch", branch.position)
return listOf(IAstModification.Remove(branch, parent as IStatementContainer))
}
return noModifications
}
override fun after(ifElse: IfElse, parent: Node): Iterable<IAstModification> {
if(ifElse.truepart.isEmpty() && ifElse.elsepart.isEmpty()) {
errors.warn("removing empty if-else statement", ifElse.position)
return listOf(IAstModification.Remove(ifElse, parent as IStatementContainer))
}
return noModifications
}
} }

View File

@ -888,9 +888,11 @@ class TestProg8Parser: FunSpec( {
bool bb bool bb
ubyte cc ubyte cc
if cc in [' ', '@', 0] { if cc in [' ', '@', 0] {
cx16.r0L++
} }
if cc in "email" { if cc in "email" {
cx16.r0L++
} }
bb = 99 in array bb = 99 in array

View File

@ -4,6 +4,7 @@ TODO
For next release For next release
^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^
- get rid of diskio.have_first_byte. But detecting invalid filenames should still work. - get rid of diskio.have_first_byte. But detecting invalid filenames should still work.
- check diskio.status(), fix diskio.f_readline
- diskio.f_read doesn't signal end of file condition if the requested number of bytes==1 ? - diskio.f_read doesn't signal end of file condition if the requested number of bytes==1 ?
- diskio.f_read doesn't work if used after seek with buffer too small? - diskio.f_read doesn't work if used after seek with buffer too small?
- ir/vm: check weird asm chunks appearing in block? - ir/vm: check weird asm chunks appearing in block?