diff options
author | Stephane Delcroix <stephane@delcroix.org> | 2016-07-19 01:30:08 +0200 |
---|---|---|
committer | Jason Smith <jason.smith@xamarin.com> | 2016-07-18 16:30:08 -0700 |
commit | d52f110d78cc66441c32520acedc752cd949c0ac (patch) | |
tree | fab1d3932c0b195ae0fb10b2ff5fb0edee59fd6a /Xamarin.Forms.Build.Tasks | |
parent | e36816810fb0c29fd5607e9cbb2102d64c46b23f (diff) | |
download | xamarin-forms-d52f110d78cc66441c32520acedc752cd949c0ac.tar.gz xamarin-forms-d52f110d78cc66441c32520acedc752cd949c0ac.tar.bz2 xamarin-forms-d52f110d78cc66441c32520acedc752cd949c0ac.zip |
[XamlC] correctly resolve override of virtual event handlers (#247)
Diffstat (limited to 'Xamarin.Forms.Build.Tasks')
-rw-r--r-- | Xamarin.Forms.Build.Tasks/SetPropertiesVisitor.cs | 14 |
1 files changed, 13 insertions, 1 deletions
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); |