diff --git a/compiler/src/prog8/ast/processing/AstChecker.kt b/compiler/src/prog8/ast/processing/AstChecker.kt index 8eabe17ec..88561462e 100644 --- a/compiler/src/prog8/ast/processing/AstChecker.kt +++ b/compiler/src/prog8/ast/processing/AstChecker.kt @@ -1053,9 +1053,8 @@ internal class AstChecker(private val program: Program, if(dtxVar!=null && dtxVar != DataType.UBYTE && dtxVar != DataType.BYTE) errors.err("array indexing is limited to byte size 0..255", arrayIndexedExpression.position) - // check type of array indexer - if(arrayIndexedExpression.indexer.indexVar==null && arrayIndexedExpression.indexer.indexNum==null) - errors.err("array indexing can only be done with a number or a variable, or a simple binary expression, but not an arbitrary expression. Use a temp var?", arrayIndexedExpression.indexer.position) + if(arrayIndexedExpression.indexer.origExpression!=null) + throw FatalAstException("array indexer should have been replaced with a temp var @ ${arrayIndexedExpression.indexer.position}") super.visit(arrayIndexedExpression) } diff --git a/compiler/src/prog8/ast/processing/StatementReorderer.kt b/compiler/src/prog8/ast/processing/StatementReorderer.kt index 8e77622db..0fc240fc0 100644 --- a/compiler/src/prog8/ast/processing/StatementReorderer.kt +++ b/compiler/src/prog8/ast/processing/StatementReorderer.kt @@ -72,18 +72,19 @@ internal class StatementReorderer(val program: Program, val errors: ErrorReporte } override fun after(arrayIndexedExpression: ArrayIndexedExpression, parent: Node): Iterable { - val expr = arrayIndexedExpression.indexer.origExpression - if (expr is NumericLiteralValue) { - arrayIndexedExpression.indexer.indexNum = expr - arrayIndexedExpression.indexer.origExpression = null - } - else if (expr is IdentifierReference) { - arrayIndexedExpression.indexer.indexVar = expr - arrayIndexedExpression.indexer.origExpression = null - } - else if(expr is BinaryExpression) { - if((expr.left is NumericLiteralValue || expr.left is IdentifierReference) && - (expr.right is NumericLiteralValue || expr.right is IdentifierReference)) { + when (val expr = arrayIndexedExpression.indexer.origExpression) { + is NumericLiteralValue -> { + arrayIndexedExpression.indexer.indexNum = expr + arrayIndexedExpression.indexer.origExpression = null + return noModifications + } + is IdentifierReference -> { + arrayIndexedExpression.indexer.indexVar = expr + arrayIndexedExpression.indexer.origExpression = null + return noModifications + } + is Expression -> { + // replace complex indexing with a temp variable val modifications = mutableListOf() val indexerVarName = "prog8_autovar_index" val block = expr.definingBlock() @@ -107,9 +108,8 @@ internal class StatementReorderer(val program: Program, val errors: ErrorReporte return modifications } + else -> return noModifications } - - return noModifications } override fun after(whenStatement: WhenStatement, parent: Node): Iterable { diff --git a/examples/sprites.p8 b/examples/sprites.p8 index 28fded526..90598dff7 100644 --- a/examples/sprites.p8 +++ b/examples/sprites.p8 @@ -41,10 +41,8 @@ main { ubyte @zp i for i in 0 to 7 { c64.SPRPTR[i] = $0a00 / 64 - ubyte twoi = i*2 - c64.SPXY[twoi] = 50+25*i - twoi++ - c64.SPXY[twoi] = rnd() + c64.SPXY[i*2] = 50+25*i + c64.SPXY[i*2+1] = rnd() } c64.SPENA = 255 ; enable all sprites