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
} }
else else
{ {
return compilation.FindType(stackType.ToKnownTypeCode(sign)); return compilation.FindType(stackType, sign);
} }
} }
@ -1644,7 +1644,7 @@ namespace ICSharpCode.Decompiler.CSharp
stackType = StackType.I8; stackType = StackType.I8;
} }
} }
return compilation.FindType(stackType.ToKnownTypeCode(sign)); return compilation.FindType(stackType, sign);
} }
/// <summary> /// <summary>
@ -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)) 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 else
{ {
@ -3731,7 +3731,7 @@ namespace ICSharpCode.Decompiler.CSharp
} }
else else
{ {
resultType = compilation.FindType(inst.ResultType.ToKnownTypeCode()); resultType = compilation.FindType(inst.ResultType);
} }
foreach (var section in inst.Sections) foreach (var section in inst.Sections)

2
ICSharpCode.Decompiler/IL/ILReader.cs

@ -1170,7 +1170,7 @@ namespace ICSharpCode.Decompiler.IL
ILInstruction Push(ILInstruction inst) ILInstruction Push(ILInstruction inst)
{ {
Debug.Assert(inst.ResultType != StackType.Void); 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); var v = new ILVariable(VariableKind.StackSlot, type, inst.ResultType);
v.HasGeneratedName = true; v.HasGeneratedName = true;
currentStack = currentStack.Push(v); currentStack = currentStack.Push(v);

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

@ -148,7 +148,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms
for (int j = 0; j < uninlinedArgs.Length; j++) for (int j = 0; j < uninlinedArgs.Length; j++)
{ {
var arg = copiedExpr.Children[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) { uninlinedArgs[j] = new ILVariable(VariableKind.StackSlot, type, arg.ResultType) {
Name = "C_" + arg.StartILOffset, Name = "C_" + arg.StartILOffset,
HasGeneratedName = true, HasGeneratedName = true,

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

@ -62,7 +62,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms
{ {
FlagsBeingMoved |= predecessor.Flags; FlagsBeingMoved |= predecessor.Flags;
MoveActions.Add(delegate { 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); var v = Function.RegisterVariable(VariableKind.StackSlot, type);
predecessor.ReplaceWith(new LdLoc(v)); predecessor.ReplaceWith(new LdLoc(v));
return new StLoc(v, predecessor); 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. // We've reached the target block, and extraction is possible all the way.
int insertIndex = inst.ChildIndex; int insertIndex = inst.ChildIndex;
var type = context.TypeSystem.FindType(instToExtract.ResultType.ToKnownTypeCode()); var type = context.TypeSystem.FindType(instToExtract.ResultType);
// Move instToExtract itself: // Move instToExtract itself:
var v = function.RegisterVariable(VariableKind.StackSlot, type); var v = function.RegisterVariable(VariableKind.StackSlot, type);
instToExtract.ReplaceWith(new LdLoc(v)); instToExtract.ReplaceWith(new LdLoc(v));

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

@ -87,7 +87,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms
{ {
var call = (CallInstruction)arg.Parent; var call = (CallInstruction)arg.Parent;
Debug.Assert(context.Function == call.Ancestors.OfType<ILFunction>().First()); 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); var v = context.Function.RegisterVariable(VariableKind.NamedArgument, type);
context.Step($"Introduce named argument '{v.Name}'", arg); context.Step($"Introduce named argument '{v.Name}'", arg);
if (!(call.Parent is Block namedArgBlock) || namedArgBlock.Kind != BlockKind.CallWithNamedArgs) 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
if (!MatchNullableCtor(trueInst, out var utype, out var exprToLift)) if (!MatchNullableCtor(trueInst, out var utype, out var exprToLift))
{ {
isNullCoalescingWithNonNullableFallback = true; isNullCoalescingWithNonNullableFallback = true;
utype = context.TypeSystem.FindType(trueInst.ResultType.ToKnownTypeCode()); utype = context.TypeSystem.FindType(trueInst.ResultType);
exprToLift = trueInst; exprToLift = trueInst;
if (nullableVars.Count == 1 && exprToLift.MatchLdLoc(nullableVars[0])) if (nullableVars.Count == 1 && exprToLift.MatchLdLoc(nullableVars[0]))
{ {

14
ICSharpCode.Decompiler/TypeSystem/ReflectionHelper.cs

@ -19,6 +19,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.TypeSystem.Implementation; using ICSharpCode.Decompiler.TypeSystem.Implementation;
namespace ICSharpCode.Decompiler.TypeSystem namespace ICSharpCode.Decompiler.TypeSystem
@ -66,6 +67,19 @@ namespace ICSharpCode.Decompiler.TypeSystem
{ {
return type.ToTypeReference().Resolve(new SimpleTypeResolveContext(compilation)); 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 #endregion
#region Type.ToTypeReference() #region Type.ToTypeReference()

Loading…
Cancel
Save