summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Build.Tasks
diff options
context:
space:
mode:
authorStephane Delcroix <stephane@delcroix.org>2016-07-19 01:30:08 +0200
committerJason Smith <jason.smith@xamarin.com>2016-07-18 16:30:08 -0700
commitd52f110d78cc66441c32520acedc752cd949c0ac (patch)
treefab1d3932c0b195ae0fb10b2ff5fb0edee59fd6a /Xamarin.Forms.Build.Tasks
parente36816810fb0c29fd5607e9cbb2102d64c46b23f (diff)
downloadxamarin-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.cs14
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);