Move 2.0 Monitor.Enter back out of the try block
authorMarek Safar <marek.safar@gmail.com>
Fri, 5 Nov 2010 15:00:29 +0000 (15:00 +0000)
committerMarek Safar <marek.safar@gmail.com>
Fri, 5 Nov 2010 15:00:29 +0000 (15:00 +0000)
mcs/mcs/statement.cs

index ad65ad783def7348a091c095dc9f9f2ba3e02da0..feabce3feb80f5b5321fdd8ba1d4b293e2ae5f47 100644 (file)
@@ -4161,6 +4161,12 @@ namespace Mono.CSharp {
                                // Initialize ref variable
                                //
                                lock_taken.EmitAssign (ec, new BoolLiteral (false, loc));
+                       } else {
+                               //
+                               // Monitor.Enter (expr_copy)
+                               //
+                               expr_copy.Emit (ec);
+                               ec.Emit (OpCodes.Call, TypeManager.void_monitor_enter_object);
                        }
                }
 
@@ -4169,15 +4175,13 @@ namespace Mono.CSharp {
                        //
                        // Monitor.Enter (expr_copy, ref lock_taken)
                        //
-                       expr_copy.Emit (ec);
-
                        if (lock_taken != null) {
+                               expr_copy.Emit (ec);
                                lock_taken.LocalInfo.CreateBuilder (ec);
                                lock_taken.AddressOf (ec, AddressOp.Load);
+                               ec.Emit (OpCodes.Call, TypeManager.void_monitor_enter_object);
                        }
 
-                       ec.Emit (OpCodes.Call, TypeManager.void_monitor_enter_object);
-
                        Statement.Emit (ec);
                }