Rewrite elna_parser_record_type_expression without manual pointer arithmetic
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user