[fpc-devel] Circular references and forward declarations
Juha Manninen
juha.manninen at phnet.fi
Tue Jan 5 20:49:56 CET 2010
On tiistai, 5. tammikuuta 2010 20:20:16 Jonas Maebe wrote:
> It would have at least two consequences (there are undoubtedly more that
> I'm not thinking of currently): a) all forward-declared types from the
> interface would have to be resolved after the uses-clause in the
> implementation has been parsed (because only at that point all classes
> would be known) b) this would cause the interface crc of those units to
> change (since the types change once they are resolved), which means that
> every unit containing such a construct (and every unit depending on them,
> even if they don't touch these types) would be recompiled at least once
> (some immediately in case of circular interface-implementation unit
> references, some only when you recompile the project)
>
> This wouldn't double the compilation time, but it would probably slow down
> things quite a bit. I'm also not sure whether the ppu storing/logic logic
> would still work if it could be called at a point where not all
> forward-declared types are resolved. It would probably require special
> code for that situation.
I realize that you know the compiler better than me, but some more thoughts of
mine anyway:
The only information needed for the interface section is that the variable's
type is object (class instance). It could be treated as TObject during the
interface parsing. The same thing as when forward declaring a class inside a
unit. The forward declaration only says it is a class, no mention of its
ancestor, data members or methods.
The class's members are used only in implementation section, but there the
class's "home unit" is included in uses clause already and it is no different
from the current situation.
Ok, I understand the class's member info is stored somewhere at the end of
interface section, the compiler would need more fundamental changes if that
info was not available then.
But still, the same space is reserved for a variable of any object, be it
TObject or TMyClass. If I only could tell the compiler that my variable is
actually TMyClass, not TObject, and then use code completion features and
avoid casting.
Hey, there could be an Alias syntax. First, in interface:
MyVar: TObject;
Then in implementation section:
MyVar = alias TMyClass
... not very good. The point is anyway that my variable is basically a pointer
to an object and the compiler should understand that.
Juha Manninen
More information about the fpc-devel
mailing list