[Lazarus] Weird object variables access [SOLVED] - Delphi mode bug!

Giuliano Colla giuliano.colla at fastwebnet.it
Wed Oct 25 13:05:57 CEST 2017

Il 24/10/2017 23:18, Michael Van Canneyt via Lazarus ha scritto:
> It simply works by accident in Delphi, because you are calling a 
> method of the same object as the caller. Try calling a method of 
> another object, and displaying the classname and make sure you trash 
> the registers between the assignment
> of the method pointer and actually calling it. 

I'm forced to admit that you're (almost) right.

Changing the initial assignment of myMethod from a valid procedural type 
to Nil, makes theĀ  program crash in Kylix.

I found it hard to swallow that Delphi of the good old times allowed 
such an unsafe assignment without even a warning, and I had assumed that 
they were using some compiler magic to work around the issue, but 
apparently this is the sad truth.

However some issues remain, about fpc Delphi mode:

With older Delphi's up to, I believe, Delphi 7 you have that:

1) the syntax for the assignment of a procedural type is @ProcIdentifier 
:= whatever;

2) If whatever is a pointer, and ProcIdentifier is a Method, the data 
field is left untouched

This made it possible, with some dirty tricks to build a proper method 
procedural type.

In recent Delphi's (someone tested with X7, I did with X10)

1) The syntax @ProcIdentifier := whatever is no more valid. It's no more 
possible to assign a pointer to a method type without typecasting.

2) Assigning (with typecasting) a pointer to a method type will set the 
data field to Nil.

This makes it impossible to use dirty tricks.

Currently fpc in Delphi mode accepts the old syntax, but sets the data 
field to Nil, thus creating a misleading inconsistency.


More information about the Lazarus mailing list