mirror of
https://github.com/irmen/prog8.git
synced 2026-04-21 17:16:33 +00:00
fix charset encoding error with merge. Fixes #207
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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") {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user