mirror of
https://github.com/KarolS/millfork.git
synced 2024-06-09 16:29:34 +00:00
Fix unused variable elimination in for-array statements (fixes #125)
This commit is contained in:
parent
84dde8589c
commit
0c8951d015
|
@ -813,7 +813,7 @@ case class MemsetStatement(start: Expression, size: Constant, value: Expression,
|
||||||
}
|
}
|
||||||
|
|
||||||
case class ForEachStatement(variable: String, pointerVariable: Option[String], values: Either[Expression, List[Expression]], body: List[ExecutableStatement]) extends CompoundStatement {
|
case class ForEachStatement(variable: String, pointerVariable: Option[String], values: Either[Expression, List[Expression]], body: List[ExecutableStatement]) extends CompoundStatement {
|
||||||
override def getAllExpressions: List[Expression] = VariableExpression(variable) :: (values.fold[List[Expression]](_ => Nil, identity) ++ body.flatMap(_.getAllExpressions))
|
override def getAllExpressions: List[Expression] = VariableExpression(variable) :: (pointerVariable.map(VariableExpression).toList ++ values.fold[List[Expression]](List(_), identity) ++ body.flatMap(_.getAllExpressions))
|
||||||
|
|
||||||
override def getChildStatements: Seq[Statement] = body
|
override def getChildStatements: Seq[Statement] = body
|
||||||
override def flatMap(f: ExecutableStatement => Option[ExecutableStatement]): Option[ExecutableStatement] = {
|
override def flatMap(f: ExecutableStatement => Option[ExecutableStatement]): Option[ExecutableStatement] = {
|
||||||
|
|
|
@ -43,4 +43,36 @@ class ForArraySuite extends FunSuite with Matchers {
|
||||||
m.readByte(0xc000) should equal(18)
|
m.readByte(0xc000) should equal(18)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test("Issue #125") {
|
||||||
|
val src = """
|
||||||
|
| byte output @$c000
|
||||||
|
| import stdio
|
||||||
|
| array(byte) data=[1,2,3,4]
|
||||||
|
| void main(){
|
||||||
|
| byte i
|
||||||
|
| for i:data{
|
||||||
|
| output += i
|
||||||
|
| }
|
||||||
|
|}
|
||||||
|
""".stripMargin
|
||||||
|
val m = EmuOptimizedRun(src)
|
||||||
|
m.readByte(0xc000) should equal(6)
|
||||||
|
}
|
||||||
|
|
||||||
|
test("Issue #125 (ver. 2)") {
|
||||||
|
val src = """
|
||||||
|
| byte output @$c000
|
||||||
|
| import stdio
|
||||||
|
| array(byte) data=[1,2,3,4]
|
||||||
|
| void main(){
|
||||||
|
| byte i,v
|
||||||
|
| for i,v:data{
|
||||||
|
| output += v
|
||||||
|
| }
|
||||||
|
|}
|
||||||
|
""".stripMargin
|
||||||
|
val m = EmuOptimizedRun(src)
|
||||||
|
m.readByte(0xc000) should equal(10)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user