Anonymous method with this access inside an iterator needs to initialize captured...
[mono.git] / mcs / mcs / async.cs
index 7742126beda0353d680e283e1c258d2b7f58a024..05f9a63f635fab3773f90e1cd5fedcbb79c8a46f 100644 (file)
@@ -195,7 +195,9 @@ namespace Mono.CSharp
 
                protected override void DoEmit (EmitContext ec)
                {
-                       GetResultExpression (ec).Emit (ec);
+                       using (ec.With (BuilderContext.Options.OmitDebugInfo, true)) {
+                               GetResultExpression (ec).Emit (ec);
+                       }
                }
 
                public Expression GetResultExpression (EmitContext ec)
@@ -224,34 +226,34 @@ namespace Mono.CSharp
                        var fe_awaiter = new FieldExpr (awaiter, loc);
                        fe_awaiter.InstanceExpression = new CompilerGeneratedThis (ec.CurrentType, loc);
 
-                       //
-                       // awaiter = expr.GetAwaiter ();
-                       //
+                               Label skip_continuation = ec.DefineLabel ();
+
                        using (ec.With (BuilderContext.Options.OmitDebugInfo, true)) {
+                               //
+                               // awaiter = expr.GetAwaiter ();
+                               //
                                fe_awaiter.EmitAssign (ec, expr, false, false);
-                       }
 
-                       Label skip_continuation = ec.DefineLabel ();
+                               Expression completed_expr;
+                               if (IsDynamic) {
+                                       var rc = new ResolveContext (ec.MemberContext);
 
-                       Expression completed_expr;
-                       if (IsDynamic) {
-                               var rc = new ResolveContext (ec.MemberContext);
+                                       Arguments dargs = new Arguments (1);
+                                       dargs.Add (new Argument (fe_awaiter));
+                                       completed_expr = new DynamicMemberBinder ("IsCompleted", dargs, loc).Resolve (rc);
 
-                               Arguments dargs = new Arguments (1);
-                               dargs.Add (new Argument (fe_awaiter));
-                               completed_expr = new DynamicMemberBinder ("IsCompleted", dargs, loc).Resolve (rc);
+                                       dargs = new Arguments (1);
+                                       dargs.Add (new Argument (completed_expr));
+                                       completed_expr = new DynamicConversion (ec.Module.Compiler.BuiltinTypes.Bool, 0, dargs, loc).Resolve (rc);
+                               } else {
+                                       var pe = PropertyExpr.CreatePredefined (awaiter_definition.IsCompleted, loc);
+                                       pe.InstanceExpression = fe_awaiter;
+                                       completed_expr = pe;
+                               }
 
-                               dargs = new Arguments (1);
-                               dargs.Add (new Argument (completed_expr));
-                               completed_expr = new DynamicConversion (ec.Module.Compiler.BuiltinTypes.Bool, 0, dargs, loc).Resolve (rc);
-                       } else {
-                               var pe = PropertyExpr.CreatePredefined (awaiter_definition.IsCompleted, loc);
-                               pe.InstanceExpression = fe_awaiter;
-                               completed_expr = pe;
+                               completed_expr.EmitBranchable (ec, skip_continuation, true);
                        }
 
-                       completed_expr.EmitBranchable (ec, skip_continuation, true);
-
                        base.DoEmit (ec);
 
                        //
@@ -378,6 +380,10 @@ namespace Mono.CSharp
                        }
                }
 
+               public TypeSpec DelegateType {
+                       get; set;
+               }
+
                public override bool IsIterator {
                        get {
                                return false;
@@ -482,7 +488,7 @@ namespace Mono.CSharp
                        if (mutator != null)
                                type = mutator.Mutate (type);
 
-                       List<Field> existing_fields = null;
+                       List<Field> existing_fields;
                        if (awaiter_fields.TryGetValue (type, out existing_fields)) {
                                foreach (var f in existing_fields) {
                                        if (f.IsAvailableForReuse) {
@@ -737,7 +743,9 @@ namespace Mono.CSharp
                        var args = new Arguments (2);
                        args.Add (new Argument (awaiter, Argument.AType.Ref));
                        args.Add (new Argument (new CompilerGeneratedThis (CurrentType, Location), Argument.AType.Ref));
-                       mg.EmitCall (ec, args);
+                       using (ec.With (BuilderContext.Options.OmitDebugInfo, true)) {
+                               mg.EmitCall (ec, args);
+                       }
                }
 
                public void EmitInitializer (EmitContext ec)
@@ -813,7 +821,9 @@ namespace Mono.CSharp
                        Arguments args = new Arguments (1);
                        args.Add (new Argument (exceptionVariable));
 
-                       mg.EmitCall (ec, args);
+                       using (ec.With (BuilderContext.Options.OmitDebugInfo, true)) {
+                               mg.EmitCall (ec, args);
+                       }
                }
 
                public void EmitSetResult (EmitContext ec)
@@ -835,7 +845,9 @@ namespace Mono.CSharp
                                args.Add (new Argument (new LocalVariableReference (hoisted_return, Location)));
                        }
 
-                       mg.EmitCall (ec, args);
+                       using (ec.With (BuilderContext.Options.OmitDebugInfo, true)) {
+                               mg.EmitCall (ec, args);
+                       }
                }
 
                protected override TypeSpec[] ResolveBaseTypes (out FullNamedExpression base_class)