diff options
author | Miguel de Icaza <miguel@gnome.org> | 2007-02-12 23:45:14 +0300 |
---|---|---|
committer | Miguel de Icaza <miguel@gnome.org> | 2007-02-12 23:45:14 +0300 |
commit | 375d9925c58bbaf05467b1eb537b6c4577c9229d (patch) | |
tree | 8efeb8b3bc4b7d5be642f88da29392f19e41570c | |
parent | 876e9eebb924bcf27820ac12b20c8eea30e92773 (diff) |
Backport
svn path=/branches/mono-1-2-3/mcs/; revision=72690
-rw-r--r-- | mcs/mcs/ChangeLog | 9 | ||||
-rw-r--r-- | mcs/mcs/assign.cs | 5 | ||||
-rw-r--r-- | mcs/mcs/class.cs | 20 |
3 files changed, 25 insertions, 9 deletions
diff --git a/mcs/mcs/ChangeLog b/mcs/mcs/ChangeLog index 26b18be0969..829170e5de1 100644 --- a/mcs/mcs/ChangeLog +++ b/mcs/mcs/ChangeLog @@ -1,3 +1,12 @@ +2007-02-12 Marek Safar <marek.safar@gmail.com> + + 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 <rharinath@novell.com> Fix #80358 diff --git a/mcs/mcs/assign.cs b/mcs/mcs/assign.cs index a7d097e1e6d..312a041b213 100644 --- a/mcs/mcs/assign.cs +++ b/mcs/mcs/assign.cs @@ -588,9 +588,12 @@ namespace Mono.CSharp { // 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 03a3ff518d1..81ffd26b01d 100644 --- a/mcs/mcs/class.cs +++ b/mcs/mcs/class.cs @@ -2784,11 +2784,13 @@ namespace Mono.CSharp { 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 @@ namespace Mono.CSharp { 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 @@ namespace Mono.CSharp { if (initializer != null) Parent.PartialContainer.RegisterFieldForInitialization (this, - new FieldInitializer (FieldBuilder, initializer)); + new FieldInitializer (FieldBuilder, initializer, Parent)); return true; } @@ -7220,7 +7224,7 @@ namespace Mono.CSharp { } Parent.PartialContainer.RegisterFieldForInitialization (this, - new FieldInitializer (FieldBuilder, Initializer)); + new FieldInitializer (FieldBuilder, Initializer, Parent)); } return true; |