Skip to content
This repository was archived by the owner on May 1, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
using System.Collections.Generic;
using System.Linq;

using Mono.Cecil;
using Mono.Cecil.Cil;

using Xamarin.Forms.Xaml;
Expand All @@ -20,14 +17,19 @@ public IEnumerable<Instruction> ConvertFromString(string value, ILContext contex
if (IsNullOrEmpty(value))
throw new XamlParseException($"Cannot convert \"{value}\" into {typeof(Binding)}", node);

var bindingCtorRef = module.ImportCtorReference(("Xamarin.Forms.Core", "Xamarin.Forms", "Binding"), paramCount: 6);
yield return Instruction.Create(OpCodes.Ldstr, value);
yield return Instruction.Create(OpCodes.Ldc_I4, (int)BindingMode.Default);
yield return Instruction.Create(OpCodes.Ldnull);
yield return Instruction.Create(OpCodes.Ldnull);
yield return Instruction.Create(OpCodes.Ldnull);
yield return Instruction.Create(OpCodes.Ldnull);
yield return Instruction.Create(OpCodes.Newobj, bindingCtorRef);
yield return Instruction.Create(OpCodes.Newobj, module.ImportCtorReference(("Xamarin.Forms.Core", "Xamarin.Forms", "Binding"), parameterTypes: new[] {
("mscorlib", "System", "String"),
("Xamarin.Forms.Core", "Xamarin.Forms", "BindingMode"),
("Xamarin.Forms.Core", "Xamarin.Forms", "IValueConverter"),
("mscorlib", "System", "Object"),
("mscorlib", "System", "String"),
("mscorlib", "System", "Object")}));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,11 @@ IEnumerable<Instruction> GenerateIL(double x, double y, double w, double h, Modu
yield return Instruction.Create(OpCodes.Ldc_R8, y);
yield return Instruction.Create(OpCodes.Ldc_R8, w);
yield return Instruction.Create(OpCodes.Ldc_R8, h);

var rectangleCtorRef = module.ImportCtorReference(("Xamarin.Forms.Core", "Xamarin.Forms", "Rectangle"), paramCount: 4);
yield return Instruction.Create(OpCodes.Newobj, rectangleCtorRef);
yield return Instruction.Create(OpCodes.Newobj, module.ImportCtorReference(("Xamarin.Forms.Core", "Xamarin.Forms", "Rectangle"), parameterTypes: new[] {
("mscorlib", "System", "Double"),
("mscorlib", "System", "Double"),
("mscorlib", "System", "Double"),
("mscorlib", "System", "Double")}));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,11 @@ public IEnumerable<Instruction> ConvertFromString(string value, ILContext contex
yield return Instruction.Create(OpCodes.Ldc_R8, color.B);
yield return Instruction.Create(OpCodes.Ldc_R8, color.A);

var colorCtorRef = module.ImportCtorReference(("Xamarin.Forms.Core", "Xamarin.Forms", "Color"),
paramCount: 4,
predicate: md => md.Parameters.All(p => p.ParameterType.FullName == "System.Double"));
yield return Instruction.Create(OpCodes.Newobj, colorCtorRef);
yield return Instruction.Create(OpCodes.Newobj, module.ImportCtorReference(("Xamarin.Forms.Core", "Xamarin.Forms", "Color"), parameterTypes: new[] {
("mscorlib", "System", "Double"),
("mscorlib", "System", "Double"),
("mscorlib", "System", "Double"),
("mscorlib", "System", "Double")}));
yield break;
}
var parts = value.Split('.');
Expand All @@ -41,14 +42,12 @@ public IEnumerable<Instruction> ConvertFromString(string value, ILContext contex

var fieldReference = module.ImportFieldReference(("Xamarin.Forms.Core", "Xamarin.Forms", "Color"),
color,
fd => fd.IsStatic);
isStatic: true);
if (fieldReference != null) {
yield return Instruction.Create(OpCodes.Ldsfld, fieldReference);
yield break;
}
var propertyGetterReference = module.ImportPropertyGetterReference(("Xamarin.Forms.Core", "Xamarin.Forms", "Color"),
color,
pd => pd.GetMethod.IsStatic);
var propertyGetterReference = module.ImportPropertyGetterReference(("Xamarin.Forms.Core", "Xamarin.Forms", "Color"), color, isStatic: true);
if (propertyGetterReference != null) {
yield return Instruction.Create(OpCodes.Call, propertyGetterReference);
yield break;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
using System.Collections.Generic;
using System.Globalization;
using System.Linq;

using Mono.Cecil;
using Mono.Cecil.Cil;

using Xamarin.Forms.Xaml;
using Xamarin.Forms.Build.Tasks;

using static Mono.Cecil.Cil.Instruction;
using static Mono.Cecil.Cil.OpCodes;

namespace Xamarin.Forms.Core.XamlC
{
class ConstraintTypeConverter : ICompiledTypeConverter
Expand All @@ -21,12 +22,11 @@ public IEnumerable<Instruction> ConvertFromString(string value, ILContext contex
if (string.IsNullOrEmpty(value) || !double.TryParse(value, NumberStyles.Number, CultureInfo.InvariantCulture, out size))
throw new XamlParseException($"Cannot convert \"{value}\" into {typeof(Constraint)}", node);

yield return Instruction.Create(OpCodes.Ldc_R8, size);
var constantReference = module.ImportMethodReference(("Xamarin.Forms.Core", "Xamarin.Forms", "Constraint"),
methodName: "Constant",
paramCount: 1,
predicate: md => md.IsStatic);
yield return Instruction.Create(OpCodes.Call, constantReference);
yield return Create(Ldc_R8, size);
yield return Create(Call, module.ImportMethodReference(("Xamarin.Forms.Core", "Xamarin.Forms", "Constraint"),
methodName: "Constant",
parameterTypes: new[] { ("mscorlib", "System", "Double") },
isStatic: true));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public IEnumerable<Instruction> ConvertFromString(string value, ILContext contex

var fieldReference = module.ImportFieldReference(("Xamarin.Forms.Core", "Xamarin.Forms", "LayoutOptions"),
fieldName: options,
predicate: fd => fd.IsStatic);
isStatic: true);
if (fieldReference != null) {
yield return Instruction.Create(OpCodes.Ldsfld, fieldReference);
yield break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@
using System.Collections.Generic;
using System.Linq;

using Mono.Cecil;
using Mono.Cecil.Cil;

using Xamarin.Forms.Xaml;
using Xamarin.Forms.Build.Tasks;

using static Mono.Cecil.Cil.Instruction;
using static Mono.Cecil.Cil.OpCodes;

namespace Xamarin.Forms.Core.XamlC
{
class ListStringTypeConverter : ICompiledTypeConverter
Expand All @@ -17,25 +19,22 @@ public IEnumerable<Instruction> ConvertFromString(string value, ILContext contex
var module = context.Body.Method.Module;

if (value == null) {
yield return Instruction.Create(OpCodes.Ldnull);
yield return Create(Ldnull);
yield break;
}
var parts = value.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).ToList();

var add = module.ImportMethodReference(("mscorlib", "System.Collections.Generic", "ICollection`1"),
methodName: "Add",
paramCount: 1,
classArguments: new[] { ("mscorlib", "System", "String") });

yield return Instruction.Create(OpCodes.Ldc_I4, parts.Count);
yield return Instruction.Create(OpCodes.Newobj, module.ImportCtorReference(("System.Collections", "System.Collections.Generic", "List`1"),
paramCount: 1,
predicate: md => md.Parameters[0].ParameterType.FullName == "System.Int32",
classArguments: new[] { ("mscorlib", "System", "String") }));
yield return Create(Ldc_I4, parts.Count);
yield return Create(Newobj, module.ImportCtorReference(("System.Collections", "System.Collections.Generic", "List`1"),
parameterTypes: new[] { ("mscorlib", "System", "Int32") },
classArguments: new[] { ("mscorlib", "System", "String") }));
foreach (var part in parts) {
yield return Instruction.Create(OpCodes.Dup);
yield return Instruction.Create(OpCodes.Ldstr, part);
yield return Instruction.Create(OpCodes.Callvirt, add);
yield return Create(Dup);
yield return Create(Ldstr, part);
yield return Create(Callvirt, module.ImportMethodReference(("mscorlib", "System.Collections.Generic", "ICollection`1"),
methodName: "Add",
paramCount: 1,
classArguments: new[] { ("mscorlib", "System", "String") }));
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,13 +49,15 @@ public IEnumerable<Instruction> ConvertFromString(string value, ILContext contex
yield return Create(Stloc, uriVarDef);
yield return Create(Ldstr, resourcePath); //resourcePath
yield return Create(Ldtoken, module.ImportReference(((ILRootNode)rootNode).TypeReference));
yield return Create(Call, module.ImportMethodReference(("mscorlib", "System", "Type"), methodName: "GetTypeFromHandle", paramCount: 1, predicate: md => md.IsStatic));
yield return Create(Call, module.ImportMethodReference(("mscorlib", "System.Reflection", "IntrospectionExtensions"), methodName: "GetTypeInfo", paramCount: 1, predicate: md => md.IsStatic));
yield return Create(Call, module.ImportMethodReference(("mscorlib", "System", "Type"), methodName: "GetTypeFromHandle", parameterTypes: new[] { ("mscorlib", "System", "RuntimeTypeHandle") }, isStatic: true));
yield return Create(Call, module.ImportMethodReference(("mscorlib", "System.Reflection", "IntrospectionExtensions"), methodName: "GetTypeInfo", parameterTypes: new[] { ("mscorlib", "System", "Type") }, isStatic: true));
yield return Create(Callvirt, module.ImportPropertyGetterReference(("mscorlib", "System.Reflection", "TypeInfo"), propertyName: "Assembly", flatten: true));

foreach (var instruction in node.PushXmlLineInfo(context))
yield return instruction; //lineinfo
yield return Create(Callvirt, module.ImportMethodReference(("Xamarin.Forms.Core", "Xamarin.Forms", "ResourceDictionary"), methodName: "SetAndLoadSource", paramCount: 4));
yield return Create(Callvirt, module.ImportMethodReference(("Xamarin.Forms.Core", "Xamarin.Forms", "ResourceDictionary"),
methodName: "SetAndLoadSource",
parameterTypes: new[] { ("System", "System", "Uri"), ("mscorlib", "System", "String"), ("mscorlib", "System.Reflection", "Assembly"), ("System.Xml.ReaderWriter", "System.Xml", "IXmlLineInfo") }));
//ldloc the stored uri as return value
yield return Create(Ldloc, uriVarDef);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,11 @@ IEnumerable<Instruction> GenerateIL(double x, double y, double w, double h, Modu
yield return Instruction.Create(OpCodes.Ldc_R8, y);
yield return Instruction.Create(OpCodes.Ldc_R8, w);
yield return Instruction.Create(OpCodes.Ldc_R8, h);

yield return Instruction.Create(OpCodes.Newobj, module.ImportCtorReference(("Xamarin.Forms.Core", "Xamarin.Forms", "Rectangle"), paramCount: 4));
yield return Instruction.Create(OpCodes.Newobj, module.ImportCtorReference(("Xamarin.Forms.Core", "Xamarin.Forms", "Rectangle"), parameterTypes: new[] {
("mscorlib", "System", "Double"),
("mscorlib", "System", "Double"),
("mscorlib", "System", "Double"),
("mscorlib", "System", "Double")}));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,7 @@ IEnumerable<Instruction> GenerateIL(ModuleDefinition module, params double[] arg
{
foreach (var d in args)
yield return Instruction.Create(OpCodes.Ldc_R8, d);
yield return Instruction.Create(OpCodes.Newobj, module.ImportCtorReference(("Xamarin.Forms.Core", "Xamarin.Forms", "Thickness"),
paramCount: args.Length));
yield return Instruction.Create(OpCodes.Newobj, module.ImportCtorReference(("Xamarin.Forms.Core", "Xamarin.Forms", "Thickness"), parameterTypes: args.Select(a => ("mscorlib", "System", "Double")).ToArray()));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@
using System.Collections.Generic;
using System.Xml;

using Mono.Cecil;
using Mono.Cecil.Cil;

using Xamarin.Forms.Build.Tasks;
using Xamarin.Forms.Xaml;

using static Mono.Cecil.Cil.Instruction;
using static Mono.Cecil.Cil.OpCodes;

namespace Xamarin.Forms.Core.XamlC
{
class TypeTypeConverter : ICompiledTypeConverter
Expand All @@ -33,8 +35,11 @@ public IEnumerable<Instruction> ConvertFromString(string value, ILContext contex
if (typeRef == null)
goto error;

yield return Instruction.Create(OpCodes.Ldtoken, module.ImportReference(typeRef));
yield return Instruction.Create(OpCodes.Call, module.ImportMethodReference(("mscorlib", "System", "Type"), methodName: "GetTypeFromHandle", paramCount: 1, predicate: md => md.IsStatic));
yield return Create(Ldtoken, module.ImportReference(typeRef));
yield return Create(Call, module.ImportMethodReference(("mscorlib", "System", "Type"),
methodName: "GetTypeFromHandle",
parameterTypes: new[] { ("mscorlib", "System", "RuntimeTypeHandle") },
isStatic: true));

yield break;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,11 @@ public IEnumerable<Instruction> ConvertFromString(string value, ILContext contex
yield break;
}

var uriCtorRef = module.ImportCtorReference(("System", "System", "Uri"),
paramCount: 2,
predicate: md => md.Parameters[1].ParameterType.FullName == "System.UriKind");
yield return Create(Ldstr, value);
yield return Create(Ldc_I4_0); //UriKind.RelativeOrAbsolute
yield return Create(Newobj, uriCtorRef);
yield return Create(Newobj, module.ImportCtorReference(("System", "System", "Uri"), parameterTypes: new[] {
("mscorlib", "System", "String"),
("System", "System", "UriKind")}));
}
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml;

using Mono.Cecil;
using Mono.Cecil.Cil;

using Xamarin.Forms.Xaml;
using System.Xml;

using static Mono.Cecil.Cil.Instruction;
using static Mono.Cecil.Cil.OpCodes;


namespace Xamarin.Forms.Build.Tasks
{
Expand All @@ -29,15 +34,15 @@ public IEnumerable<Instruction> ProvideValue(IElementNode node, ModuleDefinition
}

var typeref = module.ImportReference(XmlTypeExtensions.GetTypeReference(valueNode.Value as string, module, node as BaseNode));
if (typeref == null)
throw new XamlParseException($"Can't resolve type `{valueNode.Value}'.", node as IXmlLineInfo);

context.TypeExtensions[node] = typeref;
context.TypeExtensions[node] = typeref ?? throw new XamlParseException($"Can't resolve type `{valueNode.Value}'.", node as IXmlLineInfo);

return new List<Instruction> {
Instruction.Create(OpCodes.Ldtoken, module.ImportReference(typeref)),
Instruction.Create(OpCodes.Call, module.ImportMethodReference(("mscorlib", "System", "Type"), methodName: "GetTypeFromHandle", paramCount: 1, predicate: md => md.IsStatic)),

Create(Ldtoken, module.ImportReference(typeref)),
Create(Call, module.ImportMethodReference(("mscorlib", "System", "Type"),
methodName: "GetTypeFromHandle",
parameterTypes: new[] { ("mscorlib", "System", "RuntimeTypeHandle") },
isStatic: true)),
};
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
using System;
using System.Collections.Generic;
using System.Linq;

using System.Xml;

using Mono.Cecil;
using Mono.Cecil.Cil;
Expand All @@ -13,7 +10,6 @@
using static Mono.Cecil.Cil.Instruction;
using static Mono.Cecil.Cil.OpCodes;


namespace Xamarin.Forms.Core.XamlC
{
class StyleSheetProvider : ICompiledValueProvider
Expand Down Expand Up @@ -48,8 +44,8 @@ public IEnumerable<Instruction> ProvideValue(VariableDefinitionReference vardefr
yield return Create(Ldstr, style);
yield return Create(Call, module.ImportMethodReference(("Xamarin.Forms.Core", "Xamarin.Forms.StyleSheets", "StyleSheet"),
methodName: "FromString",
paramCount: 1,
predicate: md => md.IsStatic));
parameterTypes: new[] { ("mscorlib", "System", "String") },
isStatic: true));
}
else {
var source = (sourceNode as ValueNode)?.Value as string;
Expand All @@ -67,8 +63,8 @@ public IEnumerable<Instruction> ProvideValue(VariableDefinitionReference vardefr
throw new XamlParseException($"Resource '{source}' not found.", node);

yield return Create(Ldtoken, module.ImportReference(((ILRootNode)rootNode).TypeReference));
yield return Create(Call, module.ImportMethodReference(("mscorlib", "System", "Type"), methodName: "GetTypeFromHandle", paramCount: 1, predicate: md => md.IsStatic));
yield return Create(Call, module.ImportMethodReference(("mscorlib", "System.Reflection", "IntrospectionExtensions"), methodName: "GetTypeInfo", paramCount: 1, predicate: md => md.IsStatic));
yield return Create(Call, module.ImportMethodReference(("mscorlib", "System", "Type"), methodName: "GetTypeFromHandle", parameterTypes: new[] { ("mscorlib", "System", "RuntimeTypeHandle") }, isStatic: true));
yield return Create(Call, module.ImportMethodReference(("mscorlib", "System.Reflection", "IntrospectionExtensions"), methodName: "GetTypeInfo", parameterTypes: new[] { ("mscorlib", "System", "Type") }, isStatic: true));
yield return Create(Callvirt, module.ImportPropertyGetterReference(("mscorlib", "System.Reflection", "TypeInfo"), propertyName: "Assembly", flatten: true));

yield return Create(Ldstr, resourceId); //resourceId
Expand All @@ -78,8 +74,8 @@ public IEnumerable<Instruction> ProvideValue(VariableDefinitionReference vardefr

yield return Create(Call, module.ImportMethodReference(("Xamarin.Forms.Core", "Xamarin.Forms.StyleSheets", "StyleSheet"),
methodName: "FromAssemblyResource",
paramCount: 3,
predicate: md => md.IsStatic));
parameterTypes: new[] { ("mscorlib", "System.Reflection", "Assembly"), ("mscorlib", "System", "String"), ("System.Xml.ReaderWriter", "System.Xml", "IXmlLineInfo") },
isStatic: true));
}

//the variable is of type `object`. fix that
Expand Down
Loading