On Sun, 29 May 2022, Hairy Pixels via fpc-pascal wrote:

I’ve been testing out all the different function pointer types in FPC to
test their compatibility with each other and I noticed that “is nested”
can accept a global function declaration but “of object” can not.  What is
the reason for this exactly?  I wouldn’t expect nested function types to
accept global functions but since they do I wonder why “of object” is
different.

Because you're pushing a parameter which does not exist in the case of a
global function.


I think they both have a hidden first parameter (like self) and nested
types simply ignore this for global functions so I would think objects
types could do the same.

I cannot comment on the 'is nested', I don't know what the extra field is
for. I assume a parent stack frame pointer, which can perfectly be nil,
presumably.

A method pointer is actually 2 fields, both pointers: the data (self) and the address (location of method).

Because you cannot distinguish between 'self = nil' and 'there is no self'
when actually calling the method, it's not possible to assign a global method: you would be pushing a 'self' parameter to a procedure that is not expecting a
'self' parameter, wreaking havoc on the stack.

Theoretically one could add a third field, or maybe encode a special
value to distinguish between the two, but then you would need to add some logic at every call of an 'of object' method to determine what is needed. That would slow things down, and would be not be Delphi compatible. There is plenty of code out there that assumes the current mechanism to 'just work'

Similarly, you could let all global methods accept a 'self' pointer which is
simply Nil, but same argument applies: it slows things down (extra parameter to
handle) and is not TP nor Delphi compatible.

When starting from zero, one could probably make all 3 methods (plain
procedure, 'of object' and 'is nested' compatible - maybe even 'reference to', but for historical reasons it is not possible.

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

Reply via email to