I have some function that I load with Mono.Cecil, modify and write
back.
This generally works fine, but if I remove the nop operations, the Try/
Catch handlers
break (the TryBegin target instruction is the nop instruction being
removed).
What appears to happen is that even though I use the ILProcessor to
remove the
instruction, the ExceptionHandler still has a reference to the removed
instruction.
For some reason this works fine for the first execption handler, which
gets the
TryBegin offset 0x0b, but the second exception handler should get
0x2a, but also
gets 0x0b. (In Cecil 0.6.7 it got 0x00).
If google groups mess up the formating, I have also put the code on
pastebin:
http://pastebin.com/HDScfLMw
My question is, is there some easy fixup method/trick to get this
working?
Or do I need to create a fixup function that I execute prior to
instruction removal
that updates the exception handlers?
Regards, Kenneth
[NORMAL]
.method public hidebysig virtual instance float32 Op(float32 a,
float32 b) cil managed
{
// Code size 65 (0x41)
.maxstack 2
.locals init (float32 V_0,
float32 V_1,
float32 V_2)
IL_0000: ldc.i4 0x579223a3
IL_0005: ldc.i4.0
IL_0006: call void EnterMethod(int32, int32)
.try
{
IL_000b: nop
IL_000c: ldarg.0
IL_000d: ldarg.1
IL_000e: sub
IL_000f: stloc.0
IL_0010: leave.s IL_0018
} // end .try
fault
{
IL_0012: call void LeaveMethod()
IL_0017: endfinally
} // end handler
IL_0018: call void LeaveMethod()
IL_001d: ldloc.0
IL_001e: stloc.1
IL_001f: ldc.i4 0x579223a3
IL_0024: ldc.i4.1
IL_0025: call void EnterMethod(int32, int32)
.try
{
IL_002a: nop
IL_002b: ldloc.1
IL_002c: call float32 [mscorlib]System.Math::Abs(float32)
IL_0031: stloc.2
IL_0032: leave.s IL_003a
} // end .try
fault
{
IL_0034: call void LeaveMethod()
IL_0039: endfinally
} // end handler
IL_003a: call void LeaveMethod()
IL_003f: ldloc.2
IL_0040: ret
}
[MODIFIED]
.method public hidebysig virtual instance float32 Op(float32 a,
float32 b) cil managed
{
// Code size 63 (0x3f)
.maxstack 2
.locals init (float32 V_0,
float32 V_1,
float32 V_2)
IL_0000: ldc.i4 0x579223a3
IL_0005: ldc.i4.0
IL_0006: call void EnterMethod(int32, int32)
.try
{
.try
{
IL_000b: ldarg.0
IL_000c: ldarg.1
IL_000d: sub
IL_000e: stloc.0
IL_000f: leave.s IL_0017
} // end .try
fault
{
IL_0011: call void LeaveMethod()
IL_0016: endfinally
} // end handler
IL_0017: call void LeaveMethod()
IL_001c: ldloc.0
IL_001d: stloc.1
IL_001e: ldc.i4 0x579223a3
IL_0023: ldc.i4.1
IL_0024: call void EnterMethod(int32, int32)
IL_0029: ldloc.1
IL_002a: call float32 [mscorlib]System.Math::Abs(float32)
IL_002f: stloc.2
IL_0030: leave.s IL_0038
} // end .try
fault
{
IL_0032: call void LeaveMethod()
IL_0037: endfinally
} // end handler
IL_0038: call void LeaveMethod()
IL_003d: ldloc.2
IL_003e: ret
}