summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Build.Tasks
diff options
context:
space:
mode:
Diffstat (limited to 'Xamarin.Forms.Build.Tasks')
-rw-r--r--Xamarin.Forms.Build.Tasks/SetPropertiesVisitor.cs16
1 files changed, 13 insertions, 3 deletions
diff --git a/Xamarin.Forms.Build.Tasks/SetPropertiesVisitor.cs b/Xamarin.Forms.Build.Tasks/SetPropertiesVisitor.cs
index 44678d26..35316f26 100644
--- a/Xamarin.Forms.Build.Tasks/SetPropertiesVisitor.cs
+++ b/Xamarin.Forms.Build.Tasks/SetPropertiesVisitor.cs
@@ -953,12 +953,19 @@ namespace Xamarin.Forms.Build.Tasks
var valueNode = node as ValueNode;
var elementNode = node as IElementNode;
- yield return Instruction.Create(OpCodes.Ldloc, parent);
+ //if it's a value type, load the address so we can invoke methods on it
+ if (parent.VariableType.IsValueType)
+ yield return Instruction.Create(OpCodes.Ldloca, parent);
+ else
+ yield return Instruction.Create(OpCodes.Ldloc, parent);
if (valueNode != null) {
foreach (var instruction in valueNode.PushConvertedValue(context, propertyType, new ICustomAttributeProvider [] { property, propertyType.Resolve() }, valueNode.PushServiceProvider(context, propertyRef:property), false, true))
yield return instruction;
- yield return Instruction.Create(OpCodes.Callvirt, propertySetterRef);
+ if (parent.VariableType.IsValueType)
+ yield return Instruction.Create(OpCodes.Call, propertySetterRef);
+ else
+ yield return Instruction.Create(OpCodes.Callvirt, propertySetterRef);
} else if (elementNode != null) {
var vardef = context.Variables [elementNode];
var implicitOperator = vardef.VariableType.GetImplicitOperatorTo(propertyType, module);
@@ -970,7 +977,10 @@ namespace Xamarin.Forms.Build.Tasks
yield return Instruction.Create(OpCodes.Unbox_Any, module.Import(propertyType));
else if (vardef.VariableType.IsValueType && propertyType.FullName == "System.Object")
yield return Instruction.Create(OpCodes.Box, vardef.VariableType);
- yield return Instruction.Create(OpCodes.Callvirt, propertySetterRef);
+ if (parent.VariableType.IsValueType)
+ yield return Instruction.Create(OpCodes.Call, propertySetterRef);
+ else
+ yield return Instruction.Create(OpCodes.Callvirt, propertySetterRef);
}
}