mirror of
https://github.com/irmen/prog8.git
synced 2024-11-22 15:33:02 +00:00
get rid of problematic rewrite of certain for loops that were causing the end expression to be evaluated every loop iteration
This commit is contained in:
parent
aba36f7c92
commit
b27368175d
@ -9,7 +9,6 @@ import prog8.code.core.AssociativeOperators
|
|||||||
import prog8.code.core.CompilationOptions
|
import prog8.code.core.CompilationOptions
|
||||||
import prog8.code.core.DataType
|
import prog8.code.core.DataType
|
||||||
import prog8.code.core.IErrorReporter
|
import prog8.code.core.IErrorReporter
|
||||||
import prog8.code.target.VMTarget
|
|
||||||
|
|
||||||
|
|
||||||
class StatementOptimizer(private val program: Program,
|
class StatementOptimizer(private val program: Program,
|
||||||
@ -195,49 +194,6 @@ class StatementOptimizer(private val program: Program,
|
|||||||
return Assignment(AssignTarget(loopVar.copy(), null, null, pos), addSubOne, AssignmentOrigin.USERCODE, pos)
|
return Assignment(AssignTarget(loopVar.copy(), null, null, pos), addSubOne, AssignmentOrigin.USERCODE, pos)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (range != null && range.from.constValue(program)?.number == 0.0 && range.step.constValue(program)?.number==1.0) {
|
|
||||||
val toBinExpr = range.to as? BinaryExpression
|
|
||||||
if(toBinExpr!=null && toBinExpr.operator=="-" && toBinExpr.right.constValue(program)?.number==1.0) {
|
|
||||||
// FOR var IN 0 TO X-1 .... ---> var=0, DO {... , var++} UNTIL var==X
|
|
||||||
val pos = forLoop.position
|
|
||||||
val condition = BinaryExpression(forLoop.loopVar.copy(), "==", toBinExpr.left, pos)
|
|
||||||
val incOne = incOrDec(true)
|
|
||||||
forLoop.body.statements.add(incOne)
|
|
||||||
val replacement = AnonymousScope(mutableListOf(
|
|
||||||
Assignment(AssignTarget(forLoop.loopVar.copy(), null, null, pos),
|
|
||||||
NumericLiteral.optimalNumeric(0.0, pos),
|
|
||||||
AssignmentOrigin.OPTIMIZER, pos),
|
|
||||||
UntilLoop(forLoop.body, condition, pos)
|
|
||||||
), pos)
|
|
||||||
return listOf(IAstModification.ReplaceNode(forLoop, replacement, parent))
|
|
||||||
}
|
|
||||||
|
|
||||||
if(options.compTarget.name!=VMTarget.NAME) {
|
|
||||||
// this optimization is not effective for the VM target.
|
|
||||||
val toConst = range.to.constValue(program)
|
|
||||||
if (toConst == null) {
|
|
||||||
// FOR var in 0 TO X ... ---> var=0, REPEAT { ... , IF var==X break , var++ }
|
|
||||||
val pos = forLoop.position
|
|
||||||
val incOne = incOrDec(true)
|
|
||||||
val breakCondition = IfElse(
|
|
||||||
BinaryExpression(forLoop.loopVar, "==", range.to, pos),
|
|
||||||
AnonymousScope(mutableListOf(Break(pos)), pos),
|
|
||||||
AnonymousScope(mutableListOf(), pos),
|
|
||||||
pos
|
|
||||||
)
|
|
||||||
forLoop.body.statements.add(breakCondition)
|
|
||||||
forLoop.body.statements.add(incOne)
|
|
||||||
val replacement = AnonymousScope(mutableListOf(
|
|
||||||
Assignment(AssignTarget(forLoop.loopVar.copy(), null, null, pos),
|
|
||||||
NumericLiteral.optimalNumeric(0.0, pos),
|
|
||||||
AssignmentOrigin.OPTIMIZER, pos),
|
|
||||||
RepeatLoop(null, forLoop.body, pos)
|
|
||||||
), pos)
|
|
||||||
return listOf(IAstModification.ReplaceNode(forLoop, replacement, parent))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (range != null && range.to.constValue(program)?.number == 0.0 && range.step.constValue(program)?.number==-1.0) {
|
if (range != null && range.to.constValue(program)?.number == 0.0 && range.step.constValue(program)?.number==-1.0) {
|
||||||
val fromExpr = range.from
|
val fromExpr = range.from
|
||||||
if(fromExpr.constValue(program)==null) {
|
if(fromExpr.constValue(program)==null) {
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
TODO
|
TODO
|
||||||
====
|
====
|
||||||
|
|
||||||
(after merge in boolean): move all "OperatorXinplace" from expressionGen to AssignmentGen, see if we can get rid of the Result return type.
|
|
||||||
|
|
||||||
replace Takes by Http4k in httpCompilerService project. https://github.com/http4k/examples/blob/master/hello-world/README.md
|
replace Takes by Http4k in httpCompilerService project. https://github.com/http4k/examples/blob/master/hello-world/README.md
|
||||||
|
|
||||||
...
|
...
|
||||||
|
Loading…
Reference in New Issue
Block a user