summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Build.Tasks
diff options
context:
space:
mode:
authorStephane Delcroix <stephane@delcroix.org>2017-04-27 11:17:27 +0200
committerStephane Delcroix <stephane@delcroix.org>2017-04-27 11:18:43 +0200
commitdc3c410c5df3b62d9eb312e60ea25b1de61fe2c5 (patch)
tree4db97aa4eaec29d8196c5cd7a82c31a9dba5f4b9 /Xamarin.Forms.Build.Tasks
parent25f485b3d53da860ec6aa18c5fd1fad4bff290dc (diff)
downloadxamarin-forms-dc3c410c5df3b62d9eb312e60ea25b1de61fe2c5.tar.gz
xamarin-forms-dc3c410c5df3b62d9eb312e60ea25b1de61fe2c5.tar.bz2
xamarin-forms-dc3c410c5df3b62d9eb312e60ea25b1de61fe2c5.zip
[XamlC] support valueTypes x:Arrays (#875)
Diffstat (limited to 'Xamarin.Forms.Build.Tasks')
-rw-r--r--Xamarin.Forms.Build.Tasks/CompiledMarkupExtensions/ArrayExtension.cs19
1 files changed, 15 insertions, 4 deletions
diff --git a/Xamarin.Forms.Build.Tasks/CompiledMarkupExtensions/ArrayExtension.cs b/Xamarin.Forms.Build.Tasks/CompiledMarkupExtensions/ArrayExtension.cs
index 06261147..fdc4fa2d 100644
--- a/Xamarin.Forms.Build.Tasks/CompiledMarkupExtensions/ArrayExtension.cs
+++ b/Xamarin.Forms.Build.Tasks/CompiledMarkupExtensions/ArrayExtension.cs
@@ -20,10 +20,21 @@ namespace Xamarin.Forms.Build.Tasks
memberRef = typeTypeRef.MakeArrayType();
for (var i = 0; i < n; i++) {
- instructions.Add(Instruction.Create(OpCodes.Dup));
- instructions.Add(Instruction.Create(OpCodes.Ldc_I4, i));
- instructions.Add(Instruction.Create(OpCodes.Ldloc, context.Variables[node.CollectionItems[i] as IElementNode]));
- instructions.Add(Instruction.Create(OpCodes.Stelem_Ref));
+ var vardef = context.Variables[node.CollectionItems[i] as IElementNode];
+ if (typeTypeRef.IsValueType) {
+ instructions.Add(Instruction.Create(OpCodes.Dup));
+ instructions.Add(Instruction.Create(OpCodes.Ldc_I4, i));
+ instructions.Add(Instruction.Create(OpCodes.Ldelema, typeTypeRef));
+ instructions.Add(Instruction.Create(OpCodes.Ldloc, vardef));
+ if (vardef.VariableType == module.TypeSystem.Object)
+ instructions.Add(Instruction.Create(OpCodes.Unbox_Any, module.ImportReference(typeTypeRef)));
+ instructions.Add(Instruction.Create(OpCodes.Stobj, typeTypeRef));
+ } else {
+ instructions.Add(Instruction.Create(OpCodes.Dup));
+ instructions.Add(Instruction.Create(OpCodes.Ldc_I4, i));
+ instructions.Add(Instruction.Create(OpCodes.Ldloc, vardef));
+ instructions.Add(Instruction.Create(OpCodes.Stelem_Ref));
+ }
}
return instructions;
}