From 4a86f9481ae4902cc3a0048050c60e8645eb56b2 Mon Sep 17 00:00:00 2001 From: Stephane Delcroix Date: Mon, 12 Dec 2016 11:13:41 +0100 Subject: [XamlC] optimize Datatemplate IL as well (#612) --- Xamarin.Forms.Build.Tasks/MethodBodyExtensions.cs | 40 ++++++++++++++++++++++ Xamarin.Forms.Build.Tasks/SetPropertiesVisitor.cs | 2 ++ .../Xamarin.Forms.Build.Tasks.csproj | 1 + Xamarin.Forms.Build.Tasks/XamlCTask.cs | 25 +------------- 4 files changed, 44 insertions(+), 24 deletions(-) create mode 100644 Xamarin.Forms.Build.Tasks/MethodBodyExtensions.cs (limited to 'Xamarin.Forms.Build.Tasks') diff --git a/Xamarin.Forms.Build.Tasks/MethodBodyExtensions.cs b/Xamarin.Forms.Build.Tasks/MethodBodyExtensions.cs new file mode 100644 index 00000000..f5bdc859 --- /dev/null +++ b/Xamarin.Forms.Build.Tasks/MethodBodyExtensions.cs @@ -0,0 +1,40 @@ +using Mono.Cecil.Cil; +using Mono.Cecil.Rocks; +using System; + +namespace Xamarin.Forms.Build.Tasks +{ + static class MethodBodyExtensions + { + public static void Optimize(this MethodBody self) + { + if (self == null) + throw new ArgumentNullException(nameof(self)); + + self.OptimizeLongs(); + self.OptimizeMacros(); + } + + static void ExpandMacro(Instruction instruction, OpCode opcode, object operand) + { + instruction.OpCode = opcode; + instruction.Operand = operand; + } + + //this can be removed if/when https://github.com/jbevain/cecil/pull/307 is released in a nuget we consume + static void OptimizeLongs(this MethodBody self) + { + var method = self.Method; + for (var i = 0; i < self.Instructions.Count; i++) { + var instruction = self.Instructions[i]; + if (instruction.OpCode.Code != Code.Ldc_I8) + continue; + var l = (long)instruction.Operand; + if (l < int.MinValue || l > int.MaxValue) + continue; + ExpandMacro(instruction, OpCodes.Ldc_I4, unchecked((int)l)); + self.Instructions.Insert(++i, Instruction.Create(OpCodes.Conv_I8)); + } + } + } +} \ No newline at end of file diff --git a/Xamarin.Forms.Build.Tasks/SetPropertiesVisitor.cs b/Xamarin.Forms.Build.Tasks/SetPropertiesVisitor.cs index 35316f26..67c345ff 100644 --- a/Xamarin.Forms.Build.Tasks/SetPropertiesVisitor.cs +++ b/Xamarin.Forms.Build.Tasks/SetPropertiesVisitor.cs @@ -1161,6 +1161,8 @@ namespace Xamarin.Forms.Build.Tasks module.Import(typeof (IDataTemplate)).Resolve().Properties.First(p => p.Name == "LoadTemplate").SetMethod; #pragma warning restore 0612 parentContext.IL.Emit(OpCodes.Callvirt, module.Import(propertySetter)); + + loadTemplate.Body.Optimize(); } } diff --git a/Xamarin.Forms.Build.Tasks/Xamarin.Forms.Build.Tasks.csproj b/Xamarin.Forms.Build.Tasks/Xamarin.Forms.Build.Tasks.csproj index 1ccace2b..589d0062 100644 --- a/Xamarin.Forms.Build.Tasks/Xamarin.Forms.Build.Tasks.csproj +++ b/Xamarin.Forms.Build.Tasks/Xamarin.Forms.Build.Tasks.csproj @@ -103,6 +103,7 @@ + diff --git a/Xamarin.Forms.Build.Tasks/XamlCTask.cs b/Xamarin.Forms.Build.Tasks/XamlCTask.cs index 5127efda..4e2029c4 100644 --- a/Xamarin.Forms.Build.Tasks/XamlCTask.cs +++ b/Xamarin.Forms.Build.Tasks/XamlCTask.cs @@ -185,8 +185,7 @@ namespace Xamarin.Forms.Build.Tasks if (OptimizeIL) { Logger.LogString(2, " Optimizing IL... "); - OptimizeLongs(initComp.Body); - initComp.Body.OptimizeMacros(); + initComp.Body.Optimize(); Logger.LogLine(2, "done"); } @@ -237,28 +236,6 @@ namespace Xamarin.Forms.Build.Tasks return success; } - static void ExpandMacro(Instruction instruction, OpCode opcode, object operand) - { - instruction.OpCode = opcode; - instruction.Operand = operand; - } - - //this can be removed if/when https://github.com/jbevain/cecil/pull/307 is released in a nuget we consume - static void OptimizeLongs(MethodBody self) - { - var method = self.Method; - for (var i = 0; i < self.Instructions.Count; i++) { - var instruction = self.Instructions[i]; - if (instruction.OpCode.Code != Code.Ldc_I8) - continue; - var l = (long)instruction.Operand; - if (l < int.MinValue || l > int.MaxValue) - continue; - ExpandMacro(instruction, OpCodes.Ldc_I4, unchecked((int)l)); - self.Instructions.Insert(++i, Instruction.Create(OpCodes.Conv_I8)); - } - } - bool TryCoreCompile(MethodDefinition initComp, MethodDefinition initCompRuntime, ILRootNode rootnode, out Exception exception) { try { -- cgit v1.2.3