You're right--it turns out that I didn't replace the branch targets with the
new instructions and it was causing problems with the newly-generated
method. Thanks for your help.


On Mon, May 2, 2011 at 10:40 PM, Jb Evain <[email protected]> wrote:

> On Mon, May 2, 2011 at 1:36 PM, Philip Laureano
> <[email protected]> wrote:
> > Here's the complete example--I can't seem to figure out how to fix the
> > invalid branch targets. In this case, I inserted instructions between the
> > branch instruction and the instruction target but it doesn't appear to
> have
> > updated the code with the correct offsets. The new branch target offsets
> > seem to be the same as the original instructions.
>
> That's an issue on your side. If you add the following code after you
> instrumented the method body:
>
>                        foreach (var instruction in body.Instructions) {
>                                switch (instruction.OpCode.OperandType) {
>                                case OperandType.ShortInlineBrTarget:
>                                case OperandType.InlineBrTarget:
>                                        var tgt = (Instruction)
> instruction.Operand;
>                                        if (!body.Instructions.Contains
> (tgt))
>                                                throw new Exception
> ("fubared");
>                                        break;
>                                }
>                        }
>
> You can see that the exception is thrown, meaning that you're
> targeting an instruction that doesn't exist in the method. Cecil
> simply trusts operand here and emits its offset. Cecil could check it,
> but it would be quite costly for each branch instruction to check
> (O(N)) that the operand is in the body.
>
> Jb
>
> --
> --
> mono-cecil

-- 
--
mono-cecil

Reply via email to