Browse Source

Fix #2266: Failed to decompile complex expression tree.

pull/2276/head
Siegfried Pammer 5 years ago
parent
commit
3676107379
  1. 24
      ICSharpCode.Decompiler/IL/Transforms/TransformExpressionTrees.cs

24
ICSharpCode.Decompiler/IL/Transforms/TransformExpressionTrees.cs

@ -249,15 +249,15 @@ namespace ICSharpCode.Decompiler.IL.Transforms
return false; return false;
if (!this.parameters.TryGetValue(v, out var value)) if (!this.parameters.TryGetValue(v, out var value))
return false; return false;
// Parameter variable cannot be used in two different compiler-generated expression trees, // Add parameter variable only once to mapping.
// therefore we have to abort if the parameter is already mapped to a variable. if (!this.parameterMapping.ContainsKey(v))
if (this.parameterMapping.ContainsKey(v)) {
return false; var param = new ILVariable(VariableKind.Parameter, value.Item1, i) { Name = value.Item2 };
var param = new ILVariable(VariableKind.Parameter, value.Item1, i) { Name = value.Item2 }; parameterMapping.Add(v, param);
parameterMapping.Add(v, param); parameterVariables.Add(param);
parameterVariables.Add(param); parameters.Add(new DefaultParameter(value.Item1, value.Item2));
parameters.Add(new DefaultParameter(value.Item1, value.Item2)); instructionsToRemove.Add((ILInstruction)v.StoreInstructions[0]);
instructionsToRemove.Add((ILInstruction)v.StoreInstructions[0]); }
i++; i++;
} }
return true; return true;
@ -1290,7 +1290,8 @@ namespace ICSharpCode.Decompiler.IL.Transforms
{ {
case 1: case 1:
ILInstruction left; ILInstruction left;
switch (argumentType.GetStackType()) var underlyingType = NullableType.GetUnderlyingType(argumentType);
switch (underlyingType.GetStackType())
{ {
case StackType.I4: case StackType.I4:
left = new LdcI4(0); left = new LdcI4(0);
@ -1307,6 +1308,9 @@ namespace ICSharpCode.Decompiler.IL.Transforms
case StackType.F8: case StackType.F8:
left = new LdcF8(0); left = new LdcF8(0);
break; break;
case StackType.O when underlyingType.IsKnownType(KnownTypeCode.Decimal):
left = new LdcDecimal(0);
break;
default: default:
return (null, SpecialType.UnknownType); return (null, SpecialType.UnknownType);
} }

Loading…
Cancel
Save