예제 #1
0
        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();
            }
        }
예제 #2
0
        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();
            }
        }
예제 #3
0
 public void NewLine()
 {
     if (lastImport)
     {
         output.MarkFoldEnd();
         lastImport = false;
     }
     output.WriteLine();
 }
예제 #4
0
        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;
            }
        }
예제 #5
0
 public void CloseBrace(BraceStyle style)
 {
     output.Unindent();
     output.Write('}');
     if (nodeStack.OfType <BlockStatement>().Count() <= 1 || FoldBraces)
     {
         output.MarkFoldEnd();
     }
     if (braceLevelWithinType >= 0)
     {
         braceLevelWithinType--;
     }
 }
예제 #6
0
 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--;
     }
 }
예제 #7
0
        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);
        }
예제 #8
0
 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();
 }
예제 #9
0
 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();
 }
예제 #10
0
 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();
 }
예제 #11
0
		void CloseBlock(string comment = null)
		{
			output.Unindent();
			output.Write("}");
			if (comment != null)
				output.Write(" // " + comment);
			output.MarkFoldEnd();
			output.WriteLine();
		}
예제 #12
0
 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();
 }
예제 #13
0
파일: Block.cs 프로젝트: zarumaru/ILSpy
        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();
        }
예제 #14
0
 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();
 }
예제 #15
0
 void ITextOutput.MarkFoldEnd() => _inner.MarkFoldEnd();
예제 #16
0
        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("}");
        }
예제 #17
0
 public void MarkFoldEnd()
 {
     _wrapped.MarkFoldEnd();
 }
예제 #18
0
 public void MarkFoldEnd()
 {
     actions.Add(target => target.MarkFoldEnd());
 }
 public void MarkFoldEnd()
 {
     output.MarkFoldEnd();
 }