Skip to content

Executing result of GetInstructions #19

@sake402

Description

@sake402

Hi.
I am using this library for generating opcodes from a CIL byte[] alongside with the Harmony project.
My concept is to recompile a changed source code on the fly, get a method from the new assembly and then its instructions and replace the new instructions with the old one.

So I have been using the library for getting the new instructions. All works very well until the library encounter a branch instruction in the new code.

Inside the MethodBodyReader.ResolveBranches you have this

switch (instruction.OpCode.OperandType) {
				case OperandType.ShortInlineBrTarget:
				case OperandType.InlineBrTarget:
					instruction.Operand = GetInstruction (instructions, (int) instruction.Operand);
					break;

Which throws exception when harmony is using the opcodes to patch the method.

Given that the operand of branches needs to be an offset to the instruction to branch to, I changed the code to this

var targetInstruction = GetInstruction(instructions, (int)instruction.Operand);
int byteOffset = targetInstruction.Offset - instruction.Offset - 1;
int targetOffset = instructions.IndexOf(targetInstruction);
int instructionOffset = targetOffset - index - 1;
instruction.Operand = (sbyte)(instructionOffset);// //GetInstruction(instructions, (int)instruction.Operand);

But I still get exception anyway. Any pointers from you please...

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions