Don't capture any variables when block yield only breaks
authorMarek Safar <marek.safar@gmail.com>
Mon, 25 Mar 2013 14:11:50 +0000 (15:11 +0100)
committerMarek Safar <marek.safar@gmail.com>
Mon, 25 Mar 2013 14:11:50 +0000 (15:11 +0100)
mcs/mcs/cs-parser.jay
mcs/mcs/statement.cs
mcs/tests/ver-il-net_4_5.xml

index fbd3c2086f8065e28d5b86607da3b482e4b803fe..902690017e992da6e112221bbd8078cc1d7751c8 100644 (file)
@@ -5857,7 +5857,7 @@ yield_statement
                        FeatureIsNotAvailable (lt.Location, "iterators");
                }
                
-               current_block.Explicit.RegisterIteratorYield ();
+               current_block.ParametersBlock.TopBlock.IsIterator = true;
                $$ = new YieldBreak (lt.Location);
                lbag.AddStatement ($$, GetLocation ($2), GetLocation ($3));
          }
index eec04bb687b4a7d633138b887e467c9ffe249044..6a8f29a6d2a772c7abfe7f52cb7dc4b5017c1cfb 100644 (file)
@@ -2059,7 +2059,8 @@ namespace Mono.CSharp {
                        HasAsyncModifier = 1 << 10,
                        Resolved = 1 << 11,
                        YieldBlock = 1 << 12,
-                       AwaitBlock = 1 << 13
+                       AwaitBlock = 1 << 13,
+                       Iterator = 1 << 14
                }
 
                public Block Parent;
@@ -2664,6 +2665,8 @@ namespace Mono.CSharp {
 
                public void RegisterIteratorYield ()
                {
+                       ParametersBlock.TopBlock.IsIterator = true;
+
                        var block = this;
                        while ((block.flags & Flags.YieldBlock) == 0) {
                                block.flags |= Flags.YieldBlock;
@@ -3207,7 +3210,10 @@ namespace Mono.CSharp {
 
                public bool IsIterator {
                        get {
-                               return HasYield;
+                               return (flags & Flags.Iterator) != 0;
+                       }
+                       set {
+                               flags = value ? flags | Flags.Iterator : flags & ~Flags.Iterator;
                        }
                }
 
index b41bd8cf7798e1251c640d0da31eb3c3ac948ebe..d0f29b72b54df41af28b9262ba41469ab89ff6eb 100644 (file)
         <size>26</size>\r
       </method>\r
       <method name="Boolean MoveNext()" attrs="486">\r
-        <size>75</size>\r
+        <size>60</size>\r
       </method>\r
       <method name="Void Dispose()" attrs="486">\r
         <size>1</size>\r
         <size>26</size>\r
       </method>\r
       <method name="Boolean MoveNext()" attrs="486">\r
-        <size>37</size>\r
+        <size>32</size>\r
       </method>\r
       <method name="Void Dispose()" attrs="486">\r
         <size>1</size>\r
         <size>26</size>\r
       </method>\r
       <method name="Boolean MoveNext()" attrs="486">\r
-        <size>37</size>\r
+        <size>32</size>\r
       </method>\r
       <method name="Void Dispose()" attrs="486">\r
         <size>1</size>\r
         <size>26</size>\r
       </method>\r
       <method name="Boolean MoveNext()" attrs="486">\r
-        <size>37</size>\r
+        <size>32</size>\r
       </method>\r
       <method name="Void Dispose()" attrs="486">\r
         <size>1</size>\r