mirror of
https://github.com/irmen/prog8.git
synced 2024-09-28 17:54:58 +00:00
fix array size in vardecls
This commit is contained in:
parent
4743cacb73
commit
2c08d2f9c6
@ -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)
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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')
|
||||
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user