PDB files are not supported any more.
Symbol writing is not supported.
m_root.Header.Version = "v2.0.50727";
break;
case TargetRuntime.NET_4_0 :
- m_root.Header.Version = "v4.0.21006";
+ m_root.Header.Version = "v4.0.30319";
break;
}
LIBRARY = Mono.CodeContracts.dll
-LIB_MCS_FLAGS = -r:System -r:System.Core -r:./Mono.Cecil.dll -r:./Mono.Cecil.Mdb.dll -r:./Mono.Cecil.Pdb.dll
+LIB_MCS_FLAGS = -r:System -r:System.Core -r:Mono.Cecil.dll -r:Mono.Cecil.Mdb.dll
+#-r:Mono.Cecil.Pdb.dll
include ../../build/library.make
}\r
\r
public override TypeReference ReturnType {\r
- get { return this.Method.ReturnType; }\r
+ get { return this.Method.ReturnType.ReturnType; }\r
}\r
\r
}\r
namespace Mono.CodeContracts.Rewrite.AstVisitors {\r
class CompileVisitor : ExprVisitor {\r
\r
- public CompileVisitor (ILProcessor il, Dictionary<Expr, Instruction> instructionLookup)\r
+ public CompileVisitor (CilWorker il, Dictionary<Expr, Instruction> instructionLookup)\r
: this (il, instructionLookup, il.Append)\r
{\r
}\r
\r
- public CompileVisitor (ILProcessor il, Dictionary<Expr, Instruction> instructionLookup, Action<Instruction> fnEmit)\r
+ public CompileVisitor (CilWorker il, Dictionary<Expr, Instruction> instructionLookup, Action<Instruction> fnEmit)\r
{\r
this.il = il;\r
this.instructionLookup = instructionLookup;\r
this.fnEmit = fnEmit;\r
}\r
\r
- private ILProcessor il;\r
+ private CilWorker il;\r
private Dictionary<Expr, Instruction> instructionLookup;\r
private Action<Instruction> fnEmit;\r
\r
\r
// Create type\r
TypeReference typeObject = this.module.Import (typeof (object));\r
- TypeDefinition type = new TypeDefinition (Namespace, "__ContractsRuntime",\r
- TypeAttributes.Abstract | TypeAttributes.Sealed | TypeAttributes.NotPublic | TypeAttributes.AnsiClass | TypeAttributes.AutoClass,\r
+ TypeDefinition type = new TypeDefinition ("__ContractsRuntime", Namespace,\r
+ TypeAttributes.Abstract | TypeAttributes.Sealed | TypeAttributes.NotPublic | TypeAttributes.AnsiClass | TypeAttributes.AutoClass, // | TypeAttributes.BeforeFieldInit,\r
typeObject);\r
this.module.Types.Add (type);\r
// Attach custom attributes\r
TypeReference typeString = this.module.Import (typeof (string));\r
TypeReference typeException = this.module.Import (typeof (Exception));\r
// Create type\r
- TypeDefinition type = new TypeDefinition ("", "ContractException",\r
+ TypeDefinition type = new TypeDefinition ("ContractException", Namespace,\r
TypeAttributes.NestedPrivate | TypeAttributes.AnsiClass | TypeAttributes.AutoClass, typeException);\r
- this.typeContractsRuntime.NestedTypes.Add (type);\r
+ //this.typeContractsRuntime.NestedTypes.Add (type);\r
+ this.module.Types.Add(type);\r
// Create constructor\r
MethodDefinition cons = new MethodDefinition (".ctor",\r
MethodAttributes.Assem | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName, typeVoid);\r
- cons.Parameters.Add (new ParameterDefinition ("kind", ParameterAttributes.None, typeContractFailureKind));\r
- cons.Parameters.Add (new ParameterDefinition ("failure", ParameterAttributes.None, typeString));\r
- cons.Parameters.Add (new ParameterDefinition ("usermsg", ParameterAttributes.None, typeString));\r
- cons.Parameters.Add (new ParameterDefinition ("condition", ParameterAttributes.None, typeString));\r
- cons.Parameters.Add (new ParameterDefinition ("inner", ParameterAttributes.None, typeException));\r
- var il = cons.Body.GetILProcessor ();\r
+ cons.Parameters.Add (new ParameterDefinition ("kind", 1, ParameterAttributes.None, typeContractFailureKind));\r
+ cons.Parameters.Add (new ParameterDefinition ("failure", 2, ParameterAttributes.None, typeString));\r
+ cons.Parameters.Add (new ParameterDefinition ("usermsg", 3, ParameterAttributes.None, typeString));\r
+ cons.Parameters.Add (new ParameterDefinition ("condition", 4, ParameterAttributes.None, typeString));\r
+ cons.Parameters.Add (new ParameterDefinition ("inner", 5, ParameterAttributes.None, typeException));\r
+ var il = cons.Body.CilWorker;\r
il.Emit (OpCodes.Ldarg_0);\r
il.Emit (OpCodes.Ldarg_2);\r
il.Emit (OpCodes.Ldarg_S, cons.Parameters [4]);\r
// Create method\r
MethodDefinition method = new MethodDefinition ("TriggerFailure",\r
MethodAttributes.Assem | MethodAttributes.Static, typeVoid);\r
- method.Parameters.Add (new ParameterDefinition ("kind", ParameterAttributes.None, typeContractFailureKind));\r
- method.Parameters.Add (new ParameterDefinition ("message", ParameterAttributes.None, typeString));\r
- method.Parameters.Add (new ParameterDefinition ("userMessage", ParameterAttributes.None, typeString));\r
- method.Parameters.Add (new ParameterDefinition ("conditionText", ParameterAttributes.None, typeString));\r
- method.Parameters.Add (new ParameterDefinition ("inner", ParameterAttributes.None, typeException));\r
- var il = method.Body.GetILProcessor ();\r
+ method.Parameters.Add (new ParameterDefinition ("kind", 1, ParameterAttributes.None, typeContractFailureKind));\r
+ method.Parameters.Add (new ParameterDefinition ("message", 2, ParameterAttributes.None, typeString));\r
+ method.Parameters.Add (new ParameterDefinition ("userMessage", 3, ParameterAttributes.None, typeString));\r
+ method.Parameters.Add (new ParameterDefinition ("conditionText", 4, ParameterAttributes.None, typeString));\r
+ method.Parameters.Add (new ParameterDefinition ("inner", 5, ParameterAttributes.None, typeException));\r
+ var il = method.Body.CilWorker;\r
if (this.options.ThrowOnFailure) {\r
il.Emit (OpCodes.Ldarg_0);\r
il.Emit (OpCodes.Ldarg_1);\r
// Create method\r
MethodDefinition method = new MethodDefinition ("ReportFailure",\r
MethodAttributes.Assem | MethodAttributes.Static, typeVoid);\r
- method.Parameters.Add (new ParameterDefinition ("kind", ParameterAttributes.None, typeContractFailureKind));\r
- method.Parameters.Add (new ParameterDefinition ("message", ParameterAttributes.None, typeString));\r
- method.Parameters.Add (new ParameterDefinition ("conditionText", ParameterAttributes.None, typeString));\r
- method.Parameters.Add (new ParameterDefinition ("inner", ParameterAttributes.None, typeException));\r
- VariableDefinition vMsg = new VariableDefinition ("msg", typeString);\r
+ method.Parameters.Add (new ParameterDefinition ("kind", 1, ParameterAttributes.None, typeContractFailureKind));\r
+ method.Parameters.Add (new ParameterDefinition ("message", 2, ParameterAttributes.None, typeString));\r
+ method.Parameters.Add (new ParameterDefinition ("conditionText", 3, ParameterAttributes.None, typeString));\r
+ method.Parameters.Add (new ParameterDefinition ("inner", 4, ParameterAttributes.None, typeException));\r
+ VariableDefinition vMsg = new VariableDefinition ("sMsg", 0, method, typeString);\r
method.Body.Variables.Add (vMsg);\r
- var il = method.Body.GetILProcessor ();\r
+ method.Body.InitLocals = true;\r
+ var il = method.Body.CilWorker;\r
il.Emit (OpCodes.Ldarg_0);\r
il.Emit (OpCodes.Ldarg_1);\r
il.Emit (OpCodes.Ldarg_2);\r
// Create method\r
MethodDefinition method = new MethodDefinition ("Requires",\r
MethodAttributes.Assem | MethodAttributes.Static, typeVoid);\r
- method.Parameters.Add (new ParameterDefinition ("condition", ParameterAttributes.None, typeBoolean));\r
- method.Parameters.Add (new ParameterDefinition ("message", ParameterAttributes.None, typeString));\r
- method.Parameters.Add (new ParameterDefinition ("conditionText", ParameterAttributes.None, typeString));\r
- var il = method.Body.GetILProcessor ();\r
+ method.Parameters.Add (new ParameterDefinition ("condition", 1, ParameterAttributes.None, typeBoolean));\r
+ method.Parameters.Add (new ParameterDefinition ("message", 2, ParameterAttributes.None, typeString));\r
+ method.Parameters.Add (new ParameterDefinition ("conditionText", 3, ParameterAttributes.None, typeString));\r
+ var il = method.Body.CilWorker;\r
il.Emit (OpCodes.Ldarg_0);\r
var instRet = il.Create(OpCodes.Ret);\r
il.Emit (OpCodes.Brtrue_S, instRet);\r
\r
class Decompile {\r
\r
- public Decompile (MethodDefinition method)\r
+ public Decompile (ModuleDefinition module, MethodDefinition method)\r
{\r
this.method = method;\r
this.exprs = new Stack<Expr> ();\r
this.Instructions = new Dictionary<Expr, Instruction> ();\r
- this.methodInfo = new MethodInfo (method);\r
+ this.methodInfo = new MethodInfo (module, method);\r
this.gen = new ExprGen (this.methodInfo);\r
}\r
\r
{\r
Instruction unknownInst = null;\r
var insts = this.method.Body.Instructions;\r
- foreach (var inst in insts) {\r
+ foreach (Instruction inst in insts) {\r
if (failQuietly) {\r
if (unknownInst == null) {\r
try {\r
\r
public ExprLoadArg LoadArg (ParameterDefinition parameterDefinition)\r
{\r
- return this.LoadArg (parameterDefinition.Index);\r
+ return this.LoadArg (parameterDefinition.Sequence);\r
}\r
\r
public ExprLoadConstant LoadConstant (object value)\r
namespace Mono.CodeContracts.Rewrite {\r
class MethodInfo {\r
\r
- public MethodInfo (MethodDefinition method)\r
+ public MethodInfo (ModuleDefinition module, MethodDefinition method)\r
{\r
this.Method = method;\r
- this.Module = method.Module;\r
+ this.Module = module;\r
\r
this.typeVoid = new Lazy<TypeReference> (() => this.Module.Import (typeof (void)));\r
this.typeObject = new Lazy<TypeReference> (() => this.Module.Import (typeof (object)));\r
\r
public void Rewrite (AssemblyDefinition assembly)\r
{\r
- foreach (var module in assembly.Modules) {\r
+ foreach (ModuleDefinition module in assembly.Modules) {\r
ContractsRuntime contractsRuntime = new ContractsRuntime(module, this.options);\r
\r
var allMethods =\r
- from type in module.Types\r
- from method in type.Methods\r
+ from type in module.Types.Cast<TypeDefinition> ()\r
+ from method in type.Methods.Cast<MethodDefinition> ()\r
select method;\r
\r
- foreach (var method in allMethods.ToArray ()) {\r
- this.RewriteMethod (method, contractsRuntime);\r
+ foreach (MethodDefinition method in allMethods.ToArray ()) {\r
+ this.RewriteMethod (module, method, contractsRuntime);\r
}\r
}\r
}\r
\r
- private void RewriteMethod (MethodDefinition method, ContractsRuntime contractsRuntime)\r
+ private void RewriteMethod (ModuleDefinition module, MethodDefinition method, ContractsRuntime contractsRuntime)\r
{\r
if (this.rewrittenMethods.ContainsKey (method)) {\r
return;\r
}\r
var overridden = this.GetOverriddenMethod (method);\r
if (overridden != null) {\r
- this.RewriteMethod (overridden, contractsRuntime);\r
+ this.RewriteMethod (module, overridden, contractsRuntime);\r
}\r
bool anyRewrites = false;\r
var baseMethod = this.GetBaseOverriddenMethod (method);\r
\r
TransformContractsVisitor vTransform = null;\r
if (method.HasBody) {\r
- vTransform = this.TransformContracts (method, contractsRuntime);\r
+ vTransform = this.TransformContracts (module, method, contractsRuntime);\r
if (this.sym != null) {\r
this.sym.Write (method.Body);\r
}\r
this.rewrittenMethods.Add (method, vTransform);\r
\r
if (anyRewrites) {\r
- Console.WriteLine (method.FullName);\r
+ Console.WriteLine (method);\r
}\r
}\r
\r
- private TransformContractsVisitor TransformContracts (MethodDefinition method, ContractsRuntime contractsRuntime)\r
+ private TransformContractsVisitor TransformContracts (ModuleDefinition module, MethodDefinition method, ContractsRuntime contractsRuntime)\r
{\r
var body = method.Body;\r
- Decompile decompile = new Decompile (method);\r
+ Decompile decompile = new Decompile (module, method);\r
var decomp = decompile.Go ();\r
\r
- TransformContractsVisitor vTransform = new TransformContractsVisitor (method, decompile.Instructions, contractsRuntime);\r
+ TransformContractsVisitor vTransform = new TransformContractsVisitor (module, method, decompile.Instructions, contractsRuntime);\r
vTransform.Visit (decomp);\r
\r
foreach (var replacement in vTransform.ContractRequiresInfo) {\r
\r
private void RewriteIL (MethodBody body, Dictionary<Expr,Instruction> instructionLookup, Expr remove, Expr insert)\r
{\r
- var il = body.GetILProcessor ();\r
+ var il = body.CilWorker;\r
Instruction instInsertBefore;\r
if (remove != null) {\r
var vInstExtent = new InstructionExtentVisitor (instructionLookup);\r
if (baseType == null) {\r
return null;\r
}\r
- var overridden = baseType.Resolve ().Methods.FirstOrDefault (x => x.Name == method.Name);\r
+ var overridden = baseType.Resolve ().Methods.Cast<MethodDefinition> ().FirstOrDefault (x => x.Name == method.Name);\r
return overridden;\r
}\r
\r
using Mono.Cecil.Cil;\r
using Mono.Cecil;\r
using System.IO;\r
+using Mono.CompilerServices.SymbolWriter;\r
\r
namespace Mono.CodeContracts.Rewrite {\r
public class Rewriter {\r
this.warnings.Add ("-debug specified, but no symbol stream provided.");\r
} else {\r
try {\r
- ISymbolReaderProvider symProv = new Mono.Cecil.Mdb.MdbReaderProvider ();\r
- foreach (var module in assembly.Modules) {\r
- ISymbolReader sym = this.options.Assembly.IsFilename ?\r
- symProv.GetSymbolReader (module, this.options.Assembly.Filename) :\r
- symProv.GetSymbolReader (module, this.options.Assembly.Streams.Symbols);\r
- module.ReadSymbols (sym);\r
- this.symReaders.Add (sym);\r
+ //ISymbolReaderProvider symProv = new Mono.Cecil.Mdb.MdbReaderProvider ();\r
+ foreach (ModuleDefinition module in assembly.Modules) {\r
+ //ISymbolReader sym = this.options.Assembly.IsFilename ?\r
+ // symProv.GetSymbolReader (module, this.options.Assembly.Filename) :\r
+ // symProv.GetSymbolReader (module, this.options.Assembly.Streams.Symbols);\r
+ //module.ReadSymbols (sym);\r
+ //this.symReaders.Add (sym);\r
+ module.LoadSymbols ();\r
}\r
this.usingMdb = true;\r
} catch {\r
- try {\r
- ISymbolReaderProvider symProv = new Mono.Cecil.Pdb.PdbReaderProvider ();\r
- foreach (var module in assembly.Modules) {\r
- ISymbolReader sym = this.options.Assembly.IsFilename ?\r
- symProv.GetSymbolReader (module, this.options.Assembly.Filename) :\r
- symProv.GetSymbolReader (module, this.options.Assembly.Streams.Symbols);\r
- module.ReadSymbols (sym);\r
- this.symReaders.Add (sym);\r
- }\r
- this.usingPdb = true;\r
- } catch {\r
- }\r
+// try {\r
+// ISymbolReaderProvider symProv = new Mono.Cecil.Pdb.PdbReaderProvider ();\r
+// foreach (var module in assembly.Modules) {\r
+// ISymbolReader sym = this.options.Assembly.IsFilename ?\r
+// symProv.GetSymbolReader (module, this.options.Assembly.Filename) :\r
+// symProv.GetSymbolReader (module, this.options.Assembly.Streams.Symbols);\r
+// module.ReadSymbols (sym);\r
+// this.symReaders.Add (sym);\r
+// }\r
+// this.usingPdb = true;\r
+// } catch {\r
+// }\r
}\r
if (!this.usingMdb && !this.usingPdb) {\r
this.warnings.Add ("-debug specified, but no MDB or PDB symbol file found.");\r
private ISymbolWriter LoadSymbolWriter(AssemblyDefinition assembly, AssemblyRef output)\r
{\r
// TODO: Get symbol writing to work.\r
- ISymbolWriterProvider symProv = null;\r
- if (this.usingMdb) {\r
- symProv = new Mono.Cecil.Mdb.MdbWriterProvider ();\r
- } else if (this.usingPdb) {\r
- symProv = new Mono.Cecil.Pdb.PdbWriterProvider ();\r
- } else {\r
- this.warnings.Add ("-writePDBFile specified, but no symbol file found, cannot write symbols.");\r
- }\r
- if (symProv != null) {\r
- return output.IsFilename ?\r
- symProv.GetSymbolWriter (assembly.MainModule, output.Filename) :\r
- symProv.GetSymbolWriter (assembly.MainModule, output.Streams.Symbols);\r
- }\r
+// ISymbolWriterProvider symProv = null;\r
+// if (this.usingMdb) {\r
+// symProv = new Mono.Cecil.Mdb.MdbWriterProvider ();\r
+// } else if (this.usingPdb) {\r
+// symProv = new Mono.Cecil.Pdb.PdbWriterProvider ();\r
+// } else {\r
+// this.warnings.Add ("-writePDBFile specified, but no symbol file found, cannot write symbols.");\r
+// }\r
+// if (symProv != null) {\r
+// return output.IsFilename ?\r
+// symProv.GetSymbolWriter (assembly.MainModule, output.Filename) :\r
+// symProv.GetSymbolWriter (assembly.MainModule, output.Streams.Symbols);\r
+// }\r
return null;\r
}\r
\r
return RewriterResults.Error ("No assembly given to rewrite");\r
}\r
AssemblyDefinition assembly = this.options.Assembly.IsFilename ?\r
- AssemblyDefinition.ReadAssembly (this.options.Assembly.Filename) :\r
- AssemblyDefinition.ReadAssembly (this.options.Assembly.Streams.Assembly);\r
+ AssemblyFactory.GetAssembly (this.options.Assembly.Filename) :\r
+ AssemblyFactory.GetAssembly (this.options.Assembly.Streams.Assembly);\r
\r
if (this.options.ForceAssemblyRename != null) {\r
- assembly.Name = new AssemblyNameDefinition (this.options.ForceAssemblyRename, new Version (0, 0, 0, 0));\r
+ assembly.Name.Name = this.options.ForceAssemblyRename;\r
+ } else if (this.options.OutputFile.IsSet && this.options.OutputFile.IsFilename) {\r
+ assembly.Name.Name = Path.GetFileNameWithoutExtension(this.options.OutputFile.Filename);\r
}\r
\r
if (options.Debug) {\r
rewriter.Rewrite (assembly);\r
\r
if (output.IsFilename) {\r
- assembly.Name.Name = Path.GetFileNameWithoutExtension (output.Filename);\r
- assembly.Write (output.Filename);\r
+ AssemblyFactory.SaveAssembly(assembly, output.Filename);\r
} else {\r
- assembly.Write (output.Streams.Assembly);\r
+ AssemblyFactory.SaveAssembly(assembly, output.Streams.Assembly);\r
}\r
} finally {\r
if (symWriter != null) {\r
namespace Mono.CodeContracts.Rewrite {\r
class TransformContractsVisitor : ExprVisitor {\r
\r
- public TransformContractsVisitor (MethodDefinition method, Dictionary<Expr, Instruction> instructionLookup, ContractsRuntime contractsRuntime)\r
+ public TransformContractsVisitor (ModuleDefinition module, MethodDefinition method, Dictionary<Expr, Instruction> instructionLookup, ContractsRuntime contractsRuntime)\r
{\r
- this.module = method.Module;\r
+ //this.module = method.Module;\r
this.instructionLookup = instructionLookup;\r
this.contractsRuntime = contractsRuntime;\r
- this.methodInfo = new MethodInfo (method);\r
+ this.methodInfo = new MethodInfo (module, method);\r
}\r
\r
- private ModuleDefinition module;\r
+ //private ModuleDefinition module;\r
private Dictionary<Expr, Instruction> instructionLookup;\r
private ContractsRuntime contractsRuntime;\r
private MethodInfo methodInfo;\r