Browse Source

Fix #1168: Extend MatchCompEquals and MatchCompNotEquals to work with multiple nested logic.not instructions

pull/1176/head
Siegfried Pammer 7 years ago
parent
commit
6ce53c804b
  1. 30
      ICSharpCode.Decompiler/IL/Instructions/PatternMatching.cs

30
ICSharpCode.Decompiler/IL/Instructions/PatternMatching.cs

@ -327,11 +327,16 @@ namespace ICSharpCode.Decompiler.IL
/// </summary>
public bool MatchCompEquals(out ILInstruction left, out ILInstruction right)
{
if (this.MatchLogicNot(out var arg) && arg is Comp nestedComp && nestedComp.Kind == ComparisonKind.Inequality && !nestedComp.IsLifted) {
left = nestedComp.Left;
right = nestedComp.Right;
return true;
} else if (this is Comp comp && comp.Kind == ComparisonKind.Equality && !comp.IsLifted) {
ILInstruction thisInst = this;
var compKind = ComparisonKind.Equality;
while (thisInst.MatchLogicNot(out var arg) && arg is Comp) {
thisInst = arg;
if (compKind == ComparisonKind.Equality)
compKind = ComparisonKind.Inequality;
else
compKind = ComparisonKind.Equality;
}
if (thisInst is Comp comp && comp.Kind == compKind && !comp.IsLifted) {
left = comp.Left;
right = comp.Right;
return true;
@ -389,11 +394,16 @@ namespace ICSharpCode.Decompiler.IL
/// </summary>
public bool MatchCompNotEquals(out ILInstruction left, out ILInstruction right)
{
if (this.MatchLogicNot(out var arg) && arg is Comp nestedComp && nestedComp.Kind == ComparisonKind.Equality && !nestedComp.IsLifted) {
left = nestedComp.Left;
right = nestedComp.Right;
return true;
} else if (this is Comp comp && comp.Kind == ComparisonKind.Inequality && !comp.IsLifted) {
ILInstruction thisInst = this;
var compKind = ComparisonKind.Inequality;
while (thisInst.MatchLogicNot(out var arg) && arg is Comp) {
thisInst = arg;
if (compKind == ComparisonKind.Equality)
compKind = ComparisonKind.Inequality;
else
compKind = ComparisonKind.Equality;
}
if (thisInst is Comp comp && comp.Kind == compKind && !comp.IsLifted) {
left = comp.Left;
right = comp.Right;
return true;

Loading…
Cancel
Save