From 14d130f2854a119de69475e6f48f51ed6659953a Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Wed, 29 Apr 2026 22:57:01 +0200 Subject: [PATCH] Allow assigning variables refering to aggregates --- Rakefile | 7 ++++++- boot/stage21/cl.elna | 18 ++++++++++++------ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/Rakefile b/Rakefile index c2f5be5..fe96b49 100644 --- a/Rakefile +++ b/Rakefile @@ -38,6 +38,7 @@ desc 'Convert previous stage language into the current stage language' task :convert do File.open('boot/stage22/cl.elna', 'w') do |current_stage| seen_proc = false + seen_global_var = false File.readlines('boot/stage21/cl.elna').each do |line| seen_proc = true if line.start_with? 'proc' seen_proc = false if line.start_with? 'end' @@ -46,7 +47,6 @@ task :convert do proc f(); var - x: ElnaLocation; y: ElnaLocation; begin y.line := 1; @@ -58,6 +58,11 @@ task :convert do begin f(); FUN + elsif line.start_with?('var') && !seen_global_var + current_stage << <<~FUN + var + x: ElnaLocation; + FUN else current_stage << line end diff --git a/boot/stage21/cl.elna b/boot/stage21/cl.elna index 3e9c47a..c2d9ad1 100644 --- a/boot/stage21/cl.elna +++ b/boot/stage21/cl.elna @@ -7,6 +7,8 @@ program; (* Stage 21 compiler. *) +(* - Allow assigning variables refering to aggregates. *) + type ElnaListNode = record next: Word @@ -1284,7 +1286,7 @@ begin elna_rtl_instruction_set_operand(instruction, 2, source_operand.kind, source_operand.value, source_operand.length, 0); elna_list_append(instructions, instruction); else - elna_rtl_memcpy(instructions, @source_operand, pseudo_symbol^.rtl_type, ElnaRtlKind.pseudo, + elna_rtl_memcpy(instructions, @source_operand, pseudo_symbol^.rtl_type, source_operand.kind, tac_instruction^.operands[2].value, tac_instruction^.operands[2].length) end end; @@ -1548,12 +1550,16 @@ var begin (* pseudo or pseudo_mem. *) if instruction^.operands[2].kind <> ElnaRtlKind.data then - pseudo_symbol := elna_alloc_variable(instruction^.operands[2].value, instruction^.operands[2].length, - variable_map); - instruction^.operator := ElnaRtlOperator.addi; + pseudo_symbol := elna_symbol_table_lookup(variable_map, instruction^.operands[2].value, instruction^.operands[2].length); - elna_rtl_instruction_set_operand(instruction, 2, ElnaRtlKind.register, ElnaRtlRegister.sp, 0, 0); - elna_rtl_instruction_set_operand(instruction, 3, ElnaRtlKind.immediate, pseudo_symbol^.counter, 0, 0) + if pseudo_symbol^.kind = ElnaRtlInfoKind.object_info then + pseudo_symbol := elna_alloc_variable(instruction^.operands[2].value, instruction^.operands[2].length, + variable_map); + instruction^.operator := ElnaRtlOperator.addi; + + elna_rtl_instruction_set_operand(instruction, 2, ElnaRtlKind.register, ElnaRtlRegister.sp, 0, 0); + elna_rtl_instruction_set_operand(instruction, 3, ElnaRtlKind.immediate, pseudo_symbol^.counter, 0, 0) + end end; if instruction^.operands[1].kind = ElnaRtlKind.pseudo then elna_alloc_operation_target(instructions, instruction, variable_map)