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 - [email protected]
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal