[fpc-devel] Pascal Smart Pointers Idea + ARC implementation

Sven Barth pascaldragon at googlemail.com
Sat Oct 10 09:59:47 CEST 2015


Am 10.10.2015 02:41 schrieb "Maciej Izak" <hnb.code at gmail.com>:
> First step is almost done -> new record operators:
>
> === begin code ===
> {$MODESWITCH MANAGEMENTOPERATORS}
> type // Record with automatic constructor and destructor
>   TValue = record
>     class operator Initialize(var aRec: TValue);
>     class operator Finalize(var aRec: TValue);
>     class operator Copy(constref aSource: TValue; var aDest: TValue);
>   end;
> === end code ===
>
> MANAGEMENTOPERATORS are quite simple to implement. MANAGEMENTOPERATORS
were created initially for fast implementation of TValue in RTTI.pas, but
they inspired me for smart pointers.

This part I definitely like, because I wanted to implement them as well. ;)
You don't need to hide these behind a modeswitch however as long as they
are optional for a record as they don't conflict with existing operators.

> The second step is some concept of low level structures for smart
pointers (in this conception we have two kinds of smart pointers - smart
pointers for objects and smart pointers for pointers):

Would you please explain why you'd need this raw structure besides for
printing the RecCounts? (honest question, maybe I'm still too tired ;) )

>
> For smart pointers we need to implement in some way ".", standard
inplicit opertor, "^", "@" and "@@" operator. I thought about it for a long
time. IMO minimal invasive method is "default" keyword, used as below:

This is where we reach the dangerous territory ;)
The problem with "default" is how to differentiate from a normal field
usage of the record? Keep in mind that a feature might be used in different
contexts than one first imagined. So how to ensure that one can access
field X of the record and not field X of the default?
Also for classes: is Instance a ^T as well or merely a T?

> class operator TSmartPtr<T>.Copy(constref aSource: TSmartPtr<T>; var
aDest: TSmartPtr<T>);
> begin
>   if aDest.RefCount <> nil then
>     Finalize(aDest);
>   if aSource.RefCount <> nil then
>     InterLockedIncrement(aSource.RefCount^);
>   aDest.RefCount := aSource.RefCount;
>   aDest.Instance := aSource.Instance;
> end;

I suppose Finalize here calls TSmartPtr<>.Finalize and not System.Finalize?
We don't usually have directly callable operators, so keep that in mind.

> next step is syntax sugar (oxygene compatibility):

Only behind a modeswitch or maybe even a mode Oxygene please. And take care
with prefixes, they are a PITA to handle as I've already told you ;)

Regards,
Sven
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20151010/1e4c4054/attachment.html>


More information about the fpc-devel mailing list