[fpc-devel] Proof of Concept ARC implementation

Martin Frb lazarus at mfriebe.de
Wed Oct 29 14:44:02 CET 2014


On 29/10/2014 13:03, Sven Barth wrote:
> On 28.10.2014 09:57, Hans-Peter Diettrich wrote:
>> Sven Barth schrieb:
>>> Take unit Typinfo for example where quite some methods take a TObject
>>> instance.
>>
>> The TypInfo methods can determine the exact type of their arguments, and
>> act inside accordingly.
>
> If you have a method X that takes a TObject parameter how do you plan 
> to pass it a reference counted object when these and TObject are not 
> compatible *at compiletime*?

It would be possible, if you had a special type
TAnyObject (can be ref or none ref-counted)
or a modifier "TObject ref_compatible"

TObject  (not refcounted by default)
TRefObject = class(TObject); refcounted;

The compiler only needs refcounted code, for TRefObject  and TAnyObject 
, but not for TObject

TObject would need virtual methods for Inc- and DerRefcount (but this is 
memory only once per class, not per object).
For TObject they do nothing, for TRefObject  they do what the name says.

TObject only needs them if it is passed to  TAnyObject, otherwise the 
compiler does not generate calls to it.

In order for TAnyObject  to work, TObject and TRefObject  need the same 
memory layout. But the memory for refcount can be allocated in front of 
the object (as it is done for strings too). Then TRefObjects hidden 
pointer, points to the same fields as TObject.
Memory (de-)allocation is done in CreateInstance/FreeInstance, which are 
both virtual, and can account for the "refcount memory header"

In this case, the only overhead for none refcounted classes, are 2 
entries in the VMT of each class.

If the Inc- and DerRefcount are not overidden by usercode, then WPO (or 
class final ?) can optimize the code, and de-virtualize them for all but 
TAnyObject.

Just my 2 cents.




More information about the fpc-devel mailing list