From 7f497316186fa1d3ddb6a7a1ba3386729bdce0ad Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Tue, 2 Nov 2021 23:13:28 +0100 Subject: [PATCH] fix: don't initialize block vars twice, fix: make sure the prog8_init_vars generated routine is correctly called when needed --- .../compiler/target/cpu6502/codegen/AsmGen.kt | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/codeGeneration/src/prog8/compiler/target/cpu6502/codegen/AsmGen.kt b/codeGeneration/src/prog8/compiler/target/cpu6502/codegen/AsmGen.kt index 9d1e613ca..9e19378ac 100644 --- a/codeGeneration/src/prog8/compiler/target/cpu6502/codegen/AsmGen.kt +++ b/codeGeneration/src/prog8/compiler/target/cpu6502/codegen/AsmGen.kt @@ -48,6 +48,7 @@ class AsmGen(private val program: Program, internal val loopEndLabels = ArrayDeque() internal val slabs = mutableMapOf() internal val removals = mutableListOf>() + private val blockVariableInitializers = program.allBlocks.associateWith { it.statements.filterIsInstance() } override fun compileToAssembly(): IAssemblyProgram { assemblyLines.clear() @@ -59,8 +60,11 @@ class AsmGen(private val program: Program, val allBlocks = program.allBlocks if(allBlocks.first().name != "main") throw AssemblyError("first block should be 'main'") - for(b in program.allBlocks) + + for(b in program.allBlocks) { + b.statements.removeAll(blockVariableInitializers.getValue(b)) // no longer output the initialization assignments as regular statements in the block! block2asm(b) + } for(removal in removals.toList()) { removal.second.remove(removal.first) @@ -218,7 +222,7 @@ class AsmGen(private val program: Program, subroutine.forEach { translateSubroutine(it as Subroutine) } // generate subroutine to initialize block-level variables - val initializers = block.statements.filterIsInstance() + val initializers = blockVariableInitializers.getValue(block) if(initializers.isNotEmpty()) { out("prog8_init_vars\t.proc\n") initializers.forEach { assign -> translate(assign) } @@ -894,9 +898,9 @@ class AsmGen(private val program: Program, if(sub.name=="start" && sub.definingBlock.name=="main") { out("; program startup initialization") out(" cld") - program.allBlocks.forEach { - if(it.statements.any { stmt -> stmt is Assignment }) - out(" jsr ${it.name}.prog8_init_vars") + blockVariableInitializers.forEach { + if(it.value.isNotEmpty()) + out(" jsr ${it.key.name}.prog8_init_vars") } out(""" tsx