From 65daf29acd2cb35ad8d6bab1f035836123470ca0 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Wed, 6 Jul 2022 00:49:57 +0200 Subject: [PATCH] fix compiler crash related to word types in certain comparison expressions --- .../cpu6502/assignment/AssignmentAsmGen.kt | 4 ++-- compiler/test/TestTypecasts.kt | 22 ++++++++++++++++++- docs/source/todo.rst | 6 +---- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/codeGenCpu6502/src/prog8/codegen/cpu6502/assignment/AssignmentAsmGen.kt b/codeGenCpu6502/src/prog8/codegen/cpu6502/assignment/AssignmentAsmGen.kt index a18f7bd8d..13137cdaa 100644 --- a/codeGenCpu6502/src/prog8/codegen/cpu6502/assignment/AssignmentAsmGen.kt +++ b/codeGenCpu6502/src/prog8/codegen/cpu6502/assignment/AssignmentAsmGen.kt @@ -467,7 +467,7 @@ internal class AssignmentAsmGen(private val program: Program, private fun attemptAssignToByteCompareZero(expr: BinaryExpression, assign: AsmAssignment): Boolean { when (expr.operator) { "==" -> { - when(val dt = assign.source.datatype) { + when(val dt = expr.left.inferType(program).getOrElse { throw AssemblyError("invalid dt") }) { in ByteDatatypes -> { assignExpressionToRegister(expr.left, RegisterOrPair.A, dt==DataType.BYTE) asmgen.out(""" @@ -504,7 +504,7 @@ internal class AssignmentAsmGen(private val program: Program, } } "!=" -> { - when(val dt = assign.source.datatype) { + when(val dt = expr.left.inferType(program).getOrElse { throw AssemblyError("invalid dt") }) { in ByteDatatypes -> { assignExpressionToRegister(expr.left, RegisterOrPair.A, dt==DataType.BYTE) asmgen.out(" beq + | lda #1") diff --git a/compiler/test/TestTypecasts.kt b/compiler/test/TestTypecasts.kt index 156a04bfe..d9e1388d8 100644 --- a/compiler/test/TestTypecasts.kt +++ b/compiler/test/TestTypecasts.kt @@ -16,6 +16,27 @@ import prog8tests.helpers.compileText class TestTypecasts: FunSpec({ + test("correct evaluation of words in boolean expressions") { + val text=""" + main { + sub start() { + uword camg + ubyte @shared interlaced + interlaced = (camg & ${'$'}0004) != 0 + interlaced++ + interlaced = (${'$'}0004 & camg) != 0 + interlaced++ + uword @shared ww + ww = (camg & ${'$'}0004) + ww++ + ww = (${'$'}0004 & camg) + } + }""" + val result = compileText(C64Target(), false, text, writeAssembly = false)!! + val stmts = result.program.entrypoint.statements + stmts.size shouldBe 11 + } + test("word to byte casts") { val text=""" %import textio @@ -33,7 +54,6 @@ class TestTypecasts: FunSpec({ val result = compileText(C64Target(), false, text, writeAssembly = false)!! val stmts = result.program.entrypoint.statements stmts.size shouldBe 3 - } test("add missing & to function arguments") { diff --git a/docs/source/todo.rst b/docs/source/todo.rst index 0d85fa708..dc942e1c0 100644 --- a/docs/source/todo.rst +++ b/docs/source/todo.rst @@ -3,11 +3,7 @@ TODO For next release ^^^^^^^^^^^^^^^^ -- fix imageviewer compilation crash - -- petaxian is larger again after introduction of BOOL type (against main branch). WHY??? FIX. - caused by replacing cast-to-bool by !=0 expression perhaps rather than optimized asm for boolean() func? - boolcheck.p8 illustrates problem: stack eval +... Need help with