Minor changes
authorChris Bacon <chrisbacon76@gmail.com>
Thu, 12 Aug 2010 11:09:41 +0000 (12:09 +0100)
committerChris Bacon <chrisbacon76@gmail.com>
Thu, 12 Aug 2010 11:09:41 +0000 (12:09 +0100)
mcs/class/Mono.CodeContracts/Mono.CodeContracts.Rewrite.AstVisitors/CompileVisitor.cs
mcs/class/Mono.CodeContracts/Mono.CodeContracts.Rewrite/ContractsRuntime.cs
mcs/class/Mono.CodeContracts/Mono.CodeContracts.Rewrite/Rewriter.cs

index 5fe8098b1637695d38894de9448858fb7197a0fb..384c25bb23ce277d6ef60bbd39cd1b338f653871 100644 (file)
@@ -102,6 +102,7 @@ namespace Mono.CodeContracts.Rewrite.AstVisitors {
                                                return this.il.Create (OpCodes.Ldarg, index);\r
                                        }\r
                                }\r
+                               // Required due to bug in compiler\r
                                throw new NotSupportedException();\r
                        });\r
                        \r
@@ -148,6 +149,7 @@ namespace Mono.CodeContracts.Rewrite.AstVisitors {
                                                        return this.il.Create (OpCodes.Ldc_I4, value);\r
                                                }\r
                                        }\r
+                                       // Required due to bug in compiler\r
                                        throw new NotSupportedException();\r
                                case TypeCode.Single:\r
                                        return this.il.Create (OpCodes.Ldc_R4, (float) v);\r
@@ -158,6 +160,7 @@ namespace Mono.CodeContracts.Rewrite.AstVisitors {
                                default:\r
                                        throw new NotSupportedException ("Cannot handle constant: " + vTypeCode);\r
                                }\r
+                               // Required due to bug in compiler\r
                                throw new NotSupportedException();\r
                        });\r
 \r
index 7ff4c95abc037421d13d4352243c8f68e4d8918e..00f0e99112da2c8944d6423b0a100965e054de1a 100644 (file)
@@ -62,6 +62,12 @@ namespace Mono.CodeContracts.Rewrite {
                private void EnsureTypeContractRuntime ()\r
                {\r
                        if (this.typeContractsRuntime == null) {\r
+                               // namespace System.Diagnostics.Contracts {\r
+                               //     [CompilerGenerated]\r
+                               //     private static class __ContractsRuntime {\r
+                               //     }\r
+                               // }\r
+                               \r
                                // Create type\r
                                TypeReference typeObject = this.module.Import (typeof (object));\r
                                TypeDefinition type = new TypeDefinition (Namespace, "__ContractsRuntime",\r
@@ -80,6 +86,15 @@ namespace Mono.CodeContracts.Rewrite {
                private void EnsureTypeContractException ()\r
                {\r
                        if (this.options.ThrowOnFailure && this.typeContractException == null) {\r
+                               // [CompilerGenerated]\r
+                               // private class ContractException : Exception {\r
+                               //     internal ContractException(ContractFailureKind kind, string usermsg, string condition, Exception inner)\r
+                               //         : base(failure, inner)\r
+                               //     {\r
+                               //     }\r
+                               // }\r
+                               \r
+                               // Prepare type references\r
                                TypeReference typeVoid = this.module.Import (typeof (void));\r
                                TypeReference typeContractFailureKind = this.module.Import (typeof (ContractFailureKind));\r
                                TypeReference typeString = this.module.Import (typeof (string));\r
@@ -117,6 +132,19 @@ namespace Mono.CodeContracts.Rewrite {
                private void EnsureMethodTriggerFailure ()\r
                {\r
                        if (this.methodTriggerFailure == null) {\r
+                               // if the ThrowOnFailure option is true, then:\r
+                               // internal static void TriggerFailure(ContractFailureKind kind, string message, string userMessage, string conditionText, Exception inner)\r
+                               // {\r
+                               //     throw new ContractException(kind, message, userMessage, conditionText, inner);\r
+                               // }\r
+                               \r
+                               // if the ThrowOnFailure option is false, then:\r
+                               // internal static void TriggerFailure(ContractFailureKind kind, string message, string userMessage, string conditionText, Exception inner)\r
+                               // {\r
+                               //     Debug.Fail(message, userMessage);\r
+                               // }\r
+                               \r
+                               // Prepare type references\r
                                TypeReference typeVoid = this.module.Import (typeof (void));\r
                                TypeReference typeContractFailureKind = this.module.Import (typeof (ContractFailureKind));\r
                                TypeReference typeString = this.module.Import (typeof (string));\r
@@ -154,6 +182,15 @@ namespace Mono.CodeContracts.Rewrite {
                private void EnsureMethodReportFailure ()\r
                {\r
                        if (this.methodReportFailure == null) {\r
+                               // internal static void ReportFailure(ContractFailureKind kind, string message, string conditionText, Exception inner)\r
+                               // {\r
+                               //     string s = ContractHelper.RaiseContractFailedEvent(kind, message, conditionText, inner);\r
+                               //     if (s != null) {\r
+                               //         TriggerFailure(kind, s, message, conditionText, inner);\r
+                               //     }\r
+                               // }\r
+                               \r
+                               // Prepare type references\r
                                TypeReference typeVoid = this.module.Import (typeof (void));\r
                                TypeReference typeContractFailureKind = this.module.Import (typeof (ContractFailureKind));\r
                                TypeReference typeString = this.module.Import (typeof (string));\r
@@ -202,6 +239,16 @@ namespace Mono.CodeContracts.Rewrite {
                {\r
                        this.EnsureGlobal ();\r
                        if (this.methodRequires == null) {\r
+                               // [DebuggerNonUserCode]\r
+                               // [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]\r
+                               // internal static void Requires(bool condition, string message, string conditionText)\r
+                               // {\r
+                               //     if (!condition) {\r
+                               //         ReportFailure(ContractFailureKind.Precondition, message, conditionText, null);\r
+                               //     }\r
+                               // }\r
+                               \r
+                               // Prepare type references\r
                                TypeReference typeVoid = this.module.Import (typeof (void));\r
                                TypeReference typeBoolean = this.module.Import (typeof (bool));\r
                                TypeReference typeString = this.module.Import (typeof (string));\r
index b366321b72ec0007502cf52b14a0c4d9c99acf3a..74897a9f024b799994b5b092daaed7674a39d946 100644 (file)
@@ -35,66 +35,102 @@ using Mono.Cecil;
 using System.IO;\r
 \r
 namespace Mono.CodeContracts.Rewrite {\r
-       public static class Rewriter {\r
+       public class Rewriter {\r
 \r
                public static RewriterResults Rewrite (RewriterOptions options)\r
                {\r
-                       if (!options.Rewrite) {\r
-                               return RewriterResults.Warning("Not asked to rewrite");\r
+                       Rewriter rewriter = new Rewriter(options);\r
+                       return rewriter.RewriteImpl();\r
+               }\r
+               \r
+               private Rewriter(RewriterOptions options)\r
+               {\r
+                       this.options = options;\r
+               }\r
+               \r
+               private RewriterOptions options;\r
+               private List<string> warnings = new List<string> ();\r
+               private List<string> errors = new List<string> ();\r
+               private bool usingMdb = false;\r
+               private bool usingPdb = false;\r
+               private List<ISymbolReader> symReaders = new List<ISymbolReader> ();\r
+               \r
+               private void LoadSymbolReader (AssemblyDefinition assembly) {\r
+                       if (this.options.Assembly.IsStream && this.options.Assembly.Streams.Symbols == null) {\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
+                                       }\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
+                               }\r
+                               if (!this.usingMdb && !this.usingPdb) {\r
+                                       this.warnings.Add ("-debug specified, but no MDB or PDB symbol file found.");\r
+                               }\r
+                       }\r
+               }\r
+               \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
+                       return null;\r
+               }\r
 \r
-                       if (!options.Assembly.IsSet) {\r
+\r
+               private RewriterResults RewriteImpl ()\r
+               {\r
+                       if (!this.options.Rewrite) {\r
+                               return RewriterResults.Warning ("Not asked to rewrite");\r
+                       }\r
+\r
+                       if (!this.options.Assembly.IsSet) {\r
                                return RewriterResults.Error ("No assembly given to rewrite");\r
                        }\r
-                       AssemblyDefinition assembly = options.Assembly.IsFilename ?\r
-                               AssemblyDefinition.ReadAssembly (options.Assembly.Filename) :\r
-                               AssemblyDefinition.ReadAssembly (options.Assembly.Streams.Assembly);\r
+                       AssemblyDefinition assembly = this.options.Assembly.IsFilename ?\r
+                               AssemblyDefinition.ReadAssembly (this.options.Assembly.Filename) :\r
+                               AssemblyDefinition.ReadAssembly (this.options.Assembly.Streams.Assembly);\r
                        \r
-                       if (options.ForceAssemblyRename != null) {\r
-                               assembly.Name = new AssemblyNameDefinition (options.ForceAssemblyRename, new Version (0, 0, 0, 0));\r
+                       if (this.options.ForceAssemblyRename != null) {\r
+                               assembly.Name = new AssemblyNameDefinition (this.options.ForceAssemblyRename, new Version (0, 0, 0, 0));\r
                        }\r
 \r
-                       List<string> errors = new List<string> ();\r
-                       List<string> warnings = new List<string> ();\r
-\r
-                       bool usingMdb = false;\r
-                       bool usingPdb = false;\r
-                       List<ISymbolReader> symReaders = new List<ISymbolReader> ();\r
                        if (options.Debug) {\r
-                               if (options.Assembly.IsStream && options.Assembly.Streams.Symbols == null) {\r
-                                       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 = options.Assembly.IsFilename ?\r
-                                                               symProv.GetSymbolReader (module, options.Assembly.Filename) :\r
-                                                               symProv.GetSymbolReader (module, options.Assembly.Streams.Symbols);\r
-                                                       module.ReadSymbols (sym);\r
-                                                       symReaders.Add(sym);\r
-                                               }\r
-                                               usingMdb = true;\r
-                                       } catch {\r
-                                               try {\r
-                                                       ISymbolReaderProvider symProv = new Mono.Cecil.Pdb.PdbReaderProvider ();\r
-                                                       foreach (var module in assembly.Modules) {\r
-                                                               ISymbolReader sym = options.Assembly.IsFilename ?\r
-                                                                       symProv.GetSymbolReader (module, options.Assembly.Filename) :\r
-                                                                       symProv.GetSymbolReader (module, options.Assembly.Streams.Symbols);\r
-                                                               module.ReadSymbols (sym);\r
-                                                               symReaders.Add(sym);\r
-                                                       }\r
-                                                       usingPdb = true;\r
-                                               } catch {\r
-                                               }\r
-                                       }\r
-                                       if (!usingMdb && !usingPdb) {\r
-                                               warnings.Add ("-debug specified, but no MDB or PDB symbol file found.");\r
-                                       }\r
-                               }\r
+                               this.LoadSymbolReader (assembly);\r
                        }\r
 \r
-                       var output = options.OutputFile.IsSet ? options.OutputFile : options.Assembly;\r
+                       var output = this.options.OutputFile.IsSet ? this.options.OutputFile : this.options.Assembly;\r
                        ISymbolWriter symWriter = null;\r
                        if (options.WritePdbFile) {\r
                                if (!options.Debug) {\r
@@ -103,23 +139,11 @@ namespace Mono.CodeContracts.Rewrite {
                                if (output.IsStream && output.Streams.Symbols==null){\r
                                        return RewriterResults.Error ("-writePDFFile specified, but no output symbol stream provided.");\r
                                }\r
-                               // TODO: Get symbol writing to work.\r
-                               ISymbolWriterProvider symProv = null;\r
-                               if (usingMdb) {\r
-                                       symProv = new Mono.Cecil.Mdb.MdbWriterProvider ();\r
-                               } else if (usingPdb) {\r
-                                       symProv = new Mono.Cecil.Pdb.PdbWriterProvider ();\r
-                               } else {\r
-                                       warnings.Add ("-writePDBFile specified, but no symbol file found, cannot write symbols.");\r
-                               }\r
-                               if (symProv != null) {\r
-                                       symWriter = output.IsFilename ?\r
-                                               symProv.GetSymbolWriter (assembly.MainModule, output.Filename) :\r
-                                               symProv.GetSymbolWriter (assembly.MainModule, output.Streams.Symbols);\r
-                               }\r
+                               symWriter = this.LoadSymbolWriter (assembly, output);\r
                        }\r
+                       \r
                        try {\r
-                               PerformRewrite rewriter = new PerformRewrite (symWriter, options);\r
+                               PerformRewrite rewriter = new PerformRewrite (symWriter, this.options);\r
                                rewriter.Rewrite (assembly);\r
 \r
                                if (output.IsFilename) {\r
@@ -132,7 +156,7 @@ namespace Mono.CodeContracts.Rewrite {
                                if (symWriter != null) {\r
                                        symWriter.Dispose ();\r
                                }\r
-                               foreach (var symReader in symReaders) {\r
+                               foreach (var symReader in this.symReaders) {\r
                                        try {\r
                                                if (symReader != null) {\r
                                                        symReader.Dispose ();\r
@@ -144,6 +168,6 @@ namespace Mono.CodeContracts.Rewrite {
 \r
                        return new RewriterResults (warnings, errors);\r
                }\r
-\r
+               \r
        }\r
 }\r