示例#1
0
        static void ParseMethod(MethodDefinition method, IILVisitor visitor)
        {
            var context = CreateContext(method, visitor);
            var code    = context.Code;

            var flags = code.ReadByte();

            switch (flags & 0x3)
            {
            case 0x2:             // tiny
                int code_size = flags >> 2;
                ParseCode(code_size, context);
                break;

            case 0x3:             // fat
                code.Advance(-1);
                ParseFatMethod(context);
                break;

            default:
                throw new NotSupportedException();
            }

            code.MoveBackTo(context.Position);
        }
示例#2
0
		public static void Parse (MethodDefinition method, IILVisitor visitor)
		{
			if (method == null)
				throw new ArgumentNullException ("method");
			if (visitor == null)
				throw new ArgumentNullException ("visitor");
			if (!method.HasBody || !method.HasImage)
				throw new ArgumentException ();

			var context = CreateContext (method, visitor);
			var code = context.Code;

			code.MoveTo (method.RVA);

			var flags = code.ReadByte ();

			switch (flags & 0x3) {
			case 0x2: // tiny
				int code_size = flags >> 2;
				ParseCode (code_size, context);
				break;
			case 0x3: // fat
				code.position--;
				ParseFatMethod (context);
				break;
			default:
				throw new NotSupportedException ();
			}
		}
示例#3
0
        public static ForwardAnalysis <AbstractState, EdgeData> Make <Source, Dest, Context> (
            IILDecoder <APC, Source, Dest, Context, EdgeData> decoder,
            IAnalysis <APC, AbstractState, IILVisitor <APC, Source, Dest, AbstractState, AbstractState>, EdgeData> analysis)
            where Context : IMethodContextProvider
        {
            IILVisitor <APC, Source, Dest, AbstractState, AbstractState> visitor = analysis.GetVisitor();
            var forwardAnalysisSolver = new ForwardAnalysis <AbstractState, EdgeData> (
                decoder.ContextProvider.MethodContext.CFG,
                (pc, state) => decoder.ForwardDecode <AbstractState, AbstractState, IILVisitor <APC, Source, Dest, AbstractState, AbstractState> > (pc, visitor, state),
                analysis.Join,
                analysis.ImmutableVersion,
                analysis.MutableVersion,
                analysis.EdgeConversion,
                decoder.EdgeData,
                (pc, state) => {
                if (!decoder.IsUnreachable(pc))
                {
                    return(analysis.IsBottom(pc, state));
                }

                return(true);
            },
                analysis.Dump
                );

            analysis.SaveFixPointInfo(forwardAnalysisSolver);
            return(forwardAnalysisSolver);
        }
示例#4
0
        public static void Parse(MethodDefinition method, IILVisitor visitor)
        {
            if (method == null)
            {
                throw new ArgumentNullException("method");
            }
            if (visitor == null)
            {
                throw new ArgumentNullException("visitor");
            }
            if (!method.HasBody || !method.HasImage)
            {
                throw new ArgumentException();
            }
            ILParser.ParseContext parseContext = ILParser.CreateContext(method, visitor);
            CodeReader            code         = parseContext.Code;

            code.MoveTo(method.RVA);
            byte num  = code.ReadByte();
            int  num1 = num & 3;

            if (num1 == 2)
            {
                ILParser.ParseCode(num >> 2, parseContext);
                return;
            }
            if (num1 != 3)
            {
                throw new NotSupportedException();
            }
            code.position--;
            ILParser.ParseFatMethod(parseContext);
        }
示例#5
0
		static ParseContext CreateContext (MethodDefinition method, IILVisitor visitor)
		{
			var code = method.Module.Read (method, (_, reader) => new CodeReader (reader.image.MetadataSection, reader));

			return new ParseContext {
				Code = code,
				Metadata = code.reader,
				Visitor = visitor,
			};
		}
示例#6
0
        static ParseContext CreateContext(MethodDefinition method, IILVisitor visitor)
        {
            var code = method.Module.Read(method, (_, reader) => new CodeReader(reader.image.MetadataSection, reader));

            return(new ParseContext {
                Code = code,
                Metadata = code.reader,
                Visitor = visitor,
            });
        }
示例#7
0
        private static ILParser.ParseContext CreateContext(MethodDefinition method, IILVisitor visitor)
        {
            CodeReader codeReader = method.Module.Read <MethodDefinition, CodeReader>(method, (MethodDefinition _, MetadataReader reader) => new CodeReader(reader.image.MetadataSection, reader));

            return(new ILParser.ParseContext()
            {
                Code = codeReader,
                Metadata = codeReader.reader,
                Visitor = visitor
            });
        }
示例#8
0
        static ParseContext CreateContext(MethodDefinition method, IILVisitor visitor)
        {
            var code     = method.Module.Read(method, (_, reader) => reader.code);
            var position = code.MoveTo(method);

            return(new ParseContext {
                Code = code,
                Position = position,
                Metadata = code.reader,
                Visitor = visitor,
            });
        }
示例#9
0
        public static void Parse(MethodDefinition method, IILVisitor visitor)
        {
            if (method == null)
            {
                throw new ArgumentNullException("method");
            }
            if (visitor == null)
            {
                throw new ArgumentNullException("visitor");
            }
            if (!method.HasBody || !method.HasImage)
            {
                throw new ArgumentException();
            }

            method.Module.Read(method, (m, _) => {
                ParseMethod(m, visitor);
                return(true);
            });
        }
示例#10
0
        public static void Parse(MethodDefinition method, IILVisitor visitor)
        {
            if (method == null)
            {
                throw new ArgumentNullException("method");
            }
            if (visitor == null)
            {
                throw new ArgumentNullException("visitor");
            }
            if (!method.HasBody || !method.HasImage)
            {
                throw new ArgumentException();
            }

            var context = CreateContext(method, visitor);
            var code    = context.Code;

            code.MoveTo(method.RVA);

            var flags = code.ReadByte();

            switch (flags & 0x3)
            {
            case 0x2:             // tiny
                int code_size = flags >> 2;
                ParseCode(code_size, context);
                break;

            case 0x3:             // fat
                code.position--;
                ParseFatMethod(context);
                break;

            default:
                throw new NotSupportedException();
            }
        }
示例#11
0
文件: ILParser.cs 项目: jbevain/cecil
        static ParseContext CreateContext(MethodDefinition method, IILVisitor visitor)
        {
            var code = method.Module.Read (method, (_, reader) => reader.code);
            code.MoveTo (method);

            return new ParseContext {
                Code = code,
                Metadata = code.reader,
                Visitor = visitor,
            };
        }
示例#12
0
        private static void ParseCode(int code_size, ILParser.ParseContext context)
        {
            CodeReader     code     = context.Code;
            MetadataReader metadata = context.Metadata;
            IILVisitor     visitor  = context.Visitor;
            int            codeSize = code.position + code_size;

            while (code.position < codeSize)
            {
                byte   num    = code.ReadByte();
                OpCode opCode = (num != 254 ? OpCodes.OneByteOpCode[num] : OpCodes.TwoBytesOpCode[code.ReadByte()]);
                switch (opCode.OperandType)
                {
                case OperandType.InlineBrTarget:
                {
                    visitor.OnInlineBranch(opCode, code.ReadInt32());
                    continue;
                }

                case OperandType.InlineField:
                case OperandType.InlineMethod:
                case OperandType.InlineTok:
                case OperandType.InlineType:
                {
                    IMetadataTokenProvider metadataTokenProvider = metadata.LookupToken(code.ReadToken());
                    Mono.Cecil.TokenType   tokenType             = metadataTokenProvider.MetadataToken.TokenType;
                    if (tokenType > Mono.Cecil.TokenType.Field)
                    {
                        if (tokenType > Mono.Cecil.TokenType.MemberRef)
                        {
                            if (tokenType == Mono.Cecil.TokenType.TypeSpec)
                            {
                                goto Label0;
                            }
                            if (tokenType != Mono.Cecil.TokenType.MethodSpec)
                            {
                                continue;
                            }
                        }
                        else if (tokenType != Mono.Cecil.TokenType.Method)
                        {
                            if (tokenType == Mono.Cecil.TokenType.MemberRef)
                            {
                                FieldReference fieldReference = metadataTokenProvider as FieldReference;
                                if (fieldReference == null)
                                {
                                    MethodReference methodReference = metadataTokenProvider as MethodReference;
                                    if (methodReference == null)
                                    {
                                        throw new InvalidOperationException();
                                    }
                                    visitor.OnInlineMethod(opCode, methodReference);
                                    continue;
                                }
                                else
                                {
                                    visitor.OnInlineField(opCode, fieldReference);
                                    continue;
                                }
                            }
                            else
                            {
                                continue;
                            }
                        }
                        visitor.OnInlineMethod(opCode, (MethodReference)metadataTokenProvider);
                        continue;
                    }
                    else if (tokenType != Mono.Cecil.TokenType.TypeRef && tokenType != Mono.Cecil.TokenType.TypeDef)
                    {
                        if (tokenType == Mono.Cecil.TokenType.Field)
                        {
                            visitor.OnInlineField(opCode, (FieldReference)metadataTokenProvider);
                            continue;
                        }
                        else
                        {
                            continue;
                        }
                    }
Label0:
                    visitor.OnInlineType(opCode, (TypeReference)metadataTokenProvider);
                    continue;
                }

                case OperandType.InlineI:
                {
                    visitor.OnInlineInt32(opCode, code.ReadInt32());
                    continue;
                }

                case OperandType.InlineI8:
                {
                    visitor.OnInlineInt64(opCode, code.ReadInt64());
                    continue;
                }

                case OperandType.InlineNone:
                {
                    visitor.OnInlineNone(opCode);
                    continue;
                }

                case OperandType.InlineR:
                {
                    visitor.OnInlineDouble(opCode, code.ReadDouble());
                    continue;
                }

                case OperandType.InlineSig:
                {
                    visitor.OnInlineSignature(opCode, code.GetCallSite(code.ReadToken()));
                    continue;
                }

                case OperandType.InlineString:
                {
                    visitor.OnInlineString(opCode, code.GetString(code.ReadToken()));
                    continue;
                }

                case OperandType.InlineSwitch:
                {
                    int   num1     = code.ReadInt32();
                    int[] numArray = new int[num1];
                    for (int i = 0; i < num1; i++)
                    {
                        numArray[i] = code.ReadInt32();
                    }
                    visitor.OnInlineSwitch(opCode, numArray);
                    continue;
                }

                case OperandType.InlineVar:
                {
                    visitor.OnInlineVariable(opCode, ILParser.GetVariable(context, code.ReadInt16()));
                    continue;
                }

                case OperandType.InlineArg:
                {
                    visitor.OnInlineArgument(opCode, code.GetParameter(code.ReadInt16()));
                    continue;
                }

                case OperandType.ShortInlineBrTarget:
                {
                    visitor.OnInlineBranch(opCode, code.ReadSByte());
                    continue;
                }

                case OperandType.ShortInlineI:
                {
                    if (opCode != OpCodes.Ldc_I4_S)
                    {
                        visitor.OnInlineByte(opCode, code.ReadByte());
                        continue;
                    }
                    else
                    {
                        visitor.OnInlineSByte(opCode, code.ReadSByte());
                        continue;
                    }
                }

                case OperandType.ShortInlineR:
                {
                    visitor.OnInlineSingle(opCode, code.ReadSingle());
                    continue;
                }

                case OperandType.ShortInlineVar:
                {
                    visitor.OnInlineVariable(opCode, ILParser.GetVariable(context, (int)code.ReadByte()));
                    continue;
                }

                case OperandType.ShortInlineArg:
                {
                    visitor.OnInlineArgument(opCode, code.GetParameter((int)code.ReadByte()));
                    continue;
                }

                default:
                {
                    continue;
                }
                }
            }
        }