From 375d9925c58bbaf05467b1eb537b6c4577c9229d Mon Sep 17 00:00:00 2001 From: Miguel de Icaza Date: Mon, 12 Feb 2007 20:45:14 +0000 Subject: [PATCH] Backport svn path=/branches/mono-1-2-3/mcs/; revision=72690 --- mcs/mcs/ChangeLog | 9 +++++++++ mcs/mcs/assign.cs | 5 ++++- mcs/mcs/class.cs | 20 ++++++++++++-------- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/mcs/mcs/ChangeLog b/mcs/mcs/ChangeLog index 26b18be096989..829170e5de1ba 100644 --- a/mcs/mcs/ChangeLog +++ b/mcs/mcs/ChangeLog @@ -1,3 +1,12 @@ +2007-02-12 Marek Safar + + A fix for bug #80749 + * assign.cs (FieldInitializer): FieldInitializer has to keep track of + its parent container. + + * class.cs (DefineFieldInitializers): Each initializer can has different + resolve context. + 2007-01-27 Raja R Harinath Fix #80358 diff --git a/mcs/mcs/assign.cs b/mcs/mcs/assign.cs index a7d097e1e6dcc..312a041b21340 100644 --- a/mcs/mcs/assign.cs +++ b/mcs/mcs/assign.cs @@ -588,9 +588,12 @@ public override void EmitStatement (EmitContext ec) // This class implements fields and events class initializers public class FieldInitializer : Assign { - public FieldInitializer (FieldBuilder field, Expression expression) + public readonly DeclSpace TypeContainer; + + public FieldInitializer (FieldBuilder field, Expression expression, DeclSpace container) : base (new FieldExpr (field, expression.Location, true), expression) { + this.TypeContainer = container; if (!field.IsStatic) ((FieldExpr)target).InstanceExpression = CompilerGeneratedThis.Instance; } diff --git a/mcs/mcs/class.cs b/mcs/mcs/class.cs index 03a3ff518d17f..81ffd26b01d02 100644 --- a/mcs/mcs/class.cs +++ b/mcs/mcs/class.cs @@ -2784,11 +2784,13 @@ protected void DefineDefaultConstructor (bool is_static) void DefineFieldInitializers () { if (initialized_fields != null) { - EmitContext ec = new EmitContext (this, this, Location, null, null, ModFlags); - ec.IsFieldInitializer = true; - for (int i = 0; i < initialized_fields.Count; ++i) { FieldInitializer fi = (FieldInitializer)initialized_fields[i]; + + EmitContext ec = new EmitContext (fi.TypeContainer, fi.TypeContainer, + Location, null, null, ModFlags); + ec.IsFieldInitializer = true; + fi.ResolveStatement (ec); if (fi.IsDefaultInitializer && RootContext.Optimize) { // Field is re-initialized to its default value => removed @@ -2800,11 +2802,13 @@ void DefineFieldInitializers () if (initialized_static_fields != null) { bool has_complex_initializer = false; - EmitContext ec = new EmitContext (this, this, Location, null, null, ModFlags); - ec.IsStatic = true; - ec.IsFieldInitializer = true; foreach (FieldInitializer fi in initialized_static_fields) { + EmitContext ec = new EmitContext (fi.TypeContainer, fi.TypeContainer, + Location, null, null, ModFlags); + ec.IsStatic = true; + ec.IsFieldInitializer = true; + fi.ResolveStatement (ec); if (!fi.IsComplexInitializer) continue; @@ -6043,7 +6047,7 @@ public override bool Define () if (initializer != null) Parent.PartialContainer.RegisterFieldForInitialization (this, - new FieldInitializer (FieldBuilder, initializer)); + new FieldInitializer (FieldBuilder, initializer, Parent)); return true; } @@ -7220,7 +7224,7 @@ public override bool Define() } Parent.PartialContainer.RegisterFieldForInitialization (this, - new FieldInitializer (FieldBuilder, Initializer)); + new FieldInitializer (FieldBuilder, Initializer, Parent)); } return true;