fix array size in vardecls

This commit is contained in:
Irmen de Jong 2019-06-30 20:10:53 +02:00
parent 4743cacb73
commit 2c08d2f9c6
3 changed files with 40 additions and 88 deletions

View File

@ -165,6 +165,8 @@ private class StatementReorderer(private val program: Program): IAstProcessor {
if(decl.arraysize==null) {
val array = decl.value as? LiteralValue
if(array!=null && array.isArray) {
if(array.heapId==null)
TODO("$decl")
val size = program.heap.get(array.heapId!!).arraysize
decl.arraysize = ArrayIndex(LiteralValue.optimalInteger(size, decl.position), decl.position)
}

View File

@ -34,6 +34,25 @@ class ConstantFolding(private val program: Program) : IAstProcessor {
val litval = decl.value as? LiteralValue
if(litval!=null && litval.isArray && litval.heapId!=null)
fixupArrayTypeOnHeap(decl, litval)
if(decl.isArray){
// for arrays that have no size specifier (or a non-constant one) attempt to deduce the size
if(decl.arraysize==null) {
val arrayval = (decl.value as? LiteralValue)?.arrayvalue
if(arrayval!=null) {
decl.arraysize = ArrayIndex(LiteralValue.optimalInteger(arrayval.size, decl.position), decl.position)
optimizationsDone++
}
}
else if(decl.arraysize?.size()==null) {
val size = decl.arraysize!!.index.process(this)
if(size is LiteralValue) {
decl.arraysize = ArrayIndex(size, decl.position)
optimizationsDone++
}
}
}
when(decl.datatype) {
DataType.FLOAT -> {
// vardecl: for scalar float vars, promote constant integer initialization values to floats
@ -70,17 +89,8 @@ class ConstantFolding(private val program: Program) : IAstProcessor {
}
if(litval?.type==DataType.FLOAT)
errors.add(ExpressionError("arraysize requires only integers here", litval.position))
if(decl.arraysize==null) {
// see if we can deduce a proper arraysize
val arrayval = (decl.value as? LiteralValue)?.arrayvalue
if(arrayval!=null) {
decl.arraysize = ArrayIndex(LiteralValue.optimalInteger(arrayval.size, decl.position), decl.position)
optimizationsDone++
}
return decl
}
val size = decl.arraysize!!.size()
if ((litval==null || !litval.isArray) && size != null && rangeExpr==null) {
val size = decl.arraysize?.size() ?: return decl
if ((litval==null || !litval.isArray) && rangeExpr==null) {
// arraysize initializer is empty or a single int, and we know the size; create the arraysize.
val fillvalue = if (litval == null) 0 else litval.asIntegerValue ?: 0
when(decl.datatype){
@ -109,10 +119,8 @@ class ConstantFolding(private val program: Program) : IAstProcessor {
}
}
DataType.ARRAY_F -> {
if(decl.arraysize==null)
return decl
val size = decl.arraysize!!.size()
if ((litval==null || !litval.isArray) && size != null) {
val size = decl.arraysize?.size() ?: return decl
if (litval==null || !litval.isArray) {
// arraysize initializer is empty or a single int, and we know the size; create the arraysize.
val fillvalue = if (litval == null) 0.0 else litval.asNumericValue?.toDouble() ?: 0.0
if(fillvalue< FLOAT_MAX_NEGATIVE || fillvalue> FLOAT_MAX_POSITIVE)

View File

@ -7,84 +7,26 @@
sub start() {
word w1 = 1111
word w2 = 2222
ubyte b1 = 11
ubyte b2 = 22
ubyte[] arr1 = [1,2,3,4]
ubyte[] arr2 = [1,2,3,4]
A=99
Y=88
c64scr.print_w(w1)
c64.CHROUT(',')
c64scr.print_w(w2)
c64.CHROUT('\n')
swap(w1, w2)
c64scr.print_w(w1)
c64.CHROUT(',')
c64scr.print_w(w2)
c64.CHROUT('\n')
float[] xcoor = [ -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0 ]
c64scr.print_ub(A)
c64.CHROUT(',')
c64scr.print_ub(Y)
c64.CHROUT('\n')
swap(A, Y)
c64scr.print_ub(A)
c64.CHROUT(',')
c64scr.print_ub(Y)
c64.CHROUT('\n')
; storage for rotated coordinates
ubyte[len(xcoor)] xx = 2
float[len(xcoor)] rotatedx=0.0
c64scr.print_ub(arr1[2])
c64.CHROUT(',')
c64scr.print_ub(arr2[3])
c64.CHROUT('\n')
swap(arr1[2], arr2[3])
c64scr.print_ub(arr1[2])
c64.CHROUT(',')
c64scr.print_ub(arr2[3])
c64.CHROUT('\n')
ubyte[4] x = 23
float[4] yy = 4.4
c64scr.print_ub(A)
c64.CHROUT(',')
c64scr.print_ub(b1)
c64.CHROUT('\n')
swap(A, b1)
c64scr.print_ub(A)
c64.CHROUT(',')
c64scr.print_ub(b1)
c64.CHROUT('\n')
; c64flt.print_f(xcoor[1])
; c64.CHROUT(',')
; c64flt.print_f(xcoor[2])
; c64.CHROUT('\n')
; swap(xcoor[1], xcoor[2])
; c64flt.print_f(xcoor[1])
; c64.CHROUT(',')
; c64flt.print_f(xcoor[2])
; c64.CHROUT('\n')
c64scr.print_ub(b2)
c64.CHROUT(',')
c64scr.print_ub(Y)
c64.CHROUT('\n')
swap(b2, Y)
c64scr.print_ub(b2)
c64.CHROUT(',')
c64scr.print_ub(Y)
c64.CHROUT('\n')
c64scr.print_ub(arr1[2])
c64.CHROUT(',')
c64scr.print_ub(Y)
c64.CHROUT('\n')
swap(arr1[2], Y)
c64scr.print_ub(arr1[2])
c64.CHROUT(',')
c64scr.print_ub(Y)
c64.CHROUT('\n')
c64scr.print_ub(Y)
c64.CHROUT(',')
c64scr.print_ub(arr2[3])
c64.CHROUT('\n')
swap(Y, arr2[3])
c64scr.print_ub(Y)
c64.CHROUT(',')
c64scr.print_ub(arr2[3])
c64.CHROUT('\n')
}
}