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);
|
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;
|
||||||
|
|||||||
Reference in New Issue
Block a user