diff --git a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs index c5ebf5bf7..94d67b7c0 100644 --- a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs +++ b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs @@ -1618,7 +1618,7 @@ namespace ICSharpCode.Decompiler.CSharp } else { - return compilation.FindType(stackType.ToKnownTypeCode(sign)); + return compilation.FindType(stackType, sign); } } @@ -1644,7 +1644,7 @@ namespace ICSharpCode.Decompiler.CSharp stackType = StackType.I8; } } - return compilation.FindType(stackType.ToKnownTypeCode(sign)); + return compilation.FindType(stackType, sign); } /// @@ -3568,7 +3568,7 @@ namespace ICSharpCode.Decompiler.CSharp } else if (!value.Type.Equals(SpecialType.NullType) && !fallback.Type.Equals(SpecialType.NullType) && !value.Type.Equals(fallback.Type)) { - targetType = compilation.FindType(inst.UnderlyingResultType.ToKnownTypeCode()); + targetType = compilation.FindType(inst.UnderlyingResultType); } else { @@ -3731,7 +3731,7 @@ namespace ICSharpCode.Decompiler.CSharp } else { - resultType = compilation.FindType(inst.ResultType.ToKnownTypeCode()); + resultType = compilation.FindType(inst.ResultType); } foreach (var section in inst.Sections) diff --git a/ICSharpCode.Decompiler/IL/ILReader.cs b/ICSharpCode.Decompiler/IL/ILReader.cs index 0f0a000dc..83e78cb82 100644 --- a/ICSharpCode.Decompiler/IL/ILReader.cs +++ b/ICSharpCode.Decompiler/IL/ILReader.cs @@ -1170,7 +1170,7 @@ namespace ICSharpCode.Decompiler.IL ILInstruction Push(ILInstruction inst) { Debug.Assert(inst.ResultType != StackType.Void); - IType type = compilation.FindType(inst.ResultType.ToKnownTypeCode()); + IType type = compilation.FindType(inst.ResultType); var v = new ILVariable(VariableKind.StackSlot, type, inst.ResultType); v.HasGeneratedName = true; currentStack = currentStack.Push(v); diff --git a/ICSharpCode.Decompiler/IL/Transforms/CopyPropagation.cs b/ICSharpCode.Decompiler/IL/Transforms/CopyPropagation.cs index 766da7b98..1f3251fd2 100644 --- a/ICSharpCode.Decompiler/IL/Transforms/CopyPropagation.cs +++ b/ICSharpCode.Decompiler/IL/Transforms/CopyPropagation.cs @@ -148,7 +148,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms for (int j = 0; j < uninlinedArgs.Length; j++) { var arg = copiedExpr.Children[j]; - var type = context.TypeSystem.FindType(arg.ResultType.ToKnownTypeCode()); + var type = context.TypeSystem.FindType(arg.ResultType); uninlinedArgs[j] = new ILVariable(VariableKind.StackSlot, type, arg.ResultType) { Name = "C_" + arg.StartILOffset, HasGeneratedName = true, diff --git a/ICSharpCode.Decompiler/IL/Transforms/ILExtraction.cs b/ICSharpCode.Decompiler/IL/Transforms/ILExtraction.cs index 5840dffe1..55582a852 100644 --- a/ICSharpCode.Decompiler/IL/Transforms/ILExtraction.cs +++ b/ICSharpCode.Decompiler/IL/Transforms/ILExtraction.cs @@ -62,7 +62,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms { FlagsBeingMoved |= predecessor.Flags; MoveActions.Add(delegate { - var type = context.TypeSystem.FindType(predecessor.ResultType.ToKnownTypeCode()); + var type = context.TypeSystem.FindType(predecessor.ResultType); var v = Function.RegisterVariable(VariableKind.StackSlot, type); predecessor.ReplaceWith(new LdLoc(v)); return new StLoc(v, predecessor); @@ -119,7 +119,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms { // We've reached the target block, and extraction is possible all the way. int insertIndex = inst.ChildIndex; - var type = context.TypeSystem.FindType(instToExtract.ResultType.ToKnownTypeCode()); + var type = context.TypeSystem.FindType(instToExtract.ResultType); // Move instToExtract itself: var v = function.RegisterVariable(VariableKind.StackSlot, type); instToExtract.ReplaceWith(new LdLoc(v)); diff --git a/ICSharpCode.Decompiler/IL/Transforms/NamedArgumentTransform.cs b/ICSharpCode.Decompiler/IL/Transforms/NamedArgumentTransform.cs index 39bbfd425..d2c5c400c 100644 --- a/ICSharpCode.Decompiler/IL/Transforms/NamedArgumentTransform.cs +++ b/ICSharpCode.Decompiler/IL/Transforms/NamedArgumentTransform.cs @@ -87,7 +87,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms { var call = (CallInstruction)arg.Parent; Debug.Assert(context.Function == call.Ancestors.OfType().First()); - var type = context.TypeSystem.FindType(arg.ResultType.ToKnownTypeCode()); + var type = context.TypeSystem.FindType(arg.ResultType); var v = context.Function.RegisterVariable(VariableKind.NamedArgument, type); context.Step($"Introduce named argument '{v.Name}'", arg); if (!(call.Parent is Block namedArgBlock) || namedArgBlock.Kind != BlockKind.CallWithNamedArgs) diff --git a/ICSharpCode.Decompiler/IL/Transforms/NullableLiftingTransform.cs b/ICSharpCode.Decompiler/IL/Transforms/NullableLiftingTransform.cs index 45be72188..45429d845 100644 --- a/ICSharpCode.Decompiler/IL/Transforms/NullableLiftingTransform.cs +++ b/ICSharpCode.Decompiler/IL/Transforms/NullableLiftingTransform.cs @@ -630,7 +630,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms if (!MatchNullableCtor(trueInst, out var utype, out var exprToLift)) { isNullCoalescingWithNonNullableFallback = true; - utype = context.TypeSystem.FindType(trueInst.ResultType.ToKnownTypeCode()); + utype = context.TypeSystem.FindType(trueInst.ResultType); exprToLift = trueInst; if (nullableVars.Count == 1 && exprToLift.MatchLdLoc(nullableVars[0])) { diff --git a/ICSharpCode.Decompiler/TypeSystem/ReflectionHelper.cs b/ICSharpCode.Decompiler/TypeSystem/ReflectionHelper.cs index 4898ee5e1..df8e396f1 100644 --- a/ICSharpCode.Decompiler/TypeSystem/ReflectionHelper.cs +++ b/ICSharpCode.Decompiler/TypeSystem/ReflectionHelper.cs @@ -19,6 +19,7 @@ using System; using System.Collections.Generic; +using ICSharpCode.Decompiler.IL; using ICSharpCode.Decompiler.TypeSystem.Implementation; namespace ICSharpCode.Decompiler.TypeSystem @@ -66,6 +67,19 @@ namespace ICSharpCode.Decompiler.TypeSystem { return type.ToTypeReference().Resolve(new SimpleTypeResolveContext(compilation)); } + + public static IType FindType(this ICompilation compilation, StackType stackType, Sign sign = Sign.None) + { + switch (stackType) + { + case StackType.Unknown: + return SpecialType.UnknownType; + case StackType.Ref: + return new ByReferenceType(SpecialType.UnknownType); + default: + return compilation.FindType(stackType.ToKnownTypeCode(sign)); + } + } #endregion #region Type.ToTypeReference()