From cb6d970fdfcbf0337aec4fa68ac1462ef11902c7 Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Sat, 14 Mar 2026 08:20:53 +0100 Subject: [PATCH] Rewrite elna_parser_record_type_expression without manual pointer arithmetic --- boot/stage20/cl.elna | 68 +++++++++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 29 deletions(-) diff --git a/boot/stage20/cl.elna b/boot/stage20/cl.elna index 267da48..bd05299 100644 --- a/boot/stage20/cl.elna +++ b/boot/stage20/cl.elna @@ -36,11 +36,13 @@ type ElnaTypeKind = (primitive, enumeration, _record, pointer, array); ElnaType = record kind: ElnaTypeKind; - size: Word + size: Word; + alignment: Word end; ElnaTypeEnumeration = record kind: ElnaTypeKind; size: Word; + alignment: Word; members: Word; length: Word end; @@ -52,17 +54,20 @@ type ElnaTypeRecord = record kind: ElnaTypeKind; size: Word; + alignment: Word; members: Word; length: Word end; ElnaTypePointer = record kind: ElnaTypeKind; size: Word; + alignment: Word; base: Word end; ElnaTypeArray = record kind: ElnaTypeKind; size: Word; + alignment: Word; base: Word; length: Word end; @@ -210,9 +215,15 @@ type members: Word; length: Word end; + ElnaTreeField = record + name: Word; + length: Word; + type_expression: ^ElnaTreeNode; + next: Word + end; ElnaTreeRecordTypeExpression = record kind: ElnaTreeKind; - members: Word; + members: ^ElnaTreeField; length: Word end; ElnaTreeNamedTypeExpression = record @@ -3008,45 +3019,38 @@ end; proc elna_parser_record_type_expression(cursor: ^ElnaLexerCursor); var - entry: Word; - member_count: Word; - memory_start: Word; - field_type: Word; - result: ^ElnaTreeEnumerationTypeExpression; - previous_entry: Word; + entry: ^ElnaTreeField; + result: ^ElnaTreeRecordTypeExpression; + previous_entry: ^ElnaTreeField; token: ^ElnaLexerToken; begin elna_lexer_read(cursor); - member_count := 0; - memory_start := 0; + result := malloc(#size(ElnaTreeRecordTypeExpression)); + + result^.members := nil; + result^.length := 0; token := elna_lexer_read(cursor); if token^.kind = ElnaLexerKind._end then goto elna_parser_record_type_expression_end end; .elna_parser_record_type_expression_loop; - entry := malloc(16); - member_count := member_count + 1; + entry := malloc(#size(ElnaTreeField)); + result^.length := result^.length + 1; - entry^ := token^.start; - entry := entry + 4; - - entry^ := token^.length; - entry := entry + 4; + entry^.name := token^.start; + entry^.length := token^.length; (* Skip the colon. *) elna_lexer_read(cursor); - field_type := elna_parser_type_expression(cursor); + entry^.type_expression := elna_parser_type_expression(cursor); + entry^.next := nil; - entry^ := field_type; - entry := entry + 4; - - entry^ := 0; - if memory_start = 0 then - memory_start := entry - 12 + if result^.members = nil then + result^.members := entry else - previous_entry^ := entry - 12 + previous_entry^.next := entry end; previous_entry := entry; @@ -3057,11 +3061,7 @@ begin end; .elna_parser_record_type_expression_end; - result := malloc(#size(ElnaTreeEnumerationTypeExpression)); - result^.kind := ElnaTreeKind.record_type_expression; - result^.members := memory_start; - result^.length := member_count; return result end; @@ -3159,6 +3159,7 @@ begin result^.kind := ElnaTypeKind.enumeration; result^.size := 4; + result^.alignment := 4; result^.members := member_array_start; result^.length := member_count; @@ -3173,6 +3174,7 @@ begin result^.kind := ElnaTypeKind.pointer; result^.size := 4; + result^.alignment := 4; result^.base := elna_name_type_expression(parser_node^.base); return result @@ -3193,6 +3195,7 @@ begin result^.kind := ElnaTypeKind.array; (* Array size in bytes. *) result^.size := base^.size * length^.value; + result^.alignment := base^.alignment; result^.base := base; result^.length := length^.value; @@ -3210,6 +3213,7 @@ var begin result := malloc(#size(ElnaTypeRecord)); result^.size := 0; + result^.alignment := 0; memory_start := parser_node^.members; member_count := parser_node^.length; @@ -3227,6 +3231,9 @@ begin field_type := elna_name_type_expression(memory_start^); result^.size := result^.size + field_type^.size; + if field_type^.alignment > result^.alignment then + result^.alignment := field_type^.alignment + end; member_array_current^.field_type := field_type; member_array_current := member_array_current + #size(ElnaTypeField); @@ -4539,18 +4546,21 @@ begin word_type := malloc(#size(ElnaType)); word_type^.kind := ElnaTypeKind.primitive; word_type^.size := 4; + word_type^.alignment := 4; current_info := _type_info_create(word_type); elna_symbol_table_enter(@symbol_table_global, "Word", 4, current_info); current_type := malloc(#size(ElnaType)); current_type^.kind := ElnaTypeKind.primitive; current_type^.size := 4; + current_type^.alignment := 4; current_info := _type_info_create(current_type); elna_symbol_table_enter(@symbol_table_global, "Pointer", 7, current_info); current_type := malloc(#size(ElnaType)); current_type^.kind := ElnaTypeKind.primitive; current_type^.size := 1; + current_type^.alignment := 1; current_info := _type_info_create(current_type); elna_symbol_table_enter(@symbol_table_global, "Bool", 4, current_info); end;