[fpc-devel] Packages, Generics

Willibald Krenn Willibald.Krenn at gmx.at
Sun Sep 12 12:40:04 CEST 2010


Marco van de Voort schrieb:
> No it won't. Not all of the implementation of a package needs to be in the
> .BPL equivalent. Neither is the case in Delphi. 
> 
> Seek for $weakpackage and read the packages wiki again

In words of Borland/Embac - "Unit files containing the {$WEAKPACKAGEUNIT 
ON} directive must not have global variables, initialization sections, 
or finalization sections." Which makes sense. So not putting something 
into the bpl comes at a cost.

Also, I don't see the benefit of trying to introduce packages to have 
each type defined only once within the project, except that all generic 
types (and descendants thereof) would be spread all-over again.

> So in short, everything in the units that doesn't go into the DLL goes into
> the .DCP which is more or less a dcu archive if I understood it correctly
> 
> So only the specializations used inside the code contained in the BPL (and
> maybe one or two that you could force to save duplication) are in the BPL.
> 
> So in short, the problem is one that you create yourself by self-inflicting
> that every piece of code _must_ be in the BPL. That isn't the case.

Ok, so lets say one of my generic classes uses class variables (static 
fields). Duplicating the type in each package defeats the purpose of the 
package-concept to have one common type across all modules of a running 
application.

Say I have a generic TMyList<T> type with some class variable. Then, I 
use the specialization TMyList<TMyOtherClass> in two different packages 
that depend on the package where TMyList<T> was defined. As soon as 
TMyList<T> is put into the .dcp, it will be statically compiled into the 
two other packages - hence you end up with 2 "instances" of the same 
type, which leads to having 2 different versions of the class variable 
(and N in the general case). In my opinion this is not what packages are 
about. Packages are a means to transparently break your application in 
to modules. BTW: It would be intersting to know whether Delphi allows 
some sort of "type TMyNewList<T> = type TMyList<T>" definition  which 
would create a new type with a different set of class variables.

Finally, I have to confess that I am absolutely clueless about the 
semantics of class variables in FPC's generics. Most probably FPC only 
shares class variables between all instances of the same "type mySpec = 
specialization TMyList<...>" type, which would give somewhat room for 
the .dcp implementation. But this is not the usual semantics of 
generics. It also is not the Delphi semantics of generics, I suppose. 
This is (C++) templates without header files.

Cheers,
  Willi



More information about the fpc-devel mailing list