[fpc-pascal] Managed record types

Thomas Kurz fpc.2021 at t-net.ruhr
Mon Nov 4 21:59:47 CET 2024


Thank you. This was a very valuable and helpful comment.

Maybe we can add this information to the wiki?


----- Original Message ----- 
From: Sven Barth via fpc-pascal <fpc-pascal at lists.freepascal.org>
To: FPC-Pascal users discussions <fpc-pascal at lists.freepascal.org>
Sent: Sunday, November 3, 2024, 11:06:53
Subject: [fpc-pascal] Managed record types

Thomas Kurz via fpc-pascal <fpc-pascal at lists.freepascal.org> schrieb am
Sa., 2. Nov. 2024, 18:47:

> when I make a record type managed by adding an `Initialize` operator
> according to [1], can I rely on the record being initialized at the
> beginning of a function in which the record is the function result?

> Example:

> type TRec = record
>   // whatsoever
>   class operator Initialize(var aRec: TRec);
> end;

> function DoSomething: TRec;
> begin
>   // <---- can I assume that `Result` is initialized when the function is
> entered?
>   // more code
> end;

> [1] https://wiki.freepascal.org/management_operators


As with any managed type result the Result variable will be initialized
*outside* of the function and passed in as a var-parameter. Depending on
the code and due to how the compiler manages temporary variables involved
in this, this can lead to your code receiving a Result variable upon entry
that had been used by a previous call.

So to be on the safe side assign a Default(YourType) to it (needs current
FPC 3.3.1 to work correctly) or use a local variable of the same type and
overwrite the Result.

Regards,
Sven



More information about the fpc-pascal mailing list