Author: marek
Date: 2007-09-14 07:35:17 -0400 (Fri, 14 Sep 2007)
New Revision: 85793

Modified:
   trunk/mcs/mcs/ChangeLog
   trunk/mcs/mcs/class.cs
Log:
2007-09-14  Marek Safar  <[EMAIL PROTECTED]>

        A fix for bug #82845
        
        * class.cs (TypeContainer): Set correct resolve context for all field
        initializers.
        


Modified: trunk/mcs/mcs/ChangeLog
===================================================================
--- trunk/mcs/mcs/ChangeLog     2007-09-14 11:34:38 UTC (rev 85792)
+++ trunk/mcs/mcs/ChangeLog     2007-09-14 11:35:17 UTC (rev 85793)
@@ -1,3 +1,10 @@
+2007-09-14  Marek Safar  <[EMAIL PROTECTED]>
+
+       A fix for bug #82845
+       
+       * class.cs (TypeContainer): Set correct resolve context for all field
+       initializers.
+       
 2007-09-13  Marek Safar  <[EMAIL PROTECTED]>
 
        * assign.cs: Fixed a crash when field is resolved twice with an error.

Modified: trunk/mcs/mcs/class.cs
===================================================================
--- trunk/mcs/mcs/class.cs      2007-09-14 11:34:38 UTC (rev 85792)
+++ trunk/mcs/mcs/class.cs      2007-09-14 11:35:17 UTC (rev 85793)
@@ -814,15 +814,23 @@
 
                public void ResolveFieldInitializers (EmitContext ec)
                {
+                       // Field initializers are tricky for partial classes. 
They have to
+                       // share same costructor (block) but they have they own 
resolve scope.
+                       DeclSpace orig = ec.DeclContainer;
+
                        if (partial_parts != null) {
-                               DeclSpace orig = ec.DeclContainer ;
                                foreach (TypeContainer part in partial_parts) {
                                        ec.DeclContainer = part;
-                                       part.ResolveFieldInitializers (ec);
+                                       part.DoResolveFieldInitializers (ec);
                                }
-                               ec.DeclContainer = orig; 
                        }
+                       ec.DeclContainer = PartialContainer;
+                       DoResolveFieldInitializers (ec);
+                       ec.DeclContainer = orig; 
+               }
 
+               void DoResolveFieldInitializers (EmitContext ec)
+               {
                        if (ec.IsStatic) {
                                if (initialized_static_fields == null)
                                        return;
@@ -4928,6 +4936,8 @@
                        if (OptAttributes != null)
                                OptAttributes.Emit ();
 
+                       base.Emit ();
+
                        EmitContext ec = CreateEmitContext (null, null);
 
                        //
@@ -4998,8 +5008,6 @@
                        if (source != null)
                                source.CloseMethod ();
 
-                       base.Emit ();
-
                        if (declarative_security != null) {
                                foreach (DictionaryEntry de in 
declarative_security) {
                                        
ConstructorBuilder.AddDeclarativeSecurity ((SecurityAction)de.Key, 
(PermissionSet)de.Value);
@@ -5086,7 +5094,7 @@
                public EmitContext CreateEmitContext (DeclSpace ds, ILGenerator 
ig)
                {
                        ILGenerator ig_ = ConstructorBuilder.GetILGenerator ();
-                       EmitContext ec = new EmitContext (this, 
Parent.PartialContainer, Location, ig_, TypeManager.void_type, ModFlags, true);
+                       EmitContext ec = new EmitContext (this, Parent, 
Location, ig_, TypeManager.void_type, ModFlags, true);
                        ec.CurrentBlock = block;
                        return ec;
                }

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to