Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/cecil.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJb Evain <jbevain@gmail.com>2015-05-28 11:28:32 +0300
committerJb Evain <jbevain@gmail.com>2015-05-28 11:28:32 +0300
commit83af39c4e3ba7a8c36f94d177654f7d97561239c (patch)
tree073940d21c3378d1ac685887e483baab96ccd22c
parent2b026412f51a6684c216f10485652a54536cb715 (diff)
parent84dbccaddff1962d40288fb1c4c6f8bbf90cab09 (diff)
Merge pull request #214 from jbevain/sysruntime
Add support for treating System.Runtime as the core library
-rw-r--r--Mono.Cecil/AssemblyReader.cs5
-rw-r--r--Mono.Cecil/MetadataSystem.cs2
-rw-r--r--Mono.Cecil/ModuleDefinition.cs12
-rw-r--r--Mono.Cecil/TypeParser.cs2
-rw-r--r--Mono.Cecil/TypeSystem.cs50
-rw-r--r--Test/Mono.Cecil.Tests/TypeParserTests.cs8
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";