public TransformContractsVisitor (ModuleDefinition module, MethodDefinition method, Dictionary<Expr, Instruction> instructionLookup, ContractsRuntime contractsRuntime) { //this.module = method.Module; this.instructionLookup = instructionLookup; this.contractsRuntime = contractsRuntime; this.methodInfo = new MethodInfo (module, method); }
private void RewriteMethod(ModuleDefinition module, MethodDefinition method, ContractsRuntime contractsRuntime) { if (this.rewrittenMethods.ContainsKey(method)) { return; } var overridden = this.GetOverriddenMethod(method); if (overridden != null) { this.RewriteMethod(module, overridden, contractsRuntime); } bool anyRewrites = false; var baseMethod = this.GetBaseOverriddenMethod(method); if (baseMethod != method) { // Contract inheritance must be used var vOverriddenTransform = this.rewrittenMethods [baseMethod]; // Can be null if overriding an abstract method if (vOverriddenTransform != null) { if (this.options.Level >= 2) { // Only insert re-written contracts if level >= 2 foreach (var inheritedRequires in vOverriddenTransform.ContractRequiresInfo) { this.RewriteIL(method.Body, null, null, inheritedRequires.RewrittenExpr); anyRewrites = true; } } } } TransformContractsVisitor vTransform = null; if (method.HasBody) { vTransform = this.TransformContracts(module, method, contractsRuntime); if (vTransform.ContractRequiresInfo.Any()) { anyRewrites = true; } } this.rewrittenMethods.Add(method, vTransform); if (anyRewrites) { Console.WriteLine(method); } }
public void Rewrite (AssemblyDefinition assembly) { foreach (ModuleDefinition module in assembly.Modules) { ContractsRuntime contractsRuntime = new ContractsRuntime(module, this.options); var allMethods = from type in module.Types.Cast<TypeDefinition> () from method in type.Methods.Cast<MethodDefinition> () select method; foreach (MethodDefinition method in allMethods.ToArray ()) { this.RewriteMethod (module, method, contractsRuntime); } } }
public void Rewrite(AssemblyDefinition assembly) { foreach (ModuleDefinition module in assembly.Modules) { ContractsRuntime contractsRuntime = new ContractsRuntime(module, this.options); var allMethods = from type in module.Types from method in type.Methods select method; foreach (MethodDefinition method in allMethods.ToArray()) { this.RewriteMethod(module, method, contractsRuntime); } } }
private void RewriteMethod (ModuleDefinition module, MethodDefinition method, ContractsRuntime contractsRuntime) { if (this.rewrittenMethods.ContainsKey (method)) { return; } var overridden = this.GetOverriddenMethod (method); if (overridden != null) { this.RewriteMethod (module, overridden, contractsRuntime); } bool anyRewrites = false; var baseMethod = this.GetBaseOverriddenMethod (method); if (baseMethod != method) { // Contract inheritance must be used var vOverriddenTransform = this.rewrittenMethods [baseMethod]; // Can be null if overriding an abstract method if (vOverriddenTransform != null) { if (this.options.Level >= 2) { // Only insert re-written contracts if level >= 2 foreach (var inheritedRequires in vOverriddenTransform.ContractRequiresInfo) { this.RewriteIL (method.Body, null, null, inheritedRequires.RewrittenExpr); anyRewrites = true; } } } } TransformContractsVisitor vTransform = null; if (method.HasBody) { vTransform = this.TransformContracts (module, method, contractsRuntime); if (this.sym != null) { this.sym.Write (method.Body); } if (vTransform.ContractRequiresInfo.Any ()) { anyRewrites = true; } } this.rewrittenMethods.Add (method, vTransform); if (anyRewrites) { Console.WriteLine (method); } }
private TransformContractsVisitor TransformContracts (ModuleDefinition module, MethodDefinition method, ContractsRuntime contractsRuntime) { var body = method.Body; Decompile decompile = new Decompile (module, method); var decomp = decompile.Go (); TransformContractsVisitor vTransform = new TransformContractsVisitor (module, method, decompile.Instructions, contractsRuntime); vTransform.Visit (decomp); foreach (var replacement in vTransform.ContractRequiresInfo) { // Only insert re-written contracts if level >= 2 Expr rewritten = this.options.Level >= 2 ? replacement.RewrittenExpr : null; this.RewriteIL (body, decompile.Instructions, replacement.OriginalExpr, rewritten); } return vTransform; }
private TransformContractsVisitor TransformContracts(ModuleDefinition module, MethodDefinition method, ContractsRuntime contractsRuntime) { var body = method.Body; Decompile decompile = new Decompile(module, method); var decomp = decompile.Go(); TransformContractsVisitor vTransform = new TransformContractsVisitor(module, method, decompile.Instructions, contractsRuntime); vTransform.Visit(decomp); foreach (var replacement in vTransform.ContractRequiresInfo) { // Only insert re-written contracts if level >= 2 Expr rewritten = this.options.Level >= 2 ? replacement.RewrittenExpr : null; this.RewriteIL(body, decompile.Instructions, replacement.OriginalExpr, rewritten); } return(vTransform); }
public TransformContractsVisitor(ModuleDefinition module, MethodDefinition method, Dictionary <Expr, Instruction> instructionLookup, ContractsRuntime contractsRuntime) { //this.module = method.Module; this.instructionLookup = instructionLookup; this.contractsRuntime = contractsRuntime; this.methodInfo = new MethodInfo(module, method); }