Browse Source

Fix TypeUtils for modopt types.

pull/1243/head
Daniel Grunwald 7 years ago
parent
commit
99f0841dd6
  1. 4
      ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs
  2. 9
      ICSharpCode.Decompiler/TypeSystem/TypeUtils.cs

4
ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

@ -1377,10 +1377,12 @@ namespace ICSharpCode.Decompiler.CSharp @@ -1377,10 +1377,12 @@ namespace ICSharpCode.Decompiler.CSharp
// cast to corresponding pointer type:
var pointerType = new PointerType(((ByReferenceType)inputType).ElementType);
return arg.ConvertTo(pointerType, this).WithILInstruction(inst);
} else {
} else if (arg.Type.GetStackType().IsIntegerType()) {
// ConversionKind.StopGCTracking should only be used with managed references,
// but it's possible that we're supposed to stop tracking something we just started to track.
return arg;
} else {
goto default;
}
case ConversionKind.SignExtend:
// We just need to ensure the input type before the conversion is signed.

9
ICSharpCode.Decompiler/TypeSystem/TypeUtils.cs

@ -40,6 +40,9 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -40,6 +40,9 @@ namespace ICSharpCode.Decompiler.TypeSystem
case TypeKind.Enum:
type = type.GetEnumUnderlyingType();
break;
case TypeKind.ModOpt:
case TypeKind.ModReq:
return type.SkipModifiers().GetSize();
}
var typeDef = type.GetDefinition();
@ -232,6 +235,9 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -232,6 +235,9 @@ namespace ICSharpCode.Decompiler.TypeSystem
// Type parameters are always considered StackType.O, even
// though they might be instantiated with primitive types.
return StackType.O;
case TypeKind.ModOpt:
case TypeKind.ModReq:
return type.SkipModifiers().GetStackType();
}
ITypeDefinition typeDef = type.GetEnumUnderlyingType().GetDefinition();
if (typeDef == null)
@ -269,6 +275,7 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -269,6 +275,7 @@ namespace ICSharpCode.Decompiler.TypeSystem
/// </summary>
public static IType GetEnumUnderlyingType(this IType type)
{
type = type.SkipModifiers();
return (type.Kind == TypeKind.Enum) ? type.GetDefinition().EnumUnderlyingType : type;
}
@ -284,6 +291,7 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -284,6 +291,7 @@ namespace ICSharpCode.Decompiler.TypeSystem
/// </remarks>
public static Sign GetSign(this IType type)
{
type = type.SkipModifiers();
if (type.Kind == TypeKind.Pointer)
return Sign.Unsigned;
var typeDef = type.GetEnumUnderlyingType().GetDefinition();
@ -353,6 +361,7 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -353,6 +361,7 @@ namespace ICSharpCode.Decompiler.TypeSystem
/// </summary>
public static PrimitiveType ToPrimitiveType(this IType type)
{
type = type.SkipModifiers();
if (type.Kind == TypeKind.Unknown) return PrimitiveType.Unknown;
var def = type.GetEnumUnderlyingType().GetDefinition();
return def != null ? def.KnownTypeCode.ToPrimitiveType() : PrimitiveType.None;

Loading…
Cancel
Save