[fpc-pascal] Records as properties and Delphi compiler error

fpclist at silvermono.co.za fpclist at silvermono.co.za
Mon Jun 8 19:02:00 CEST 2009


On Sunday 07 June 2009 22:19:47 Jonas Maebe wrote:
> On 07 Jun 2009, at 10:35, fpclist at silvermono.co.za wrote:
> > A high level, a class is like a record that has been modified to
> > include
> > functions and procedures. I know that I'm over simplifying thing
> > here, please
> > bare with me.
>
> The difference you skip over is the fundamental reason why one works
> and the other doesn't: a class is a pointer, while a record is a value.

I understand the difference, but a pointer to a record still suffers the from 
the same problem as a pointer to a class i.e. if memory is not allocated then 
the code fails at runtime. It's interesting to note though, that Delphi allows 
the assignment to the fields of a record type property via the with - do 
construct. Is this also the case with FPC 2.3.1?

>
> > I'm trying to understand the logic employed by the creators of
> > Delphi where
> > they don't allow to write to the fields of a record type property,
> > but if the
> > property points to a class type, then anything goes.
>
> In case of a class, the property returns a pointer (namely the pointer
> to the class instance data), and then you (implicitly) dereference the
> pointer and write data where it points to. In case of a record, the
> property returns a record's value, and then (semantically) you change
> the value of this returned record (not the value of the element of the
> record that the property referred to).
>
> This worked in previous FPC versions because rather than treating the
> result of the property like a function result (which it has to,
> because that's the semantical meaning of a property, so you can
> transparently change them into getters/setters without breaking any
> code), it treated it like a direct field access in case no getter/
> setter existed. So rather than returning a record's value, the
> property returned "a reference to a record".
>
> > In the example bellow,
> > where a property is of a class type, both Delphi and FPC compile the
> > code,
> > but there is no guarantee that the object referenced to by the
> > property has
> > been instantiated before the property is used (The programmer must
> > instantiate the TTestProp class within TTestClass prior to any call
> > made to xx
> > the property). IMO, it would be a nice feature if the compiler could
> > be
> > modified to issue a warning in such a case.Again, I'm over
> > simplifying, to
> > the compiler, it would be similar to checking for a variable
> > declaration
> > before the variable is used.
>
> Except that it's about dynamically allocated memory and depends on
> interprocedural control flow graph analysis, which makes it immensely
> more complex.
>
> > I thing that the "error" in the way that FPC allows record
> > properties to
> > access the record fields could be handy if retained. Perhaps this
> > feature
> > could be reserved for objfpc mode. What are your thoughts on the
> > matter?
>
> Things will remain the way they are for the reasons explained above.
>
>
> Jonas
> _______________________________________________
> fpc-pascal maillist  -  fpc-pascal at lists.freepascal.org
> http://lists.freepascal.org/mailman/listinfo/fpc-pascal




More information about the fpc-pascal mailing list