diff options
author | Stephane Delcroix <stephane@delcroix.org> | 2016-12-14 13:25:42 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-12-14 13:25:42 +0100 |
commit | d4792dc98dfca29849bedc21519d9cf9ae6f2cb6 (patch) | |
tree | d63399bcc3c99abf141944ebd4f8ff15b32b2f6f /Xamarin.Forms.Build.Tasks/CompiledConverters | |
parent | f2fe64ac235871dbed5f1f09812cb5cfc11864e3 (diff) | |
download | xamarin-forms-d4792dc98dfca29849bedc21519d9cf9ae6f2cb6.tar.gz xamarin-forms-d4792dc98dfca29849bedc21519d9cf9ae6f2cb6.tar.bz2 xamarin-forms-d4792dc98dfca29849bedc21519d9cf9ae6f2cb6.zip |
[XamlC] Allow compilation of IValueProviders (#622)
* [XamlC] Allow compilation of IValueProviders
`IValueProvider`s tagged with the appropriate attribute will be bypassed
and the compiled version, if found, will be used.
This first version contains a compiled version of Setter's
IValueProvider and it already reduces the amount of generated IL by 39%
in, e.g. StyleTests.
It's a huge gain because XamlC no longer have to generate
ServiceProviders for those, so the methodbody is smaller, takes less
time to jit, less time to execute and nothing is invoked at runtime,
which probably saves a tons of time as well, as most IValueProvider
implementation heavily uses reflection.
* name bool parameters
Diffstat (limited to 'Xamarin.Forms.Build.Tasks/CompiledConverters')
-rw-r--r-- | Xamarin.Forms.Build.Tasks/CompiledConverters/BindablePropertyConverter.cs | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/Xamarin.Forms.Build.Tasks/CompiledConverters/BindablePropertyConverter.cs b/Xamarin.Forms.Build.Tasks/CompiledConverters/BindablePropertyConverter.cs index 92a53539..c1d11487 100644 --- a/Xamarin.Forms.Build.Tasks/CompiledConverters/BindablePropertyConverter.cs +++ b/Xamarin.Forms.Build.Tasks/CompiledConverters/BindablePropertyConverter.cs @@ -18,7 +18,12 @@ namespace Xamarin.Forms.Core.XamlC yield return Instruction.Create(OpCodes.Ldnull); yield break; } + var bpRef = GetBindablePropertyFieldReference(value, module, node); + yield return Instruction.Create(OpCodes.Ldsfld, bpRef); + } + public FieldReference GetBindablePropertyFieldReference(string value, ModuleDefinition module, BaseNode node) + { FieldReference bpRef = null; string typeName = null, propertyName = null; @@ -49,7 +54,7 @@ namespace Xamarin.Forms.Core.XamlC bpRef = GetBindablePropertyFieldReference(typeRef, propertyName, module); if (bpRef == null) throw new XamlParseException($"Can't resolve {propertyName} on {typeRef.Name}", node); - yield return Instruction.Create(OpCodes.Ldsfld, bpRef); + return bpRef; } public static TypeReference GetTypeReference(string xmlType, ModuleDefinition module, BaseNode iNode) |