diff --git a/compiler/src/prog8/ast/base/Extensions.kt b/compiler/src/prog8/ast/base/Extensions.kt index 2bbe3c5ef..dfb2988d8 100644 --- a/compiler/src/prog8/ast/base/Extensions.kt +++ b/compiler/src/prog8/ast/base/Extensions.kt @@ -3,8 +3,6 @@ package prog8.ast.base import prog8.ast.Module import prog8.ast.Program import prog8.ast.processing.* -import prog8.ast.statements.Block -import prog8.ast.statements.VarDecl import prog8.compiler.CompilationOptions import prog8.compiler.target.AsmVariablePreparer import prog8.optimizer.FlattenAnonymousScopesAndNopRemover diff --git a/compiler/src/prog8/ast/processing/AddressOfInserter.kt b/compiler/src/prog8/ast/processing/AddressOfInserter.kt index 21643f61a..77cf06c7b 100644 --- a/compiler/src/prog8/ast/processing/AddressOfInserter.kt +++ b/compiler/src/prog8/ast/processing/AddressOfInserter.kt @@ -3,9 +3,16 @@ package prog8.ast.processing import prog8.ast.IFunctionCall import prog8.ast.Node import prog8.ast.Program -import prog8.ast.base.* -import prog8.ast.expressions.* -import prog8.ast.statements.* +import prog8.ast.base.DataType +import prog8.ast.base.IterableDatatypes +import prog8.ast.base.PassByReferenceDatatypes +import prog8.ast.expressions.AddressOf +import prog8.ast.expressions.Expression +import prog8.ast.expressions.FunctionCall +import prog8.ast.expressions.IdentifierReference +import prog8.ast.statements.FunctionCallStatement +import prog8.ast.statements.Statement +import prog8.ast.statements.Subroutine import prog8.compiler.CompilerException import prog8.functions.BuiltinFunctions import prog8.functions.FSignature diff --git a/compiler/src/prog8/ast/processing/TypecastsAdder.kt b/compiler/src/prog8/ast/processing/TypecastsAdder.kt index 6ab199ebe..93587226b 100644 --- a/compiler/src/prog8/ast/processing/TypecastsAdder.kt +++ b/compiler/src/prog8/ast/processing/TypecastsAdder.kt @@ -4,7 +4,9 @@ import prog8.ast.IFunctionCall import prog8.ast.INameScope import prog8.ast.Node import prog8.ast.Program -import prog8.ast.base.* +import prog8.ast.base.DataType +import prog8.ast.base.ErrorReporter +import prog8.ast.base.FatalAstException import prog8.ast.expressions.* import prog8.ast.statements.* import prog8.functions.BuiltinFunctions diff --git a/compiler/src/prog8/compiler/target/AsmVariablePreparer.kt b/compiler/src/prog8/compiler/target/AsmVariablePreparer.kt index d6ece789b..c02aab120 100644 --- a/compiler/src/prog8/compiler/target/AsmVariablePreparer.kt +++ b/compiler/src/prog8/compiler/target/AsmVariablePreparer.kt @@ -5,11 +5,10 @@ import prog8.ast.Program import prog8.ast.base.ErrorReporter import prog8.ast.base.NumericDatatypes import prog8.ast.base.VarDeclType +import prog8.ast.expressions.IdentifierReference import prog8.ast.processing.AstWalker import prog8.ast.processing.IAstModification -import prog8.ast.statements.AnonymousScope -import prog8.ast.statements.Subroutine -import prog8.ast.statements.VarDecl +import prog8.ast.statements.* class AsmVariablePreparer(val program: Program, val errors: ErrorReporter): AstWalker() { @@ -35,19 +34,19 @@ class AsmVariablePreparer(val program: Program, val errors: ErrorReporter): AstW conflicts = true } } - if(!conflicts) - return listOf(MoveVardecls(decls, scope, sub)) + if(!conflicts) { + val numericVarsWithValue = decls.filter { it.value!=null && it.datatype in NumericDatatypes } + return numericVarsWithValue.map { + val initValue = it.value!! // assume here that value has always been set by now + it.value = null // make sure no value init assignment for this vardecl will be created later (would be superfluous) + val target = AssignTarget(null, IdentifierReference(listOf(it.name), it.position), null, null, it.position) + val assign = Assignment(target, null, initValue, it.position) + IAstModification.Insert(null, assign, scope) + } + + decls.map { IAstModification.ReplaceNode(it, NopStatement(it.position), scope) } + + decls.map { IAstModification.Insert(null, it, sub) } // move it up to the subroutine + } } return emptyList() } - - private class MoveVardecls(val decls: Collection, - val scope: AnonymousScope, - val sub: Subroutine) : IAstModification { - override fun perform() { - decls.forEach { scope.remove(it) } - sub.statements.addAll(0, decls) - decls.forEach { it.parent = sub } - } - } } diff --git a/compiler/src/prog8/compiler/target/CompilationTarget.kt b/compiler/src/prog8/compiler/target/CompilationTarget.kt index dc86d3a2d..3a4715496 100644 --- a/compiler/src/prog8/compiler/target/CompilationTarget.kt +++ b/compiler/src/prog8/compiler/target/CompilationTarget.kt @@ -1,8 +1,6 @@ package prog8.compiler.target import prog8.ast.Program -import prog8.ast.statements.Block -import prog8.ast.statements.VarDecl import prog8.compiler.CompilationOptions import prog8.compiler.Zeropage import java.nio.file.Path diff --git a/compiler/src/prog8/compiler/target/c64/codegen/AssignmentAsmGen.kt b/compiler/src/prog8/compiler/target/c64/codegen/AssignmentAsmGen.kt index 29dd51e08..71ac2eb05 100644 --- a/compiler/src/prog8/compiler/target/c64/codegen/AssignmentAsmGen.kt +++ b/compiler/src/prog8/compiler/target/c64/codegen/AssignmentAsmGen.kt @@ -117,7 +117,7 @@ internal class AssignmentAsmGen(private val program: Program, private val asmgen asmgen.translateExpression(assign.value as FunctionCall) assignFromEvalResult(assign.target) } - is ArrayLiteralValue, is StringLiteralValue -> TODO("string/array/struct assignment?") + is ArrayLiteralValue, is StringLiteralValue -> TODO("string/array/struct assignment? $assign") is StructLiteralValue -> throw AssemblyError("struct literal value assignment should have been flattened ${assign.value.position}") is RangeExpr -> throw AssemblyError("range expression should have been changed into array values ${assign.value.position}") } diff --git a/compiler/src/prog8/optimizer/CallGraph.kt b/compiler/src/prog8/optimizer/CallGraph.kt index 9679050c4..ad497e61f 100644 --- a/compiler/src/prog8/optimizer/CallGraph.kt +++ b/compiler/src/prog8/optimizer/CallGraph.kt @@ -6,7 +6,6 @@ import prog8.ast.Node import prog8.ast.Program import prog8.ast.base.DataType import prog8.ast.base.ParentSentinel -import prog8.ast.base.VarDeclType import prog8.ast.expressions.FunctionCall import prog8.ast.expressions.IdentifierReference import prog8.ast.processing.IAstVisitor diff --git a/docs/source/todo.rst b/docs/source/todo.rst index 92a3966ef..b521d044c 100644 --- a/docs/source/todo.rst +++ b/docs/source/todo.rst @@ -2,9 +2,6 @@ TODO ==== -- fix manderbrot compiler issue - - - remove statements after an exit() or return - fix warnings about that unreachable code? diff --git a/examples/mandelbrot.p8 b/examples/mandelbrot.p8 index 44e442598..468510dc3 100644 --- a/examples/mandelbrot.p8 +++ b/examples/mandelbrot.p8 @@ -19,10 +19,6 @@ main { ubyte pixelx ubyte pixely - - ; TODO fix compiler - calculation is broken now - - for pixely in 0 to height-1 { float yy = (pixely as float)/0.4/height - 1.0 diff --git a/examples/test.p8 b/examples/test.p8 index ee023f394..2b3c744bf 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -5,73 +5,7 @@ main { - sub subje() { - ubyte a1 - ubyte a2 - ubyte zz - for a1 in 1 to 3 { - ubyte qq = 100 ; TODO should be inited here, and not in the subroutine. - for a2 in 1 to 3 { - ubyte zz = 100 ; TODO should be inited here, and not in the subroutine. - c64scr.print_ub(a1) - c64.CHROUT(',') - c64scr.print_ub(a2) - c64.CHROUT(',') - c64scr.print_ub(qq) ; TODO qq shoud be 100..103 repeated three times... - c64.CHROUT(',') - c64scr.print_ub(zz) ; TODO zz should always be 100... - c64.CHROUT('\n') - qq++ - zz++ - } - } - } - sub start() { - subje() - c64.CHROUT('\n') - subje() - c64.CHROUT('\n') - return -; ubyte ub1 -; ubyte ub2 = 99 -; uword uw1 -; uword uw2 = 9999 -; ubyte[5] array1 -; ubyte[5] array2 = [22,33,44,55,66] -; -; c64scr.print_ub(ub1) -; c64.CHROUT(',') -; c64scr.print_ub(ub2) -; c64.CHROUT(',') -; c64scr.print_uw(uw1) -; c64.CHROUT(',') -; c64scr.print_uw(uw2) -; c64.CHROUT(',') -; c64scr.print_ub(array1[0]) -; c64.CHROUT(',') -; c64scr.print_ub(array2[0]) -; c64.CHROUT('\n') -; -; ub1++ -; ub2++ -; uw1++ -; uw2++ -; array1[0]++ -; array2[0]++ -; -; c64scr.print_ub(ub1) -; c64.CHROUT(',') -; c64scr.print_ub(ub2) -; c64.CHROUT(',') -; c64scr.print_uw(uw1) -; c64.CHROUT(',') -; c64scr.print_uw(uw2) -; c64.CHROUT(',') -; c64scr.print_ub(array1[0]) -; c64.CHROUT(',') -; c64scr.print_ub(array2[0]) -; c64.CHROUT('\n') } }