protected override void Execute(LocalsCtxMenuContext context) { var output = new PlainTextOutput(); foreach (var vm in context.SelectedItems) { //TODO: Break if it takes too long and the user cancels var printer = new ValuePrinter(output, DebuggerSettings.Instance.UseHexadecimal); printer.WriteExpander(vm); output.Write('\t', TextTokenType.Text); // Add an extra here to emulate VS output output.Write('\t', TextTokenType.Text); printer.WriteName(vm); output.Write('\t', TextTokenType.Text); printer.WriteValue(vm); output.Write('\t', TextTokenType.Text); printer.WriteType(vm); output.WriteLine(); } var s = output.ToString(); if (s.Length > 0) { Clipboard.SetText(s); } }
private static void WriteTo(this FieldReference field, PlainTextOutput writer) { field.FieldType.WriteTo(writer, IlNameSyntax.SignatureNoNamedTypeParameters); writer.Write(' '); field.DeclaringType.WriteTo(writer, IlNameSyntax.TypeName); writer.Write("::"); writer.Write(Escape(field.Name)); }
public string Decompile(object @object) { if (@object == null) { return(String.Empty); } Language l = new CSharpLanguage(); //ITextOutput output = new RtfTextOutput(); ITextOutput output = new PlainTextOutput(); var options = new DecompilationOptions(); if (@object is AssemblyDefinition) { l.DecompileAssembly((AssemblyDefinition)@object, output, options); } else if (@object is TypeDefinition) { l.DecompileType((TypeDefinition)@object, output, options); } else if (@object is MethodDefinition) { l.DecompileMethod((MethodDefinition)@object, output, options); } else if (@object is FieldDefinition) { l.DecompileField((FieldDefinition)@object, output, options); } else if (@object is PropertyDefinition) { l.DecompileProperty((PropertyDefinition)@object, output, options); } else if (@object is EventDefinition) { l.DecompileEvent((EventDefinition)@object, output, options); } else if (@object is AssemblyNameReference) { output.Write("// Assembly Reference "); output.WriteDefinition(@object.ToString(), null); output.WriteLine(); } else if (@object is ModuleReference) { output.Write("// Module Reference "); output.WriteDefinition(@object.ToString(), null); output.WriteLine(); } else { output.Write(String.Format("// {0} ", @object.GetType().Name)); output.WriteDefinition(@object.ToString(), null); output.WriteLine(); } return(output.ToString()); }
private static void WriteLabelList(PlainTextOutput writer, Instruction[] instructions) { writer.Write("("); for (var i = 0; i < instructions.Length; i++) { if (i != 0) writer.Write(", "); WriteOffsetReference(writer, instructions[i]); } writer.Write(")"); }
private static void WriteLabelList(PlainTextOutput writer, Instruction[] instructions) { writer.Write("("); for (var i = 0; i < instructions.Length; i++) { if (i != 0) { writer.Write(", "); } WriteOffsetReference(writer, instructions[i]); } writer.Write(")"); }
protected override void CopyItemsAsText(LocalVM[] locals) { Array.Sort(locals, (a, b) => a.Index.CompareTo(b.Index)); var output = new PlainTextOutput(); for (int i = 0; i < locals.Length; i++) { if (i > 0) { output.WriteLine(); } var local = locals[i]; output.Write(local.Index.ToString(), TextTokenType.Number); output.Write('\t', TextTokenType.Text); output.Write(local.IsPinned ? "P" : string.Empty, TextTokenType.Text); output.Write('\t', TextTokenType.Text); output.Write(local.IsCompilerGenerated ? "C" : string.Empty, TextTokenType.Text); output.Write('\t', TextTokenType.Text); output.Write(local.Name ?? string.Empty, TextTokenType.Local); output.Write('\t', TextTokenType.Text); BodyUtils.WriteObject(output, local.Type); } if (locals.Length > 1) { output.WriteLine(); } Clipboard.SetText(output.ToString()); }
public override string ToString() { var output = new PlainTextOutput(); WriteTo(output, new ILAstWritingOptions()); if (!ILRange.IsEmpty) { output.Write(" at IL_" + ILRange.Start.ToString("x4")); } return(output.ToString()); }
public static void WriteTo(this Instruction instruction, PlainTextOutput writer) { writer.Write($"IL_{instruction.Offset:x4}"); writer.Write(": "); writer.Write(instruction.OpCode.Name); if (instruction.Operand == null) { return; } writer.Write(' '); if (instruction.OpCode == OpCodes.Ldtoken) { if (instruction.Operand is MethodReference) { writer.Write("method "); } else if (instruction.Operand is FieldReference) { writer.Write("field "); } } WriteOperand(writer, instruction.Operand); }
protected override void Execute(BreakpointCtxMenuContext context) { var output = new PlainTextOutput(); foreach (var vm in context.SelectedItems) { var printer = new BreakpointPrinter(output, DebuggerSettings.Instance.UseHexadecimal); printer.WriteName(vm); output.Write('\t', TextTokenType.Text); printer.WriteAssembly(vm); output.Write('\t', TextTokenType.Text); printer.WriteModule(vm); output.Write('\t', TextTokenType.Text); printer.WriteFile(vm); output.WriteLine(); } var s = output.ToString(); if (s.Length > 0) { Clipboard.SetText(s); } }
protected override void Execute(ModulesCtxMenuContext context) { var output = new PlainTextOutput(); foreach (var vm in context.SelectedItems) { var printer = new ModulePrinter(output, DebuggerSettings.Instance.UseHexadecimal); printer.WriteName(vm); output.Write('\t', TextTokenType.Text); printer.WriteOptimized(vm); output.Write('\t', TextTokenType.Text); printer.WriteDynamic(vm); output.Write('\t', TextTokenType.Text); printer.WriteInMemory(vm); output.Write('\t', TextTokenType.Text); printer.WriteOrder(vm); output.Write('\t', TextTokenType.Text); printer.WriteVersion(vm); output.Write('\t', TextTokenType.Text); printer.WriteTimestamp(vm); output.Write('\t', TextTokenType.Text); printer.WriteAddress(vm); output.Write('\t', TextTokenType.Text); printer.WriteProcess(vm); output.Write('\t', TextTokenType.Text); printer.WriteAppDomain(vm); output.Write('\t', TextTokenType.Text); printer.WritePath(vm); output.WriteLine(); } var s = output.ToString(); if (s.Length > 0) { Clipboard.SetText(s); } }
protected override void CopyItemsAsText(ExceptionHandlerVM[] ehs) { Array.Sort(ehs, (a, b) => a.Index.CompareTo(b.Index)); var output = new PlainTextOutput(); for (int i = 0; i < ehs.Length; i++) { if (i > 0) { output.WriteLine(); } var eh = ehs[i]; output.Write(eh.Index.ToString(), TextTokenType.Number); output.Write('\t', TextTokenType.Text); BodyUtils.WriteObject(output, eh.TryStartVM.SelectedItem); output.Write('\t', TextTokenType.Text); BodyUtils.WriteObject(output, eh.TryEndVM.SelectedItem); output.Write('\t', TextTokenType.Text); BodyUtils.WriteObject(output, eh.FilterStartVM.SelectedItem); output.Write('\t', TextTokenType.Text); BodyUtils.WriteObject(output, eh.HandlerStartVM.SelectedItem); output.Write('\t', TextTokenType.Text); BodyUtils.WriteObject(output, eh.HandlerEndVM.SelectedItem); output.Write('\t', TextTokenType.Text); output.Write(((EnumVM)eh.HandlerTypeVM.Items[eh.HandlerTypeVM.SelectedIndex]).Name, TextTokenType.Text); output.Write('\t', TextTokenType.Text); BodyUtils.WriteObject(output, eh.CatchType); } if (ehs.Length > 1) { output.WriteLine(); } Clipboard.SetText(output.ToString()); }
public static void WriteTo(this Instruction instruction, PlainTextOutput writer) { writer.Write($"IL_{instruction.Offset:x4}"); writer.Write(": "); writer.Write(instruction.OpCode.Name); if (instruction.Operand == null) return; writer.Write(' '); if (instruction.OpCode == OpCodes.Ldtoken) { if (instruction.Operand is MethodReference) writer.Write("method "); else if (instruction.Operand is FieldReference) writer.Write("field "); } WriteOperand(writer, instruction.Operand); }
public static void WriteTo(this TypeReference type, PlainTextOutput writer, IlNameSyntax syntax = IlNameSyntax.Signature) { var syntaxForElementTypes = syntax == IlNameSyntax.SignatureNoNamedTypeParameters ? syntax : IlNameSyntax.Signature; if (type is PinnedType) { ((PinnedType)type).ElementType.WriteTo(writer, syntaxForElementTypes); writer.Write(" pinned"); } else if (type is ArrayType) { var at = (ArrayType)type; at.ElementType.WriteTo(writer, syntaxForElementTypes); writer.Write('['); writer.Write(string.Join(", ", at.Dimensions)); writer.Write(']'); } else if (type is GenericParameter) { writer.Write('!'); if (((GenericParameter)type).Owner.GenericParameterType == GenericParameterType.Method) { writer.Write('!'); } if (string.IsNullOrEmpty(type.Name) || type.Name[0] == '!' || syntax == IlNameSyntax.SignatureNoNamedTypeParameters) { writer.Write(((GenericParameter)type).Position.ToString()); } else { writer.Write(Escape(type.Name)); } } else if (type is ByReferenceType) { ((ByReferenceType)type).ElementType.WriteTo(writer, syntaxForElementTypes); writer.Write('&'); } else if (type is PointerType) { ((PointerType)type).ElementType.WriteTo(writer, syntaxForElementTypes); writer.Write('*'); } else if (type is GenericInstanceType) { type.GetElementType().WriteTo(writer, syntaxForElementTypes); writer.Write('<'); var arguments = ((GenericInstanceType)type).GenericArguments; for (var i = 0; i < arguments.Count; i++) { if (i > 0) { writer.Write(", "); } arguments[i].WriteTo(writer, syntaxForElementTypes); } writer.Write('>'); } else if (type is OptionalModifierType) { ((OptionalModifierType)type).ElementType.WriteTo(writer, syntax); writer.Write(" modopt("); ((OptionalModifierType)type).ModifierType.WriteTo(writer, IlNameSyntax.TypeName); writer.Write(") "); } else if (type is RequiredModifierType) { ((RequiredModifierType)type).ElementType.WriteTo(writer, syntax); writer.Write(" modreq("); ((RequiredModifierType)type).ModifierType.WriteTo(writer, IlNameSyntax.TypeName); writer.Write(") "); } else { var name = PrimitiveTypeName(type.FullName); if ((syntax == IlNameSyntax.Signature || syntax == IlNameSyntax.SignatureNoNamedTypeParameters) && name != null) { writer.Write(name); } else { if (syntax == IlNameSyntax.Signature || syntax == IlNameSyntax.SignatureNoNamedTypeParameters) { writer.Write(type.IsValueType ? "valuetype " : "class "); } if (type.DeclaringType != null) { type.DeclaringType.WriteTo(writer, IlNameSyntax.TypeName); writer.Write('/'); writer.Write(Escape(type.Name)); } else { if (!type.IsDefinition && type.Scope != null && !(type is TypeSpecification)) { writer.Write("[{0}]", Escape(type.Scope.Name)); } writer.Write(Escape(type.FullName)); } } } }
public void Disassemble(MethodBody body) { // start writing IL code var method = body.Method; var codesize = body.ComputeCodeSize(); var maxstacksize = body.ComputeMaxStackSize(); body.ComputeOffsets(); _o.WriteLine("// Code size {0} (0x{0:x})", codesize); _o.WriteLine(".maxstack {0}", maxstacksize); if (method.DeclaringType.Module.Assembly != null && method.DeclaringType.Module.Assembly.EntryPoint == method) { _o.WriteLine(".entrypoint"); } if (method.Body.HasVariables) { _o.Write(".locals "); if (body.InitLocals) { _o.Write("init "); } _o.WriteLine("("); _o.Indent(); foreach (var v in body.Variables) { _o.Write("[" + v.Index + "] "); v.VariableType.WriteTo(_o); if (!string.IsNullOrEmpty(v.Name)) { _o.Write(' '); _o.Write(DisassemblerHelpers.Escape(v.Name)); } if (v.Index + 1 < body.Variables.Count) { _o.Write(','); } _o.WriteLine(); } _o.Unindent(); _o.WriteLine(")"); } _o.WriteLine(); if (body.Instructions.Count > 0) { var inst = body.Instructions[0]; var branchTargets = GetBranchTargets(body.Instructions); WriteStructureBody(new IlStructure(body, codesize), branchTargets, ref inst); } else { // we ignore method without instructions (but it can have exception handlers) _o.WriteLine(); } }
public static void WriteOperand(PlainTextOutput writer, object operand) { if (operand == null) { throw new ArgumentNullException(nameof(operand)); } var targetInstruction = operand as Instruction; if (targetInstruction != null) { WriteOffsetReference(writer, targetInstruction); return; } var targetInstructions = operand as Instruction[]; if (targetInstructions != null) { WriteLabelList(writer, targetInstructions); return; } var variableRef = operand as VariableReference; if (variableRef != null) { writer.Write(string.IsNullOrEmpty(variableRef.Name) ? variableRef.Index.ToString() : Escape(variableRef.Name)); return; } var paramRef = operand as ParameterReference; if (paramRef != null) { writer.Write(string.IsNullOrEmpty(paramRef.Name) ? paramRef.Index.ToString() : Escape(paramRef.Name)); return; } var methodRef = operand as MethodReference; if (methodRef != null) { methodRef.WriteTo(writer); return; } var typeRef = operand as TypeReference; if (typeRef != null) { typeRef.WriteTo(writer, IlNameSyntax.TypeName); return; } var fieldRef = operand as FieldReference; if (fieldRef != null) { fieldRef.WriteTo(writer); return; } var s = operand as string; if (s != null) { writer.Write("\"" + ConvertString(s) + "\""); } else if (operand is char) { writer.Write(((int)(char)operand).ToString()); } else if (operand is float) { var val = (float)operand; if (val == 0) { if (float.IsNegativeInfinity(1 / val)) { // negative zero is a special case writer.Write('-'); } writer.Write("0.0"); } else if (float.IsInfinity(val) || float.IsNaN(val)) { var data = BitConverter.GetBytes(val); writer.Write('('); for (var i = 0; i < data.Length; i++) { if (i > 0) { writer.Write(' '); } writer.Write(data[i].ToString("X2")); } writer.Write(')'); } else { writer.Write(val.ToString("R", System.Globalization.CultureInfo.InvariantCulture)); } } else if (operand is double) { var val = (double)operand; if (val == 0) { if (double.IsNegativeInfinity(1 / val)) { // negative zero is a special case writer.Write('-'); } writer.Write("0.0"); } else if (double.IsInfinity(val) || double.IsNaN(val)) { var data = BitConverter.GetBytes(val); writer.Write('('); for (var i = 0; i < data.Length; i++) { if (i > 0) { writer.Write(' '); } writer.Write(data[i].ToString("X2")); } writer.Write(')'); } else { writer.Write(val.ToString("R", System.Globalization.CultureInfo.InvariantCulture)); } } else if (operand is bool) { writer.Write((bool)operand ? "true" : "false"); } else { s = ToInvariantCultureString(operand); writer.Write(s); } }
public static void CopyItemsAsTextToClipboard(InstructionVM[] instrs) { var output = new PlainTextOutput(); for (int i = 0; i < instrs.Length; i++) { if (i > 0) { output.WriteLine(); } var instr = instrs[i]; output.Write(instr.Index.ToString(), TextTokenType.Number); output.Write('\t', TextTokenType.Text); output.Write(string.Format("{0:X4}", instr.Offset), TextTokenType.Label); output.Write('\t', TextTokenType.Text); output.Write(instr.Code.ToOpCode().ToString(), TextTokenType.OpCode); switch (instr.InstructionOperandVM.InstructionOperandType) { case InstructionOperandType.None: break; case InstructionOperandType.SByte: output.Write('\t', TextTokenType.Text); output.Write(instr.InstructionOperandVM.SByte.StringValue, TextTokenType.Number); break; case InstructionOperandType.Byte: output.Write('\t', TextTokenType.Text); output.Write(instr.InstructionOperandVM.Byte.StringValue, TextTokenType.Number); break; case InstructionOperandType.Int32: output.Write('\t', TextTokenType.Text); output.Write(instr.InstructionOperandVM.Int32.StringValue, TextTokenType.Number); break; case InstructionOperandType.Int64: output.Write('\t', TextTokenType.Text); output.Write(instr.InstructionOperandVM.Int64.StringValue, TextTokenType.Number); break; case InstructionOperandType.Single: output.Write('\t', TextTokenType.Text); output.Write(instr.InstructionOperandVM.Single.StringValue, TextTokenType.Number); break; case InstructionOperandType.Double: output.Write('\t', TextTokenType.Text); output.Write(instr.InstructionOperandVM.Double.StringValue, TextTokenType.Number); break; case InstructionOperandType.String: output.Write('\t', TextTokenType.Text); output.Write(instr.InstructionOperandVM.String.StringValue, TextTokenType.String); break; case InstructionOperandType.Field: case InstructionOperandType.Method: case InstructionOperandType.Token: case InstructionOperandType.Type: case InstructionOperandType.MethodSig: case InstructionOperandType.BranchTarget: case InstructionOperandType.SwitchTargets: case InstructionOperandType.Local: case InstructionOperandType.Parameter: output.Write('\t', TextTokenType.Text); BodyUtils.WriteObject(output, instr.InstructionOperandVM.Value); break; default: throw new InvalidOperationException(); } } if (instrs.Length > 1) { output.WriteLine(); } Clipboard.SetText(output.ToString()); }
private static void WriteTo(this FieldReference field, PlainTextOutput writer) { field.FieldType.WriteTo(writer, IlNameSyntax.SignatureNoNamedTypeParameters); writer.Write(' '); field.DeclaringType.WriteTo(writer, IlNameSyntax.TypeName); writer.Write("::"); writer.Write(Escape(field.Name)); }
public static void WriteOffsetReference(PlainTextOutput writer, Instruction instruction) { writer.Write($"IL_{instruction.Offset:x4}"); }
public static void WriteOperand(PlainTextOutput writer, object operand) { if (operand == null) throw new ArgumentNullException(nameof(operand)); var targetInstruction = operand as Instruction; if (targetInstruction != null) { WriteOffsetReference(writer, targetInstruction); return; } var targetInstructions = operand as Instruction[]; if (targetInstructions != null) { WriteLabelList(writer, targetInstructions); return; } var variableRef = operand as VariableReference; if (variableRef != null) { writer.Write(string.IsNullOrEmpty(variableRef.Name) ? variableRef.Index.ToString() : Escape(variableRef.Name)); return; } var paramRef = operand as ParameterReference; if (paramRef != null) { writer.Write(string.IsNullOrEmpty(paramRef.Name) ? paramRef.Index.ToString() : Escape(paramRef.Name)); return; } var methodRef = operand as MethodReference; if (methodRef != null) { methodRef.WriteTo(writer); return; } var typeRef = operand as TypeReference; if (typeRef != null) { typeRef.WriteTo(writer, IlNameSyntax.TypeName); return; } var fieldRef = operand as FieldReference; if (fieldRef != null) { fieldRef.WriteTo(writer); return; } var s = operand as string; if (s != null) { writer.Write("\"" + ConvertString(s) + "\""); } else if (operand is char) { writer.Write(((int)(char)operand).ToString()); } else if (operand is float) { var val = (float)operand; if (val == 0) { if (float.IsNegativeInfinity(1 / val)) // negative zero is a special case writer.Write('-'); writer.Write("0.0"); } else if (float.IsInfinity(val) || float.IsNaN(val)) { var data = BitConverter.GetBytes(val); writer.Write('('); for (var i = 0; i < data.Length; i++) { if (i > 0) writer.Write(' '); writer.Write(data[i].ToString("X2")); } writer.Write(')'); } else { writer.Write(val.ToString("R", System.Globalization.CultureInfo.InvariantCulture)); } } else if (operand is double) { var val = (double)operand; if (val == 0) { if (double.IsNegativeInfinity(1 / val)) // negative zero is a special case writer.Write('-'); writer.Write("0.0"); } else if (double.IsInfinity(val) || double.IsNaN(val)) { var data = BitConverter.GetBytes(val); writer.Write('('); for (var i = 0; i < data.Length; i++) { if (i > 0) writer.Write(' '); writer.Write(data[i].ToString("X2")); } writer.Write(')'); } else { writer.Write(val.ToString("R", System.Globalization.CultureInfo.InvariantCulture)); } } else if (operand is bool) { writer.Write((bool)operand ? "true" : "false"); } else { s = ToInvariantCultureString(operand); writer.Write(s); } }
public static void WriteTo(this TypeReference type, PlainTextOutput writer, IlNameSyntax syntax = IlNameSyntax.Signature) { var syntaxForElementTypes = syntax == IlNameSyntax.SignatureNoNamedTypeParameters ? syntax : IlNameSyntax.Signature; if (type is PinnedType) { ((PinnedType)type).ElementType.WriteTo(writer, syntaxForElementTypes); writer.Write(" pinned"); } else if (type is ArrayType) { var at = (ArrayType)type; at.ElementType.WriteTo(writer, syntaxForElementTypes); writer.Write('['); writer.Write(string.Join(", ", at.Dimensions)); writer.Write(']'); } else if (type is GenericParameter) { writer.Write('!'); if (((GenericParameter)type).Owner.GenericParameterType == GenericParameterType.Method) writer.Write('!'); if (string.IsNullOrEmpty(type.Name) || type.Name[0] == '!' || syntax == IlNameSyntax.SignatureNoNamedTypeParameters) writer.Write(((GenericParameter)type).Position.ToString()); else writer.Write(Escape(type.Name)); } else if (type is ByReferenceType) { ((ByReferenceType)type).ElementType.WriteTo(writer, syntaxForElementTypes); writer.Write('&'); } else if (type is PointerType) { ((PointerType)type).ElementType.WriteTo(writer, syntaxForElementTypes); writer.Write('*'); } else if (type is GenericInstanceType) { type.GetElementType().WriteTo(writer, syntaxForElementTypes); writer.Write('<'); var arguments = ((GenericInstanceType)type).GenericArguments; for (var i = 0; i < arguments.Count; i++) { if (i > 0) writer.Write(", "); arguments[i].WriteTo(writer, syntaxForElementTypes); } writer.Write('>'); } else if (type is OptionalModifierType) { ((OptionalModifierType)type).ElementType.WriteTo(writer, syntax); writer.Write(" modopt("); ((OptionalModifierType)type).ModifierType.WriteTo(writer, IlNameSyntax.TypeName); writer.Write(") "); } else if (type is RequiredModifierType) { ((RequiredModifierType)type).ElementType.WriteTo(writer, syntax); writer.Write(" modreq("); ((RequiredModifierType)type).ModifierType.WriteTo(writer, IlNameSyntax.TypeName); writer.Write(") "); } else { var name = PrimitiveTypeName(type.FullName); if ((syntax == IlNameSyntax.Signature || syntax == IlNameSyntax.SignatureNoNamedTypeParameters) && name != null) { writer.Write(name); } else { if (syntax == IlNameSyntax.Signature || syntax == IlNameSyntax.SignatureNoNamedTypeParameters) writer.Write(type.IsValueType ? "valuetype " : "class "); if (type.DeclaringType != null) { type.DeclaringType.WriteTo(writer, IlNameSyntax.TypeName); writer.Write('/'); writer.Write(Escape(type.Name)); } else { if (!type.IsDefinition && type.Scope != null && !(type is TypeSpecification)) writer.Write("[{0}]", Escape(type.Scope.Name)); writer.Write(Escape(type.FullName)); } } } }
protected override void Execute(ThreadsCtxMenuContext context) { var output = new PlainTextOutput(); foreach (var vm in context.SelectedItems) { var printer = new ThreadPrinter(output, DebuggerSettings.Instance.UseHexadecimal); printer.WriteCurrent(vm); output.Write('\t', TextTokenType.Text); printer.WriteId(vm); output.Write('\t', TextTokenType.Text); printer.WriteManagedId(vm); output.Write('\t', TextTokenType.Text); printer.WriteCategory(vm); output.Write('\t', TextTokenType.Text); printer.WriteName(vm); output.Write('\t', TextTokenType.Text); printer.WriteLocation(vm); output.Write('\t', TextTokenType.Text); printer.WritePriority(vm); output.Write('\t', TextTokenType.Text); printer.WriteAffinityMask(vm); output.Write('\t', TextTokenType.Text); printer.WriteSuspended(vm); output.Write('\t', TextTokenType.Text); printer.WriteProcess(vm); output.Write('\t', TextTokenType.Text); printer.WriteAppDomain(vm); output.Write('\t', TextTokenType.Text); printer.WriteUserState(vm); output.WriteLine(); } var s = output.ToString(); if (s.Length > 0) { Clipboard.SetText(s); } }
private static void WriteTypeParameters(PlainTextOutput output, IGenericParameterProvider p) { if (!p.HasGenericParameters) { return; } output.Write('<'); for (var i = 0; i < p.GenericParameters.Count; i++) { if (i > 0) { output.Write(", "); } var gp = p.GenericParameters[i]; if (gp.HasReferenceTypeConstraint) { output.Write("class "); } else if (gp.HasNotNullableValueTypeConstraint) { output.Write("valuetype "); } if (gp.HasDefaultConstructorConstraint) { output.Write(".ctor "); } if (gp.HasConstraints) { output.Write('('); for (var j = 0; j < gp.Constraints.Count; j++) { if (j > 0) { output.Write(", "); } gp.Constraints[j].WriteTo(output, IlNameSyntax.TypeName); } output.Write(") "); } if (gp.IsContravariant) { output.Write('-'); } else if (gp.IsCovariant) { output.Write('+'); } output.Write(DisassemblerHelpers.Escape(gp.Name)); } output.Write('>'); }
public static void WriteTo(this MethodReference method, PlainTextOutput writer) { if (method.ExplicitThis) writer.Write("instance explicit "); else if (method.HasThis) writer.Write("instance "); method.ReturnType.WriteTo(writer, IlNameSyntax.SignatureNoNamedTypeParameters); writer.Write(' '); if (method.DeclaringType != null) { method.DeclaringType.WriteTo(writer, IlNameSyntax.TypeName); writer.Write("::"); } var md = method as MethodDefinition; if (md != null && md.IsCompilerControlled) { writer.Write(Escape(method.Name + "$PST" + method.MetadataToken.ToInt32().ToString("X8"))); } else { writer.Write(Escape(method.Name)); } var gim = method as GenericInstanceMethod; if (gim != null) { writer.Write('<'); for (var i = 0; i < gim.GenericArguments.Count; i++) { if (i > 0) writer.Write(", "); gim.GenericArguments[i].WriteTo(writer); } writer.Write('>'); } writer.Write("("); var parameters = method.Parameters; for (var i = 0; i < parameters.Count; ++i) { if (i > 0) writer.Write(", "); parameters[i].ParameterType.WriteTo(writer, IlNameSyntax.SignatureNoNamedTypeParameters); } writer.Write(")"); }
public static void WriteOffsetReference(PlainTextOutput writer, Instruction instruction) { writer.Write($"IL_{instruction.Offset:x4}"); }
public static void WriteTo(this MethodReference method, PlainTextOutput writer) { if (method.ExplicitThis) { writer.Write("instance explicit "); } else if (method.HasThis) { writer.Write("instance "); } method.ReturnType.WriteTo(writer, IlNameSyntax.SignatureNoNamedTypeParameters); writer.Write(' '); if (method.DeclaringType != null) { method.DeclaringType.WriteTo(writer, IlNameSyntax.TypeName); writer.Write("::"); } var md = method as MethodDefinition; if (md != null && md.IsCompilerControlled) { writer.Write(Escape(method.Name + "$PST" + method.MetadataToken.ToInt32().ToString("X8"))); } else { writer.Write(Escape(method.Name)); } var gim = method as GenericInstanceMethod; if (gim != null) { writer.Write('<'); for (var i = 0; i < gim.GenericArguments.Count; i++) { if (i > 0) { writer.Write(", "); } gim.GenericArguments[i].WriteTo(writer); } writer.Write('>'); } writer.Write("("); var parameters = method.Parameters; for (var i = 0; i < parameters.Count; ++i) { if (i > 0) { writer.Write(", "); } parameters[i].ParameterType.WriteTo(writer, IlNameSyntax.SignatureNoNamedTypeParameters); } writer.Write(")"); }