From f21adaa3ef81a4a9647b5513409f25af86addd18 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Fri, 17 Nov 2023 19:34:19 +0100 Subject: [PATCH] fix compiler error caused by removal of string symbol in txt.print() optimization --- .../src/prog8/optimizer/StatementOptimizer.kt | 10 ++-------- compiler/test/TestOptimization.kt | 18 ++++++++++++++++++ docs/source/todo.rst | 2 -- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/codeOptimizers/src/prog8/optimizer/StatementOptimizer.kt b/codeOptimizers/src/prog8/optimizer/StatementOptimizer.kt index 17e00b464..508f670e3 100644 --- a/codeOptimizers/src/prog8/optimizer/StatementOptimizer.kt +++ b/codeOptimizers/src/prog8/optimizer/StatementOptimizer.kt @@ -45,11 +45,7 @@ class StatementOptimizer(private val program: Program, mutableListOf(NumericLiteral(DataType.UBYTE, firstCharEncoded.toDouble(), pos)), functionCallStatement.void, pos ) - val stringDecl = string.parent as VarDecl - return listOf( - IAstModification.ReplaceNode(functionCallStatement, chrout, parent), - IAstModification.Remove(stringDecl, stringDecl.parent as IStatementContainer) - ) + return listOf(IAstModification.ReplaceNode(functionCallStatement, chrout, parent)) } else if (string.value.length == 2) { val firstTwoCharsEncoded = options.compTarget.encodeString(string.value.take(2), string.encoding) val chrout1 = FunctionCallStatement( @@ -62,11 +58,9 @@ class StatementOptimizer(private val program: Program, mutableListOf(NumericLiteral(DataType.UBYTE, firstTwoCharsEncoded[1].toDouble(), pos)), functionCallStatement.void, pos ) - val stringDecl = string.parent as VarDecl return listOf( IAstModification.InsertBefore(functionCallStatement, chrout1, parent as IStatementContainer), - IAstModification.ReplaceNode(functionCallStatement, chrout2, parent), - IAstModification.Remove(stringDecl, stringDecl.parent as IStatementContainer) + IAstModification.ReplaceNode(functionCallStatement, chrout2, parent) ) } } diff --git a/compiler/test/TestOptimization.kt b/compiler/test/TestOptimization.kt index 2754f5bbd..9a884afd3 100644 --- a/compiler/test/TestOptimization.kt +++ b/compiler/test/TestOptimization.kt @@ -16,6 +16,7 @@ import prog8.code.core.DataType import prog8.code.core.Position import prog8.code.target.C64Target import prog8.code.target.Cx16Target +import prog8.code.target.VMTarget import prog8tests.helpers.* @@ -758,4 +759,21 @@ main { }""" compileText(C64Target(), true, text, writeAssembly = false) shouldNotBe null } + + test("replacing string print by chrout with referenced string elsewhere shouldn't give string symbol error") { + val text=""" +%import textio + +main { + sub start() { + str key = "test" + txt.print(":") + if key != ":" { + cx16.r0++ + } + } +} +""" + compileText(VMTarget(), true, text, writeAssembly = false) shouldNotBe null + } }) diff --git a/docs/source/todo.rst b/docs/source/todo.rst index 8ca1b804d..1c6d8eeae 100644 --- a/docs/source/todo.rst +++ b/docs/source/todo.rst @@ -2,8 +2,6 @@ TODO ==== -- fix discord string bug for if key!="." : "ERROR undefined symbol: prog8_interned_strings.string_3" - - txt.waitkey() should return the pressed key? Also on atari. - [on branch: shortcircuit] investigate McCarthy evaluation again? this may also reduce code size perhaps for things like if a>4 or a<2 ....