diff options
author | Aleksey Kliger (λgeek) <akliger@gmail.com> | 2017-07-28 19:00:17 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-07-28 19:00:17 +0300 |
commit | 6425f06ff697f516990729d3f4058f10e68966ef (patch) | |
tree | 7745b6dfeab9439bed583f03f8dc7b14d98b0537 | |
parent | bda280c5e854e3124692256729c3a551945c1494 (diff) | |
parent | 287f4303f3b789431d2da5b5570e97d7db770567 (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.cs | 34 | ||||
-rw-r--r-- | mono/metadata/sre-save.c | 8 |
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; |