[fpc-devel] Initialising method pointers with class methods

Sven Barth pascaldragon at googlemail.com
Thu May 26 21:55:24 CEST 2022


Am 24.12.2021 um 02:27 schrieb Blaise--- via fpc-devel:
> DCC allows the subj (provided that the class type is known at compile 
> time), FPC does not.
>
> The attached init_methptr_with_classmeth.patch implements this feature.
>
> -------8<-------
> type C = class
>     class procedure Foo;
> end;
> class procedure C.Foo; begin end;
> type CC = class of C;
> type H = class helper for C end;
> type T = procedure of object;
>
> //var aC: C = nil;
> //var aCC: CC = nil;
> // Still rejected:
> //var ViaInstance: T = aC.Foo;
> //var ViaClassRef: T = aCC.Foo;
>
> const ViaClass: T = C.Foo;
> // NB: This needs metaclass_meth_to_procvar-2.patch
> //    from 
> https://lists.freepascal.org/pipermail/fpc-devel/2021-December/044249.html
> //    Otherwise: AV in FPC
> var ViaMetaclass: T = CC.Foo;
> // TODO: Currently, ICE 2021122302 -- needs to be fixed elsewhere.
> //    See 
> https://lists.freepascal.org/pipermail/fpc-devel/2021-December/044251.html
> //var ViaHelper: T = H.Foo;
>
> procedure Report(const s: string; const X: T);
> var Status: Boolean;
> begin
>     Status := (TMethod(X).Code = @C.Foo) and (TMethod(X).Data = 
> Pointer(C));
>     writeln(s, ': ', Status)
> end;
>
> begin
>     Report('via class', ViaClass);
>     Report('via metaclass', ViaMetaclass)
> end.
> -------8<-------
>
> Proposed new error message for parser_e_no_procvarobj_const:
> Cannot initialize a method pointer: Self pointer is not known at 
> compile time
>     In order to initialize a method pointer with a method, the value 
> of the Self pointer for calling that method at run time must be known 
> at compile time. Thus, a method pointer can be initialized either with 
> NIL, or with a class method that is accessed via a class type or a 
> class reference type.

Accepted.

Regards,
Sven


More information about the fpc-devel mailing list