static this sucks, we should deprecate it

Steven Schveighoffer schveiguy at yahoo.com
Thu May 28 19:18:32 PDT 2009


On Thu, 28 May 2009 21:41:01 -0400, Ary Borenszweig <ary at esperanto.org.ar>  
wrote:

>
> The thing is, I've been using Java for more than 7 years now and I never  
> got any error because of intialization dependency. It would be nice to  
> turn that check off in D and see the results. Maybe no one will complain  
> about it.
>
> (Or maybe it was added because someone complained about it, some years  
> ago? I don't know...)

You are probably right that most of the time static initializers do not  
depend on external variables.  But it might be best to start with the  
conservative option and move towards the compromise than the other way  
around.  I think a reasonable first step is to implement some better  
runtime checks.

For example, the compiler could put wrappers around static this calls:

_wrapper()
{
   // mode is initted to 0 by the runtime.
   static int mode;
   if(mode == 0)
   {
     mode = 1;
     static_this(); // calls the static initializers of the module
     mode = 2;
   }
   else if(mode == 1) // a dependency of this module called this module's  
initializer!
   {
     assert(false, "circular dependency!");
   }
}

And put calls to a dependent module's _wrapper function in other modules  
when they are about to access static variables in that other module.

for example:

f1.d:
import f2;

int x;
int n;
static this()
{
   n = 4;
   x = y;
}

f2.d:
import f1;

int y;
static this()
{
   y = 5;
}

--------
f1.d's static this becomes:

static this()
{
   f2._wrapper();
   x = y;
}

and f2.d's static this remains the same because it doesn't have any  
dependencies.  Then the compiler can call the static initializers in any  
order, and they do the right thing.

This still wouldn't be perfect, because you may get incorrect assertions,  
but it's better than what we have now.

-Steve



More information about the Digitalmars-d mailing list