From d52f110d78cc66441c32520acedc752cd949c0ac Mon Sep 17 00:00:00 2001 From: Stephane Delcroix Date: Tue, 19 Jul 2016 01:30:08 +0200 Subject: [XamlC] correctly resolve override of virtual event handlers (#247) --- Xamarin.Forms.Build.Tasks/SetPropertiesVisitor.cs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'Xamarin.Forms.Build.Tasks') diff --git a/Xamarin.Forms.Build.Tasks/SetPropertiesVisitor.cs b/Xamarin.Forms.Build.Tasks/SetPropertiesVisitor.cs index 71f19f56..16eddb41 100644 --- a/Xamarin.Forms.Build.Tasks/SetPropertiesVisitor.cs +++ b/Xamarin.Forms.Build.Tasks/SetPropertiesVisitor.cs @@ -316,7 +316,12 @@ namespace Xamarin.Forms.Build.Tasks //If the target is an event, connect // IL_0007: ldloc.0 // IL_0008: ldarg.0 + // // IL_0009: ldftn instance void class Xamarin.Forms.Xaml.XamlcTests.MyPage::OnButtonClicked(object, class [mscorlib]System.EventArgs) + //OR, if the handler is virtual + // IL_000x: ldarg.0 + // IL_0009: ldvirtftn instance void class Xamarin.Forms.Xaml.XamlcTests.MyPage::OnButtonClicked(object, class [mscorlib]System.EventArgs) + // // IL_000f: newobj instance void class [mscorlib]System.EventHandler::'.ctor'(object, native int) // IL_0014: callvirt instance void class [Xamarin.Forms.Core]Xamarin.Forms.Button::add_Clicked(class [mscorlib]System.EventHandler) @@ -345,7 +350,14 @@ namespace Xamarin.Forms.Build.Tasks string.Format("EventHandler \"{0}\" not found in type \"{1}\"", value, context.Body.Method.DeclaringType.FullName), iXmlLineInfo); } - context.IL.Emit(OpCodes.Ldftn, handler); + if (handler.IsVirtual) + { + context.IL.Emit(OpCodes.Ldarg_0); + context.IL.Emit(OpCodes.Ldvirtftn, handler); + } + else + context.IL.Emit(OpCodes.Ldftn, handler); + //FIXME: eventually get the right ctor instead fo the First() one, just in case another one could exists (not even sure it's possible). var ctor = module.Import(eventinfo.EventType.Resolve().GetConstructors().First()); ctor = ctor.ResolveGenericParameters(eventinfo.EventType, module); -- cgit v1.2.3