svn path=/branches/martin/anonymous-methods2/mcs/; revision=68437
authorMartin Baulig <martin@novell.com>
Fri, 24 Nov 2006 17:40:24 +0000 (17:40 -0000)
committerMartin Baulig <martin@novell.com>
Fri, 24 Nov 2006 17:40:24 +0000 (17:40 -0000)
mcs/mcs/anonymous.cs
mcs/mcs/class.cs
mcs/mcs/expression.cs

index 9aefc1daddf8bce1ab78d8a035718fdb9b997273..b80dc212be27e77263d8c487b4ed9a1416c2e2c7 100644 (file)
@@ -410,7 +410,8 @@ namespace Mono.CSharp {
 
                        protected FieldInfo GetField (EmitContext ec)
                        {
-                               if (ec.CurrentBlock.Toplevel != Scope.ScopeBlock.Toplevel)
+                               if ((ec.CurrentBlock != null) &&
+                                   (ec.CurrentBlock.Toplevel != Scope.ScopeBlock.Toplevel))
                                        return Field.FieldBuilder;
                                else
                                        return FieldInstance.FieldInfo;
@@ -626,10 +627,11 @@ namespace Mono.CSharp {
 
                        protected virtual void DoEmit (EmitContext ec)
                        {
-                               if (ec.CurrentBlock.Toplevel == Scope.ScopeBlock.Toplevel)
-                                       DoEmitInstance (ec);
-                               else
+                               if ((ec.CurrentBlock != null) &&
+                                   (ec.CurrentBlock.Toplevel != Scope.ScopeBlock.Toplevel))
                                        ec.ig.Emit (OpCodes.Ldarg_0);
+                               else
+                                       DoEmitInstance (ec);
                        }
 
                        protected void DoEmitInstance (EmitContext ec)
index 790c6aa73f67560d289126919a08402382aa531b..06e75900a195ec5d50ce5ce15c736325a5f4b6a1 100644 (file)
@@ -4747,6 +4747,11 @@ namespace Mono.CSharp {
                        if (block != null) {
                                ec.ResolveTopBlock (null, block, ParameterInfo, this, out unreachable);
                                ec.EmitMeta (block);
+
+                               if (block.ScopeInfo != null) {
+                                       ExpressionStatement init = block.ScopeInfo.GetScopeInitializer (ec);
+                                       init.EmitStatement (ec);
+                               }
                        }
 
                        if (Initializer != null) {
index 6cd15a7b977dae02cc4b420ec723b27e7ac9010e..c7448abfd44c4b6e9ff9f04af3fd54345ba21f7b 100644 (file)
@@ -6669,7 +6669,8 @@ namespace Mono.CSharp {
                                }
 
                                RootScopeInfo host = block.Toplevel.RootScope;
-                               if ((host != null) && (!is_struct || host.IsIterator)) {
+                               if ((host != null) && !ec.IsConstructor &&
+                                   (!is_struct || host.IsIterator)) {
                                        variable = host.CaptureThis ();
                                        type = variable.Type;
                                        is_struct = false;