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

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksey Kliger (λgeek) <akliger@gmail.com>2017-07-28 19:00:17 +0300
committerGitHub <noreply@github.com>2017-07-28 19:00:17 +0300
commit6425f06ff697f516990729d3f4058f10e68966ef (patch)
tree7745b6dfeab9439bed583f03f8dc7b14d98b0537
parentbda280c5e854e3124692256729c3a551945c1494 (diff)
parent287f4303f3b789431d2da5b5570e97d7db770567 (diff)
Merge pull request #5277 from lambdageek/bug-58421-2017-06mono-5.4.0.135
[2017-06][sre] Handle typeref tokens in fixup_method (Fixes #58421)
-rw-r--r--mcs/class/corlib/Test/System.Reflection.Emit/TypeBuilderTest.cs34
-rw-r--r--mono/metadata/sre-save.c8
2 files changed, 42 insertions, 0 deletions
diff --git a/mcs/class/corlib/Test/System.Reflection.Emit/TypeBuilderTest.cs b/mcs/class/corlib/Test/System.Reflection.Emit/TypeBuilderTest.cs
index 5386ae2460c..cf74124675f 100644
--- a/mcs/class/corlib/Test/System.Reflection.Emit/TypeBuilderTest.cs
+++ b/mcs/class/corlib/Test/System.Reflection.Emit/TypeBuilderTest.cs
@@ -11374,5 +11374,39 @@ namespace MonoTests.System.Reflection.Emit
assembly.Save (ASSEMBLY_NAME + ".dll");
}
+
+ [Test]
+ public void TwoAssembliesMidFlightTest () {
+ // Check that one AssemblyBuilder can refer to a TypeBuilder from another AssemblyBuilder.
+ // Regression test for https://bugzilla.xamarin.com/show_bug.cgi?id=58421
+ var name2 = "MonoTests.System.Reflection.Emit.TypeBuilderTest2";
+ var assemblyName2 = new AssemblyName (name2);
+ var assembly2 =
+ Thread.GetDomain ().DefineDynamicAssembly (
+ assemblyName2, AssemblyBuilderAccess.RunAndSave, tempDir);
+
+ var module2 = assembly2.DefineDynamicModule (name2, name2 + ".dll");
+
+ var tb = module.DefineType ("Foo", TypeAttributes.Public);
+ var tb2 = module2.DefineType ("Foo2", TypeAttributes.Public);
+
+ var cb = tb.DefineConstructor (MethodAttributes.Public, CallingConventions.Standard,
+ Type.EmptyTypes);
+
+ var ilg = cb.GetILGenerator ();
+
+ ilg.Emit (OpCodes.Ldtoken, tb2); // N.B. type from the other AssemblyBuilder
+ ilg.Emit (OpCodes.Pop);
+ ilg.Emit (OpCodes.Ret);
+
+ var t = tb.CreateType ();
+ tb2.CreateType ();
+
+ var ci = t.GetConstructor (Type.EmptyTypes);
+ var x = ci.Invoke (null);
+ assembly.Save (ASSEMBLY_NAME + ".dll");
+ assembly2.Save (name2 + ".dll");
+ }
+
}
}
diff --git a/mono/metadata/sre-save.c b/mono/metadata/sre-save.c
index d36381357ca..5d26024218b 100644
--- a/mono/metadata/sre-save.c
+++ b/mono/metadata/sre-save.c
@@ -1759,6 +1759,14 @@ fixup_method (MonoReflectionILGen *ilgen, gpointer value, MonoDynamicImage *asse
g_assert_not_reached ();
}
break;
+ case MONO_TABLE_TYPEREF:
+ g_assert (!strcmp (iltoken->member->vtable->klass->name, "RuntimeType"));
+ MonoClass *k = mono_class_from_mono_type (((MonoReflectionType*)iltoken->member)->type);
+ MonoObject *obj = mono_class_get_ref_info_raw (k); /* FIXME use handles */
+ g_assert (obj);
+ g_assert (!strcmp (mono_object_class (obj)->name, "TypeBuilder"));
+ g_assert (((MonoReflectionTypeBuilder*)obj)->module->dynamic_image != assembly);
+ continue;
case MONO_TABLE_MEMBERREF:
if (!strcmp (iltoken->member->vtable->klass->name, "MonoArrayMethod")) {
am = (MonoReflectionArrayMethod*)iltoken->member;