diff --git a/NETGenerator/NETGenerator.cs b/NETGenerator/NETGenerator.cs index 2390dc7b8..3333e6422 100644 --- a/NETGenerator/NETGenerator.cs +++ b/NETGenerator/NETGenerator.cs @@ -10399,7 +10399,9 @@ namespace PascalABCCompiler.NETGenerator il.Emit(OpCodes.Stloc, lb); il.Emit(OpCodes.Call, _monitor_enter); il.BeginExceptionBlock(); + bool safe_block = EnterSafeBlock(); ConvertStatement(value.Body); + LeaveSafeBlock(safe_block); il.BeginFinallyBlock(); il.Emit(OpCodes.Ldloc, lb); il.Emit(OpCodes.Call, _monitor_exit); diff --git a/TestSuite/lock1.pas b/TestSuite/lock1.pas new file mode 100644 index 000000000..c9844baf8 --- /dev/null +++ b/TestSuite/lock1.pas @@ -0,0 +1,54 @@ +type t1 = class end;//любой ссылочный тип + +var i: integer; + +procedure p1; +begin + lock new t1 do + begin + i := 1; + exit; + end; +end; + +procedure p2; +begin + loop 1 do + lock new t1 do + begin + i := 2; + continue; + end; +end; + +procedure p3; +begin + loop 1 do + lock new t1 do + begin + i := 3; + break; + end; +end; + +procedure p4; +label l1; +begin + lock new t1 do + begin + i := 4; + goto l1; + end; + l1: +end; + +begin + p1; + assert(i = 1); + p2; + assert(i = 2); + p3; + assert(i = 3); + p4; + assert(i = 4); +end. \ No newline at end of file