Make sure assembly ordering matches MS by always appending. Fixes #10004.
authorRodrigo Kumpera <kumpera@gmail.com>
Mon, 4 Feb 2013 18:51:28 +0000 (13:51 -0500)
committerRodrigo Kumpera <kumpera@gmail.com>
Mon, 4 Feb 2013 18:51:28 +0000 (13:51 -0500)
mono/metadata/appdomain.c
mono/tests/Makefile.am
mono/tests/assembly_append_ordering.cs [new file with mode: 0644]

index 7c2bd3c29d6bd2cb1e54bfb983e266a8d56e6520..a7057d13059f1731746a3e4817c777eef4bea0be 100644 (file)
@@ -997,7 +997,7 @@ add_assemblies_to_domain (MonoDomain *domain, MonoAssembly *ass, GHashTable *ht)
        if (!g_hash_table_lookup (ht, ass)) {
                mono_assembly_addref (ass);
                g_hash_table_insert (ht, ass, ass);
-               domain->domain_assemblies = g_slist_prepend (domain->domain_assemblies, ass);
+               domain->domain_assemblies = g_slist_append (domain->domain_assemblies, ass);
                mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Assembly %s[%p] added to domain %s, ref_count=%d", ass->aname.name, ass, domain->friendly_name, ass->ref_count);
        }
 
index 0f1baf3686aec79763dbaf01ffa6b0bdda9b0f2d..e083924a1036d27af5797721a1edb6acbdcc5264 100644 (file)
@@ -387,7 +387,8 @@ BASE_TEST_CS_SRC=           \
        bug-3903.cs     \
        async-with-cb-throws.cs \
        appdomain-unload-doesnot-raise-pending-events.cs        \
-       bug-6148.cs
+       bug-6148.cs     \
+       assembly_append_ordering.cs
 
 TEST_CS_SRC_DIST=      \
        $(BASE_TEST_CS_SRC)     \
diff --git a/mono/tests/assembly_append_ordering.cs b/mono/tests/assembly_append_ordering.cs
new file mode 100644 (file)
index 0000000..6f0b471
--- /dev/null
@@ -0,0 +1,59 @@
+using System;
+using System.Linq;
+using System.Reflection;
+using System.Reflection.Emit;
+
+class Driver {
+       static int Main () {
+               var dyn = DefineDynamicAssembly (AppDomain.CurrentDomain);
+               var core = TriggerLoadingSystemCore ();
+               var asm = AppDomain.CurrentDomain.GetAssemblies ();
+       
+               if (asm [0] != typeof (object).Assembly) {
+                       Console.WriteLine ("first assembly must be mscorlib, but it was {0}", asm [0]);
+                       return 1;
+               }
+
+               if (asm [1] != typeof (Driver).Assembly) {
+                       Console.WriteLine ("second assembly must be test assembly, but it was {0}", asm [1]);
+                       return 2;
+               }
+
+               if (asm [2] != dyn) {
+                       Console.WriteLine ("third assembly must be SRE, but it was {0}", asm [2]);
+                       return 3;
+               }
+
+               if (asm [3] != core) {
+                       Console.WriteLine ("last assembly must be System.Core, but it was {0}", asm [3]);
+                       return 4;
+               }
+
+               return 0;
+       }
+
+       static Assembly TriggerLoadingSystemCore ()
+       {
+               int[] x = new int[] { 1,2,3};
+               x.Where (v => v > 1);
+               return typeof (Enumerable).Assembly;
+       }
+
+
+       static Assembly DefineDynamicAssembly (AppDomain domain)
+       {
+               AssemblyName assemblyName = new AssemblyName ();
+               assemblyName.Name = "MyDynamicAssembly";
+
+               AssemblyBuilder assemblyBuilder = domain.DefineDynamicAssembly (assemblyName, AssemblyBuilderAccess.Run);
+               ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule ("MyDynamicModule");
+               TypeBuilder typeBuilder = moduleBuilder.DefineType ("MyDynamicType", TypeAttributes.Public);
+               ConstructorBuilder constructorBuilder = typeBuilder.DefineConstructor (MethodAttributes.Public, CallingConventions.Standard, null);
+               ILGenerator ilGenerator = constructorBuilder.GetILGenerator ();
+               ilGenerator.EmitWriteLine ("MyDynamicType instantiated!");
+               ilGenerator.Emit (OpCodes.Ret);
+               typeBuilder.CreateType ();
+               return assemblyBuilder;
+       }
+       
+}
\ No newline at end of file