|
@@ -2191,6 +2191,13 @@ TYPE
|
|
BreqL(trueL,left,right);
|
|
BreqL(trueL,left,right);
|
|
Emit(Mov(position,left,IntermediateCode.Memory(addressType,left,0)));
|
|
Emit(Mov(position,left,IntermediateCode.Memory(addressType,left,0)));
|
|
BrneL(repeatL,left,nil);
|
|
BrneL(repeatL,left,nil);
|
|
|
|
+ ELSIF meta.simple THEN
|
|
|
|
+ level := type(SyntaxTree.RecordType).Level();
|
|
|
|
+ (* get type desc tag of level relative to base tag *)
|
|
|
|
+ offset := (meta.BaseTypesTableOffset - level) * addressType.sizeInBits;
|
|
|
|
+ IntermediateCode.AddOffset(left,ToMemoryUnits(system,offset));
|
|
|
|
+ IntermediateCode.MakeMemory(left,addressType);
|
|
|
|
+ BreqL(trueL,left,right);
|
|
ELSE
|
|
ELSE
|
|
level := type(SyntaxTree.RecordType).Level();
|
|
level := type(SyntaxTree.RecordType).Level();
|
|
(* get type desc tag of level relative to base tag *)
|
|
(* get type desc tag of level relative to base tag *)
|
|
@@ -5610,7 +5617,7 @@ TYPE
|
|
ELSE
|
|
ELSE
|
|
source := NewSection(module.importedSections, Sections.ConstSection,name,td,commentPrintout # NIL);
|
|
source := NewSection(module.importedSections, Sections.ConstSection,name,td,commentPrintout # NIL);
|
|
END;
|
|
END;
|
|
- IF backend.cooperative THEN
|
|
|
|
|
|
+ IF backend.cooperative OR meta.simple THEN
|
|
offset := 0;
|
|
offset := 0;
|
|
ELSE
|
|
ELSE
|
|
IF x IS SyntaxTree.CellType THEN
|
|
IF x IS SyntaxTree.CellType THEN
|
|
@@ -10533,15 +10540,15 @@ TYPE
|
|
PROCEDURE &InitMetaDataGenerator(implementationVisitor: ImplementationVisitor; declarationVisitor: DeclarationVisitor; simple: BOOLEAN);
|
|
PROCEDURE &InitMetaDataGenerator(implementationVisitor: ImplementationVisitor; declarationVisitor: DeclarationVisitor; simple: BOOLEAN);
|
|
BEGIN
|
|
BEGIN
|
|
IF implementationVisitor.backend.cooperative THEN
|
|
IF implementationVisitor.backend.cooperative THEN
|
|
- TypeTags := MAX(LONGINT); (* only 3 extensions allowed *)
|
|
|
|
|
|
+ TypeTags := MAX(LONGINT);
|
|
BaseTypesTableOffset := 0;
|
|
BaseTypesTableOffset := 0;
|
|
MethodTableOffset := 2;
|
|
MethodTableOffset := 2;
|
|
TypeRecordBaseOffset := 0;
|
|
TypeRecordBaseOffset := 0;
|
|
ELSIF simple THEN
|
|
ELSIF simple THEN
|
|
TypeTags := 3; (* only 3 extensions allowed *)
|
|
TypeTags := 3; (* only 3 extensions allowed *)
|
|
- BaseTypesTableOffset := -1;
|
|
|
|
- MethodTableOffset := -TypeTags+BaseTypesTableOffset;
|
|
|
|
- TypeRecordBaseOffset := TypeTags;
|
|
|
|
|
|
+ BaseTypesTableOffset := 3;
|
|
|
|
+ MethodTableOffset := BaseTypesTableOffset+1;
|
|
|
|
+ TypeRecordBaseOffset := 0;
|
|
ELSE
|
|
ELSE
|
|
TypeTags := 16;
|
|
TypeTags := 16;
|
|
BaseTypesTableOffset := -2; (* typeInfo and size field *)
|
|
BaseTypesTableOffset := -2; (* typeInfo and size field *)
|
|
@@ -10562,7 +10569,7 @@ TYPE
|
|
|
|
|
|
PROCEDURE GetTypeRecordBaseOffset(numberMethods: LONGINT): LONGINT;
|
|
PROCEDURE GetTypeRecordBaseOffset(numberMethods: LONGINT): LONGINT;
|
|
BEGIN
|
|
BEGIN
|
|
- IF implementationVisitor.backend.cooperative THEN RETURN 0 ELSE RETURN TypeRecordBaseOffset + numberMethods END;
|
|
|
|
|
|
+ IF implementationVisitor.backend.cooperative OR simple THEN RETURN 0 ELSE RETURN TypeRecordBaseOffset + numberMethods END;
|
|
END GetTypeRecordBaseOffset;
|
|
END GetTypeRecordBaseOffset;
|
|
|
|
|
|
PROCEDURE HeapBlock(CONST moduleName, typeName: ARRAY OF CHAR; section: IntermediateCode.Section; dataAdrOffset: LONGINT);
|
|
PROCEDURE HeapBlock(CONST moduleName, typeName: ARRAY OF CHAR; section: IntermediateCode.Section; dataAdrOffset: LONGINT);
|
|
@@ -12286,16 +12293,16 @@ TYPE
|
|
ELSE
|
|
ELSE
|
|
(*
|
|
(*
|
|
simple:
|
|
simple:
|
|
- methods
|
|
|
|
- tag(2)
|
|
|
|
|
|
+ td adr --> size
|
|
tag(1)
|
|
tag(1)
|
|
- td adr ---> tag(0)
|
|
|
|
- td adr ---> size
|
|
|
|
|
|
+ tag(2)
|
|
|
|
+ tag(3)
|
|
|
|
+ methods ->
|
|
*)
|
|
*)
|
|
- MethodTable;
|
|
|
|
- TdTable(TypeTags);
|
|
|
|
Info(source, "record size");
|
|
Info(source, "record size");
|
|
Address(source, ToMemoryUnits(module.system,module.system.SizeOf(recordType)));
|
|
Address(source, ToMemoryUnits(module.system,module.system.SizeOf(recordType)));
|
|
|
|
+ TdTable(TypeTags);
|
|
|
|
+ MethodTable;
|
|
source.SetReferenced(FALSE);
|
|
source.SetReferenced(FALSE);
|
|
END;
|
|
END;
|
|
END NewTypeDescriptor;
|
|
END NewTypeDescriptor;
|