Browse Source

Fix #2506: NamedArgumentTransform loses information, if the original variable is of StackType.Ref

pull/2509/head
Siegfried Pammer 4 years ago
parent
commit
1568aeca3e
  1. 8
      ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs
  2. 2
      ICSharpCode.Decompiler/IL/ILReader.cs
  3. 2
      ICSharpCode.Decompiler/IL/Transforms/CopyPropagation.cs
  4. 4
      ICSharpCode.Decompiler/IL/Transforms/ILExtraction.cs
  5. 2
      ICSharpCode.Decompiler/IL/Transforms/NamedArgumentTransform.cs
  6. 2
      ICSharpCode.Decompiler/IL/Transforms/NullableLiftingTransform.cs
  7. 14
      ICSharpCode.Decompiler/TypeSystem/ReflectionHelper.cs

8
ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

@ -1618,7 +1618,7 @@ namespace ICSharpCode.Decompiler.CSharp @@ -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 @@ -1644,7 +1644,7 @@ namespace ICSharpCode.Decompiler.CSharp
stackType = StackType.I8;
}
}
return compilation.FindType(stackType.ToKnownTypeCode(sign));
return compilation.FindType(stackType, sign);
}
/// <summary>
@ -3568,7 +3568,7 @@ namespace ICSharpCode.Decompiler.CSharp @@ -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 @@ -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)

2
ICSharpCode.Decompiler/IL/ILReader.cs

@ -1170,7 +1170,7 @@ namespace ICSharpCode.Decompiler.IL @@ -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);

2
ICSharpCode.Decompiler/IL/Transforms/CopyPropagation.cs

@ -148,7 +148,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms @@ -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,

4
ICSharpCode.Decompiler/IL/Transforms/ILExtraction.cs

@ -62,7 +62,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms @@ -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 @@ -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));

2
ICSharpCode.Decompiler/IL/Transforms/NamedArgumentTransform.cs

@ -87,7 +87,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms @@ -87,7 +87,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms
{
var call = (CallInstruction)arg.Parent;
Debug.Assert(context.Function == call.Ancestors.OfType<ILFunction>().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)

2
ICSharpCode.Decompiler/IL/Transforms/NullableLiftingTransform.cs

@ -630,7 +630,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms @@ -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]))
{

14
ICSharpCode.Decompiler/TypeSystem/ReflectionHelper.cs

@ -19,6 +19,7 @@ @@ -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 @@ -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()

Loading…
Cancel
Save