public void DisassembleField(FieldDefinition field) { // create mappings for decompiled fields only this.DecompiledMemberReferences.Add(field.MetadataToken.ToInt32(), field); output.WriteDefinition(".field ", field); WriteEnum(field.Attributes & FieldAttributes.FieldAccessMask, fieldVisibility); const FieldAttributes hasXAttributes = FieldAttributes.HasDefault | FieldAttributes.HasFieldMarshal | FieldAttributes.HasFieldRVA; WriteFlags(field.Attributes & ~(FieldAttributes.FieldAccessMask | hasXAttributes), fieldAttributes); if (field.HasMarshalInfo) { WriteMarshalInfo(field.MarshalInfo); } field.FieldType.WriteTo(output); output.Write(' '); output.Write(DisassemblerHelpers.Escape(field.Name)); if ((field.Attributes & FieldAttributes.HasFieldRVA) == FieldAttributes.HasFieldRVA) { output.Write(" at I_{0:x8}", field.RVA); } if (field.HasConstant) { output.Write(" = "); WriteConstant(field.Constant); } output.WriteLine(); if (field.HasCustomAttributes) { output.MarkFoldStart(); WriteAttributes(field.CustomAttributes); output.MarkFoldEnd(); } }
public void DisassembleField(FieldDefinition field) { _output.WriteDefinition(".field ", field); if (field.HasLayoutInfo) { _output.Write("[" + field.Offset + "] "); } WriteEnum(field.Attributes & FieldAttributes.FieldAccessMask, _fieldVisibility); const FieldAttributes hasXAttributes = FieldAttributes.HasDefault | FieldAttributes.HasFieldMarshal | FieldAttributes.HasFieldRVA; WriteFlags(field.Attributes & ~(FieldAttributes.FieldAccessMask | hasXAttributes), _fieldAttributes); if (field.HasMarshalInfo) { WriteMarshalInfo(field.MarshalInfo); } field.FieldType.WriteTo(_output); _output.Write(' '); _output.Write(DisassemblerHelpers.Escape(field.Name)); if ((field.Attributes & FieldAttributes.HasFieldRVA) == FieldAttributes.HasFieldRVA) { _output.Write(" at I_{0:x8}", field.RVA); } if (field.HasConstant) { _output.Write(" = "); WriteConstant(field.Constant); } _output.WriteLine(); if (field.HasCustomAttributes) { _output.MarkFoldStart(); WriteAttributes(field.CustomAttributes); _output.MarkFoldEnd(); } }
public void NewLine() { if (lastImport) { output.MarkFoldEnd(); lastImport = false; } output.WriteLine(); }
public override void WriteToken(Role role, string token) { switch (token) { case "{": if (role != Roles.LBrace) { output.Write("{"); break; } if (braceLevelWithinType >= 0 || nodeStack.Peek() is TypeDeclaration) { braceLevelWithinType++; } if (nodeStack.OfType <BlockStatement>().Count() <= 1 || FoldBraces) { output.MarkFoldStart(defaultCollapsed: !ExpandMemberDefinitions && braceLevelWithinType == 1); } output.Write("{"); break; case "}": output.Write('}'); if (role != Roles.RBrace) { break; } if (nodeStack.OfType <BlockStatement>().Count() <= 1 || FoldBraces) { output.MarkFoldEnd(); } if (braceLevelWithinType >= 0) { braceLevelWithinType--; } break; default: // Attach member reference to token only if there's no identifier in the current node. var member = SymbolToCecil(GetCurrentMemberReference()); var node = nodeStack.Peek(); if (member != null && node.GetChildByRole(Roles.Identifier).IsNull) { output.WriteReference(token, member); } else { output.Write(token); } break; } }
public void CloseBrace(BraceStyle style) { output.Unindent(); output.Write('}'); if (nodeStack.OfType <BlockStatement>().Count() <= 1 || FoldBraces) { output.MarkFoldEnd(); } if (braceLevelWithinType >= 0) { braceLevelWithinType--; } }
public void CloseBrace(BraceStyle style, out TextLocation?start, out TextLocation?end) { output.Unindent(); start = output.Location; output.WriteRightBrace(); end = output.Location; if (nodeStack.OfType <BlockStatement>().Count() <= 1) { output.MarkFoldEnd(); } if (braceLevelWithinType >= 0) { braceLevelWithinType--; } }
public override void Decompile(Language language, ITextOutput output, DecompilationOptions options) { void HandleException(Exception ex, string message) { language.WriteCommentLine(output, message); output.WriteLine(); output.MarkFoldStart("Exception details", true); output.Write(ex.ToString()); output.MarkFoldEnd(); } try { assembly.WaitUntilLoaded(); // necessary so that load errors are passed on to the caller } catch (AggregateException ex) { language.WriteCommentLine(output, assembly.FileName); switch (ex.InnerException) { case BadImageFormatException badImage: HandleException(badImage, "This file does not contain a managed assembly."); return; case FileNotFoundException fileNotFound: HandleException(fileNotFound, "The file was not found."); return; default: throw; } } language.DecompileAssembly(assembly, output, options); }
public override void WriteTo(ITextOutput output, ILAstWritingOptions options) { output.WriteDefinition("BlockContainer", this); output.Write(' '); output.MarkFoldStart("{...}"); output.WriteLine("{"); output.Indent(); foreach (var inst in Blocks) { if (inst.Parent == this) { inst.WriteTo(output, options); } else { output.Write("stale reference to "); output.WriteReference(inst.Label, inst, isLocal: true); } output.WriteLine(); output.WriteLine(); } output.Unindent(); output.Write("}"); output.MarkFoldEnd(); }
public override void WriteTo(ITextOutput output, ILAstWritingOptions options) { WriteILRange(output, options); output.Write("deconstruct "); output.MarkFoldStart("{...}"); output.WriteLine("{"); output.Indent(); output.WriteLine("init:"); output.Indent(); foreach (var inst in this.Init) { inst.WriteTo(output, options); output.WriteLine(); } output.Unindent(); output.WriteLine("pattern:"); output.Indent(); pattern.WriteTo(output, options); output.Unindent(); output.WriteLine(); output.Write("conversions: "); conversions.WriteTo(output, options); output.WriteLine(); output.Write("assignments: "); assignments.WriteTo(output, options); output.Unindent(); output.WriteLine(); output.Write('}'); output.MarkFoldEnd(); }
public override void WriteTo(ITextOutput output, ILAstWritingOptions options) { ILRange.WriteTo(output, options); output.Write("Block "); output.WriteDefinition(Label, this); if (Parent is BlockContainer) { output.Write(" (incoming: {0})", IncomingEdgeCount); } output.Write(' '); output.MarkFoldStart("{...}"); output.WriteLine("{"); output.Indent(); foreach (var inst in Instructions) { inst.WriteTo(output, options); output.WriteLine(); } if (finalInstruction.OpCode != OpCode.Nop) { output.Write("final: "); finalInstruction.WriteTo(output, options); output.WriteLine(); } output.Unindent(); output.Write("}"); output.MarkFoldEnd(); }
void CloseBlock(string comment = null) { output.Unindent(); output.Write("}"); if (comment != null) output.Write(" // " + comment); output.MarkFoldEnd(); output.WriteLine(); }
public override void WriteTo(ITextOutput output, ILAstWritingOptions options) { output.Write("switch ("); value.WriteTo(output, options); output.Write(") "); output.MarkFoldStart("{...}"); output.WriteLine("{"); output.Indent(); output.Write("default: "); defaultBody.WriteTo(output, options); output.WriteLine(); foreach (var section in this.Sections) { section.WriteTo(output, options); output.WriteLine(); } output.Unindent(); output.Write('}'); output.MarkFoldEnd(); }
public override void WriteTo(ITextOutput output, ILAstWritingOptions options) { WriteILRange(output, options); output.Write("Block "); output.WriteLocalReference(Label, this, isDefinition: true); if (Kind != BlockKind.ControlFlow) { output.Write($" ({Kind})"); } if (Parent is BlockContainer) { output.Write(" (incoming: {0})", IncomingEdgeCount); } output.Write(' '); output.MarkFoldStart("{...}"); output.WriteLine("{"); output.Indent(); int index = 0; foreach (var inst in Instructions) { if (options.ShowChildIndexInBlock) { output.Write("[" + index + "] "); index++; } inst.WriteTo(output, options); output.WriteLine(); } if (finalInstruction.OpCode != OpCode.Nop) { output.Write("final: "); finalInstruction.WriteTo(output, options); output.WriteLine(); } output.Unindent(); output.Write("}"); output.MarkFoldEnd(); }
public override void WriteTo(ITextOutput output, ILAstWritingOptions options) { WriteILRange(output, options); output.Write("switch"); if (IsLifted) { output.Write(".lifted"); } output.Write(" ("); value.WriteTo(output, options); output.Write(") "); output.MarkFoldStart("{...}"); output.WriteLine("{"); output.Indent(); foreach (var section in this.Sections) { section.WriteTo(output, options); output.WriteLine(); } output.Unindent(); output.Write('}'); output.MarkFoldEnd(); }
void ITextOutput.MarkFoldEnd() => _inner.MarkFoldEnd();
public override void WriteTo(ITextOutput output, ILAstWritingOptions options) { WriteILRange(output, options); output.Write(OpCode); if (Method != null) { output.Write(' '); Method.WriteTo(output); } if (IsExpressionTree) { output.Write(".ET"); } if (DelegateType != null) { output.Write("["); DelegateType.WriteTo(output); output.Write("]"); } output.WriteLine(" {"); output.Indent(); if (IsAsync) { output.WriteLine(".async"); } if (IsIterator) { output.WriteLine(".iterator"); } output.MarkFoldStart(Variables.Count + " variable(s)", true); foreach (var variable in Variables) { variable.WriteDefinitionTo(output); output.WriteLine(); } output.MarkFoldEnd(); output.WriteLine(); foreach (string warning in Warnings) { output.WriteLine("//" + warning); } body.WriteTo(output, options); output.WriteLine(); if (options.ShowILRanges) { var unusedILRanges = FindUnusedILRanges(); if (!unusedILRanges.IsEmpty) { output.Write("// Unused IL Ranges: "); output.Write(string.Join(", ", unusedILRanges.Intervals.Select( range => $"[{range.Start:x4}..{range.InclusiveEnd:x4}]"))); output.WriteLine(); } } output.Unindent(); output.WriteLine("}"); }
public void MarkFoldEnd() { _wrapped.MarkFoldEnd(); }
public void MarkFoldEnd() { actions.Add(target => target.MarkFoldEnd()); }
public void MarkFoldEnd() { output.MarkFoldEnd(); }