diff --git a/codeOptimizers/src/prog8/optimizer/ConstantFoldingOptimizer.kt b/codeOptimizers/src/prog8/optimizer/ConstantFoldingOptimizer.kt index eca513194..033e5065b 100644 --- a/codeOptimizers/src/prog8/optimizer/ConstantFoldingOptimizer.kt +++ b/codeOptimizers/src/prog8/optimizer/ConstantFoldingOptimizer.kt @@ -6,12 +6,14 @@ import prog8.ast.base.FatalAstException import prog8.ast.expressions.* import prog8.ast.maySwapOperandOrder import prog8.ast.statements.ForLoop +import prog8.ast.statements.RepeatLoop import prog8.ast.statements.VarDecl import prog8.ast.statements.VarDeclType import prog8.ast.walk.AstWalker import prog8.ast.walk.IAstModification import prog8.code.core.AssociativeOperators import prog8.code.core.DataType +import kotlin.math.floor class ConstantFoldingOptimizer(private val program: Program) : AstWalker() { @@ -363,6 +365,16 @@ class ConstantFoldingOptimizer(private val program: Program) : AstWalker() { return noModifications } + override fun after(repeatLoop: RepeatLoop, parent: Node): Iterable { + val count = (repeatLoop.iterations as? NumericLiteral)?.number + if(count!=null && floor(count)!=count) { + val integer = NumericLiteral.optimalInteger(count.toInt(), repeatLoop.position) + repeatLoop.iterations = integer + integer.linkParents(repeatLoop) + } + return noModifications + } + private class ShuffleOperands(val expr: BinaryExpression, val exprOperator: String?, val subExpr: BinaryExpression, diff --git a/compiler/src/prog8/compiler/astprocessing/AstChecker.kt b/compiler/src/prog8/compiler/astprocessing/AstChecker.kt index 49ace8a75..516a322cd 100644 --- a/compiler/src/prog8/compiler/astprocessing/AstChecker.kt +++ b/compiler/src/prog8/compiler/astprocessing/AstChecker.kt @@ -12,6 +12,7 @@ import prog8.compiler.builtinFunctionReturnType import java.io.CharConversionException import java.io.File import kotlin.io.path.Path +import kotlin.math.floor /** * Semantic analysis. @@ -468,8 +469,10 @@ internal class AstChecker(private val program: Program, override fun visit(repeatLoop: RepeatLoop) { val iterations = repeatLoop.iterations?.constValue(program) - if(iterations != null && iterations.number.toInt() > 65535) - errors.err("repeat cannot go over 65535 iterations", iterations.position) + if (iterations != null) { + require(floor(iterations.number)==iterations.number) + if (iterations.number.toInt() > 65535) errors.err("repeat cannot go over 65535 iterations", iterations.position) + } val ident = repeatLoop.iterations as? IdentifierReference if(ident!=null) { diff --git a/docs/source/todo.rst b/docs/source/todo.rst index 3e3801121..3bcc74be3 100644 --- a/docs/source/todo.rst +++ b/docs/source/todo.rst @@ -1,7 +1,7 @@ TODO ==== -- Fix expericodegen errors (examples/cx16/diskspeed, rockrunners etc) +- Fix expericodegen errors (examples/cx16/keyboardhandler, rockrunners etc) ...