fix charset encoding error with merge. Fixes #207

This commit is contained in:
Irmen de Jong
2026-01-24 16:12:53 +01:00
parent b99b054a09
commit ab98f4a5e2
4 changed files with 34 additions and 6 deletions
@@ -210,6 +210,28 @@ sub printit(str arg) {
compileText(C64Target(), optimize=false, src, outputDir, writeAssembly=false) shouldNotBe null
}
test("merge works with charset encoding") {
val src = """
main {
sub start() {
cx16.r0L = KEY_0
cx16.r1L = KEY_9
when cx16.r0L {
KEY_0 to KEY_9 -> {}
else -> {}
}
}
}
main {
%option merge
const ubyte KEY_0 = 'A'
const ubyte KEY_9 = 'B'
}"""
compileText(C64Target(), optimize=false, src, outputDir, writeAssembly=false) shouldNotBe null
}
test("merge override existing subroutine") {
val src="""
%import textio
+5 -3
View File
@@ -618,11 +618,13 @@ class TestProg8Parser: FunSpec( {
val char1 = CharLiteral.create('A', Encoding.PETSCII, Position.DUMMY)
val char2 = CharLiteral.create('z', Encoding.SCREENCODES, Position.DUMMY)
val char3 = CharLiteral.create('_', Encoding.ISO, Position.DUMMY)
val char4 = CharLiteral.create('_', Encoding.DEFAULT, Position.DUMMY)
val program = Program("test", DummyFunctions, DummyMemsizer, AsciiStringEncoder)
char1.constValue(program).number.toInt() shouldBe 65
char2.constValue(program).number.toInt() shouldBe 122
char3.constValue(program).number.toInt() shouldBe 95
char1.constValue(program)?.number?.toInt() shouldBe 65
char2.constValue(program)?.number?.toInt() shouldBe 122
char3.constValue(program)?.number?.toInt() shouldBe 95
char4.constValue(program) shouldBe null
}
test("testLiteralValueComparisons") {
+2 -2
View File
@@ -381,9 +381,9 @@ open class Module(final override val statements: MutableList<Statement>,
fun accept(visitor: AstWalker, parent: Node) = visitor.visit(this, parent)
val textEncoding: Encoding by lazy {
val encoding = (statements.singleOrNull { it is Directive && it.directive == "%encoding" } as? Directive)
val encoding = statements.singleOrNull { it is Directive && it.directive == "%encoding" } as? Directive
if(encoding!=null)
Encoding.entries.first { it.prefix==encoding.args[0].string }
Encoding.entries.firstOrNull { it.prefix==encoding.args[0].string } ?: program.encoding.defaultEncoding // invalid encoding will be noticed by ast checker error message
else
program.encoding.defaultEncoding
}
@@ -1037,7 +1037,9 @@ class CharLiteral private constructor(val value: Char,
override fun copy() =
CharLiteral(value, encoding, position)
override fun referencesIdentifier(nameInSource: List<String>) = false
override fun constValue(program: Program): NumericLiteral {
override fun constValue(program: Program): NumericLiteral? {
if(encoding== Encoding.DEFAULT) // will be determined at a later stage, hopefully
return null
val bytevalue = program.encoding.encodeString(value.toString(), encoding).single()
return NumericLiteral(BaseDataType.UBYTE, bytevalue.toDouble(), position)
}
@@ -1611,6 +1613,8 @@ class ContainmentCheck(var element: Expression,
is StringLiteral -> {
if(elementConst.type.isByte) {
val stringval = iterable as StringLiteral
if(stringval.encoding== Encoding.DEFAULT) // will be set at a later stage, hopefully
return null
val exists = program.encoding.encodeString(stringval.value, stringval.encoding).contains(elementConst.number.toInt().toUByte() )
return NumericLiteral.fromBoolean(exists, position)
}