diff options
Diffstat (limited to 'rocks/Mono.Cecil.Rocks/MethodBodyRocks.cs')
-rw-r--r-- | rocks/Mono.Cecil.Rocks/MethodBodyRocks.cs | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/rocks/Mono.Cecil.Rocks/MethodBodyRocks.cs b/rocks/Mono.Cecil.Rocks/MethodBodyRocks.cs index 2ff43c3..dfdaece 100644 --- a/rocks/Mono.Cecil.Rocks/MethodBodyRocks.cs +++ b/rocks/Mono.Cecil.Rocks/MethodBodyRocks.cs @@ -174,6 +174,29 @@ namespace Mono.Cecil.Rocks { instruction.Operand = null; } + public static void Optimize (this MethodBody self) + { + if (self == null) + throw new ArgumentNullException ("self"); + + OptimizeLongs (self); + OptimizeMacros (self); + } + + static void OptimizeLongs (this MethodBody self) + { + 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 >= uint.MaxValue) + continue; + ExpandMacro (instruction, OpCodes.Ldc_I4, (uint)l); + self.Instructions.Insert (++i, Instruction.Create (OpCodes.Conv_I8)); + } + } + public static void OptimizeMacros (this MethodBody self) { if (self == null) |