// called from Traverser // set in Main public static void IMethodDefinitionTraverse(IMethodDefinition mD, IMetadataHost host, ISourceLocationProvider sourceLocationProvider) { // TODO: Hack to for treating a method as nondet var method = mD.ResolvedMethod; var methodName = method.ContainingType.FullName() + "." + method.Name.Value; if (methodName.Equals("SVX.ContractBase.getNondet")) { InstructionTranslator.AddToExternalMethods(method); return; } // End Hack if (!mD.IsExternal) { try { if (whitelistContains(mD.ContainingType.FullName())) { var disassembler = new Disassembler(host, mD, sourceLocationProvider); MethodBody mB = disassembler.Execute(); transformBody(mB); MethodTranslator methodTranslator = new MethodTranslator(mD, mB, Traverser.CHA); // todo: improve this piece of code StreamWriter streamWriter = Program.streamWriter; streamWriter.WriteLine(methodTranslator.Translate()); Helpers.addTranslatedMethod(mD); } } catch (InvalidOperationException ex) { Console.WriteLine("WARNING: Exception thrown while translating method (omitting): " + BoogieMethod.From(mD).Name); if (!Settings.SilentExceptionsForMethods) { throw ex; } } } }
// 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; } } } } } }