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 }; }