From 673ed91ee3c11e54b265a2bb8857eddbd5be2c1c Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Sun, 16 Aug 2026 16:13:42 +0200 Subject: [PATCH] pointer and float size moved to memsizer, fix memory size of pass-by-ref to properly be size of pointer --- codeCore/src/prog8/code/core/ICompilationTarget.kt | 2 -- codeCore/src/prog8/code/core/IMemSizer.kt | 5 ++++- codeCore/src/prog8/code/target/Amiga500Target.kt | 2 +- codeCore/src/prog8/code/target/C128Target.kt | 2 +- codeCore/src/prog8/code/target/C64Target.kt | 2 +- codeCore/src/prog8/code/target/ConfigFileTarget.kt | 2 +- codeCore/src/prog8/code/target/Cx16Target.kt | 2 +- codeCore/src/prog8/code/target/Mflpt5.kt | 4 ++-- codeCore/src/prog8/code/target/NormalMemSizer.kt | 9 ++++++--- codeCore/src/prog8/code/target/PETTarget.kt | 2 +- codeCore/src/prog8/code/target/Qemu68kTarget.kt | 2 +- codeCore/src/prog8/code/target/VMTarget.kt | 2 +- .../testFixtures/kotlin/prog8tests/helpers/Dummies.kt | 3 +++ compiler/test/helpers/Dummies.kt | 3 +++ 14 files changed, 26 insertions(+), 16 deletions(-) diff --git a/codeCore/src/prog8/code/core/ICompilationTarget.kt b/codeCore/src/prog8/code/core/ICompilationTarget.kt index 40aae4dd7..1c6b583dc 100644 --- a/codeCore/src/prog8/code/core/ICompilationTarget.kt +++ b/codeCore/src/prog8/code/core/ICompilationTarget.kt @@ -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 diff --git a/codeCore/src/prog8/code/core/IMemSizer.kt b/codeCore/src/prog8/code/core/IMemSizer.kt index 1b23be6b8..819595a6e 100644 --- a/codeCore/src/prog8/code/core/IMemSizer.kt +++ b/codeCore/src/prog8/code/core/IMemSizer.kt @@ -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) { diff --git a/codeCore/src/prog8/code/target/Amiga500Target.kt b/codeCore/src/prog8/code/target/Amiga500Target.kt index 00272cc64..a171a4a2a 100644 --- a/codeCore/src/prog8/code/target/Amiga500Target.kt +++ b/codeCore/src/prog8/code/target/Amiga500Target.kt @@ -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 diff --git a/codeCore/src/prog8/code/target/C128Target.kt b/codeCore/src/prog8/code/target/C128Target.kt index 11ccdf982..489593aff 100644 --- a/codeCore/src/prog8/code/target/C128Target.kt +++ b/codeCore/src/prog8/code/target/C128Target.kt @@ -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 diff --git a/codeCore/src/prog8/code/target/C64Target.kt b/codeCore/src/prog8/code/target/C64Target.kt index fdcf9d97d..5477574b0 100644 --- a/codeCore/src/prog8/code/target/C64Target.kt +++ b/codeCore/src/prog8/code/target/C64Target.kt @@ -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 diff --git a/codeCore/src/prog8/code/target/ConfigFileTarget.kt b/codeCore/src/prog8/code/target/ConfigFileTarget.kt index b46bb044f..f0c7630ff 100644 --- a/codeCore/src/prog8/code/target/ConfigFileTarget.kt +++ b/codeCore/src/prog8/code/target/ConfigFileTarget.kt @@ -40,7 +40,7 @@ class ConfigFileTarget( val zpKernalsafe: List, val zpBasicsafe: List, 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" } diff --git a/codeCore/src/prog8/code/target/Cx16Target.kt b/codeCore/src/prog8/code/target/Cx16Target.kt index e1fc76aca..71e7e4fef 100644 --- a/codeCore/src/prog8/code/target/Cx16Target.kt +++ b/codeCore/src/prog8/code/target/Cx16Target.kt @@ -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 diff --git a/codeCore/src/prog8/code/target/Mflpt5.kt b/codeCore/src/prog8/code/target/Mflpt5.kt index ade58279b..7683a598f 100644 --- a/codeCore/src/prog8/code/target/Mflpt5.kt +++ b/codeCore/src/prog8/code/target/Mflpt5.kt @@ -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" } -} \ No newline at end of file +} diff --git a/codeCore/src/prog8/code/target/NormalMemSizer.kt b/codeCore/src/prog8/code/target/NormalMemSizer.kt index 0c1cc3d91..fa900cc62 100644 --- a/codeCore/src/prog8/code/target/NormalMemSizer.kt +++ b/codeCore/src/prog8/code/target/NormalMemSizer.kt @@ -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) diff --git a/codeCore/src/prog8/code/target/PETTarget.kt b/codeCore/src/prog8/code/target/PETTarget.kt index 447ccdf2b..9e9d1b166 100644 --- a/codeCore/src/prog8/code/target/PETTarget.kt +++ b/codeCore/src/prog8/code/target/PETTarget.kt @@ -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 diff --git a/codeCore/src/prog8/code/target/Qemu68kTarget.kt b/codeCore/src/prog8/code/target/Qemu68kTarget.kt index 97dabd6b7..929ca735f 100644 --- a/codeCore/src/prog8/code/target/Qemu68kTarget.kt +++ b/codeCore/src/prog8/code/target/Qemu68kTarget.kt @@ -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 diff --git a/codeCore/src/prog8/code/target/VMTarget.kt b/codeCore/src/prog8/code/target/VMTarget.kt index 087f4c935..3cdf67f65 100644 --- a/codeCore/src/prog8/code/target/VMTarget.kt +++ b/codeCore/src/prog8/code/target/VMTarget.kt @@ -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 diff --git a/codeCore/src/testFixtures/kotlin/prog8tests/helpers/Dummies.kt b/codeCore/src/testFixtures/kotlin/prog8tests/helpers/Dummies.kt index 8659cfcf0..de95f84fd 100644 --- a/codeCore/src/testFixtures/kotlin/prog8tests/helpers/Dummies.kt +++ b/codeCore/src/testFixtures/kotlin/prog8tests/helpers/Dummies.kt @@ -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!! diff --git a/compiler/test/helpers/Dummies.kt b/compiler/test/helpers/Dummies.kt index f8ab4fd78..5a0d1edd6 100644 --- a/compiler/test/helpers/Dummies.kt +++ b/compiler/test/helpers/Dummies.kt @@ -31,6 +31,9 @@ internal object DummyFunctions : IBuiltinFunctions { internal 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!!