[fpc-devel] RTTI module and "IsManaged" critical problem
Maciej Izak
hnb.code at gmail.com
Tue Dec 13 09:22:06 CET 2016
2016-12-12 23:14 GMT+01:00 Maciej Izak <hnb.code at gmail.com>:
> With second iteration we could add your modifications, I have no other
> objections.
New day new ideas :)
With my patch we don't really need ManagedFieldCount, ManagedFields,
ManagedFieldTable in TTypeData (each of Managed* can still be added later).
It means also much better memory usage and it solves RTL problems (which
was mentioned in my previous message). All what we need is:
=== code begin ===
type
TInitManagedField = record
TypeRefRef: TypeInfoPtr;
FldOffset: SizeInt;
end;
PPRecInitTable = ^PRecInitTable;
PRecInitTable = TRecInitTable;
TRecInitTable = packed record
Size: Longint;
Terminator: Pointer;
ManagedFieldCount: Longint;
{ ManagedFields: array[0..ManagedFieldCount - 1] of TInitManagedField
; }
end;
TRecordField = record
Visibility: TVisibility;
TypeRef: TypeInfoPtr;
FldOffset: SizeInt;
Name: PShortString; { can be NULL if no ext RTTI }
end;
TManagedField = TRecordField deprecated;
TTypeData = record
// ...
tkRecord: (
RecSize: Integer;
RecInitTable: PPRecInitTable;
case Boolean of
True: (ManagedFldCount: Integer deprecated 'Use
RecInitTable^^.ManagedFieldCount
or TotalFieldCount depending on your use case')
False: (TotalFieldCount: Integer)
{ Fields: array[1..TotalFieldCount] of TRecordField }
{ Names: array[1..TotalFieldCount] of {packed} ShortString }
);
end;
=== code end ===
I have hope that this is final solution :)
--
Best regards,
Maciej Izak
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20161213/d288b946/attachment.html>
More information about the fpc-devel
mailing list