static TypeReference GetType (Instruction ins, MethodDefinition method) { object operand = ins.GetOperand (method); ParameterDefinition parameter = (operand as ParameterDefinition); if (parameter != null) return parameter.ParameterType; FieldDefinition field = (operand as FieldDefinition); if (field != null) return field.FieldType; VariableDefinition variable = (operand as VariableDefinition); if (variable != null) return variable.VariableType; return null; // unknown }
static bool OriginsMatch (MethodDefinition method, Instruction lhs, Instruction rhs) { bool match = false; object operand1 = lhs.GetOperand (method); object operand2 = rhs.GetOperand (method); if (lhs.OpCode.Code == rhs.OpCode.Code) { if (lhs.IsLoadArgument ()) match = operand1.Equals (operand2); else if (lhs.IsLoadElement ()) match = LoadElementMatch (method, lhs, rhs); else if (lhs.IsLoadIndirect ()) match = LoadIndirectMatch (method, lhs, rhs); else if (lhs.IsLoadLocal ()) match = LocalsMatch (operand1, operand2); } else if (lhs.IsStoreLocal () && rhs.IsLoadLocal ()) match = LocalsMatch (operand1, operand2); else if (lhs.IsLoadLocal () && rhs.IsStoreLocal ()) match = LocalsMatch (operand1, operand2); return match; }
static bool IndexesMatch (MethodDefinition method, Instruction lhs, Instruction rhs) { bool match = false; if (lhs.OpCode.Code == rhs.OpCode.Code) { switch (lhs.OpCode.Code) { case Code.Ldc_I4_M1: case Code.Ldc_I4_0: case Code.Ldc_I4_1: case Code.Ldc_I4_2: case Code.Ldc_I4_3: case Code.Ldc_I4_4: case Code.Ldc_I4_5: case Code.Ldc_I4_6: case Code.Ldc_I4_7: case Code.Ldc_I4_8: case Code.Ldc_I4_S: case Code.Ldc_I4: object operand1 = lhs.GetOperand (method); object operand2 = rhs.GetOperand (method); match = operand1.Equals (operand2); break; } } return match; }
static bool CompareOperand (Instruction left, Instruction right, MethodDefinition method) { object operand_left = left.GetOperand (method); object operand_right = right.GetOperand (method); if (operand_left == null) return (operand_right == null); return operand_left.Equals (operand_right); }