diff options
author | Stephane Delcroix <stephane@delcroix.org> | 2017-04-27 11:17:27 +0200 |
---|---|---|
committer | Stephane Delcroix <stephane@delcroix.org> | 2017-04-27 11:18:43 +0200 |
commit | dc3c410c5df3b62d9eb312e60ea25b1de61fe2c5 (patch) | |
tree | 4db97aa4eaec29d8196c5cd7a82c31a9dba5f4b9 /Xamarin.Forms.Build.Tasks | |
parent | 25f485b3d53da860ec6aa18c5fd1fad4bff290dc (diff) | |
download | xamarin-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.cs | 19 |
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; } |