reducing dependencies

This commit is contained in:
Irmen de Jong 2022-03-10 01:27:27 +01:00
parent 7d20458e82
commit da352a322c
9 changed files with 37 additions and 60 deletions

View File

@ -6,7 +6,6 @@ import prog8.ast.base.ArrayDatatypes
import prog8.ast.base.DataType import prog8.ast.base.DataType
import prog8.ast.base.IntegerDatatypes import prog8.ast.base.IntegerDatatypes
import prog8.ast.statements.Subroutine import prog8.ast.statements.Subroutine
import prog8.ast.statements.ZeropageWish
import prog8.compilerinterface.* import prog8.compilerinterface.*
@ -37,10 +36,10 @@ internal class VariableAllocator(private val symboltable: SymbolTable,
val allVariables = collectAllVariables(symboltable) val allVariables = collectAllVariables(symboltable)
val numberOfAllocatableVariables = allVariables.size val numberOfAllocatableVariables = allVariables.size
val varsRequiringZp = allVariables.filter { it.zpw == ZeropageWish.REQUIRE_ZEROPAGE } val varsRequiringZp = allVariables.filter { it.zpw == StZeropageWish.REQUIRE_ZEROPAGE }
val varsPreferringZp = allVariables.filter { it.zpw == ZeropageWish.PREFER_ZEROPAGE } val varsPreferringZp = allVariables.filter { it.zpw == StZeropageWish.PREFER_ZEROPAGE }
val varsDontCare = allVariables.filter { it.zpw == ZeropageWish.DONTCARE } val varsDontCare = allVariables.filter { it.zpw == StZeropageWish.DONTCARE }
val numberOfExplicitNonZpVariables = allVariables.count { it.zpw == ZeropageWish.NOT_IN_ZEROPAGE } val numberOfExplicitNonZpVariables = allVariables.count { it.zpw == StZeropageWish.NOT_IN_ZEROPAGE }
require(varsDontCare.size + varsRequiringZp.size + varsPreferringZp.size + numberOfExplicitNonZpVariables == numberOfAllocatableVariables) require(varsDontCare.size + varsRequiringZp.size + varsPreferringZp.size + numberOfExplicitNonZpVariables == numberOfAllocatableVariables)
var numVariablesAllocatedInZP = 0 var numVariablesAllocatedInZP = 0

View File

@ -1,11 +1,12 @@
package prog8.codegen.target package prog8.codegen.target
import prog8.ast.base.* import prog8.ast.base.ByteDatatypes
import prog8.ast.base.DataType
import prog8.ast.base.PassByReferenceDatatypes
import prog8.ast.base.WordDatatypes
import prog8.ast.expressions.Expression import prog8.ast.expressions.Expression
import prog8.ast.expressions.StringLiteral
import prog8.ast.statements.RegisterOrStatusflag import prog8.ast.statements.RegisterOrStatusflag
import prog8.ast.statements.Subroutine import prog8.ast.statements.Subroutine
import prog8.ast.statements.VarDecl
import prog8.codegen.target.atari.AtariMachineDefinition import prog8.codegen.target.atari.AtariMachineDefinition
import prog8.codegen.target.cbm.asmsub6502ArgsEvalOrder import prog8.codegen.target.cbm.asmsub6502ArgsEvalOrder
import prog8.codegen.target.cbm.asmsub6502ArgsHaveRegisterClobberRisk import prog8.codegen.target.cbm.asmsub6502ArgsHaveRegisterClobberRisk
@ -38,18 +39,4 @@ class AtariTarget: ICompilationTarget, IStringEncoding by Encoder, IMemSizer {
else -> Int.MIN_VALUE else -> Int.MIN_VALUE
} }
} }
override fun memorySize(decl: VarDecl): Int {
return when(decl.type) {
VarDeclType.CONST -> 0
VarDeclType.VAR, VarDeclType.MEMORY -> {
when(val dt = decl.datatype) {
in NumericDatatypes -> return memorySize(dt)
in ArrayDatatypes -> decl.arraysize!!.constIndex()!! * memorySize(ArrayToElementTypes.getValue(dt))
DataType.STR -> (decl.value as StringLiteral).value.length + 1
else -> 0
}
}
}
}
} }

View File

@ -1,8 +1,9 @@
package prog8.codegen.target.cbm package prog8.codegen.target.cbm
import prog8.ast.base.* import prog8.ast.base.ByteDatatypes
import prog8.ast.expressions.StringLiteral import prog8.ast.base.DataType
import prog8.ast.statements.VarDecl import prog8.ast.base.PassByReferenceDatatypes
import prog8.ast.base.WordDatatypes
import prog8.compilerinterface.IMemSizer import prog8.compilerinterface.IMemSizer
internal object CbmMemorySizer: IMemSizer { internal object CbmMemorySizer: IMemSizer {
@ -14,18 +15,4 @@ internal object CbmMemorySizer: IMemSizer {
else -> Int.MIN_VALUE else -> Int.MIN_VALUE
} }
} }
override fun memorySize(decl: VarDecl): Int {
return when(decl.type) {
VarDeclType.CONST -> 0
VarDeclType.VAR, VarDeclType.MEMORY -> {
when(val dt = decl.datatype) {
in NumericDatatypes -> return memorySize(dt)
in ArrayDatatypes -> decl.arraysize!!.constIndex()!! * memorySize(ArrayToElementTypes.getValue(dt))
DataType.STR -> (decl.value as StringLiteral).value.length + 1
else -> 0
}
}
}
}
} }

View File

@ -644,7 +644,7 @@ internal class AstChecker(private val program: Program,
} }
} }
if(compilerOptions.zeropage==ZeropageType.DONTUSE && decl.zeropage==ZeropageWish.REQUIRE_ZEROPAGE) if(compilerOptions.zeropage==ZeropageType.DONTUSE && decl.zeropage == ZeropageWish.REQUIRE_ZEROPAGE)
err("zeropage usage has been disabled by options") err("zeropage usage has been disabled by options")
super.visit(decl) super.visit(decl)

View File

@ -5,10 +5,7 @@ import prog8.ast.base.FatalAstException
import prog8.ast.base.Position import prog8.ast.base.Position
import prog8.ast.base.VarDeclType import prog8.ast.base.VarDeclType
import prog8.ast.expressions.* import prog8.ast.expressions.*
import prog8.ast.statements.Block import prog8.ast.statements.*
import prog8.ast.statements.Label
import prog8.ast.statements.Subroutine
import prog8.ast.statements.VarDecl
import prog8.ast.walk.IAstVisitor import prog8.ast.walk.IAstVisitor
import prog8.compilerinterface.* import prog8.compilerinterface.*
import java.util.* import java.util.*
@ -56,7 +53,7 @@ internal class SymbolTableMaker: IAstVisitor {
val initialString = if(initialStringLit==null) null else Pair(initialStringLit.value, initialStringLit.encoding) val initialString = if(initialStringLit==null) null else Pair(initialStringLit.value, initialStringLit.encoding)
val initialArrayLit = decl.value as? ArrayLiteral val initialArrayLit = decl.value as? ArrayLiteral
val initialArray = makeInitialArray(initialArrayLit) val initialArray = makeInitialArray(initialArrayLit)
StStaticVariable(decl.name, decl.datatype, initialNumeric, initialString, initialArray, decl.arraysize?.constIndex(), decl.zeropage, decl.position) StStaticVariable(decl.name, decl.datatype, initialNumeric, initialString, initialArray, decl.arraysize?.constIndex(), map(decl.zeropage), decl.position)
} }
VarDeclType.CONST -> StConstant(decl.name, decl.datatype, (decl.value as NumericLiteral).number, decl.position) VarDeclType.CONST -> StConstant(decl.name, decl.datatype, (decl.value as NumericLiteral).number, decl.position)
VarDeclType.MEMORY -> StMemVar(decl.name, decl.datatype, (decl.value as NumericLiteral).number.toUInt(), decl.position) VarDeclType.MEMORY -> StMemVar(decl.name, decl.datatype, (decl.value as NumericLiteral).number.toUInt(), decl.position)
@ -65,6 +62,13 @@ internal class SymbolTableMaker: IAstVisitor {
st.origAstLinks[decl] = node st.origAstLinks[decl] = node
} }
private fun map(zpw: ZeropageWish): StZeropageWish = when(zpw) {
ZeropageWish.REQUIRE_ZEROPAGE -> StZeropageWish.REQUIRE_ZEROPAGE
ZeropageWish.PREFER_ZEROPAGE -> StZeropageWish.PREFER_ZEROPAGE
ZeropageWish.DONTCARE -> StZeropageWish.DONTCARE
ZeropageWish.NOT_IN_ZEROPAGE -> StZeropageWish.NOT_IN_ZEROPAGE
}
private fun makeInitialArray(arrayLit: ArrayLiteral?): StArray? { private fun makeInitialArray(arrayLit: ArrayLiteral?): StArray? {
if(arrayLit==null) if(arrayLit==null)
return null return null

View File

@ -6,7 +6,6 @@ import io.kotest.matchers.shouldBe
import io.kotest.matchers.shouldNotBe import io.kotest.matchers.shouldNotBe
import prog8.ast.base.DataType import prog8.ast.base.DataType
import prog8.ast.base.Position import prog8.ast.base.Position
import prog8.ast.statements.ZeropageWish
import prog8.compilerinterface.* import prog8.compilerinterface.*
class TestSymbolTable: FunSpec({ class TestSymbolTable: FunSpec({
@ -71,10 +70,10 @@ private fun makeSt(): SymbolTable {
block1.add(sub12) block1.add(sub12)
block1.add(StConstant("c1", DataType.UWORD, 12345.0, Position.DUMMY)) block1.add(StConstant("c1", DataType.UWORD, 12345.0, Position.DUMMY))
block1.add(StConstant("blockc", DataType.UWORD, 999.0, Position.DUMMY)) block1.add(StConstant("blockc", DataType.UWORD, 999.0, Position.DUMMY))
sub11.add(StStaticVariable("v1", DataType.BYTE, null, null, null, null, ZeropageWish.DONTCARE, Position.DUMMY)) sub11.add(StStaticVariable("v1", DataType.BYTE, null, null, null, null, StZeropageWish.DONTCARE, Position.DUMMY))
sub11.add(StStaticVariable("v2", DataType.BYTE, null, null, null, null, ZeropageWish.DONTCARE, Position.DUMMY)) sub11.add(StStaticVariable("v2", DataType.BYTE, null, null, null, null, StZeropageWish.DONTCARE, Position.DUMMY))
sub12.add(StStaticVariable("v1", DataType.BYTE, null, null, null, null, ZeropageWish.DONTCARE, Position.DUMMY)) sub12.add(StStaticVariable("v1", DataType.BYTE, null, null, null, null, StZeropageWish.DONTCARE, Position.DUMMY))
sub12.add(StStaticVariable("v2", DataType.BYTE, null, null, null, null, ZeropageWish.DONTCARE, Position.DUMMY)) sub12.add(StStaticVariable("v2", DataType.BYTE, null, null, null, null, StZeropageWish.DONTCARE, Position.DUMMY))
val block2 = StNode("block2", StNodeType.BLOCK, Position.DUMMY) val block2 = StNode("block2", StNodeType.BLOCK, Position.DUMMY)
val sub21 = StNode("sub1", StNodeType.SUBROUTINE, Position.DUMMY) val sub21 = StNode("sub1", StNodeType.SUBROUTINE, Position.DUMMY)

View File

@ -8,7 +8,6 @@ import prog8.ast.expressions.InferredTypes
import prog8.ast.expressions.NumericLiteral import prog8.ast.expressions.NumericLiteral
import prog8.ast.statements.RegisterOrStatusflag import prog8.ast.statements.RegisterOrStatusflag
import prog8.ast.statements.Subroutine import prog8.ast.statements.Subroutine
import prog8.ast.statements.VarDecl
import prog8.compilerinterface.* import prog8.compilerinterface.*
internal object DummyFunctions : IBuiltinFunctions { internal object DummyFunctions : IBuiltinFunctions {
@ -25,7 +24,6 @@ internal object DummyFunctions : IBuiltinFunctions {
internal object DummyMemsizer : IMemSizer { internal object DummyMemsizer : IMemSizer {
override fun memorySize(dt: DataType) = 0 override fun memorySize(dt: DataType) = 0
override fun memorySize(decl: VarDecl) = 0
} }
internal object DummyStringEncoder : IStringEncoding { internal object DummyStringEncoder : IStringEncoding {
@ -73,8 +71,4 @@ internal object DummyCompilationTarget : ICompilationTarget {
override fun memorySize(dt: DataType): Int { override fun memorySize(dt: DataType): Int {
throw NotImplementedError("dummy") throw NotImplementedError("dummy")
} }
override fun memorySize(decl: VarDecl): Int {
throw NotImplementedError("dummy")
}
} }

View File

@ -1,7 +1,6 @@
package prog8.compilerinterface package prog8.compilerinterface
import prog8.ast.base.DataType import prog8.ast.base.DataType
import prog8.ast.statements.VarDecl
// note: this is a separate interface in the compilerAst module because // note: this is a separate interface in the compilerAst module because
@ -9,5 +8,4 @@ import prog8.ast.statements.VarDecl
interface IMemSizer { interface IMemSizer {
fun memorySize(dt: DataType): Int fun memorySize(dt: DataType): Int
fun memorySize(decl: VarDecl): Int
} }

View File

@ -3,7 +3,6 @@ package prog8.compilerinterface
import prog8.ast.Node import prog8.ast.Node
import prog8.ast.base.DataType import prog8.ast.base.DataType
import prog8.ast.base.Position import prog8.ast.base.Position
import prog8.ast.statements.ZeropageWish
/** /**
@ -31,6 +30,16 @@ enum class StNodeType {
BUILTINFUNC BUILTINFUNC
} }
// TODO assumption: replicating this here (from the Ast namespace) allows us later to have 0 dependencies on the original Ast nodes/namespace
// same for DataType? or should those things be moved into a separate module 'elementary' that contains all shared enums and classes such as Position?
enum class StZeropageWish {
REQUIRE_ZEROPAGE,
PREFER_ZEROPAGE,
DONTCARE,
NOT_IN_ZEROPAGE
}
open class StNode(val name: String, open class StNode(val name: String,
val type: StNodeType, val type: StNodeType,
val position: Position, val position: Position,
@ -125,7 +134,7 @@ class StStaticVariable(name: String,
val initialStringValue: StString?, val initialStringValue: StString?,
val initialArrayValue: StArray?, val initialArrayValue: StArray?,
val arraysize: Int?, val arraysize: Int?,
val zpw: ZeropageWish, val zpw: StZeropageWish,
position: Position) : StNode(name, StNodeType.STATICVAR, position) { position: Position) : StNode(name, StNodeType.STATICVAR, position) {
init { init {