This caused me a nasty debugging confusion, it’s a bug right? In the program 
below the two parameters passed to TBinding.Create have the same address 
despite being function pointers to two different class methods. Calling them 
both call the same method which is clearly not correct.

Free Pascal Compiler version 3.3.1 [2022/09/28] for aarch64

========================

{$mode objfpc}
{$modeswitch functionreferences}
{$modeswitch advancedrecords}

program test;

type
  generic TBinding<T> = record
    private type
      TGetter = reference to function: T;
      TSetter = reference to procedure(newValue: T);
    private
      getter: TGetter;
      setter: TSetter;
    public
      constructor Create(_getter: TGetter; _setter: TSetter);
  end;

constructor TBinding.Create(_getter: TGetter; _setter: TSetter);
begin
  getter := _getter;
  setter := _setter;

  // Same address for both!
  writeln(HexStr(getter));
  writeln(HexStr(setter));
end;

type
  TMyClass = class
    procedure SetSelection(newValue: Integer); 
    function GetSelection: Integer;
    procedure AfterConstruction; override;
  end;

function TMyClass.GetSelection: Integer;
begin
end;

procedure TMyClass.SetSelection(newValue: Integer); 
begin
end;

procedure TMyClass.AfterConstruction;
begin
  specialize TBinding<Integer>.Create(@GetSelection, @SetSelection);
end;

begin
  TMyClass.Create;
end.

Regards,
        Ryan Joseph

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to