Rewrite elna_parser_record_type_expression without manual pointer arithmetic

This commit is contained in:
2026-03-14 08:20:53 +01:00
parent f8ff357045
commit cb6d970fdf

View File

@@ -36,11 +36,13 @@ type
ElnaTypeKind = (primitive, enumeration, _record, pointer, array); ElnaTypeKind = (primitive, enumeration, _record, pointer, array);
ElnaType = record ElnaType = record
kind: ElnaTypeKind; kind: ElnaTypeKind;
size: Word size: Word;
alignment: Word
end; end;
ElnaTypeEnumeration = record ElnaTypeEnumeration = record
kind: ElnaTypeKind; kind: ElnaTypeKind;
size: Word; size: Word;
alignment: Word;
members: Word; members: Word;
length: Word length: Word
end; end;
@@ -52,17 +54,20 @@ type
ElnaTypeRecord = record ElnaTypeRecord = record
kind: ElnaTypeKind; kind: ElnaTypeKind;
size: Word; size: Word;
alignment: Word;
members: Word; members: Word;
length: Word length: Word
end; end;
ElnaTypePointer = record ElnaTypePointer = record
kind: ElnaTypeKind; kind: ElnaTypeKind;
size: Word; size: Word;
alignment: Word;
base: Word base: Word
end; end;
ElnaTypeArray = record ElnaTypeArray = record
kind: ElnaTypeKind; kind: ElnaTypeKind;
size: Word; size: Word;
alignment: Word;
base: Word; base: Word;
length: Word length: Word
end; end;
@@ -210,9 +215,15 @@ type
members: Word; members: Word;
length: Word length: Word
end; end;
ElnaTreeField = record
name: Word;
length: Word;
type_expression: ^ElnaTreeNode;
next: Word
end;
ElnaTreeRecordTypeExpression = record ElnaTreeRecordTypeExpression = record
kind: ElnaTreeKind; kind: ElnaTreeKind;
members: Word; members: ^ElnaTreeField;
length: Word length: Word
end; end;
ElnaTreeNamedTypeExpression = record ElnaTreeNamedTypeExpression = record
@@ -3008,45 +3019,38 @@ end;
proc elna_parser_record_type_expression(cursor: ^ElnaLexerCursor); proc elna_parser_record_type_expression(cursor: ^ElnaLexerCursor);
var var
entry: Word; entry: ^ElnaTreeField;
member_count: Word; result: ^ElnaTreeRecordTypeExpression;
memory_start: Word; previous_entry: ^ElnaTreeField;
field_type: Word;
result: ^ElnaTreeEnumerationTypeExpression;
previous_entry: Word;
token: ^ElnaLexerToken; token: ^ElnaLexerToken;
begin begin
elna_lexer_read(cursor); elna_lexer_read(cursor);
member_count := 0; result := malloc(#size(ElnaTreeRecordTypeExpression));
memory_start := 0;
result^.members := nil;
result^.length := 0;
token := elna_lexer_read(cursor); token := elna_lexer_read(cursor);
if token^.kind = ElnaLexerKind._end then if token^.kind = ElnaLexerKind._end then
goto elna_parser_record_type_expression_end goto elna_parser_record_type_expression_end
end; end;
.elna_parser_record_type_expression_loop; .elna_parser_record_type_expression_loop;
entry := malloc(16); entry := malloc(#size(ElnaTreeField));
member_count := member_count + 1; result^.length := result^.length + 1;
entry^ := token^.start; entry^.name := token^.start;
entry := entry + 4; entry^.length := token^.length;
entry^ := token^.length;
entry := entry + 4;
(* Skip the colon. *) (* Skip the colon. *)
elna_lexer_read(cursor); 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; if result^.members = nil then
entry := entry + 4; result^.members := entry
entry^ := 0;
if memory_start = 0 then
memory_start := entry - 12
else else
previous_entry^ := entry - 12 previous_entry^.next := entry
end; end;
previous_entry := entry; previous_entry := entry;
@@ -3057,11 +3061,7 @@ begin
end; end;
.elna_parser_record_type_expression_end; .elna_parser_record_type_expression_end;
result := malloc(#size(ElnaTreeEnumerationTypeExpression));
result^.kind := ElnaTreeKind.record_type_expression; result^.kind := ElnaTreeKind.record_type_expression;
result^.members := memory_start;
result^.length := member_count;
return result return result
end; end;
@@ -3159,6 +3159,7 @@ begin
result^.kind := ElnaTypeKind.enumeration; result^.kind := ElnaTypeKind.enumeration;
result^.size := 4; result^.size := 4;
result^.alignment := 4;
result^.members := member_array_start; result^.members := member_array_start;
result^.length := member_count; result^.length := member_count;
@@ -3173,6 +3174,7 @@ begin
result^.kind := ElnaTypeKind.pointer; result^.kind := ElnaTypeKind.pointer;
result^.size := 4; result^.size := 4;
result^.alignment := 4;
result^.base := elna_name_type_expression(parser_node^.base); result^.base := elna_name_type_expression(parser_node^.base);
return result return result
@@ -3193,6 +3195,7 @@ begin
result^.kind := ElnaTypeKind.array; result^.kind := ElnaTypeKind.array;
(* Array size in bytes. *) (* Array size in bytes. *)
result^.size := base^.size * length^.value; result^.size := base^.size * length^.value;
result^.alignment := base^.alignment;
result^.base := base; result^.base := base;
result^.length := length^.value; result^.length := length^.value;
@@ -3210,6 +3213,7 @@ var
begin begin
result := malloc(#size(ElnaTypeRecord)); result := malloc(#size(ElnaTypeRecord));
result^.size := 0; result^.size := 0;
result^.alignment := 0;
memory_start := parser_node^.members; memory_start := parser_node^.members;
member_count := parser_node^.length; member_count := parser_node^.length;
@@ -3227,6 +3231,9 @@ begin
field_type := elna_name_type_expression(memory_start^); field_type := elna_name_type_expression(memory_start^);
result^.size := result^.size + field_type^.size; 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^.field_type := field_type;
member_array_current := member_array_current + #size(ElnaTypeField); member_array_current := member_array_current + #size(ElnaTypeField);
@@ -4539,18 +4546,21 @@ begin
word_type := malloc(#size(ElnaType)); word_type := malloc(#size(ElnaType));
word_type^.kind := ElnaTypeKind.primitive; word_type^.kind := ElnaTypeKind.primitive;
word_type^.size := 4; word_type^.size := 4;
word_type^.alignment := 4;
current_info := _type_info_create(word_type); current_info := _type_info_create(word_type);
elna_symbol_table_enter(@symbol_table_global, "Word", 4, current_info); elna_symbol_table_enter(@symbol_table_global, "Word", 4, current_info);
current_type := malloc(#size(ElnaType)); current_type := malloc(#size(ElnaType));
current_type^.kind := ElnaTypeKind.primitive; current_type^.kind := ElnaTypeKind.primitive;
current_type^.size := 4; current_type^.size := 4;
current_type^.alignment := 4;
current_info := _type_info_create(current_type); current_info := _type_info_create(current_type);
elna_symbol_table_enter(@symbol_table_global, "Pointer", 7, current_info); elna_symbol_table_enter(@symbol_table_global, "Pointer", 7, current_info);
current_type := malloc(#size(ElnaType)); current_type := malloc(#size(ElnaType));
current_type^.kind := ElnaTypeKind.primitive; current_type^.kind := ElnaTypeKind.primitive;
current_type^.size := 1; current_type^.size := 1;
current_type^.alignment := 1;
current_info := _type_info_create(current_type); current_info := _type_info_create(current_type);
elna_symbol_table_enter(@symbol_table_global, "Bool", 4, current_info); elna_symbol_table_enter(@symbol_table_global, "Bool", 4, current_info);
end; end;