Precomp is a non standard optimization for this precise reason.<div><br></div><div>Please file a bug report on the issue. I believe making it spec compliant would be nice</div><div>but non-trivial. So, if you feel like you need it, feel free to submit a patch.</div>
<div><br></div><div><br><br><div class="gmail_quote">On Thu, Jan 19, 2012 at 2:37 PM, Martin Däumler <span dir="ltr"><<a href="mailto:mdae@cs.tu-chemnitz.de">mdae@cs.tu-chemnitz.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hello,<br>
<br>
I tried out several optimizations of Mono 2.6.1 and Mono 2.10.8.1.<br>
So I used "-O=precomp". The class 'Test' of the appended test case<br>
has an (explicit) class constructor. That is, in class Test's IL-code,<br>
the field "beforefieldinit" is not set. ECMA-335 §8.9.5 states that<br>
the class constructor is executed at first access to any static member<br>
of that class or at first creation of one instance of that class, as<br>
I understood it. When I execute the program with Mono 2.6.1 and the<br>
optimization "-O=precomp", class Test's class constructor is executed<br>
before first access. Even worse, Mono 2.10.8.1 crashes while<br>
precompiling.<br>
<br>
So, what have do be done in order to don't violate the specification?<br>
How is it handled in AOT-mode?<br>
<br>
<br>
With kind regards,<br>
Martin Däumler<br>
<br>
<br>
<br>
using System;<br>
<br>
class Test<br>
{<br>
    public static string x;<br>
<br>
    static Test ()<br>
    {<br>
      Console.WriteLine("In type initializer");<br>
      x = "In type initializer";<br>
    }<br>
<br>
    public static string EchoAndReturn (string s)<br>
    {<br>
        Console.WriteLine (s);<br>
        return s;<br>
    }<br>
}<br>
<br>
class Driver<br>
{<br>
    public static void Main()<br>
    {<br>
        Console.WriteLine("Starting Main");<br>
        // Invoke a static method on Test<br>
        Test.EchoAndReturn("Echo!");<br>
        Console.WriteLine("After echo");<br>
        // Reference a static field in Test<br>
        string y = Test.x;<br>
        // Use the value just to avoid compiler cleverness<br>
        if (y != null)<br>
        {<br>
            Console.WriteLine("After field access");<br>
        }<br>
    }<br>
}<br>
______________________________<u></u>_________________<br>
Mono-devel-list mailing list<br>
<a href="mailto:Mono-devel-list@lists.ximian.com" target="_blank">Mono-devel-list@lists.ximian.<u></u>com</a><br>
<a href="http://lists.ximian.com/mailman/listinfo/mono-devel-list" target="_blank">http://lists.ximian.com/<u></u>mailman/listinfo/mono-devel-<u></u>list</a><br>
</blockquote></div><br></div>