how to avoid "cycle detected"?

Steven Schveighoffer via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Jul 1 05:52:38 PDT 2015


On 7/1/15 5:09 AM, aki wrote:
> Following code causes run-time error.
> How can I use static this() without causing error?
> It's difficult to avoid this situation because
> actual code is more complex.
>
> file main.d:
> void main() {
> }
>
> file a.d:
> import b;
> class A {
>      static this() {}
> };
>
> file b.d:
> import a;
> class B {
>      static this() {}
> };
>
> object.Exception at src\rt\minfo.d(162): Aborting: Cycle detected between
> modules with ctors/dtors:
> a -> b -> a

You need to either factor out the static constructors to put them in a 
leaf module, replace one of them with intializers, or remove one of them.

It can be an exercise in ugly coding, but you can fix this.

I know it wasn't specifically asked, but the reason it exists is simple:

class A {
     static int x;
     static this() { x = B.x + 5;}
}

...

class B {
     static int x;
     static this() { x = A.x + 5;}
}

The runtime cannot introspect the code to detect the circular 
dependency, so it makes a conservative decision. I'm waiting on an 
introduction of RTInfo for modules [1] to allow us to mark static ctors 
as standalone, then we can probably fix this problem through a sort of 
"trust the programmer" mechanism.

-Steve

[1] https://issues.dlang.org/show_bug.cgi?id=10023


More information about the Digitalmars-d-learn mailing list