public String Translate() { // instructions must be translated before local variables // modification to local variables can ocurr while instruction translation is done // for example when delegate creation is detected some local variables are deleted. var ins = TranslateInstructions(out Dictionary <string, BoogieVariable> temporalVariables); var localVariables = TranslateLocalVariables(temporalVariables); var methodName = BoogieMethod.From(methodDefinition).Name; var attr = TranslateAttr(); Disassembler disassembler = new Disassembler(assembly.Host, methodDefinition, assembly.PdbReader); disassembler.Execute(); var parametersWithTypes = Helpers.GetParametersWithBoogieType(disassembler.MethodBody.Parameters); var returnTypeIfAny = TranslateReturnTypeIfAny(); var boogieProcedureTemplate = new BoogieProcedureTemplate(methodName, attr, localVariables, ins, parametersWithTypes, returnTypeIfAny, Helpers.IsExternal(methodDefinition)); return(boogieProcedureTemplate.TransformText()); }
public override void TraverseChildren(IMethodDefinition methodDefinition) { //var signature = MemberHelper.GetMethodSignature(methodDefinition, NameFormattingOptions.Signature | NameFormattingOptions.ParameterName); //System.Console.WriteLine(signature); if (methodDefinition.IsAbstract || methodDefinition.IsExternal) { return; } var disassembler = new Disassembler(host, methodDefinition, sourceLocationProvider); var methodBody = disassembler.Execute(); foreach (var instruction in methodBody.Instructions) { var visitor = new AllocAndDelegateFinderVisitor(this); instruction.Accept(visitor); } }
// called from Traverser // set in Main public static void TranslateAssemblies(ISet <Assembly> assemblies, ClassHierarchyAnalysis CHA) { foreach (Assembly assembly in assemblies) { foreach (IMethodDefinition methodDefinition in assembly.GetAllDefinedMethods()) { if (!methodDefinition.IsExternal) { try { var disassembler = new Disassembler(assembly.Host, methodDefinition, assembly.PdbReader); disassembler.Execute(); MethodBody mB = disassembler.MethodBody; ControlFlowGraph cfg = disassembler.ControlFlowGraph; // it would be faster to do this while we do // the global search for field references if (Settings.MemoryModel == ProgramOptions.MemoryModelOption.Mixed) { ReferenceFinder reference = new ReferenceFinder(); reference.CollectLocalVariables(mB); } MethodTranslator methodTranslator = new MethodTranslator(methodDefinition, mB, CHA, cfg, assembly, assemblies); // todo: improve this piece of code StreamWriter streamWriter = Program.streamWriter; streamWriter.WriteLine(methodTranslator.Translate()); Helpers.addTranslatedMethod(methodDefinition); } catch (InvalidOperationException ex) { Console.WriteLine("WARNING: Exception thrown while translating method (omitting): " + BoogieMethod.From(methodDefinition).Name); if (!Settings.SilentExceptionsForMethods) { throw ex; } } } } } }