Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/cecil.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'rocks/Mono.Cecil.Rocks/MethodBodyRocks.cs')
-rw-r--r--rocks/Mono.Cecil.Rocks/MethodBodyRocks.cs23
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)