Skip to content

Commit 83b5b35

Browse files
Fix finally generation for AppContext.OnProcessExit (#1291)
Fix finally generation for AppContext.OnProcessExit
1 parent c8eafe5 commit 83b5b35

File tree

1 file changed

+15
-3
lines changed

1 file changed

+15
-3
lines changed

src/coverlet.core/Instrumentation/Instrumenter.cs

+15-3
Original file line numberDiff line numberDiff line change
@@ -305,10 +305,22 @@ private void InstrumentModule()
305305
onProcessExitIl.InsertAfter(lastInst, firstNullParam);
306306
onProcessExitIl.InsertAfter(firstNullParam, secondNullParam);
307307
onProcessExitIl.InsertAfter(secondNullParam, callUnload);
308+
var endFinally = Instruction.Create(OpCodes.Endfinally);
309+
onProcessExitIl.InsertAfter(callUnload, endFinally);
308310
var ret = onProcessExitIl.Create(OpCodes.Ret);
309-
var leave = onProcessExitIl.Create(OpCodes.Leave, ret);
310-
onProcessExitIl.InsertAfter(callUnload, leave);
311-
onProcessExitIl.InsertAfter(leave, ret);
311+
var leaveAfterFinally = onProcessExitIl.Create(OpCodes.Leave, ret);
312+
onProcessExitIl.InsertAfter(endFinally, ret);
313+
foreach (var inst in onProcessExitMethod.Body.Instructions.ToArray())
314+
{
315+
// Patch ret to leave after the finally
316+
if (inst.OpCode == OpCodes.Ret && inst != ret)
317+
{
318+
var leaveBodyInstAfterFinally = onProcessExitIl.Create(OpCodes.Leave, ret);
319+
var prevInst = inst.Previous;
320+
onProcessExitMethod.Body.Instructions.Remove(inst);
321+
onProcessExitIl.InsertAfter(prevInst, leaveBodyInstAfterFinally);
322+
}
323+
}
312324
var handler = new ExceptionHandler(ExceptionHandlerType.Finally)
313325
{
314326
TryStart = onProcessExitIl.Body.Instructions.First(),

0 commit comments

Comments
 (0)