public static void OptimizeMacros(this MethodBody self) { int index; if (self == null) { throw new ArgumentNullException("self"); } MethodDefinition method = self.Method; foreach (Instruction instruction in self.Instructions) { Code code = instruction.OpCode.Code; if (code == Code.Ldc_I4) { int operand = (int)instruction.Operand; switch (operand) { case -1: { MethodBodyRocks.MakeMacro(instruction, OpCodes.Ldc_I4_M1); continue; } case 0: { MethodBodyRocks.MakeMacro(instruction, OpCodes.Ldc_I4_0); continue; } case 1: { MethodBodyRocks.MakeMacro(instruction, OpCodes.Ldc_I4_1); continue; } case 2: { MethodBodyRocks.MakeMacro(instruction, OpCodes.Ldc_I4_2); continue; } case 3: { MethodBodyRocks.MakeMacro(instruction, OpCodes.Ldc_I4_3); continue; } case 4: { MethodBodyRocks.MakeMacro(instruction, OpCodes.Ldc_I4_4); continue; } case 5: { MethodBodyRocks.MakeMacro(instruction, OpCodes.Ldc_I4_5); continue; } case 6: { MethodBodyRocks.MakeMacro(instruction, OpCodes.Ldc_I4_6); continue; } case 7: { MethodBodyRocks.MakeMacro(instruction, OpCodes.Ldc_I4_7); continue; } case 8: { MethodBodyRocks.MakeMacro(instruction, OpCodes.Ldc_I4_8); continue; } } if (operand < -128 || operand >= 128) { continue; } MethodBodyRocks.ExpandMacro(instruction, OpCodes.Ldc_I4_S, (sbyte)operand); } else { switch (code) { case Code.Ldarg: { index = ((ParameterDefinition)instruction.Operand).Index; if (index == -1 && instruction.Operand == self.ThisParameter) { index = 0; } else if (method.HasThis) { index++; } switch (index) { case 0: { MethodBodyRocks.MakeMacro(instruction, OpCodes.Ldarg_0); continue; } case 1: { MethodBodyRocks.MakeMacro(instruction, OpCodes.Ldarg_1); continue; } case 2: { MethodBodyRocks.MakeMacro(instruction, OpCodes.Ldarg_2); continue; } case 3: { MethodBodyRocks.MakeMacro(instruction, OpCodes.Ldarg_3); continue; } } if (index >= 256) { continue; } MethodBodyRocks.ExpandMacro(instruction, OpCodes.Ldarg_S, instruction.Operand); continue; } case Code.Ldarga: { index = ((ParameterDefinition)instruction.Operand).Index; if (index == -1 && instruction.Operand == self.ThisParameter) { index = 0; } else if (method.HasThis) { index++; } if (index >= 256) { continue; } MethodBodyRocks.ExpandMacro(instruction, OpCodes.Ldarga_S, instruction.Operand); continue; } case Code.Ldloc: { index = ((VariableDefinition)instruction.Operand).Index; switch (index) { case 0: { MethodBodyRocks.MakeMacro(instruction, OpCodes.Ldloc_0); continue; } case 1: { MethodBodyRocks.MakeMacro(instruction, OpCodes.Ldloc_1); continue; } case 2: { MethodBodyRocks.MakeMacro(instruction, OpCodes.Ldloc_2); continue; } case 3: { MethodBodyRocks.MakeMacro(instruction, OpCodes.Ldloc_3); continue; } } if (index >= 256) { continue; } MethodBodyRocks.ExpandMacro(instruction, OpCodes.Ldloc_S, instruction.Operand); continue; } case Code.Ldloca: { if (((VariableDefinition)instruction.Operand).Index >= 256) { continue; } MethodBodyRocks.ExpandMacro(instruction, OpCodes.Ldloca_S, instruction.Operand); continue; } case Code.Stloc: { index = ((VariableDefinition)instruction.Operand).Index; switch (index) { case 0: { MethodBodyRocks.MakeMacro(instruction, OpCodes.Stloc_0); continue; } case 1: { MethodBodyRocks.MakeMacro(instruction, OpCodes.Stloc_1); continue; } case 2: { MethodBodyRocks.MakeMacro(instruction, OpCodes.Stloc_2); continue; } case 3: { MethodBodyRocks.MakeMacro(instruction, OpCodes.Stloc_3); continue; } } if (index >= 256) { continue; } MethodBodyRocks.ExpandMacro(instruction, OpCodes.Stloc_S, instruction.Operand); continue; } default: { continue; } } } } MethodBodyRocks.OptimizeBranches(self); }