diff options
author | Jb Evain <jbevain@gmail.com> | 2015-05-28 11:28:32 +0300 |
---|---|---|
committer | Jb Evain <jbevain@gmail.com> | 2015-05-28 11:28:32 +0300 |
commit | 83af39c4e3ba7a8c36f94d177654f7d97561239c (patch) | |
tree | 073940d21c3378d1ac685887e483baab96ccd22c | |
parent | 2b026412f51a6684c216f10485652a54536cb715 (diff) | |
parent | 84dbccaddff1962d40288fb1c4c6f8bbf90cab09 (diff) |
Merge pull request #214 from jbevain/sysruntime
Add support for treating System.Runtime as the core library
-rw-r--r-- | Mono.Cecil/AssemblyReader.cs | 5 | ||||
-rw-r--r-- | Mono.Cecil/MetadataSystem.cs | 2 | ||||
-rw-r--r-- | Mono.Cecil/ModuleDefinition.cs | 12 | ||||
-rw-r--r-- | Mono.Cecil/TypeParser.cs | 2 | ||||
-rw-r--r-- | Mono.Cecil/TypeSystem.cs | 50 | ||||
-rw-r--r-- | Test/Mono.Cecil.Tests/TypeParserTests.cs | 8 |
6 files changed, 55 insertions, 24 deletions
diff --git a/Mono.Cecil/AssemblyReader.cs b/Mono.Cecil/AssemblyReader.cs index ee440cf..ee667cb 100644 --- a/Mono.Cecil/AssemblyReader.cs +++ b/Mono.Cecil/AssemblyReader.cs @@ -849,6 +849,9 @@ namespace Mono.Cecil { metadata.AddTypeDefinition (type); + if (type.IsTypeOf ("System", "Object")) + metadata.HasSystemObject = true; + this.context = type; type.BaseType = GetTypeDefOrRef (ReadMetadataToken (CodedIndex.TypeDefOrRef)); @@ -2285,7 +2288,7 @@ namespace Mono.Cecil { var type_system = module.TypeSystem; var context = new MethodReference (string.Empty, type_system.Void); - context.DeclaringType = new TypeReference (string.Empty, string.Empty, module, type_system.Corlib); + context.DeclaringType = new TypeReference (string.Empty, string.Empty, module, type_system.CoreLibrary); var member_references = new MemberReference [length]; diff --git a/Mono.Cecil/MetadataSystem.cs b/Mono.Cecil/MetadataSystem.cs index 15922b6..b5c620b 100644 --- a/Mono.Cecil/MetadataSystem.cs +++ b/Mono.Cecil/MetadataSystem.cs @@ -34,6 +34,8 @@ namespace Mono.Cecil { internal TypeDefinition [] Types; internal TypeReference [] TypeReferences; + internal bool HasSystemObject; + internal FieldDefinition [] Fields; internal MethodDefinition [] Methods; internal MemberReference [] MemberReferences; diff --git a/Mono.Cecil/ModuleDefinition.cs b/Mono.Cecil/ModuleDefinition.cs index 26534df..bd1ef95 100644 --- a/Mono.Cecil/ModuleDefinition.cs +++ b/Mono.Cecil/ModuleDefinition.cs @@ -1107,12 +1107,20 @@ namespace Mono.Cecil { return self != null && self.HasImage; } - public static bool IsCorlib (this ModuleDefinition module) + public static bool IsCoreLibrary (this ModuleDefinition module) { if (module.Assembly == null) return false; - return module.Assembly.Name.Name == "mscorlib"; + var assembly_name = module.Assembly.Name.Name; + + if (assembly_name != "mscorlib" && assembly_name != "System.Runtime") + return false; + + if (module.HasImage && !module.MetadataSystem.HasSystemObject) + return false; + + return true; } public static string GetFullyQualifiedName (this Stream self) diff --git a/Mono.Cecil/TypeParser.cs b/Mono.Cecil/TypeParser.cs index 36bc6c3..f876070 100644 --- a/Mono.Cecil/TypeParser.cs +++ b/Mono.Cecil/TypeParser.cs @@ -368,7 +368,7 @@ namespace Mono.Cecil { static IMetadataScope GetMetadataScope (ModuleDefinition module, Type type_info) { if (string.IsNullOrEmpty (type_info.assembly)) - return module.TypeSystem.Corlib; + return module.TypeSystem.CoreLibrary; return MatchReference (module, AssemblyNameReference.Parse (type_info.assembly)); } diff --git a/Mono.Cecil/TypeSystem.cs b/Mono.Cecil/TypeSystem.cs index 57b611e..ccaef1f 100644 --- a/Mono.Cecil/TypeSystem.cs +++ b/Mono.Cecil/TypeSystem.cs @@ -78,7 +78,7 @@ namespace Mono.Cecil { sealed class CommonTypeSystem : TypeSystem { - AssemblyNameReference corlib; + AssemblyNameReference core_library; public CommonTypeSystem (ModuleDefinition module) : base (module) @@ -90,30 +90,43 @@ namespace Mono.Cecil { return CreateTypeReference (@namespace, name); } - public AssemblyNameReference GetCorlibReference () + public AssemblyNameReference GetCoreLibraryReference () { - if (corlib != null) - return corlib; + if (core_library != null) + return core_library; const string mscorlib = "mscorlib"; + const string system_runtime = "System.Runtime"; - var references = module.AssemblyReferences; + if (TryLookupReference (mscorlib, out core_library)) + return core_library; - for (int i = 0; i < references.Count; i++) { - var reference = references [i]; - if (reference.Name == mscorlib) - return corlib = reference; - } + if (TryLookupReference (system_runtime, out core_library)) + return core_library; - corlib = new AssemblyNameReference { + core_library = new AssemblyNameReference { Name = mscorlib, Version = GetCorlibVersion (), PublicKeyToken = new byte [] { 0xb7, 0x7a, 0x5c, 0x56, 0x19, 0x34, 0xe0, 0x89 }, }; - references.Add (corlib); + module.AssemblyReferences.Add (core_library); - return corlib; + return core_library; + } + + bool TryLookupReference (string name, out AssemblyNameReference reference) + { + var references = module.AssemblyReferences; + + for (int i = 0; i < references.Count; i++) { + reference = references [i]; + if (reference.Name == name) + return true; + } + + reference = null; + return false; } Version GetCorlibVersion () @@ -133,7 +146,7 @@ namespace Mono.Cecil { TypeReference CreateTypeReference (string @namespace, string name) { - return new TypeReference (@namespace, name, module, GetCorlibReference ()); + return new TypeReference (@namespace, name, module, GetCoreLibraryReference ()); } } @@ -165,7 +178,7 @@ namespace Mono.Cecil { internal static TypeSystem CreateTypeSystem (ModuleDefinition module) { - if (module.IsCorlib ()) + if (module.IsCoreLibrary ()) return new CoreTypeSystem (module); return new CommonTypeSystem (module); @@ -196,13 +209,18 @@ namespace Mono.Cecil { } } + [Obsolete ("Use CoreLibrary")] public IMetadataScope Corlib { + get { return CoreLibrary; } + } + + public IMetadataScope CoreLibrary { get { var common = this as CommonTypeSystem; if (common == null) return module; - return common.GetCorlibReference (); + return common.GetCoreLibraryReference (); } } diff --git a/Test/Mono.Cecil.Tests/TypeParserTests.cs b/Test/Mono.Cecil.Tests/TypeParserTests.cs index 82a88b9..603b7f4 100644 --- a/Test/Mono.Cecil.Tests/TypeParserTests.cs +++ b/Test/Mono.Cecil.Tests/TypeParserTests.cs @@ -12,7 +12,7 @@ namespace Mono.Cecil.Tests { public void SimpleStringReference () { var module = GetCurrentModule (); - var corlib = module.TypeSystem.Corlib; + var corlib = module.TypeSystem.CoreLibrary; const string fullname = "System.String"; @@ -31,7 +31,7 @@ namespace Mono.Cecil.Tests { public void SimpleInt32Reference () { var module = GetCurrentModule (); - var corlib = module.TypeSystem.Corlib; + var corlib = module.TypeSystem.CoreLibrary; const string fullname = "System.Int32"; @@ -66,7 +66,7 @@ namespace Mono.Cecil.Tests { public void ByRefTypeReference () { var module = GetCurrentModule (); - var corlib = module.TypeSystem.Corlib; + var corlib = module.TypeSystem.CoreLibrary; const string fullname = "System.String&"; @@ -105,7 +105,7 @@ namespace Mono.Cecil.Tests { public void OpenGenericType () { var module = GetCurrentModule (); - var corlib = module.TypeSystem.Corlib; + var corlib = module.TypeSystem.CoreLibrary; const string fullname = "System.Collections.Generic.Dictionary`2"; |