public IDictionary <Model.Bytecode.Instruction, IList <Mono.Cecil.Cil.Instruction> > CreateInstructions(Model.Types.MethodDefinition methodDefinition, Mono.Cecil.MethodDefinition methodDef, IDictionary <AnalysisNet.ThreeAddressCode.Values.IVariable, Cecil.Cil.VariableDefinition> variableDefinitions, IDictionary <AnalysisNet.ThreeAddressCode.Values.IVariable, Cecil.ParameterDefinition> parameterDefinitions) { Cecil.Cil.ILProcessor ilProcessor = methodDef.Body.GetILProcessor(); BytecodeTranslator translator = new BytecodeTranslator(methodDefinition, variableDefinitions, parameterDefinitions, ReferenceGenerator, ilProcessor); // analysis net instruction -> [cecil instructions] IDictionary <AnalysisNet.Bytecode.Instruction, IList <Cecil.Cil.Instruction> > mappingTranslatedInstructions = translator.Translate(); IEnumerable <Cecil.Cil.Instruction> instructions = mappingTranslatedInstructions.Values.SelectMany(l => l); foreach (Mono.Cecil.Cil.Instruction ins in instructions) { ilProcessor.Append(ins); } return(mappingTranslatedInstructions); }
private IDictionary <AnalysisNet.ThreeAddressCode.Values.IVariable, Cecil.Cil.VariableDefinition> CreateLocalVariables(Model.Types.MethodDefinition methodDefinition, Mono.Cecil.MethodDefinition methodDef) { IDictionary <AnalysisNet.ThreeAddressCode.Values.IVariable, Cecil.Cil.VariableDefinition> variableDefinitions = new Dictionary <AnalysisNet.ThreeAddressCode.Values.IVariable, Cecil.Cil.VariableDefinition>(); foreach (AnalysisNet.ThreeAddressCode.Values.IVariable localVariable in methodDefinition.Body.LocalVariables) { Cecil.Cil.VariableDefinition varDef = new Cecil.Cil.VariableDefinition(ReferenceGenerator.TypeReference(localVariable.Type)); methodDef.Body.Variables.Add(varDef); variableDefinitions[localVariable] = varDef; } return(variableDefinitions); }
private IDictionary <AnalysisNet.ThreeAddressCode.Values.IVariable, Cecil.ParameterDefinition> CreateParameters(AnalysisNet.Types.MethodDefinition methodDefinition, Mono.Cecil.MethodDefinition methodDef) { IDictionary <AnalysisNet.ThreeAddressCode.Values.IVariable, Cecil.ParameterDefinition> parameterDefinitions = new Dictionary <AnalysisNet.ThreeAddressCode.Values.IVariable, Cecil.ParameterDefinition>(); for (int idx = 0; idx < methodDefinition.Parameters.Count; idx++) { AnalysisNet.Types.MethodParameter methodParameter = methodDefinition.Parameters.ElementAt(idx); //if (methodParameter.Name.Equals("this")) // continue; Cecil.ParameterDefinition paramDef = new Cecil.ParameterDefinition(ReferenceGenerator.TypeReference(methodParameter.Type)); if (methodParameter.DefaultValue != null) { paramDef.Constant = methodParameter.DefaultValue.Value; paramDef.HasDefault = true; } if (methodParameter.Kind == AnalysisNet.Types.MethodParameterKind.In) { paramDef.IsIn = true; } else if (methodParameter.Kind == AnalysisNet.Types.MethodParameterKind.Out) { paramDef.IsOut = true; } methodDef.Parameters.Add(paramDef); // map body parameters to cecil parameters if (methodDefinition.HasBody && methodDefinition.Body.Parameters.Count > 0) { // body parameters contain 'this' while analysis-net's parameters do not int localIdx = (methodDefinition.IsStatic ? 0 : 1) + idx; AnalysisNet.ThreeAddressCode.Values.IVariable localVariable = methodDefinition.Body.Parameters.ElementAt(localIdx); parameterDefinitions[localVariable] = paramDef; } } return(parameterDefinitions); }