Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiguel de Icaza <miguel@gnome.org>2007-02-12 23:45:14 +0300
committerMiguel de Icaza <miguel@gnome.org>2007-02-12 23:45:14 +0300
commit375d9925c58bbaf05467b1eb537b6c4577c9229d (patch)
tree8efeb8b3bc4b7d5be642f88da29392f19e41570c
parent876e9eebb924bcf27820ac12b20c8eea30e92773 (diff)
Backport
svn path=/branches/mono-1-2-3/mcs/; revision=72690
-rw-r--r--mcs/mcs/ChangeLog9
-rw-r--r--mcs/mcs/assign.cs5
-rw-r--r--mcs/mcs/class.cs20
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;