management operators

From Lazarus wiki
Revision as of 12:55, 1 January 2018 by Thaddy (talk | contribs) (→‎management operators)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search

Management Operators

From Free Pascal version 3.1.1 there is a new language feature called management operators for advanced records. The new operators are: Initialize, Finalize, AddRef and Copy. The new operators are a unique feature and are called "management operators". That is because:

  • each of record (even non managed or even empty) with management operator becomes a managed type.
  • It is now possible to implement new custom types with their own memory management, e.g: new string types, fast TValue implementations without hacks on RTL etc.
  • Management operators have no result type as opposed to normal operators.
  • A simple virtual method table is generated for the management oprators. Thanks to this is possible to work with management operators together with all RTL functions like InitializeArray and FinalizeArray.

Initialize

The initialize operator is called after memory allocation for a record and called after the internal compiler call to recordrtti(data,typeinfo,@int_initialize); It allows automatic initialization for a record. A simple example is:

{$if FPC_FULLVERSION < 30101}{$ERROR this demo needs version 3.1.1}{$endif}
{$mode delphi}{$macro on}
program TestInitialize;

type
    PRec = ^TRec;
    TRec = record
      I : Integer;
      class operator initialize(var aRec:TRec);
    end;

    class operator TRec.initialize(var aRec:TRec);
    begin
      aRec :=Default(TRec);
    end;

    procedure printTRec(r : PRec);
    begin
        WriteLn('Initialized TRec field i: ', r^.I = 0);
    end; 
var
 a,b:PRec; 
begin
    New(a);New(b);
    PrintTRec(a);
    PrintTRec(b);
    Dispose(a);Dispose(b);
end.

Finalize

Finalize is called when a record goes out of scope and called before the internal call to recordrtti(data,typeinfo,@int_finalize);
It is useful for automatic custom finalization code. A simple example looks like:
{$if FPC_FULLVERSION < 30101}{$ERROR this demo needs version 3.1.1}{$endif}
{$mode delphi}{$macro on}
program testfinalize;

type
    PRec = ^TRec;
    TRec = record
      I : Integer;
      class operator finalize(var aRec:TRec);
    end;

    class operator TRec.finalize(var aRec:TRec);
    begin
      writeln('Just to let you know: I am finalizing..');
    end;
var
 a,b:PRec; 
begin
    New(a);New(b);
    Dispose(a);Dispose(b);
end.

AddRef

AddRef is called after the contents of a record has been duplicated by copying the contents byte by byte and is called *after* FPC internal call recordrtti(data,typeinfo,@int_addref); By itself it does not any lifetime management, but you can use it to implement it. See also Copy

Copy