https://bugzilla.novell.com/show_bug.cgi?id=430804


           Summary: Static readonly field optimization doesn't account for
                    changes via reflection
           Product: Mono: Compilers
           Version: 1.9
          Platform: Other
        OS/Version: Other
            Status: NEW
          Severity: Normal
          Priority: P5 - None
         Component: C#
        AssignedTo: mono-bugs@lists.ximian.com
        ReportedBy: [EMAIL PROTECTED]
         QAContact: mono-bugs@lists.ximian.com
          Found By: ---


It appears that static readonly fields are being optimized in a way that
doesn't account for them being changed via reflection.  Consider the following
example:

public class TheClass
{
   public class Foo
   {
      // Initialize to zero.
      public static readonly int s_int = 0;

      // Return the value of the int.
      public static int TheInt
      {
         get { return s_int; }
      }
   }

   public static void Main(params string[] args)
   {
      // Get the field via reflection.
      Type type = typeof (Foo);
      FieldInfo fi = type.GetField("s_int", BindingFlags.Static |
BindingFlags.Public);

      // Write out the initial value.
      Console.Out.WriteLine("TheInt: " + Foo.TheInt);
      // Set the value via reflection.
      fi.SetValue(null, 1);
      // Write out the value that we get via reflection.
      Console.Out.WriteLine("TheInt GetValue: " + fi.GetValue(null));
      // Write out the value we get by calling the property.
      Console.Out.WriteLine("TheInt: " + Foo.TheInt);
   }
}

Expected Output:
TheInt: 0
TheInt GetValue: 1
TheInt: 1

Actual Output:
TheInt: 0
TheInt GetValue: 1
TheInt: 0

We verify that the static value actually changed by retrieving it via
reflection after it's set.  But the property fails to return the new value. 
This suggests that the compiler or something has optimized this and it's
returning some cached value which is not the current value.  It's probably
thinking that since the field is declared "readonly" that it can't be changed
after it's been initialized.

I think this is a bug because if the reflection call lets us set the value,
then the compiler can't assume that the field can't change after
initialization.


-- 
Configure bugmail: https://bugzilla.novell.com/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
You are the assignee for the bug.
_______________________________________________
mono-bugs maillist  -  mono-bugs@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-bugs

Reply via email to