예제 #1
0
 public override Expression Interpret(Instruction instruction, IndividualDecompilationContext context)
 {
     var field = ((FieldReferenceInstruction)instruction).Field;
     var instance = !field.IsStatic
                  ? context.CapturePreceding()
                  : null;
     return Expression.Field(instance, field);
 }
예제 #2
0
 public TestMethod(string name, Type returnType, IEnumerable<IManagedMethodParameter> parameters, IList<Type> localTypes, Instruction[] instructions)
 {
     this.name = name;
     this.returnType = returnType;
     this.parameters = parameters;
     this.localTypes = localTypes;
     this.instructions = instructions;
 }
예제 #3
0
        public override Expression Interpret(Instruction instruction, IndividualDecompilationContext context)
        {
            var right = context.CapturePreceding();
            var left = context.CapturePreceding();

            BooleanSupport.ConvertIfRequired(ref left, ref right);

            var condition = conditions[instruction.OpCode.Name.SubstringBefore(".")];
            return Expression.Condition(
                condition(left, right),
                Expression.Constant(1),
                Expression.Constant(0)
            );
        }
예제 #4
0
        public override Expression Interpret(Instruction instruction, IndividualDecompilationContext context)
        {
            var singleOrRight = context.CapturePreceding();
            var unary = unaryOperators.GetValueOrDefault(instruction.OpCode);
            if (unary != null)
                return unary(singleOrRight);

            var left = context.CapturePreceding();
            var binary = binaryOperators[instruction.OpCode];

            Adapt(left, ref singleOrRight);

            return binary(left, singleOrRight);
        }
예제 #5
0
        private object GetValue(Instruction instruction)
        {
            var valueInstruction = instruction as IValueInstruction;
            if (valueInstruction != null)
                return valueInstruction.Value;

            var parts = instruction.OpCode.Name.Split('.');
            if (parts.Length < 3)
                throw new InvalidOperationException("Cannot extract value from " + instruction.OpCode + ".");

            if (!parts[1].Equals("i4", StringComparison.InvariantCultureIgnoreCase))
                throw new NotSupportedException("Cannot extract value from " + instruction.OpCode + ": " + parts[1] + " is not yet supported here.");

            var valueString = parts[2];
            if (valueString.Equals("M1", StringComparison.InvariantCultureIgnoreCase))
                return -1;

            return int.Parse(valueString);
        }
예제 #6
0
 public override bool CanInterpret(Instruction instruction)
 {
     return binaryOperators.ContainsKey(instruction.OpCode)
         || unaryOperators.ContainsKey(instruction.OpCode);
 }
예제 #7
0
 public override Expression Interpret(Instruction instruction, IndividualDecompilationContext context)
 {
     var indexGetter = parameterIndexGetters[instruction.OpCode];
     return this.primaryContext.GetParameter(indexGetter(instruction));
 }
예제 #8
0
 public override bool CanInterpret(Instruction instruction)
 {
     return parameterIndexGetters.ContainsKey(instruction.OpCode);
 }
예제 #9
0
 public override Expression Interpret(Instruction instruction, IndividualDecompilationContext context)
 {
     return Expression.Constant(
         ((ValueInstruction<string>)instruction).Value
     );
 }
예제 #10
0
 public override bool CanInterpret(Instruction instruction)
 {
     return instruction.OpCode == OpCodes.Ldfld
         || instruction.OpCode == OpCodes.Ldsfld;
 }
예제 #11
0
 public InstructionElement(Instruction instruction)
 {
     this.Instruction = instruction;
 }
예제 #12
0
 public override Expression Interpret(Instruction instruction, IndividualDecompilationContext context)
 {
     return Expression.Constant(GetValue(instruction));
 }
예제 #13
0
 public override bool CanInterpret(Instruction instruction)
 {
     return instruction.OpCode.Name.StartsWith(LdcNamePrefix);
 }
예제 #14
0
 public override Expression Interpret(Instruction instruction, IndividualDecompilationContext context)
 {
     return context.GetPreceding();
 }
예제 #15
0
 public override Expression Interpret(Instruction instruction, IndividualDecompilationContext context)
 {
     var target = context.CapturePreceding();
     return conversions[instruction.OpCode](target);
 }
예제 #16
0
 public override bool CanInterpret(Instruction instruction)
 {
     return conversions.ContainsKey(instruction.OpCode);
 }
예제 #17
0
 public override Expression Interpret(Instruction instruction, IndividualDecompilationContext context)
 {
     var method = ((MethodReferenceInstruction)instruction).Method;
     return new AddressOfExpression(method);
 }
예제 #18
0
 public override bool CanInterpret(Instruction instruction)
 {
     return instruction.OpCode == OpCodes.Newarr;
 }
예제 #19
0
 public override Expression Interpret(Instruction instruction, IndividualDecompilationContext context)
 {
     var type = ((TypeReferenceInstruction)instruction).Type;
     return Expression.NewArrayBounds(type, context.CapturePreceding());
 }
예제 #20
0
 public override bool CanInterpret(Instruction instruction)
 {
     return conditions.Keys.Any(k => instruction.OpCode.Name.StartsWith(k));
 }