zp test added, some cleanups

This commit is contained in:
Irmen de Jong 2019-08-11 21:30:13 +02:00
parent b5c5560af8
commit 2665618fa6
5 changed files with 29 additions and 13 deletions

View File

@ -497,7 +497,11 @@ class ReferenceLiteralValue(val type: DataType, // only reference types allo
throw FatalAstException("weird array element $it") throw FatalAstException("weird array element $it")
it it
} else { } else {
num.cast(elementType) // TODO this can throw an exception try {
num.cast(elementType)
} catch(x: ExpressionError) {
return null
}
} }
}.toTypedArray() }.toTypedArray()
return ReferenceLiteralValue(targettype, null, array=castArray, position = position) return ReferenceLiteralValue(targettype, null, array=castArray, position = position)
@ -668,7 +672,7 @@ data class IdentifierReference(val nameInSource: List<String>, override val posi
override fun accept(visitor: IAstModifyingVisitor) = visitor.visit(this) override fun accept(visitor: IAstModifyingVisitor) = visitor.visit(this)
override fun accept(visitor: IAstVisitor) = visitor.visit(this) override fun accept(visitor: IAstVisitor) = visitor.visit(this)
override fun referencesIdentifiers(vararg name: String): Boolean = nameInSource.last() in name // @todo is this correct all the time? override fun referencesIdentifiers(vararg name: String): Boolean = nameInSource.last() in name
override fun inferType(program: Program): DataType? { override fun inferType(program: Program): DataType? {
val targetStmt = targetStatement(program.namespace) val targetStmt = targetStatement(program.namespace)

View File

@ -390,7 +390,7 @@ internal fun fixupArrayDatatype(array: ReferenceLiteralValue, vardecl: VarDecl,
} }
vardecl.value = litval2 vardecl.value = litval2
litval2.linkParents(vardecl) litval2.linkParents(vardecl)
litval2.addToHeap(heap) // TODO is the previous array discarded from the resulting asm code? litval2.addToHeap(heap)
return litval2 return litval2
} }
} else { } else {

View File

@ -13,7 +13,7 @@ abstract class Zeropage(protected val options: CompilationOptions) {
val allowedDatatypes = NumericDatatypes val allowedDatatypes = NumericDatatypes
fun available() = free.size fun available() = if(options.zeropage==ZeropageType.DONTUSE) 0 else free.size
fun allocate(scopedname: String, datatype: DataType, position: Position?): Int { fun allocate(scopedname: String, datatype: DataType, position: Position?): Int {
assert(scopedname.isEmpty() || !allocations.values.any { it.first==scopedname } ) {"isSameAs scopedname can't be allocated twice"} assert(scopedname.isEmpty() || !allocations.values.any { it.first==scopedname } ) {"isSameAs scopedname can't be allocated twice"}

View File

@ -210,7 +210,7 @@ class ConstantFolding(private val program: Program) : IAstModifyingVisitor {
val possibleDts = arg.second.possibleDatatypes val possibleDts = arg.second.possibleDatatypes
val argConst = arg.first.value.constValue(program) val argConst = arg.first.value.constValue(program)
if(argConst!=null && argConst.type !in possibleDts) { if(argConst!=null && argConst.type !in possibleDts) {
val convertedValue = argConst.cast(possibleDts.first()) // TODO can throw exception val convertedValue = argConst.cast(possibleDts.first())
functionCall.arglist[arg.first.index] = convertedValue functionCall.arglist[arg.first.index] = convertedValue
optimizationsDone++ optimizationsDone++
} }
@ -226,7 +226,7 @@ class ConstantFolding(private val program: Program) : IAstModifyingVisitor {
val expectedDt = arg.second.type val expectedDt = arg.second.type
val argConst = arg.first.value.constValue(program) val argConst = arg.first.value.constValue(program)
if(argConst!=null && argConst.type!=expectedDt) { if(argConst!=null && argConst.type!=expectedDt) {
val convertedValue = argConst.cast(expectedDt) // TODO can throw exception val convertedValue = argConst.cast(expectedDt)
functionCall.arglist[arg.first.index] = convertedValue functionCall.arglist[arg.first.index] = convertedValue
optimizationsDone++ optimizationsDone++
} }
@ -356,7 +356,7 @@ class ConstantFolding(private val program: Program) : IAstModifyingVisitor {
subleftIsConst: Boolean, subleftIsConst: Boolean,
subrightIsConst: Boolean): Expression subrightIsConst: Boolean): Expression
{ {
// @todo this implements only a small set of possible reorderings for now // todo: this implements only a small set of possible reorderings at this time
if(expr.operator==subExpr.operator) { if(expr.operator==subExpr.operator) {
// both operators are the isSameAs. // both operators are the isSameAs.
// If + or *, we can simply swap the const of expr and Var in subexpr. // If + or *, we can simply swap the const of expr and Var in subexpr.
@ -544,11 +544,15 @@ class ConstantFolding(private val program: Program) : IAstModifyingVisitor {
override fun visit(forLoop: ForLoop): Statement { override fun visit(forLoop: ForLoop): Statement {
fun adjustRangeDt(rangeFrom: NumericLiteralValue, targetDt: DataType, rangeTo: NumericLiteralValue, stepLiteral: NumericLiteralValue?, range: RangeExpr): RangeExpr { fun adjustRangeDt(rangeFrom: NumericLiteralValue, targetDt: DataType, rangeTo: NumericLiteralValue, stepLiteral: NumericLiteralValue?, range: RangeExpr): RangeExpr {
// TODO casts can throw exception val newFrom: NumericLiteralValue
val newFrom = rangeFrom.cast(targetDt) val newTo: NumericLiteralValue
val newTo = rangeTo.cast(targetDt) try {
val newStep: Expression = newFrom = rangeFrom.cast(targetDt)
stepLiteral?.cast(targetDt) ?: range.step newTo = rangeTo.cast(targetDt)
} catch (x: ExpressionError) {
return range
}
val newStep: Expression = stepLiteral?.cast(targetDt) ?: range.step
return RangeExpr(newFrom, newTo, newStep, range.position) return RangeExpr(newFrom, newTo, newStep, range.position)
} }

View File

@ -169,7 +169,15 @@ class TestZeropage {
} }
} }
// TODO test dontuse option @Test
fun testZpDontuse() {
val zp = C64Zeropage(CompilationOptions(OutputType.RAW, LauncherType.NONE, ZeropageType.DONTUSE, emptyList(), false))
println(zp.free)
assertEquals(0, zp.available())
assertFailsWith<CompilerException> {
zp.allocate("", DataType.BYTE, null)
}
}
@Test @Test
fun testFreeSpaces() { fun testFreeSpaces() {