View mode: basic / threaded / horizontal-split · Log in · Help
August 08, 2010
Static constructor call ordering in imported modules
Here's an example from TDPL (with writeln's) with two modules:

-------------------------------------
module MA;

import std.stdio;
import MB;

class A
{
   static this()
   {
       writeln("A's constructor called.");
   }
}

void main()
{
}
-------------------------------------

-------------------------------------
module MB;

import std.stdio;

class B
{
   static this()
   {
       writeln("B's constructor called.");
   }
}
-------------------------------------

Compiling and running this examples gives this output:
B's constructor called.
A's constructor called.


But, according to TDPL, page 189, it states:

"MA imports MB. Then A's static class constructors run before B's"

I've tried using a driver module which imports MA and then MB, but as long as MA itself imports MB then I still get the same output. Error in text / in DMD?
August 08, 2010
Re: Static constructor call ordering in imported modules
On 08.08.2010 22:55, Andrej Mitrovic wrote:
> Here's an example from TDPL (with writeln's) with two modules:
>
> -------------------------------------
> module MA;
>
> import std.stdio;
> import MB;
>
> class A
> {
>      static this()
>      {
>          writeln("A's constructor called.");
>      }
> }
>
> void main()
> {
> }
> -------------------------------------
>
> -------------------------------------
> module MB;
>
> import std.stdio;
>
> class B
> {
>      static this()
>      {
>          writeln("B's constructor called.");
>      }
> }
> -------------------------------------
>
> Compiling and running this examples gives this output:
> B's constructor called.
> A's constructor called.
>
>
> But, according to TDPL, page 189, it states:
>
> "MA imports MB. Then A's static class constructors run before B's"
>
> I've tried using a driver module which imports MA and then MB, but as long as MA itself imports MB then I still get the same output. Error in text / in DMD?
>    
In text I guess - consider A static constructor uses class B that is in  
MB (as it can, but not the other way around).
MA should have B's static constructor called, or all sorts of trouble come.

-- 
Dmitry Olshansky
August 08, 2010
Re: Static constructor call ordering in imported modules
Andrej Mitrovic wrote:
> But, according to TDPL, page 189, it states:
> 
> "MA imports MB. Then A's static class constructors run before B's"

TDPL appears to be incorrect. The compiler is correct.
August 08, 2010
Re: Static constructor call ordering in imported modules
Pretend the modules are classes, they behave the same way. 

Andrej Mitrovic <andrej.mitrovich@gmail.com> wrote:
> Here's an example from TDPL (with writeln's) with two modules:
> 
> -------------------------------------
> module MA;
> 
> import std.stdio;
> import MB;
> 
> class A
> {
>     static this()
>     {
>         writeln("A's constructor called.");
>     }
> }
> 
> void main()
> {
> }
> -------------------------------------
> 
> -------------------------------------
> module MB;
> 
> import std.stdio;
> 
> class B
> {
>     static this()
>     {
>         writeln("B's constructor called.");
>     }
> }
> -------------------------------------
> 
> Compiling and running this examples gives this output:
> B's constructor called.
> A's constructor called.
> 
> 
> But, according to TDPL, page 189, it states:
> 
> "MA imports MB. Then A's static class constructors run before B's"
> 
> I've tried using a driver module which imports MA and then MB, but as
> long as MA itself imports MB then I still get the same output. Error
> in text / in DMD?
August 09, 2010
Re: Static constructor call ordering in imported modules
On 08/08/2010 04:13 PM, Walter Bright wrote:
> Andrej Mitrovic wrote:
>> But, according to TDPL, page 189, it states:
>>
>> "MA imports MB. Then A's static class constructors run before B's"
>
> TDPL appears to be incorrect. The compiler is correct.

Yah, it's obvious that if MA imports MB then whatever stuff is in MB 
better be ready to roll when MA wakes up.

This should be in the errata. I finally reinstated the database (which 
I'd deleted by mistake) and re-entered the errata by hand. Here it is:

http://www.erdani.com/tdpl/errata/


Andrei
Top | Discussion index | About this forum | D home