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
}

-- 
--
mono-cecil

Reply via email to