static init cycle detection problem
"Øivind"
oivind.loe at gmail.com
Wed Sep 19 14:17:08 PDT 2012
On Wednesday, 19 September 2012 at 20:56:17 UTC, Simen Kjaeraas
wrote:
> On Wed, 19 Sep 2012 22:25:46 +0200, Øivind
> <oivind.loe at gmail.com> wrote:
>
>> I am struggeling to get around the cycle detection kicking in
>> when I have static init in modules that depend on eachother.
>>
>> I have seen some threads on 'fixes' for this, e.g. adding a
>> @standalone property to the module or similar. Has there been
>> any progress on this?
>>
>> If not would it be possible in e.g. main() to get a list of
>> all compiled-in modules, and then iterate over them and call
>> an init function where it exists? As long as there is a way to
>> list the name of the modules at compile-time, this should be
>> pretty easy..?
>
> There's no way to get that list at compile-time, because object
> files may
> be added at link-time. However, D has a ModuleInfo object,
> which contains
> information on all modules in the program:
>
> import std.stdio;
> void main( ) {
> foreach( m; ModuleInfo ) {
> writeln( m.name );
> }
> }
>
> For details on how this object works, have a look-see at
> src/druntime/src/object_.d in your DMD installation folder.
>
> I'm not sure what you're asking for is possible even given this
> object,
> but it's probably the closest you'll (easily) get.
If I define a function:
void getMembers() {
}
in one of my modules, all modules including this get the
xgetMembers property of the ModuleInfo struct set. It seems like
I should be able to do something with this, but i then get the
following assertion failure:
./dboss(_d_assertm+0x26) [0x8aa1da]
./dboss() [0x7c8555]
./dboss(boss.core.proc.ProcBase!(boss.core.boss.Boss,
"boss").ProcBase boss.core.proc.ProcBase!(boss.core.boss.Boss,
"boss").ProcBase.__ctor()+0x31) [0x797805]
./dboss(boss.core.boss.Boss
boss.core.boss.Boss.__ctor(immutable(char)[][])+0x21) [0x791099]
./dboss(_Dmain+0x33) [0x7488fb]
./dboss(extern (C) int rt.dmain2.main(int, char**).void
runMain()+0x1c) [0x8aaa70]
./dboss(extern (C) int rt.dmain2.main(int, char**).void
tryExec(scope void delegate())+0x2a) [0x8aa3ea]
./dboss(extern (C) int rt.dmain2.main(int, char**).void
runAll()+0x3b) [0x8aaab7]
./dboss(extern (C) int rt.dmain2.main(int, char**).void
tryExec(scope void delegate())+0x2a) [0x8aa3ea]
./dboss(main+0xd1) [0x8aa375]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)
[0x7f1d0edcc76d]
Removing the function from the module makes the assertion failure
go away.. What is the cause of this? And what is the getMembers
function used for?
Another way of approaching this would be if I could feed a list
of modules into DMD during compile time. In C++, i would be able
to do this by passing a define to g++ on the command line when
invoking it. Is it possible to do something similar with DMD?
E.g. create a list of modules before invoking DMD, pass it to
DMD, and use this at compile time to import and call my init
function?
More information about the Digitalmars-d-learn
mailing list