예제 #1
0
 public override void WriteTo(ITextOutput output, FormattingOptions format)
 {
     output.Write("Block{");
     output.WriteLine();
     if (EntryGoto != null)
     {
         output.Indent();
         output.Write("// Entry Goto");
         output.WriteLine();
         EntryGoto.WriteTo(output, format);
         output.Unindent();
     }
     if (Body != null)
     {
         output.Indent();
         output.Write("// Body");
         output.WriteLine();
         foreach (AstNode child in Body)
         {
             child.WriteTo(output, format);
             output.WriteLine();
         }
         output.Unindent();
     }
     output.Write("}");
     output.WriteLine();
 }
 private void DisassembleLocalsBlock(MethodBody body)
 {
     if (body.HasVariables)
     {
         output.Write(".locals ");
         if (body.InitLocals)
         {
             output.Write("init ");
         }
         output.WriteLine("(");
         output.Indent();
         foreach (var v in body.Variables)
         {
             output.WriteDefinition("[" + v.Index + "] ", v);
             v.VariableType.WriteTo(output);
             if (v.Index + 1 < body.Variables.Count)
             {
                 output.Write(',');
             }
             output.WriteLine();
         }
         output.Unindent();
         output.WriteLine(")");
     }
 }
예제 #3
0
 public override void WriteTo(ITextOutput output)
 {
     output.WriteLine(".try {");
     output.Indent();
     TryBlock.WriteTo(output);
     output.Unindent();
     output.WriteLine("}");
     foreach (CatchBlock block in CatchBlocks)
     {
         block.WriteTo(output);
     }
     if (FaultBlock != null)
     {
         output.WriteLine("fault {");
         output.Indent();
         FaultBlock.WriteTo(output);
         output.Unindent();
         output.WriteLine("}");
     }
     if (FinallyBlock != null)
     {
         output.WriteLine("finally {");
         output.Indent();
         FinallyBlock.WriteTo(output);
         output.Unindent();
         output.WriteLine("}");
     }
 }
예제 #4
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();
 }
예제 #5
0
파일: Cpp.cs 프로젝트: dailypipsgxj/ILSpy
        static void WriteFieldMethodBody(FieldDefinition def, ITextOutput output, bool isRead)
        {
            var info = InfoUtil.Info(def);

            if (!isRead)
            {
                output.WriteLine("{");
                output.Indent();
                output.Write("d_ptr->");
                output.Write(info.GetterMethodName);
                output.WriteLine("(value);");
                output.Unindent();
                output.WriteLine("}");
            }
            else
            {
                output.WriteLine("{");
                output.Indent();
                string value = Util.GetDefaultValue(def.FieldType);
                output.WriteLine("return d_ptr->");
                output.Write(info.SetterMethodName);
                output.WriteLine("()");
                output.Unindent();
                output.WriteLine("}");
            }
        }
예제 #6
0
        private void PrintMethod(CompiledMethod cmethod, ITextOutput output, DecompilationOptions options)
        {
            if ((cmethod != null) && (cmethod.RLBody != null))
            {
                var body        = cmethod.RLBody;
                var basicBlocks = BasicBlock.Find(body);

                foreach (var block in basicBlocks)
                {
                    output.Write(string.Format("D_{0:X4}:", block.Entry.Index));
                    output.WriteLine();
                    output.Indent();
                    foreach (var ins in block.Instructions)
                    {
                        if (ShowHasSeqPoint)
                        {
                            if (ins.SequencePoint != null)
                            {
                                output.Write(ins.SequencePoint.IsSpecial ? "!" : "~");
                            }
                        }

                        output.Write(ins.ToString());
                        output.WriteLine();
                    }
                    output.Unindent();
                }

                if (body.Exceptions.Any())
                {
                    output.WriteLine();
                    output.Write("Exception handlers:");
                    output.WriteLine();
                    output.Indent();
                    foreach (var handler in body.Exceptions)
                    {
                        output.Write(string.Format("{0:x4}-{1:x4}", handler.TryStart.Index, handler.TryEnd.Index));
                        output.WriteLine();
                        output.Indent();
                        foreach (var c in handler.Catches)
                        {
                            output.Write(string.Format("{0} => {1:x4}", c.Type, c.Instruction.Index));
                            output.WriteLine();
                        }
                        if (handler.CatchAll != null)
                        {
                            output.Write(string.Format("{0} => {1:x4}", "<any>", handler.CatchAll.Index));
                            output.WriteLine();
                        }
                        output.Unindent();
                    }
                    output.Unindent();
                }
            }
            else
            {
                output.Write("Method not found in dex");
                output.WriteLine();
            }
        }
예제 #7
0
        void DisassembleLocalsBlock(MethodDefinitionHandle method, MethodBodyBlock body)
        {
            if (body.LocalSignature.IsNil)
            {
                return;
            }
            output.Write(".locals");
            WriteMetadataToken(body.LocalSignature, spaceBefore: true);
            if (body.LocalVariablesInitialized)
            {
                output.Write(" init");
            }
            var blob      = metadata.GetStandaloneSignature(body.LocalSignature);
            var signature = ImmutableArray <Action <ILNameSyntax> > .Empty;

            try
            {
                if (blob.GetKind() == StandaloneSignatureKind.LocalVariables)
                {
                    signature = blob.DecodeLocalSignature(signatureDecoder, genericContext);
                }
                else
                {
                    output.Write(" /* wrong signature kind */");
                }
            }
            catch (BadImageFormatException ex)
            {
                output.Write($" /* {ex.Message} */");
            }
            output.Write(' ');
            output.WriteLine("(");
            output.Indent();
            int index = 0;

            foreach (var v in signature)
            {
                output.WriteLocalReference("[" + index + "]", "loc_" + index, isDefinition: true);
                output.Write(' ');
                v(ILNameSyntax.TypeName);
                if (DebugInfo != null && DebugInfo.TryGetName(method, index, out var name))
                {
                    output.Write(" " + DisassemblerHelpers.Escape(name));
                }
                if (index + 1 < signature.Length)
                {
                    output.Write(',');
                }
                output.WriteLine();
                index++;
            }
            output.Unindent();
            output.WriteLine(")");
        }
예제 #8
0
        public void Disassemble(MethodBody body)
        {
            MethodDefinition method = body.Method;

            output.WriteLine("// Method begins at RVA 0x{0:x4}", method.RVA);
            output.WriteLine("// Code size {0} (0x{0:x})", body.CodeSize);
            output.WriteLine(".maxstack {0}", body.MaxStackSize);
            if (method.DeclaringType.Module.Assembly.EntryPoint == method)
            {
                output.WriteLine(".entrypoint");
            }

            if (method.Body.HasVariables)
            {
                output.Write(".locals ");
                if (method.Body.InitLocals)
                {
                    output.Write("init ");
                }
                output.WriteLine("(");
                output.Indent();
                foreach (var v in method.Body.Variables)
                {
                    output.WriteDefinition("[" + v.Index + "] ", v);
                    v.VariableType.WriteTo(output);
                    output.Write(' ');
                    output.Write(DisassemblerHelpers.Escape(v.Name));
                    output.WriteLine();
                }
                output.Unindent();
                output.WriteLine(")");
            }
            output.WriteLine();

            if (detectControlStructure && body.Instructions.Count > 0)
            {
                Instruction inst = body.Instructions[0];
                WriteStructureBody(new ILStructure(body), ref inst);
            }
            else
            {
                foreach (var inst in method.Body.Instructions)
                {
                    inst.WriteTo(output);
                    output.WriteLine();
                }
                output.WriteLine();
                foreach (var eh in method.Body.ExceptionHandlers)
                {
                    eh.WriteTo(output);
                    output.WriteLine();
                }
            }
        }
예제 #9
0
 public void OpenBrace(BraceStyle style, out TextPosition?start, out TextPosition?end)
 {
     if (braceLevelWithinType >= 0 || nodeStack.Peek() is TypeDeclaration)
     {
         braceLevelWithinType++;
     }
     output.WriteLine();
     start = output.Location;
     output.WriteLeftBrace();
     end = output.Location;
     output.WriteLine();
     output.Indent();
 }
예제 #10
0
        private static void FallbackFormatting(ITextOutput output, CompiledMethod cmethod)
        {
            var body = cmethod.DexMethod.Body;

            body.UpdateInstructionOffsets();
            var targetInstructions = body.Instructions.Select(x => x.Operand).OfType <Instruction>().ToList();

            targetInstructions.AddRange(body.Exceptions.Select(x => x.TryStart));
            targetInstructions.AddRange(body.Exceptions.Select(x => x.TryEnd));
            targetInstructions.AddRange(body.Exceptions.SelectMany(x => x.Catches, (h, y) => y.Instruction));
            targetInstructions.AddRange(body.Exceptions.Select(x => x.CatchAll));

            foreach (var ins in body.Instructions)
            {
                if (targetInstructions.Contains(ins) || (ins.Offset == 0))
                {
                    output.Write(string.Format("D_{0:X4}:", ins.Offset));
                    output.WriteLine();
                }
                output.Indent();
                output.Write(ins.ToString());
                output.WriteLine();
                output.Unindent();
            }

            if (body.Exceptions.Any())
            {
                output.WriteLine();
                output.Write("Exception handlers:");
                output.WriteLine();
                output.Indent();
                foreach (var handler in body.Exceptions)
                {
                    output.Write(string.Format("{0:x4}-{1:x4}", handler.TryStart.Offset, handler.TryEnd.Offset));
                    output.WriteLine();
                    output.Indent();
                    foreach (var c in handler.Catches)
                    {
                        output.Write(string.Format("{0} => {1:x4}", c.Type, c.Instruction.Offset));
                        output.WriteLine();
                    }
                    if (handler.CatchAll != null)
                    {
                        output.Write(string.Format("{0} => {1:x4}", "<any>", handler.CatchAll.Offset));
                        output.WriteLine();
                    }
                    output.Unindent();
                }
                output.Unindent();
            }
        }
예제 #11
0
 public void OpenBrace(BraceStyle style)
 {
     if (braceLevelWithinType >= 0 || nodeStack.Peek() is TypeDeclaration)
     {
         braceLevelWithinType++;
     }
     if (nodeStack.OfType <BlockStatement>().Count() <= 1 || FoldBraces)
     {
         output.MarkFoldStart(defaultCollapsed: braceLevelWithinType == 1);
     }
     output.WriteLine();
     output.WriteLine("{");
     output.Indent();
 }
예제 #12
0
        static void WriteCtor(MethodDefinition m, ITextOutput output)
        {
            if (m.IsConstructor && m.IsStatic)
            {
                return;
            }
            if (m.DeclaringType != null && m.DeclaringType.IsInterface)
            {
                return;
            }

            var info = InfoUtil.Info(m);

            WriteMethodHead(m, output, true);
            output.WriteLine();
            var clist = info.CtorInitBody;

            if (clist.Count() > 0)
            {
                output.Indent();
                foreach (var s in clist)
                {
                    output.WriteLine(s);
                }
                output.Unindent();
            }
            output.WriteLine("{");
            // special process getTypeId

            if (info.Name == "getTypeId")
            {
                output.Indent();
                string rvalue;
                if (m.Name == "get_TypeId")
                {
                    rvalue = "EventType::" + m.DeclaringType.Name;
                }
                output.Unindent();
            }
            else
            {
                output.Indent();
                foreach (var s in info.MethodBody)
                {
                    output.WriteLine(s);
                }
                output.Unindent();
            }
            output.WriteLine("}");
        }
예제 #13
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();
 }
예제 #14
0
파일: Hpp.cs 프로젝트: dailypipsgxj/ILSpy
        static void WriteEnumBody(ClassInfo info, ITextOutput output)
        {
            output.WriteLine("enum " + info.Name + " : unsigned char");
            output.WriteLine("{");
            output.Indent();
            var members = info.Declaration.Descendants.OfType <EnumMemberDeclaration>().ToList();

            for (int i = 0; i < members.Count(); ++i)
            {
                var item  = members[i];
                var text  = item.GetText();
                var split = text.Split('=');
                output.Write(split[0]);
                if (split.Count() >= 2)
                {
                    output.Write(" = ");
                    output.Write(split[1]);
                }
                if (i != members.Count() - 1)
                {
                    output.WriteLine(",");
                }
                else
                {
                    output.WriteLine();
                }
            }

            output.Unindent();
            output.WriteLine("};");
        }
예제 #15
0
 public static void WriteCurrencyIdInclude(TypeDefinition def, ITextOutput output)
 {
     output.WriteLine("class QUANTKIT_EXPORT CurrencyId");
     output.WriteLine("{");
     output.WriteLine("public:");
     output.Indent();
     output.WriteLine("/*");
     output.WriteLine("* return 0 means not found");
     output.WriteLine("*/");
     output.WriteLine("static unsigned char GetId(const QString &name);");
     output.WriteLine();
     output.WriteLine("/*");
     output.WriteLine("* return QString().isEmpty() == true means not found");
     output.WriteLine("*/");
     output.WriteLine("static const QString& GetName(unsigned char id);");
     output.WriteLine();
     foreach (var f in def.Fields)
     {
         if (f.Constant != null)
         {
             output.Write("static const unsigned char ");
             output.Write(f.Name);
             output.Write(" = ");
             output.Write(f.Constant.ToString());
             output.WriteLine(";");
         }
     }
     output.Unindent();
     output.WriteLine("};");
 }
예제 #16
0
        void DisassembleRecord(BamlContext ctx, BamlRecord record)
        {
            if (BamlNode.IsFooter(record))
            {
                while (scopeStack.Count > 0 && !BamlNode.IsMatch(scopeStack.Peek(), record))
                {
                    scopeStack.Pop();
                    output.Unindent();
                }
                if (scopeStack.Count > 0)
                {
                    scopeStack.Pop();
                    output.Unindent();
                }
            }

            output.WriteDefinition(record.Type.ToString(), BamlToolTipReference.Create(GetRecordReference(record)), TextTokenKind.Keyword, true);

            Action <BamlContext, BamlRecord> handler;

            if (handlerMap.TryGetValue(record.Type, out handler))
            {
                output.Write(" [", TextTokenKind.Text);
                handler(ctx, record);
                output.Write("]", TextTokenKind.Text);
            }

            output.WriteLine();

            if (BamlNode.IsHeader(record))
            {
                scopeStack.Push(record);
                output.Indent();
            }
        }
예제 #17
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();
 }
예제 #18
0
파일: Cpp.cs 프로젝트: dailypipsgxj/ILSpy
 static void WriteEqualFunction(TypeDefinition def, ITextOutput output)
 {
     output.WriteLine("bool " + def.Name + "::operator==(const " + def.Name + " &other) const");
     output.WriteLine("{");
     output.Indent();
     output.WriteLine("if(d && other.d)");
     output.Indent();
     output.WriteLine("return (*d == *other.d);");
     output.Unindent();
     output.WriteLine("else");
     output.Indent();
     output.WriteLine("return (d==other.d)");
     output.Unindent();
     output.Unindent();
     output.WriteLine("}");
 }
예제 #19
0
 public override void WriteTo(ITextOutput output)
 {
     if (IsFilter)
     {
         output.Write("filter ");
         output.Write(ExceptionVariable.Name);
     }
     else if (ExceptionType != null)
     {
         output.Write("catch ");
         output.WriteReference(ExceptionType.FullName, ExceptionType);
         if (ExceptionVariable != null)
         {
             output.Write(' ');
             output.Write(ExceptionVariable.Name);
         }
     }
     else
     {
         output.Write("handler ");
         output.Write(ExceptionVariable.Name);
     }
     output.WriteLine(" {");
     output.Indent();
     base.WriteTo(output);
     output.Unindent();
     output.WriteLine("}");
 }
        public override void Decompile(Language language, ITextOutput output, DecompilationOptions options)
        {
            var loaded = parentAssembly.LoadedAssembly.LoadedAssemblyReferencesInfo.TryGetInfo(r.FullName, out var info);

            if (r.IsWindowsRuntime)
            {
                language.WriteCommentLine(output, r.FullName + " [WinRT]" + (!loaded ? " (unresolved)" : ""));
            }
            else
            {
                language.WriteCommentLine(output, r.FullName + (!loaded ? " (unresolved)" : ""));
            }
            if (loaded)
            {
                output.Indent();
                language.WriteCommentLine(output, "Assembly reference loading information:");
                if (info.HasErrors)
                {
                    language.WriteCommentLine(output, "There were some problems during assembly reference load, see below for more information!");
                }
                foreach (var item in info.Messages)
                {
                    language.WriteCommentLine(output, $"{item.Item1}: {item.Item2}");
                }
                output.Unindent();
                output.WriteLine();
            }
        }
예제 #21
0
        public override void Decompile(Language language, ITextOutput output, DecompilationOptions options)
        {
            language.WriteCommentLine(output, $"Detected Target-Framework-Id: {parentAssembly.LoadedAssembly.GetTargetFrameworkIdAsync().Result}");
            App.Current.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(EnsureLazyChildren));
            output.WriteLine();
            language.WriteCommentLine(output, "Referenced assemblies (in metadata order):");
            // Show metadata order of references
            foreach (var node in this.Children.OfType <ILSpyTreeNode>())
            {
                node.Decompile(language, output, options);
            }

            output.WriteLine();
            output.WriteLine();
            // Show full assembly load log:
            language.WriteCommentLine(output, "Assembly load log including transitive references:");
            var info = parentAssembly.LoadedAssembly.LoadedAssemblyReferencesInfo;

            foreach (var asm in info.Entries)
            {
                language.WriteCommentLine(output, asm.FullName);
                output.Indent();
                foreach (var item in asm.Messages)
                {
                    language.WriteCommentLine(output, $"{item.Item1}: {item.Item2}");
                }
                output.Unindent();
                output.WriteLine();
            }
        }
예제 #22
0
파일: Cpp.cs 프로젝트: dailypipsgxj/ILSpy
        static void WriteCtor(MethodDefinition def, ITextOutput output)
        {
            if (def.IsConstructor && def.IsStatic)
            {
                return;
            }
            if (!def.IsConstructor)
            {
                return;
            }
            if (def.DeclaringType != null && def.DeclaringType.IsInterface)
            {
                return;
            }

            output.Write(def.DeclaringType.Name + "::" + def.DeclaringType.Name);

            output.Write("(");
            WriteParameters(def, output, false);
            output.Write(")");

            output.WriteLine();
            output.Indent();
            output.Write(": d_ptr(new " + def.DeclaringType.Name + "Private");
            if (def.Parameters.Count() > 0)
            {
                output.Write("(");
                WriteParameterNames(def, output);
                output.Write(")");
            }
            output.WriteLine(")");
            output.Unindent();
            output.WriteLine("{");
            output.WriteLine("}");
        }
예제 #23
0
 public void OpenBrace(BraceStyle style, out TextLocation?start, out TextLocation?end)
 {
     if (braceLevelWithinType >= 0 || nodeStack.Peek() is TypeDeclaration)
     {
         braceLevelWithinType++;
     }
     if (nodeStack.OfType <BlockStatement>().Count() <= 1)
     {
         output.MarkFoldStart(defaultCollapsed: braceLevelWithinType == 1);
     }
     output.WriteLine();
     start = output.Location;
     output.WriteLeftBrace();
     end = output.Location;
     output.WriteLine();
     output.Indent();
 }
예제 #24
0
        private void PrintMethod(CompiledMethod cmethod, ITextOutput output, DecompilationOptions options)
        {
            if ((cmethod != null) && (cmethod.RLBody != null))
            {
                var body = cmethod.RLBody;
                var basicBlocks = BasicBlock.Find(body);

                foreach (var block in basicBlocks)
                {
                    output.Write(string.Format("D_{0:X4}:", block.Entry.Index));
                    output.WriteLine();
                    output.Indent();
                    foreach (var ins in block.Instructions)
                    {
                        if (ShowHasSeqPoint)
                        {
                            if (ins.SequencePoint != null)
                                output.Write(ins.SequencePoint.IsSpecial ? "!" : "~");
                        }

                        output.Write(ins.ToString());
                        output.WriteLine();
                    }
                    output.Unindent();
                }

                if (body.Exceptions.Any())
                {
                    output.WriteLine();
                    output.Write("Exception handlers:");
                    output.WriteLine();
                    output.Indent();
                    foreach (var handler in body.Exceptions)
                    {
                        output.Write(string.Format("{0:x4}-{1:x4}", handler.TryStart.Index, handler.TryEnd.Index));
                        output.WriteLine();
                        output.Indent();
                        foreach (var c in handler.Catches)
                        {
                            output.Write(string.Format("{0} => {1:x4}", c.Type, c.Instruction.Index));
                            output.WriteLine();
                        }
                        if (handler.CatchAll != null)
                        {
                            output.Write(string.Format("{0} => {1:x4}", "<any>", handler.CatchAll.Index));
                            output.WriteLine();
                        }
                        output.Unindent();
                    }
                    output.Unindent();
                }
            }
            else
            {
                output.Write("Method not found in dex");
                output.WriteLine();
            }
        }
예제 #25
0
파일: Cpp.cs 프로젝트: dailypipsgxj/ILSpy
 static void WriteCopyConstructor(TypeDefinition def, ITextOutput output)
 {
     output.WriteLine(def.Name + "::" + def.Name + " (const " + def.Name + " &other)");
     output.Indent();
     output.WriteLine(": d(other.d)");
     output.Unindent();
     output.WriteLine("{");
     output.WriteLine("}");
 }
예제 #26
0
 public override void WriteTo(ITextOutput output)
 {
     output.Write("filter ");
     output.WriteLine(" {");
     output.Indent();
     base.WriteTo(output);
     output.Unindent();
     output.WriteLine("}");
 }
예제 #27
0
 public override void WriteTo(ITextOutput output)
 {
     output.Write("if (");
     Condition.WriteTo(output);
     output.WriteLine(") {");
     output.Indent();
     TrueBlock.WriteTo(output);
     output.Unindent();
     output.Write("}");
     if (FalseBlock != null)
     {
         output.WriteLine(" else {");
         output.Indent();
         FalseBlock.WriteTo(output);
         output.Unindent();
         output.WriteLine("}");
     }
 }
예제 #28
0
 public override void WriteTo(ITextOutput output)
 {
     output.Write("catch ");
     output.WriteReference(ExceptionType.FullName, ExceptionType);
     output.WriteLine(" {");
     output.Indent();
     base.WriteTo(output);
     output.Unindent();
     output.WriteLine("}");
 }
예제 #29
0
파일: Cpp.cs 프로젝트: dailypipsgxj/ILSpy
 static void WriteAssignConstructor(TypeDefinition def, ITextOutput output)
 {
     output.WriteLine(def.Name + "::" + def.Name + " &operator=(const " + def.Name + " &other)");
     output.WriteLine("{");
     output.Indent();
     output.WriteLine("d = other.d;");
     output.WriteLine("return *this;");
     output.Unindent();
     output.WriteLine("}");
 }
예제 #30
0
 void StartKeywordBlock(ITextOutput output, string keyword, IMemberDef member)
 {
     output.Write(keyword, TextTokenKind.Keyword);
     output.WriteSpace();
     output.WriteDefinition(IdentifierEscaper.Escape(member.Name), member, TextTokenKindUtils.GetTextTokenType(member), false);
     output.WriteSpace();
     output.WriteLeftBrace();
     output.WriteLine();
     output.Indent();
 }
예제 #31
0
        /*static void BuildIncludeList(TypeDefinition def, out List<string> externalList, out List<string> moduleClassList, out List<string> moduleEnumOrInterfaceList)
         * {
         *  List<string> elist = new List<string>();
         *  List<string> mlist = new List<string>();
         *  List<string> clist = new List<string>();
         *  bool hasBaseType = def.BaseType != null && def.BaseType.Name != "Object";
         *  if (hasBaseType)
         *      mlist.Add(def.BaseType.Name); // basetype must be include file
         *  if (def.HasInterfaces)
         *  {
         *      foreach (var i in def.Interfaces)
         *      {
         *          if (i.Module == def.Module)
         *              mlist.Add(i.Name);
         *          else
         *              elist.Add(i.Name);
         *      }
         *  }
         *  foreach (var m in def.Methods)
         *  {
         *      Util.AddInclude(def.Namespace, m.ReturnType, elist, clist, mlist);
         *      foreach (var p in m.Parameters)
         *          Util.AddInclude(def.Namespace, p.ParameterType, elist, clist, mlist);
         *      //special for currencyId
         *      foreach (var p in m.Parameters)
         *      {
         *          if (p.Name == "currencyId" && p.HasConstant && p.Constant != null)
         *              mlist.Add("CurrencyId");
         *      }
         *  }
         *  foreach (var f in def.Fields)
         *  {
         *      Util.AddInclude(def.Namespace, f.FieldType, elist, clist, mlist);
         *  }
         *
         *  externalList = elist.Distinct<string>().ToList();
         *  moduleClassList = clist.Distinct<string>().ToList();
         *  moduleEnumOrInterfaceList = mlist.Distinct<string>().ToList();
         * }
         *
         * static void WriteIncludeBody(TypeDefinition def, TypeDeclaration decl, ITextOutput output)
         * {
         *  List<string> externalList;
         *  List<string> moduleEnumOrInterfaceList;
         *  List<string> classList;
         *
         *  BuildIncludeList(def, out externalList, out classList, out moduleEnumOrInterfaceList);
         *
         *  foreach (var m in classList)
         *  {
         *      if (m != def.Name)
         *      {
         *          output.WriteLine("#include <QuantKit/" + m + ".h>");
         *      }
         *  }
         *
         *  var tevent = Util.GetTypeDefinition(def.Module, "Event");
         *  if (tevent == def || Util.isInhertFrom(def, tevent))
         *  {
         *      if (classList.Count() > 0)
         *          output.WriteLine();
         *      output.WriteLine("#include <QuantKit/EventType.h>");
         *  }
         * }*/

        /*static void process_getTypeId(MethodDefinition m, ITextOutput output)
         * {
         *  var decl = Util.getMethodDeclaration(m);
         *  var rlist = decl.Descendants.OfType<ReturnStatement>().ToList();
         *  if (rlist.Count() > 0)
         *  {
         *      var pexpr = rlist[0].Descendants.OfType<PrimitiveExpression>().ToList();
         *      if (pexpr.Count() > 0)
         *      {
         *          var v = pexpr[0].Value;
         *          output.Indent();
         *
         *          output.Unindent();
         *      }
         *
         *  }
         *
         * }*/
        static void WriteMethod(MethodDefinition m, ITextOutput output)
        {
            if (m.IsConstructor && m.IsStatic)
            {
                return;
            }
            if (m.DeclaringType != null && m.DeclaringType.IsInterface)
            {
                return;
            }

            var info = InfoUtil.Info(m);

            WriteMethodHead(m, output, true);
            if (m.IsGetter)
            {
                output.Write(" const");
            }
            output.WriteLine();
            output.WriteLine("{");
            // special process getTypeId

            if (info.Name == "getTypeId")
            {
                output.Indent();
                string rvalue;
                if (m.Name == "get_TypeId")
                {
                    rvalue = "EventType::" + m.DeclaringType.Name;
                }
                output.Unindent();
            }
            else
            {
                //output.Indent();
                foreach (var s in info.MethodBody)
                {
                    output.WriteLine(s);
                }
                //output.Unindent();
            }

            /*if (m.ReturnType.MetadataType != MetadataType.Void)
             * {
             *  output.Indent();
             *  string rvalue;
             *  if (m.Name == "get_TypeId")
             *      rvalue = "EventType::" + m.DeclaringType.Name;
             *  else
             *      rvalue = Util.GetDefaultValue(m.ReturnType);
             *  output.WriteLine("return " + rvalue + ";");
             *  output.Unindent();
             * }*/
            output.WriteLine("}");
        }
예제 #32
0
		void StartKeywordBlock(ITextOutput output, string keyword, IMemberDef member)
		{
			output.Write(keyword, TextTokenType.Keyword);
			output.WriteSpace();
			output.WriteDefinition(IdentifierEscaper.Escape(member.Name), member, TextTokenHelper.GetTextTokenType(member), false);
			output.WriteSpace();
			output.WriteLeftBrace();
			output.WriteLine();
			output.Indent();
		}
예제 #33
0
        private static void FallbackFormatting(ITextOutput output, CompiledMethod cmethod)
        {
            var body = cmethod.DexMethod.Body;

            body.UpdateInstructionOffsets();
            var targetInstructions = body.Instructions.Select(x => x.Operand).OfType<Instruction>().ToList();
            targetInstructions.AddRange(body.Exceptions.Select(x => x.TryStart));
            targetInstructions.AddRange(body.Exceptions.Select(x => x.TryEnd));
            targetInstructions.AddRange(body.Exceptions.SelectMany(x => x.Catches, (h, y) => y.Instruction));
            targetInstructions.AddRange(body.Exceptions.Select(x => x.CatchAll));

            foreach (var ins in body.Instructions)
            {
                if (targetInstructions.Contains(ins) || (ins.Offset == 0))
                {
                    output.Write(string.Format("D_{0:X4}:", ins.Offset));
                    output.WriteLine();
                }
                output.Indent();
                output.Write(ins.ToString());
                output.WriteLine();
                output.Unindent();
            }

            if (body.Exceptions.Any())
            {
                output.WriteLine();
                output.Write("Exception handlers:");
                output.WriteLine();
                output.Indent();
                foreach (var handler in body.Exceptions)
                {
                    output.Write(string.Format("{0:x4}-{1:x4}", handler.TryStart.Offset, handler.TryEnd.Offset));
                    output.WriteLine();
                    output.Indent();
                    foreach (var c in handler.Catches)
                    {
                        output.Write(string.Format("{0} => {1:x4}", c.Type, c.Instruction.Offset));
                        output.WriteLine();
                    }
                    if (handler.CatchAll != null)
                    {
                        output.Write(string.Format("{0} => {1:x4}", "<any>", handler.CatchAll.Offset));
                        output.WriteLine();
                    }
                    output.Unindent();
                }
                output.Unindent();
            }
        }