diff --git a/compiler/src/prog8/ast/AstToplevel.kt b/compiler/src/prog8/ast/AstToplevel.kt index 1d492a31f..3ba9004d5 100644 --- a/compiler/src/prog8/ast/AstToplevel.kt +++ b/compiler/src/prog8/ast/AstToplevel.kt @@ -80,8 +80,7 @@ class GlobalNamespace(val modules: List): Node, INameScope { if(struct.statements.any { (it as VarDecl).name == scopedName.last()}) { // return ref to the mangled name variable val mangled = mangledStructMemberName(thing.name, scopedName.last()) - val mangledVar = thing.definingScope().getLabelOrVariable(mangled) - return mangledVar + return thing.definingScope().getLabelOrVariable(mangled) } } } diff --git a/compiler/src/prog8/ast/Interfaces.kt b/compiler/src/prog8/ast/Interfaces.kt index 04c46a38e..924de2280 100644 --- a/compiler/src/prog8/ast/Interfaces.kt +++ b/compiler/src/prog8/ast/Interfaces.kt @@ -144,8 +144,7 @@ interface INameScope { if(struct.statements.any { (it as VarDecl).name == scopedName.last()}) { // return ref to the mangled name variable val mangled = mangledStructMemberName(thing.name, scopedName.last()) - val mangledVar = thing.definingScope().getLabelOrVariable(mangled) - return mangledVar + return thing.definingScope().getLabelOrVariable(mangled) } } diff --git a/compiler/src/prog8/ast/antlr/Antr2Kotlin.kt b/compiler/src/prog8/ast/antlr/Antr2Kotlin.kt index 4cd1c25fe..b13a6006e 100644 --- a/compiler/src/prog8/ast/antlr/Antr2Kotlin.kt +++ b/compiler/src/prog8/ast/antlr/Antr2Kotlin.kt @@ -102,9 +102,9 @@ private fun prog8Parser.StatementContext.toAst() : IStatement { it.varname.text, it.structname.text, null, - false, - false, - it.toPosition() + isArray = false, + autogeneratedDontRemove = false, + position = it.toPosition() ) } @@ -522,10 +522,6 @@ private fun prog8Parser.BooleanliteralContext.toAst() = when(text) { private fun prog8Parser.ArrayliteralContext.toAst() : Array = expression().map { it.toAst() }.toTypedArray() -private fun prog8Parser.StructliteralContext.toAst() : Array = - expression().map { it.toAst() }.toTypedArray() - - private fun prog8Parser.If_stmtContext.toAst(): IfStatement { val condition = expression().toAst() val trueStatements = statement_block()?.toAst() ?: mutableListOf(statement().toAst()) diff --git a/compiler/src/prog8/ast/processing/AstIdentifiersChecker.kt b/compiler/src/prog8/ast/processing/AstIdentifiersChecker.kt index 54ca75fa5..c93809c2a 100644 --- a/compiler/src/prog8/ast/processing/AstIdentifiersChecker.kt +++ b/compiler/src/prog8/ast/processing/AstIdentifiersChecker.kt @@ -210,10 +210,7 @@ internal class AstIdentifiersChecker(private val program: Program) : IAstModifyi val lval = returnStmt.value as? NumericLiteralValue if(lval!=null) { val adjusted = lval.cast(subroutine.returntypes.single()) - if(adjusted!=null && adjusted !== lval) - newValue = adjusted - else - newValue = lval + newValue = if(adjusted!=null && adjusted !== lval) adjusted else lval } else { newValue = returnStmt.value!! } diff --git a/compiler/src/prog8/ast/processing/StatementReorderer.kt b/compiler/src/prog8/ast/processing/StatementReorderer.kt index 5e97c6de9..bdd53db7a 100644 --- a/compiler/src/prog8/ast/processing/StatementReorderer.kt +++ b/compiler/src/prog8/ast/processing/StatementReorderer.kt @@ -232,14 +232,14 @@ internal class StatementReorderer(private val program: Program): IAstModifyingVi return assg // do NOT flatten it at this point!! (the compiler will take care if it, later, if needed) val assignments = flattenStructAssignmentFromIdentifier(assg, program) // 'structvar1 = structvar2' - if(assignments.isEmpty()) { + return if(assignments.isEmpty()) { // something went wrong (probably incompatible struct types) // we'll get an error later from the AstChecker - return assg + assg } else { val scope = AnonymousScope(assignments.toMutableList(), assg.position) scope.linkParents(assg.parent) - return scope + scope } } diff --git a/compiler/src/prog8/ast/processing/VarInitValueAndAddressOfCreator.kt b/compiler/src/prog8/ast/processing/VarInitValueAndAddressOfCreator.kt index c3cffa31b..649827e6d 100644 --- a/compiler/src/prog8/ast/processing/VarInitValueAndAddressOfCreator.kt +++ b/compiler/src/prog8/ast/processing/VarInitValueAndAddressOfCreator.kt @@ -33,6 +33,17 @@ internal class VarInitValueAndAddressOfCreator(private val namespace: INameScope override fun visit(decl: VarDecl): IStatement { super.visit(decl) + + if(decl.isArray && decl.value==null) { + // array datatype without initialization value, add list of zeros + val arraysize = decl.arraysize!!.size()!! + val array = ReferenceLiteralValue(decl.datatype, null, + Array(arraysize) { NumericLiteralValue.optimalInteger(0, decl.position) }, + null, decl.position) + array.addToHeap(heap) + decl.value = array + } + if(decl.type!= VarDeclType.VAR || decl.value==null) return decl @@ -47,7 +58,7 @@ internal class VarInitValueAndAddressOfCreator(private val namespace: INameScope } else declvalue - val identifierName = listOf(decl.name) // // TODO this was: (scoped name) decl.scopedname.split(".") + val identifierName = listOf(decl.name) // this was: (scoped name) decl.scopedname.split(".") return VariableInitializationAssignment( AssignTarget(null, IdentifierReference(identifierName, decl.position), null, null, decl.position), null, @@ -55,6 +66,7 @@ internal class VarInitValueAndAddressOfCreator(private val namespace: INameScope decl.position ) } + return decl } diff --git a/compiler/src/prog8/ast/statements/AstStatements.kt b/compiler/src/prog8/ast/statements/AstStatements.kt index 0b8ac78db..77d169131 100644 --- a/compiler/src/prog8/ast/statements/AstStatements.kt +++ b/compiler/src/prog8/ast/statements/AstStatements.kt @@ -356,24 +356,6 @@ data class AssignTarget(val register: Register?, return null } - fun shortString(withTypePrefix: Boolean=false): String { - if(register!=null) - return (if(withTypePrefix) "0register::" else "") + register.name - if(identifier!=null) - return (if(withTypePrefix) "3identifier::" else "") + identifier.nameInSource.last() - if(arrayindexed!=null) - return (if(withTypePrefix) "2arrayidx::" else "") + arrayindexed.identifier.nameInSource.last() - val address = memoryAddress?.addressExpression - if(address is NumericLiteralValue) - return (if(withTypePrefix) "1address::" else "") +address.number.toString() - else if(address is ReferenceLiteralValue) - throw FatalAstException("assigntarget is a reference literal") - return if(withTypePrefix) "???::???" else "???" - } - - fun isMemoryMapped(namespace: INameScope): Boolean = - memoryAddress!=null || (identifier?.targetVarDecl(namespace)?.type== VarDeclType.MEMORY) - infix fun isSameAs(value: IExpression): Boolean { return when { this.memoryAddress!=null -> false diff --git a/compiler/src/prog8/compiler/AstToSourceCode.kt b/compiler/src/prog8/compiler/AstToSourceCode.kt index 4623c9fcd..63dc23227 100644 --- a/compiler/src/prog8/compiler/AstToSourceCode.kt +++ b/compiler/src/prog8/compiler/AstToSourceCode.kt @@ -8,12 +8,12 @@ import prog8.ast.processing.IAstVisitor import prog8.ast.statements.* class AstToSourceCode(val output: (text: String) -> Unit, val program: Program): IAstVisitor { - var scopelevel = 0 + private var scopelevel = 0 - fun indent(s: String) = " ".repeat(scopelevel) + s - fun outputln(text: String) = output(text + "\n") - fun outputlni(s: Any) = outputln(indent(s.toString())) - fun outputi(s: Any) = output(indent(s.toString())) + private fun indent(s: String) = " ".repeat(scopelevel) + s + private fun outputln(text: String) = output(text + "\n") + private fun outputlni(s: Any) = outputln(indent(s.toString())) + private fun outputi(s: Any) = output(indent(s.toString())) override fun visit(program: Program) { outputln("============= PROGRAM ${program.name} (FROM AST) ===============") @@ -73,7 +73,7 @@ class AstToSourceCode(val output: (text: String) -> Unit, val program: Program): output("\n") } - fun datatypeString(dt: DataType): String { + private fun datatypeString(dt: DataType): String { return when(dt) { in NumericDatatypes -> dt.toString().toLowerCase() in StringDatatypes -> dt.toString().toLowerCase() diff --git a/compiler/src/prog8/compiler/Main.kt b/compiler/src/prog8/compiler/Main.kt index 5c7115162..b7607bc1b 100644 --- a/compiler/src/prog8/compiler/Main.kt +++ b/compiler/src/prog8/compiler/Main.kt @@ -63,6 +63,11 @@ fun compileProgram(filepath: Path, //println(" time2: $time2") val time3 = measureTimeMillis { programAst.removeNopsFlattenAnonScopes() + + // if you want to print the AST, do it before shuffling the statements around below + //printAst(programAst) + + programAst.reorderStatements() // reorder statements and add type casts, to please the compiler later } //println(" time3: $time3") @@ -88,9 +93,6 @@ fun compileProgram(filepath: Path, programAst.checkValid(compilerOptions) // check if final tree is valid programAst.checkRecursion() // check if there are recursive subroutine calls - // printAst(programAst) - // namespace.debugPrint() - if(generateVmCode) { // compile the syntax tree into stackvmProg form, and optimize that val compiler = Compiler(programAst) diff --git a/compiler/src/prog8/compiler/intermediate/IntermediateProgram.kt b/compiler/src/prog8/compiler/intermediate/IntermediateProgram.kt index 58ff30afd..d35ed1483 100644 --- a/compiler/src/prog8/compiler/intermediate/IntermediateProgram.kt +++ b/compiler/src/prog8/compiler/intermediate/IntermediateProgram.kt @@ -421,21 +421,7 @@ class IntermediateProgram(val name: String, var loadAddress: Int, val heap: Heap if(litval!=null){ RuntimeValue(decl.datatype, heapId = litval.heapId) } else { - // uninitialized array. fill it with zeros. - val arraysize = decl.arraysize!!.size()!! - val heapId = - when(decl.datatype){ - DataType.ARRAY_UB, DataType.ARRAY_B, DataType.ARRAY_UW, DataType.ARRAY_W -> { - val array = Array(arraysize) { IntegerOrAddressOf(0, null) } - heap.addIntegerArray(decl.datatype, array) - } - DataType.ARRAY_F -> { - val array = DoubleArray(arraysize) { 0.0 } - heap.addDoublesArray(array) - } - else -> throw CompilerException("weird array dt") - } - RuntimeValue(decl.datatype, heapId=heapId) + throw CompilerException("initialization value expected") } } DataType.STRUCT -> { diff --git a/compiler/src/prog8/functions/BuiltinFunctions.kt b/compiler/src/prog8/functions/BuiltinFunctions.kt index 0a1c6a3a3..803538e6c 100644 --- a/compiler/src/prog8/functions/BuiltinFunctions.kt +++ b/compiler/src/prog8/functions/BuiltinFunctions.kt @@ -6,7 +6,6 @@ import prog8.ast.expressions.DirectMemoryRead import prog8.ast.expressions.IdentifierReference import prog8.ast.expressions.NumericLiteralValue import prog8.ast.expressions.ReferenceLiteralValue -import prog8.ast.statements.VarDecl import prog8.compiler.CompilerException import kotlin.math.* diff --git a/compiler/src/prog8/optimizer/Extensions.kt b/compiler/src/prog8/optimizer/Extensions.kt index 7921716d5..19cd7e62a 100644 --- a/compiler/src/prog8/optimizer/Extensions.kt +++ b/compiler/src/prog8/optimizer/Extensions.kt @@ -2,7 +2,6 @@ package prog8.optimizer import prog8.ast.* import prog8.ast.base.AstException -import prog8.ast.statements.NopStatement import prog8.parser.ParsingFailedError diff --git a/compiler/src/prog8/vm/RuntimeValue.kt b/compiler/src/prog8/vm/RuntimeValue.kt index ca4578589..ea15f3169 100644 --- a/compiler/src/prog8/vm/RuntimeValue.kt +++ b/compiler/src/prog8/vm/RuntimeValue.kt @@ -3,8 +3,6 @@ package prog8.vm import prog8.ast.base.* import prog8.ast.expressions.NumericLiteralValue import prog8.ast.expressions.ReferenceLiteralValue -import prog8.ast.statements.StructDecl -import prog8.ast.statements.ZeropageWish import prog8.compiler.HeapValues import prog8.compiler.target.c64.Petscii import kotlin.math.abs @@ -119,20 +117,6 @@ open class RuntimeValue(val type: DataType, num: Number?=null, val str: String?= } } - fun asNumericLiteralValue(): NumericLiteralValue { - return when(type) { - in ByteDatatypes -> NumericLiteralValue(type, byteval!!, Position("", 0, 0, 0)) - in WordDatatypes -> NumericLiteralValue(type, wordval!!, Position("", 0, 0, 0)) - DataType.FLOAT -> NumericLiteralValue(type, floatval!!, Position("", 0, 0, 0)) - in PassByReferenceDatatypes -> TODO("passbyref???") -// in StringDatatypes -> NumericLiteralValue(type, strvalue = str, Position("", 0, 0, 0)) -// in ArrayDatatypes -> NumericLiteralValue(type, -// arrayvalue = array?.map { NumericLiteralValue.optimalNumeric(it, Position("", 0, 0, 0)) }?.toTypedArray(), -// Position("", 0, 0, 0)) - else -> throw IllegalArgumentException("weird source value $this") - } - } - override fun toString(): String { return when(type) { DataType.UBYTE -> "ub:%02x".format(byteval) diff --git a/compiler/src/prog8/vm/astvm/AstVm.kt b/compiler/src/prog8/vm/astvm/AstVm.kt index 0ca4ea98b..149f37c54 100644 --- a/compiler/src/prog8/vm/astvm/AstVm.kt +++ b/compiler/src/prog8/vm/astvm/AstVm.kt @@ -413,9 +413,9 @@ class AstVm(val program: Program) { val elementType = stmt.target.arrayindexed!!.inferType(program)!! val index = evaluate(stmt.target.arrayindexed!!.arrayspec.index, evalCtx).integerValue() var value = RuntimeValue(elementType, arrayvalue.array!![index].toInt()) - when { - stmt.operator == "++" -> value=value.inc() - stmt.operator == "--" -> value=value.dec() + value = when { + stmt.operator == "++" -> value.inc() + stmt.operator == "--" -> value.dec() else -> throw VmExecutionException("strange postincdec operator $stmt") } arrayvalue.array[index] = value.numericValue() diff --git a/compiler/src/prog8/vm/astvm/CallStack.kt b/compiler/src/prog8/vm/astvm/CallStack.kt deleted file mode 100644 index 603c46d11..000000000 --- a/compiler/src/prog8/vm/astvm/CallStack.kt +++ /dev/null @@ -1,18 +0,0 @@ -package prog8.vm.astvm - -import prog8.ast.INameScope -import java.util.* - -class CallStack { - - private val stack = Stack>() - - fun pop(): Pair { - return stack.pop() - } - - fun push(scope: INameScope, index: Int) { - stack.push(Pair(scope, index)) - } - -} diff --git a/compiler/src/prog8/vm/astvm/ScreenDialog.kt b/compiler/src/prog8/vm/astvm/ScreenDialog.kt index 254c8b540..f07b70ef0 100644 --- a/compiler/src/prog8/vm/astvm/ScreenDialog.kt +++ b/compiler/src/prog8/vm/astvm/ScreenDialog.kt @@ -18,7 +18,7 @@ class BitmapScreenPanel : KeyListener, JPanel() { private val g2d = image.graphics as Graphics2D private var cursorX: Int=0 private var cursorY: Int=0 - val keyboardBuffer: Deque = LinkedList() + val keyboardBuffer: Deque = LinkedList() init { val size = Dimension(image.width * SCALING, image.height * SCALING) diff --git a/examples/test.p8 b/examples/test.p8 index 20740f376..55978e2af 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -5,24 +5,22 @@ ~ main { - struct Color { - word red - byte green - float blue - } + float[5] flarray + byte[5] barray + uword[5] uwarray sub start() { - Color rgb1 = {1,2,3.44} - Color rgb2 - - rgb2 = {22233, 33, 1.1} ; @todo implicit type conversion - c64scr.print_b(rgb1.green) + c64scr.print_uw(flarray) + c64.CHROUT('=') + c64flt.print_f(flarray[0]) c64.CHROUT('\n') - c64scr.print_b(rgb2.green) + c64scr.print_uw(barray) + c64.CHROUT('=') + c64scr.print_b(barray[0]) c64.CHROUT('\n') - - rgb1=rgb2 - c64scr.print_b(rgb1.green) + c64scr.print_uw(uwarray) + c64.CHROUT('=') + c64scr.print_uw(uwarray[0]) c64.CHROUT('\n') }