// Go through and slap *_S everywhere it's needed for branches private void PatchBranches() { foreach (var start in BranchPatches.Keys.OrderBy(o => o).AsEnumerable()) { var item = BranchPatches[start]; var label = item.Item1; var patcher = item.Item2; var originalOp = item.Item3; if (!Marks.ContainsKey(label)) { throw new SigilVerificationException("Usage of unmarked label " + label, IL.Instructions(AllLocals)); } var stop = Marks[label]; var distance = IL.ByteDistance(start, stop); if (distance >= sbyte.MinValue && distance <= sbyte.MaxValue) { if (originalOp == OpCodes.Switch) { // No short form to be had continue; } if (originalOp == OpCodes.Br) { patcher(OpCodes.Br_S); continue; } if (originalOp == OpCodes.Beq) { patcher(OpCodes.Beq_S); continue; } if (originalOp == OpCodes.Bne_Un) { patcher(OpCodes.Bne_Un_S); continue; } if (originalOp == OpCodes.Bge) { patcher(OpCodes.Bge_S); continue; } if (originalOp == OpCodes.Bge_Un) { patcher(OpCodes.Bge_Un_S); continue; } if (originalOp == OpCodes.Bgt) { patcher(OpCodes.Bgt_S); continue; } if (originalOp == OpCodes.Bgt_Un) { patcher(OpCodes.Bgt_Un_S); continue; } if (originalOp == OpCodes.Ble) { patcher(OpCodes.Ble_S); continue; } if (originalOp == OpCodes.Ble_Un) { patcher(OpCodes.Ble_Un_S); continue; } if (originalOp == OpCodes.Blt) { patcher(OpCodes.Blt_S); continue; } if (originalOp == OpCodes.Blt_Un) { patcher(OpCodes.Blt_Un_S); continue; } if (originalOp == OpCodes.Brfalse) { patcher(OpCodes.Brfalse_S); continue; } if (originalOp == OpCodes.Brtrue) { patcher(OpCodes.Brtrue_S); continue; } if (originalOp == OpCodes.Leave) { patcher(OpCodes.Leave_S); continue; } throw new Exception("Unexpected OpCode: " + originalOp); } } }