Browse Source

[mcs] Support System.Object forwarded to any assembly in any references order

Marek Safar 9 years ago
parent
commit
bc5e8fbf5c
6 changed files with 47 additions and 8 deletions
  1. 8 3
      mcs/mcs/assembly.cs
  2. 8 2
      mcs/mcs/ikvm.cs
  3. 1 1
      mcs/mcs/mcs.csproj
  4. 2 2
      mcs/mcs/reflection.cs
  5. 15 0
      mcs/tests/test-937.cs
  6. 13 0
      mcs/tests/ver-il-net_4_x.xml

+ 8 - 3
mcs/mcs/assembly.cs

@@ -1196,7 +1196,7 @@ namespace Mono.CSharp
 			paths.AddRange (compiler.Settings.ReferencesLookupPaths);
 		}
 
-		public abstract bool HasObjectType (T assembly);
+		public abstract T HasObjectType (T assembly);
 		protected abstract string[] GetDefaultReferences ();
 		public abstract T LoadAssemblyFile (string fileName, bool isImplicitReference);
 		public abstract void LoadReferences (ModuleContainer module);
@@ -1263,8 +1263,13 @@ namespace Mono.CSharp
 					//
 					// corlib assembly is the first referenced assembly which contains System.Object
 					//
-					if (HasObjectType (assembly.Item2)) {
-						corlib_assembly = assembly.Item2;
+					corlib_assembly = HasObjectType (assembly.Item2);
+					if (corlib_assembly != null) {
+						if (corlib_assembly != assembly.Item2) {
+							var ca = corlib_assembly;
+							i = loaded.FindIndex (l => l.Item2 == ca);
+						}
+
 						loaded.RemoveAt (i);
 						break;
 					}

+ 8 - 2
mcs/mcs/ikvm.cs

@@ -239,6 +239,7 @@ namespace Mono.CSharp
 		readonly List<Tuple<AssemblyName, string, Assembly>> loaded_names;
 		static readonly Dictionary<string, string[]> sdk_directory;
 		Dictionary<AssemblyName, List<string[]>> resolved_version_mismatches;
+		static readonly TypeName objectTypeName = new TypeName ("System", "Object");
 
 		static StaticLoader ()
 		{
@@ -442,10 +443,15 @@ namespace Mono.CSharp
 			return list;
 		}
 
-		public override bool HasObjectType (Assembly assembly)
+		public override Assembly HasObjectType (Assembly assembly)
 		{
 			try {
-				return assembly.GetType (compiler.BuiltinTypes.Object.FullName) != null;
+				// System.Object can be forwarded and ikvm
+				// transparently finds it in target assembly therefore
+				// need to return actual obj assembly becauase in such
+				// case it's different to assembly parameter
+				var obj = assembly.FindType (objectTypeName);
+				return obj == null ? null : obj.Assembly;
 			} catch (Exception e) {
 				throw new InternalErrorException (e, "Failed to load assembly `{0}'", assembly.FullName);
 			}

+ 1 - 1
mcs/mcs/mcs.csproj

@@ -22,7 +22,7 @@
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
     <UseVSHostingProcess>false</UseVSHostingProcess>
-    <Commandlineparameters>y.cs</Commandlineparameters>
+    <Commandlineparameters></Commandlineparameters>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>pdbonly</DebugType>

+ 2 - 2
mcs/mcs/reflection.cs

@@ -440,9 +440,9 @@ namespace Mono.CSharp
 			return Path.GetDirectoryName (typeof (object).Assembly.Location);
 		}
 
-		public override bool HasObjectType (Assembly assembly)
+		public override Assembly HasObjectType (Assembly assembly)
 		{
-			return assembly.GetType (compiler.BuiltinTypes.Object.FullName) != null;
+			return assembly.GetType (compiler.BuiltinTypes.Object.FullName) == null ? null : assembly;
 		}
 
 		public override Assembly LoadAssemblyFile (string assembly, bool isImplicitReference)

+ 15 - 0
mcs/tests/test-937.cs

@@ -0,0 +1,15 @@
+// Compiler options: /noconfig /nostdlib -r:../class/lib/net_4_x/Facades/System.Runtime.dll -r:../class/lib/net_4_x/mscorlib.dll
+
+using System;
+
+class TypeForwarderOfSystemObject
+{
+	void TestAttributeReadDoesNotCrash ()
+	{
+		System.Runtime.InteropServices.Marshal.ReadByte (IntPtr.Zero, 0);		
+	}
+
+	static void Main ()
+	{
+	}
+}

+ 13 - 0
mcs/tests/ver-il-net_4_x.xml

@@ -52191,6 +52191,19 @@
       </method>
     </type>
   </test>
+  <test name="test-937.cs">
+    <type name="TypeForwarderOfSystemObject">
+      <method name="Void TestAttributeReadDoesNotCrash()" attrs="129">
+        <size>14</size>
+      </method>
+      <method name="Void Main()" attrs="145">
+        <size>2</size>
+      </method>
+      <method name="Void .ctor()" attrs="6278">
+        <size>7</size>
+      </method>
+    </type>
+  </test>
   <test name="test-94.cs">
     <type name="Base">
       <method name="Int32 IVehicle.Start()" attrs="481">