Program size, linking matter, and static this()
Martin Nowak
dawg at dawgfoto.de
Wed Jan 18 03:14:07 PST 2012
> Yes they are. static constructors completely chicken out on them. Not
> only is
> there no real attempt to determine whether the static constructors are
> actually dependent (which granted, isn't an easy problem), but there is
> _zero_
> support in the language for resolving such circular dependencies.
> There's no
> way to say that they _aren't_ dependent even if you can clearly see that
> they
> aren't. The solution used in Phobos (which won't work in std.datetime
> due to
> the use of immutable and pure) is to create a C module which has the
> code from
> the static constructor and then have a separate module which calls it in
> its
> static constructor.
Which is a hack because that C function is a compiler wall while the
dependency
persists. Btw. that stdiobase and datebase are obsolete the cycles have
vanished.
You will get this only if std.dateparse had a shared static ctor too.
Cycle detected between modules with ctors/dtors:
std.date -> std.dateparse -> std.date
object.Exception at src/rt/minfo.d(309): Aborting!
There is a cleaner hack to solve the issue but I really don't like it.
It's two DAGs that are iterated one for "shared static this" and
one for "static this".
----
module a;
import b;
shared static this()
{
}
----
module b;
import a, core.atomic : cas;
shared bool initialized;
static this()
{
if (!cas(&initialized, false, true)) return;
...
}
----
More information about the Digitalmars-d
mailing list