Files
Nitrox/NitroxPatcher/PatternMatching/OpCodePattern.cs
2025-07-06 00:23:46 +02:00

35 lines
1.4 KiB
C#

using System;
using System.Reflection.Emit;
namespace NitroxPatcher.PatternMatching;
public readonly struct OpCodePattern
{
public bool Equals(OpCodePattern other) => Nullable.Equals(OpCode, other.OpCode);
public override bool Equals(object obj) => obj is OpCodePattern other && Equals(other);
public override int GetHashCode() => OpCode.GetHashCode();
public OpCode? OpCode { get; init; }
/// <summary>
/// If true, similar opcodes will be matched as being the same.
/// </summary>
/// <remarks>
/// Example for similar opcodes (call): call, callvirt and calli.
/// </remarks>
public bool WeakMatch { get; init; }
public bool IsAnyCall => WeakMatch && (OpCode == OpCodes.Call || OpCode == OpCodes.Callvirt || OpCode == OpCodes.Calli);
public static implicit operator OpCodePattern(OpCode opCode) => new() { OpCode = opCode };
public static bool operator ==(OpCodePattern pattern, OpCode opCode) => pattern.OpCode == opCode ||
(pattern.IsAnyCall && (opCode == OpCodes.Call || opCode == OpCodes.Callvirt || opCode == OpCodes.Calli));
public static bool operator ==(OpCode opCode, OpCodePattern pattern) => pattern == opCode;
public static bool operator !=(OpCodePattern pattern, OpCode opCode) => !(pattern == opCode);
public static bool operator !=(OpCode opCode, OpCodePattern pattern) => !(opCode == pattern);
}