[fpc-devel] RTTI module and "IsManaged" critical problem
Sven Barth
pascaldragon at googlemail.com
Tue Dec 13 11:09:38 CET 2016
Am 13.12.2016 09:22 schrieb "Maciej Izak" <hnb.code at gmail.com>:
>
>
> 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.
>
Comment regarding your previous mail: right, I forgot that due to
InitializeArray() and FinalizeArray() being publicly available version of
the internal helpers we either need to keep INIT and FULL RTTI in sync or a
way to differentiate them... That's why you added the Terminator field I
guess?
> 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 :)
Okay, I think we can indeed go with this aside from one small remark: the
double indirection for Pointers is only needed if data resides in different
units as those might be in different dynamic packages. Since the INIT and
FULL RTTI of a record are always in the same unit a single indirection is
sufficient (thus PRecInitTable instead of PPRecInitTable).
Other than that I think we've found a good compromise for our wishes and
hopes for this :)
Regards,
Sven
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20161213/c7f4340b/attachment.html>
More information about the fpc-devel
mailing list