diff --git a/ICSharpCode.Decompiler/ILAst/ILAstOptimizer.cs b/ICSharpCode.Decompiler/ILAst/ILAstOptimizer.cs index 4391ec365..42c2893e5 100644 --- a/ICSharpCode.Decompiler/ILAst/ILAstOptimizer.cs +++ b/ICSharpCode.Decompiler/ILAst/ILAstOptimizer.cs @@ -742,9 +742,24 @@ namespace ICSharpCode.Decompiler.ILAst // property getters can't be expression statements, but all other method calls can be MethodReference mr = (MethodReference)expr.Operand; return !mr.Name.StartsWith("get_", StringComparison.Ordinal); + case ILCode.CallSetter: + case ILCode.CallvirtSetter: case ILCode.Newobj: case ILCode.Newarr: case ILCode.Stloc: + case ILCode.Stobj: + case ILCode.Stsfld: + case ILCode.Stfld: + case ILCode.Stind_Ref: + case ILCode.Stelem_Any: + case ILCode.Stelem_I: + case ILCode.Stelem_I1: + case ILCode.Stelem_I2: + case ILCode.Stelem_I4: + case ILCode.Stelem_I8: + case ILCode.Stelem_R4: + case ILCode.Stelem_R8: + case ILCode.Stelem_Ref: return true; default: return false; diff --git a/ICSharpCode.Decompiler/ILAst/InitializerPeepholeTransforms.cs b/ICSharpCode.Decompiler/ILAst/InitializerPeepholeTransforms.cs index 9a33ae37e..1a9ad78cf 100644 --- a/ICSharpCode.Decompiler/ILAst/InitializerPeepholeTransforms.cs +++ b/ICSharpCode.Decompiler/ILAst/InitializerPeepholeTransforms.cs @@ -32,7 +32,7 @@ namespace ICSharpCode.Decompiler.ILAst #region Array Initializers bool TransformArrayInitializers(List body, ILExpression expr, int pos) { - ILVariable v, v2, v3; + ILVariable v, v3; ILExpression newarrExpr; TypeReference elementType; ILExpression lengthExpr; @@ -87,7 +87,7 @@ namespace ICSharpCode.Decompiler.ILAst bool TransformMultidimensionalArrayInitializers(List body, ILExpression expr, int pos) { - ILVariable v, v2, v3; + ILVariable v; ILExpression newarrExpr; MethodReference ctor; List ctorArgs; diff --git a/ICSharpCode.Decompiler/ILAst/TypeAnalysis.cs b/ICSharpCode.Decompiler/ILAst/TypeAnalysis.cs index f1e9273ab..4755ea4c7 100644 --- a/ICSharpCode.Decompiler/ILAst/TypeAnalysis.cs +++ b/ICSharpCode.Decompiler/ILAst/TypeAnalysis.cs @@ -957,7 +957,7 @@ namespace ICSharpCode.Decompiler.ILAst { if (type == null) return 0; - if (type.IsValueType) { + if (type.IsValueType && !IsArrayPointerOrReference(type)) { // value type might be an enum TypeDefinition typeDef = type.Resolve() as TypeDefinition; if (typeDef != null && typeDef.IsEnum) { @@ -1005,7 +1005,9 @@ namespace ICSharpCode.Decompiler.ILAst public static bool IsEnum(TypeReference type) { - if (type == null) + // Arrays/Pointers/ByReference resolve to their element type, but we don't want to consider those to be enums + // However, GenericInstanceTypes, ModOpts etc. should be considered enums. + if (type == null || IsArrayPointerOrReference(type)) return false; // unfortunately we cannot rely on type.IsValueType here - it's not set when the instruction operand is a typeref (as opposed to a typespec) TypeDefinition typeDef = type.Resolve() as TypeDefinition; @@ -1014,7 +1016,7 @@ namespace ICSharpCode.Decompiler.ILAst static bool? IsSigned(TypeReference type) { - if (type == null) + if (type == null || IsArrayPointerOrReference(type)) return null; // unfortunately we cannot rely on type.IsValueType here - it's not set when the instruction operand is a typeref (as opposed to a typespec) TypeDefinition typeDef = type.Resolve() as TypeDefinition; @@ -1041,6 +1043,17 @@ namespace ICSharpCode.Decompiler.ILAst } } + static bool IsArrayPointerOrReference(TypeReference type) + { + TypeSpecification typeSpec = type as TypeSpecification; + while (typeSpec != null) { + if (typeSpec is ArrayType || typeSpec is PointerType || typeSpec is ByReferenceType) + return true; + typeSpec = typeSpec.ElementType as TypeSpecification; + } + return false; + } + public static TypeCode GetTypeCode(TypeReference type) { if (type == null)