summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2026-04-29 22:57:01 +0200
committerEugen Wissner <belka@caraus.de>2026-04-29 22:57:01 +0200
commit14d130f2854a119de69475e6f48f51ed6659953a (patch)
tree9b9232187bc375c82d74772bb00aa3b7e8ffa1bd
parent2342dd8429e4e6243c820c187664113557edd336 (diff)
downloadelna-14d130f2854a119de69475e6f48f51ed6659953a.tar.gz
Allow assigning variables refering to aggregates
-rw-r--r--Rakefile7
-rw-r--r--boot/stage21/cl.elna18
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)