pointer and float size moved to memsizer, fix memory size of pass-by-ref to properly be size of pointer

This commit is contained in:
Irmen de Jong committed 2026-08-16 16:13:42 +02:00
1 parent 65b6280618
commit 673ed91ee3
14 files changed
+26 -16

No files matched your search

@@ -67,8 +67,6 @@ interface ICompilationTarget: IStringEncoding, IMemSizer {
val FLOAT_MAX_NEGATIVE: Double
val FLOAT_MAX_POSITIVE: Double
val FLOAT_MEM_SIZE: UInt
val POINTER_MEM_SIZE: UInt
val ARRAY_SIZE_LIMIT: UInt
val PROGRAM_LOAD_ADDRESS : UInt
val PROGRAM_MEMTOP_ADDRESS: UInt
+4 -1
View File
@@ -1,11 +1,14 @@
package prog8.code.core
interface IMemSizer {
val FLOAT_MEM_SIZE: UInt
val POINTER_MEM_SIZE: UInt
fun memorySize(dt: DataType, numElements: Int?): Int
fun memorySize(dt: BaseDataType): Int {
if(dt.isPassByRef)
return memorySize(DataType.UWORD, null) // a pointer size
return POINTER_MEM_SIZE.toInt()
try {
return memorySize(DataType.forDt(dt), null)
} catch (x: NoSuchElementException) {
@@ -7,7 +7,7 @@ import java.nio.file.Path
class Amiga500Target: ICompilationTarget,
IStringEncoding by Encoder(false),
IMemSizer by NormalMemSizer(4, pointerSize = 4) {
IMemSizer by NormalMemSizer(4u, 4u) {
override val name = NAME
override val supportsBankedCalls = true
+1 -1
View File
@@ -8,7 +8,7 @@ import java.nio.file.Path
class C128Target: ICompilationTarget,
IStringEncoding by Encoder(true),
IMemSizer by NormalMemSizer(Mflpt5.FLOAT_MEM_SIZE) {
IMemSizer by NormalMemSizer(Mflpt5.FLOAT_MEM_SIZE, 2u) {
override val name = NAME
override val supportsBankedCalls = true
+1 -1
View File
@@ -9,7 +9,7 @@ import java.nio.file.Path
class C64Target: ICompilationTarget,
IStringEncoding by Encoder(true),
IMemSizer by NormalMemSizer(Mflpt5.FLOAT_MEM_SIZE) {
IMemSizer by NormalMemSizer(Mflpt5.FLOAT_MEM_SIZE, 2u) {
override val name = NAME
override val supportsBankedCalls = true
@@ -40,7 +40,7 @@ class ConfigFileTarget(
val zpKernalsafe: List<UIntRange>,
val zpBasicsafe: List<UIntRange>,
val pointerSize: Int = 2
): ICompilationTarget, IStringEncoding by Encoder(true), IMemSizer by NormalMemSizer(8, pointerSize) {
): ICompilationTarget, IStringEncoding by Encoder(true), IMemSizer by NormalMemSizer(8u, pointerSize.toUInt()) {
init {
require(pointerSize == 2 || pointerSize == 4) { "unsupported pointer size: $pointerSize" }
+1 -1
View File
@@ -8,7 +8,7 @@ import java.nio.file.Path
class Cx16Target: ICompilationTarget,
IStringEncoding by Encoder(true),
IMemSizer by NormalMemSizer(Mflpt5.FLOAT_MEM_SIZE) {
IMemSizer by NormalMemSizer(Mflpt5.FLOAT_MEM_SIZE, 2u) {
override val name = NAME
override val supportsBankedCalls = true
+2 -2
View File
@@ -9,7 +9,7 @@ data class Mflpt5(val b0: UByte, val b1: UByte, val b2: UByte, val b3: UByte, va
companion object {
const val FLOAT_MAX_POSITIVE = 1.7014118345e+38 // bytes: 255,127,255,255,255
const val FLOAT_MAX_NEGATIVE = -1.7014118345e+38 // bytes: 255,255,255,255,255
const val FLOAT_MEM_SIZE = 5
const val FLOAT_MEM_SIZE = 5u
val zero = Mflpt5(0u, 0u, 0u, 0u, 0u)
fun fromNumber(num: Number): Mflpt5 {
@@ -73,4 +73,4 @@ data class Mflpt5(val b0: UByte, val b1: UByte, val b2: UByte, val b3: UByte, va
val b4 = "$" + b4.toString(16).padStart(2, '0')
return "$b0, $b1, $b2, $b3, $b4"
}
}
}
@@ -4,8 +4,11 @@ import prog8.code.core.BaseDataType
import prog8.code.core.DataType
import prog8.code.core.IMemSizer
internal class NormalMemSizer(val floatsize: Int, val pointerSize: Int = 2): IMemSizer {
internal class NormalMemSizer(override val FLOAT_MEM_SIZE: UInt, override val POINTER_MEM_SIZE: UInt): IMemSizer {
private val pointerSize = POINTER_MEM_SIZE.toInt()
private val floatSize = FLOAT_MEM_SIZE.toInt()
override fun memorySize(dt: DataType, numElements: Int?): Int {
if(dt.isPointerArray)
return pointerSize * numElements!! // array of pointers
@@ -16,7 +19,7 @@ internal class NormalMemSizer(val floatsize: Int, val pointerSize: Int = 2): IMe
BaseDataType.UWORD, BaseDataType.WORD -> numElements * 2
BaseDataType.STR, BaseDataType.POINTER -> numElements * pointerSize
BaseDataType.LONG -> numElements * 4
BaseDataType.FLOAT-> numElements * floatsize
BaseDataType.FLOAT-> numElements * floatSize
BaseDataType.UNDEFINED -> throw IllegalArgumentException("undefined has no memory size")
else -> throw IllegalArgumentException("invalid sub type")
}
@@ -28,7 +31,7 @@ internal class NormalMemSizer(val floatsize: Int, val pointerSize: Int = 2): IMe
return when {
dt.isByteOrBool -> 1 * (numElements ?: 1)
dt.isFloat -> floatsize * (numElements ?: 1)
dt.isFloat -> floatSize * (numElements ?: 1)
dt.isLong -> 4 * (numElements ?: 1)
dt.isWord -> 2 * (numElements ?: 1)
dt.isPointer -> pointerSize * (numElements ?: 1)
+1 -1
View File
@@ -8,7 +8,7 @@ import java.nio.file.Path
class PETTarget: ICompilationTarget,
IStringEncoding by Encoder(true),
IMemSizer by NormalMemSizer(Mflpt5.FLOAT_MEM_SIZE) {
IMemSizer by NormalMemSizer(Mflpt5.FLOAT_MEM_SIZE, 2u) {
override val name = NAME
override val supportsBankedCalls = false
@@ -11,7 +11,7 @@ import java.nio.file.Path
class Qemu68kTarget: ICompilationTarget,
IStringEncoding by Encoder(false),
IMemSizer by NormalMemSizer(4, pointerSize = 4) {
IMemSizer by NormalMemSizer(4u, 4u) {
override val name = NAME
override val supportsBankedCalls = false
+1 -1
View File
@@ -10,7 +10,7 @@ import kotlin.io.path.readText
class VMTarget: ICompilationTarget,
IStringEncoding by Encoder(false),
IMemSizer by NormalMemSizer(8) {
IMemSizer by NormalMemSizer(8u, 2u) {
override val name = NAME
override val supportsBankedCalls = false
@@ -8,6 +8,9 @@ import prog8.code.core.*
* Returns standard memory sizes for all data types.
*/
object DummyMemsizer : IMemSizer {
override val FLOAT_MEM_SIZE: UInt = 4u
override val POINTER_MEM_SIZE: UInt = 2u
override fun memorySize(dt: DataType, numElements: Int?): Int {
if (dt.isPointerArray)
return 2 * numElements!!