Browse Source

Use appropriate type for helper variables introduced for named arguments.

pull/1464/head v5.0-preview1
Daniel Grunwald 6 years ago
parent
commit
40b6f0c7bf
  1. 13
      ICSharpCode.Decompiler/IL/Instructions/ILFunction.cs
  2. 2
      ICSharpCode.Decompiler/IL/Transforms/NamedArgumentTransform.cs

13
ICSharpCode.Decompiler/IL/Instructions/ILFunction.cs

@ -229,7 +229,18 @@ namespace ICSharpCode.Decompiler.IL
public ILVariable RegisterVariable(VariableKind kind, IType type, string name = null) public ILVariable RegisterVariable(VariableKind kind, IType type, string name = null)
{ {
var variable = new ILVariable(kind, type); return RegisterVariable(kind, type, type.GetStackType(), name);
}
public ILVariable RegisterVariable(VariableKind kind, StackType stackType, string name = null)
{
var type = Method.Compilation.FindType(stackType.ToKnownTypeCode());
return RegisterVariable(kind, type, stackType, name);
}
ILVariable RegisterVariable(VariableKind kind, IType type, StackType stackType, string name = null)
{
var variable = new ILVariable(kind, type, stackType);
if (string.IsNullOrWhiteSpace(name)) { if (string.IsNullOrWhiteSpace(name)) {
name = "I_" + (helperVariableCount++); name = "I_" + (helperVariableCount++);
variable.HasGeneratedName = true; variable.HasGeneratedName = true;

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

@ -79,7 +79,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 v = context.Function.RegisterVariable(VariableKind.NamedArgument, arg.InferType(context.TypeSystem)); var v = context.Function.RegisterVariable(VariableKind.NamedArgument, arg.ResultType);
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) {
// create namedArgBlock: // create namedArgBlock:

Loading…
Cancel
Save