Skip to content

Commit

Permalink
Backport
Browse files Browse the repository at this point in the history
svn path=/branches/mono-1-2-3/mcs/; revision=72690
  • Loading branch information
migueldeicaza committed Feb 12, 2007
1 parent 876e9ee commit 375d992
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 9 deletions.
9 changes: 9 additions & 0 deletions 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
Expand Down
5 changes: 4 additions & 1 deletion mcs/mcs/assign.cs
Expand Up @@ -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;
}
Expand Down
20 changes: 12 additions & 8 deletions mcs/mcs/class.cs
Expand Up @@ -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
Expand All @@ -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;
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -7220,7 +7224,7 @@ public override bool Define()
}

Parent.PartialContainer.RegisterFieldForInitialization (this,
new FieldInitializer (FieldBuilder, Initializer));
new FieldInitializer (FieldBuilder, Initializer, Parent));
}

return true;
Expand Down

0 comments on commit 375d992

Please sign in to comment.