diff --git a/Source/SpirV/Disassembler.cs b/Source/SpirV/Disassembler.cs index 32eb8b867..71b469159 100644 --- a/Source/SpirV/Disassembler.cs +++ b/Source/SpirV/Disassembler.cs @@ -189,7 +189,7 @@ namespace SpirV { foreach (uint key in enumOperandValue.Values.Keys) { - sb.Append(enumOperandValue.EnumerationType.GetEnumName(key)); + sb.Append(enumOperandValue.GetEnumName(key)); IReadOnlyList value = enumOperandValue.Values[key]; if (value.Count != 0) { diff --git a/Source/SpirV/OperandType.cs b/Source/SpirV/OperandType.cs index 2b7d084fe..861ffcd8a 100644 --- a/Source/SpirV/OperandType.cs +++ b/Source/SpirV/OperandType.cs @@ -137,12 +137,12 @@ namespace SpirV } public class EnumType : EnumType - where T : Enum + where T : unmanaged, Enum { }; public class EnumType : OperandType - where T : Enum + where T : unmanaged, Enum where U : ParameterFactory, new() { public override bool ReadValue(IReadOnlyList words, int index, out object value, out int wordsUsed) diff --git a/Source/SpirV/ParsedInstruction.cs b/Source/SpirV/ParsedInstruction.cs index b8d7d04bb..4f262ff81 100644 --- a/Source/SpirV/ParsedInstruction.cs +++ b/Source/SpirV/ParsedInstruction.cs @@ -1,3 +1,4 @@ +using System.Runtime.CompilerServices; using System.Text; namespace SpirV @@ -38,7 +39,7 @@ namespace SpirV return ((ObjectReference)Value).Id; } - public T GetBitEnumValue() where T : Enum + public uint GetBitEnumValue() { IBitEnumOperandValue v = (IBitEnumOperandValue)Value; @@ -48,7 +49,7 @@ namespace SpirV result |= k; } - return (T)(object)result; + return result; } public IReadOnlyList Words { get; } @@ -95,7 +96,7 @@ namespace SpirV public interface IEnumOperandValue { - System.Type EnumerationType { get; } + string? GetEnumName(uint value); } public interface IBitEnumOperandValue : IEnumOperandValue @@ -109,8 +110,28 @@ namespace SpirV IReadOnlyList Value { get; } } - public class ValueEnumOperandValue : IValueEnumOperandValue - where T : Enum + public abstract class EnumOperandValue : IEnumOperandValue + where T : unmanaged, Enum + { + public string? GetEnumName(uint value) + { + if (Unsafe.SizeOf() == sizeof(uint)) + { + return Enum.GetName(Unsafe.As(ref value)); + } + else + { +#if DEBUG + throw new InvalidCastException(); +#else + return default;//Exceptions prevent inlining. +#endif + } + } + } + + public class ValueEnumOperandValue : EnumOperandValue, IValueEnumOperandValue + where T : unmanaged, Enum { public ValueEnumOperandValue(T key, IReadOnlyList value) { @@ -118,13 +139,12 @@ namespace SpirV Value = value; } - public System.Type EnumerationType => typeof(T); public object Key { get; } public IReadOnlyList Value { get; } } - public class BitEnumOperandValue : IBitEnumOperandValue - where T : Enum + public class BitEnumOperandValue : EnumOperandValue, IBitEnumOperandValue + where T : unmanaged, Enum { public BitEnumOperandValue(Dictionary> values) { @@ -132,7 +152,6 @@ namespace SpirV } public IReadOnlyDictionary> Values { get; } - public System.Type EnumerationType => typeof(T); } public class ObjectReference