mirror of
https://github.com/irmen/prog8.git
synced 2024-12-23 09:32:43 +00:00
fix crash on empty conditional branch statement (if_cc { } )
This commit is contained in:
parent
f870e4965a
commit
e2f20ebf94
@ -794,7 +794,7 @@ $repeatLabel lda $counterVar
|
||||
if(stmt.truepart.isEmpty() && stmt.elsepart.isNotEmpty())
|
||||
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) {
|
||||
// branch with only a jump (goto)
|
||||
val instruction = branchInstruction(stmt.condition, false)
|
||||
@ -812,11 +812,13 @@ $repeatLabel lda $counterVar
|
||||
translate(stmt.elsepart)
|
||||
} else {
|
||||
if(stmt.elsepart.isEmpty()) {
|
||||
val instruction = branchInstruction(stmt.condition, true)
|
||||
val elseLabel = program.makeLabel("branch_else")
|
||||
out(" $instruction $elseLabel")
|
||||
translate(stmt.truepart)
|
||||
out(elseLabel)
|
||||
if(stmt.truepart.isNotEmpty()) {
|
||||
val instruction = branchInstruction(stmt.condition, true)
|
||||
val elseLabel = program.makeLabel("branch_else")
|
||||
out(" $instruction $elseLabel")
|
||||
translate(stmt.truepart)
|
||||
out(elseLabel)
|
||||
}
|
||||
} else {
|
||||
val instruction = branchInstruction(stmt.condition, true)
|
||||
val elseLabel = program.makeLabel("branch_else")
|
||||
|
@ -8,6 +8,8 @@ import prog8.ast.base.FatalAstException
|
||||
import prog8.ast.expressions.*
|
||||
import prog8.ast.statements.AnonymousScope
|
||||
import prog8.ast.statements.Assignment
|
||||
import prog8.ast.statements.ConditionalBranch
|
||||
import prog8.ast.statements.IfElse
|
||||
import prog8.ast.walk.AstWalker
|
||||
import prog8.ast.walk.IAstModification
|
||||
import prog8.code.core.*
|
||||
@ -219,5 +221,22 @@ internal class VariousCleanups(val program: Program, val errors: IErrorReporter,
|
||||
}
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -888,9 +888,11 @@ class TestProg8Parser: FunSpec( {
|
||||
bool bb
|
||||
ubyte cc
|
||||
if cc in [' ', '@', 0] {
|
||||
cx16.r0L++
|
||||
}
|
||||
|
||||
if cc in "email" {
|
||||
cx16.r0L++
|
||||
}
|
||||
|
||||
bb = 99 in array
|
||||
|
@ -4,6 +4,7 @@ TODO
|
||||
For next release
|
||||
^^^^^^^^^^^^^^^^
|
||||
- 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 work if used after seek with buffer too small?
|
||||
- ir/vm: check weird asm chunks appearing in block?
|
||||
|
Loading…
Reference in New Issue
Block a user