summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--boot/stage20/cl.elna68
1 files 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^ := token^.start;
- entry := entry + 4;
+ entry := malloc(#size(ElnaTreeField));
+ result^.length := result^.length + 1;
- 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^ := field_type;
- entry := entry + 4;
+ entry^.type_expression := elna_parser_type_expression(cursor);
+ entry^.next := nil;
- 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;