Пример #1
0
        public override IEnumerable<Element> GetElements(Instruction instr, MethodDef method)
        {
            switch (instr.OpCode.OperandType)
            {
                case OperandType.InlineI:
                case OperandType.ShortInlineI:
                case OperandType.ShortInlineR:
                    yield return new LiteralExpression(instr) { Value = Convert.ToInt32(instr.Operand) };
                    break;
                case OperandType.InlineI8:
                    yield return new LiteralLongExpression(instr) { Value = (long)instr.Operand };
                    break;
                case OperandType.InlineString:
                    yield return new StringExpression(instr) { Value = (string)instr.Operand };
                    break;
                case OperandType.InlineVar:
                    if (instr.IsLdloc())
                        yield return
                            new VariableExpression(instr, method)
                            {
                                Variable = new Local(((dnlib.DotNet.Emit.Local)instr.Operand).Index)
                            };
                    if (instr.IsLdarg())
                        yield return
                            new VariableExpression(instr, method) { Variable = new Argument(((Parameter)instr.Operand).Index) };
                    break;

            }

            if (instr.IsBr())
                yield return new UnconditionalBranchExpression(instr);

            if (instr.IsConditionalBranch())
                yield return HandleConditionalBranch(instr, method);

            if (instr.IsCall())
                yield return HandleCall(instr);

            if (instr.IsLdarg())
                yield return HandleLdarg(instr, method);

            if (instr.IsStloc())
            {
                yield return HandleStloc(instr, method);
                yield return new AssignmentStatement(instr);
            }

            if (instr.IsLdloc())
                yield return HandleLdloc(instr, method);

            if (instr.IsLdcI4() && instr.Operand == null)
                yield return new LiteralExpression(instr) { Value = instr.GetLdcI4Value() };

            switch (instr.OpCode.Code)
            {
                case Code.Ret:
                    yield return new ReturnExpression(instr);
                    break;

                case Code.Not:
                    yield return new UnaryOpExpression(instr) { Operation = UnaryOps.Not };
                    break;

                case Code.Neg:
                    yield return new UnaryOpExpression(instr) { Operation = UnaryOps.Negate };
                    break;
            }

            if (instr.OpCode.Code == Code.Sub)
                yield return new BinOpExpression(instr) { Operation = BinOps.Sub };
            if (instr.OpCode.Code == Code.Add)
                yield return new BinOpExpression(instr) { Operation = BinOps.Add };
            if (instr.OpCode.Code == Code.Mul)
                yield return new BinOpExpression(instr) { Operation = BinOps.Mul };
        }