/// <summary> /// Obtains a reference to the singleton /// </summary> /// <returns>The reference</returns> public static OpCodesMap GetSingleton() { if (OpCodesMap._singleton == null) { OpCodesMap._singleton = new OpCodesMap(); } return(OpCodesMap._singleton); }
/// <summary> /// Returns an array of instructions that describe the code portion of this method. /// </summary> /// <returns>The array of instructions</returns> private ILInstruction[] GetInstructions(byte[] fromILBytes) { List <ILInstruction> il = new List <ILInstruction>(); OpCodesMap map = OpCodesMap.GetSingleton(); // for now iterate over the IL bytes and change them to opcodes for (int i = 0; i < fromILBytes.Length; i++) { byte current = fromILBytes[i]; OpCode code = OpCodes.Nop; if (current != 0xfe) { code = map.GetCode(current); } else { code = map.GetCode(BitConverter.ToInt16(fromILBytes, i)); i++; } ILInstruction instruction = null; switch (code.OperandType) { case OperandType.InlineNone: instruction = new InlineNoneILInstruction(code); break; case OperandType.ShortInlineBrTarget: instruction = new ShortInlineBrTargetILInstruction(code, fromILBytes[i++]); break; case OperandType.InlineBrTarget: instruction = new InlineBrTargetILInstruction(code, BitConverter.ToInt32(fromILBytes, i + 1)); i += 4; break; case OperandType.ShortInlineI: instruction = new ShortInlineIILInstruction(code, fromILBytes[i++]); break; case OperandType.ShortInlineR: instruction = new ShortInlineRILInstruction(code, BitConverter.ToSingle(fromILBytes, i + 1)); i += 4; break; case OperandType.ShortInlineVar: instruction = new ShortInlineVarILInstruction(code, fromILBytes[i++]); break; case OperandType.InlineI: instruction = new InlineIILInstruction(code, BitConverter.ToUInt32(fromILBytes, i + 1)); i += 4; break; case OperandType.InlineVar: instruction = new InlineVarILInstruction(code, BitConverter.ToUInt16(fromILBytes, i + 1)); i += 2; break; case OperandType.InlineR: instruction = new InlineRILInstruction(code, BitConverter.ToDouble(fromILBytes, i + 1)); i += 8; break; case OperandType.InlineI8: instruction = new InlineI8ILInstruction(code, BitConverter.ToUInt64(fromILBytes, i + 1)); i += 8; break; case OperandType.InlineString: instruction = new InlineStringILInstruction(this.Assembly, code, BitConverter.ToInt32(fromILBytes, i + 1)); i += 4; break; case OperandType.InlineSig: instruction = new InlineSigILInstruction(this.Assembly, code, BitConverter.ToInt32(fromILBytes, i + 1)); i += 4; break; case OperandType.InlineField: instruction = new InlineFieldILInstruction(this.Assembly, code, BitConverter.ToUInt32(fromILBytes, i + 1)); i += 4; break; case OperandType.InlineMethod: instruction = new InlineMethodILInstruction(this.Assembly, code, BitConverter.ToUInt32(fromILBytes, i + 1)); i += 4; break; case OperandType.InlineType: instruction = new InlineTypeILInstruction(this.Assembly, code, BitConverter.ToUInt32(fromILBytes, i + 1)); i += 4; break; case OperandType.InlineTok: instruction = new InlineTokenILInstruction(this.Assembly, code, BitConverter.ToUInt32(fromILBytes, i + 1)); i += 4; break; case OperandType.InlineSwitch: Int32 cases = BitConverter.ToInt32(fromILBytes, i + 1); i += 4; Int32[] jumpTargets = new Int32[cases]; for (Int32 counter = 0; counter < cases; counter++) { jumpTargets[counter] = BitConverter.ToInt32(fromILBytes, i + 1); i += 4; } instruction = new InlineSwitchILInstruction(code, jumpTargets); break; default: instruction = new ILInstruction(code); break; } il.Add(instruction); } return(il.ToArray()); }