public ProcessorState(Stack<Address> stack, VariableInfo[] locals, IList<Address> args, Instruction instruction, Instruction last = null, IDictionary<FieldInfo, Address> delegates = null) { Delegates = delegates ?? new Dictionary<FieldInfo, Address>(); Stack = stack; Locals = locals; Args = args; Instruction = instruction; Last = last; }
public static Expression Process(VariableInfo[] locals, IList<Address> args, Instruction instruction, Type returnType) { Processor processor = new Processor(); processor.states.Push(new ProcessorState(new Stack<Address>(), locals, args, instruction)); var ex = AdjustType(processor.Process(), returnType); if (ex.Type != returnType && returnType != typeof(void)) { return Expression.Convert(ex, returnType); } return ex; }
public MethodBodyDecompiler(MethodInfo method) { this.method = method; var parameters = method.GetParameters(); if (method.IsStatic) args = parameters .Select(p => (Address) Expression.Parameter(p.ParameterType, p.Name)) .ToList(); else args = new[] {(Address) Expression.Parameter(method.DeclaringType, "this")} .Union(parameters.Select(p => (Address) Expression.Parameter(p.ParameterType, p.Name))) .ToList(); var body = method.GetMethodBody(); var addresses = new VariableInfo[body.LocalVariables.Count]; for (int i = 0; i < addresses.Length; i++) { addresses[i] = new VariableInfo(body.LocalVariables[i].LocalType); } locals = addresses.ToArray(); }