[mcs] Support System.Object forwarded to any assembly in any references order
authorMarek Safar <marek.safar@gmail.com>
Tue, 14 Jun 2016 17:02:52 +0000 (19:02 +0200)
committerMarek Safar <marek.safar@gmail.com>
Tue, 14 Jun 2016 17:03:59 +0000 (19:03 +0200)
mcs/mcs/assembly.cs
mcs/mcs/ikvm.cs
mcs/mcs/mcs.csproj
mcs/mcs/reflection.cs
mcs/tests/test-937.cs [new file with mode: 0644]
mcs/tests/ver-il-net_4_x.xml

index d69feb3de5b15bd0bd0c08a986db9865c0098104..d1eb34c0f726f10b076c472c03b518128e99aa76 100644 (file)
@@ -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;
                                        }
index 1190d549eb4fb10ef015db52f72d52f68fd2c1c6..75a02034f9cf9cda8bef266f139325a055c15546 100644 (file)
@@ -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);
                        }
index 812652f925fad15efa145069ddb2ec259faa0f7d..74a217c4eb22d0c0491626502091d0b053a243f5 100644 (file)
@@ -22,7 +22,7 @@
     <ErrorReport>prompt</ErrorReport>\r
     <WarningLevel>4</WarningLevel>\r
     <UseVSHostingProcess>false</UseVSHostingProcess>\r
-    <Commandlineparameters>y.cs</Commandlineparameters>\r
+    <Commandlineparameters></Commandlineparameters>\r
   </PropertyGroup>\r
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">\r
     <DebugType>pdbonly</DebugType>\r
index b233b9439cbfd397d52a28c70953d10d3ab8564e..1210ae4221a40a47fb53c67390239a86931dc280 100644 (file)
@@ -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)
diff --git a/mcs/tests/test-937.cs b/mcs/tests/test-937.cs
new file mode 100644 (file)
index 0000000..b577d34
--- /dev/null
@@ -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 ()
+       {
+       }
+}
index 8d87222999dd12b67d31e7a4da53c4c87042b5e3..55f9c7b2fa6fc0ebce88f03463ee0c9390fa82ae 100644 (file)
       </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">