Wenn man Assembler kann, dann sieht man in der automatisch aufgerufenen Routine FinalizeRecord sehr deutlich den Aufbau. Hier meine Umsetzung:
Delphi-Quellcode:
type
TFinalField = packed record
Typ: PPTypeInfo; //Beachte den Zeiger auf den Zeiger!
Offset: integer;
end;
TRecordTypeData = packed record
RecSize: integer;
FinalFieldCount: integer;
FinalFields: array[0..MaxWord div sizeof(TFinalField)-1] of TFinalField;
//Eigentlich:
//FinalFields: array[0..FinalFieldCount-1] of TFinalField;
end;
procedure dumpRecTypeData(p: PTypeData);
var i: integer;
begin
writeln('Size: ', PInteger(p)^);
writeln('Number of fields to finalize: ', PInteger(Integer(p)+4)^);
for i:=1 to PInteger(Integer(p)+4)^ do
begin
writeln;
writeln('Offset: ', PInteger(integer(p)+12)^);
writeln('PTypeInfo: ', inttohex(PInteger(PPointer(integer(p)+8))^, 8));
inc(integer(p), 8);
end;
end;
Es werden also wirklich nur die Felder gespeichert, die finalisiert werden müssen.