mirror of
https://github.com/irmen/prog8.git
synced 2024-09-07 19:54:26 +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())
|
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")
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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?
|
||||||
|
Loading…
Reference in New Issue
Block a user