Browse Source

Fix #2764: Move constant field initializers regardless of whether the other field initializers can be moved.

pull/2804/head
Siegfried Pammer 3 years ago
parent
commit
9017592d1d
  1. 8
      ICSharpCode.Decompiler/CSharp/Transforms/TransformFieldAndConstructorInitializers.cs

8
ICSharpCode.Decompiler/CSharp/Transforms/TransformFieldAndConstructorInitializers.cs

@ -315,9 +315,10 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
SRM.MethodDefinition ctorMethodDef = metadata.GetMethodDefinition((SRM.MethodDefinitionHandle)ctorMethod.MetadataToken); SRM.MethodDefinition ctorMethodDef = metadata.GetMethodDefinition((SRM.MethodDefinitionHandle)ctorMethod.MetadataToken);
SRM.TypeDefinition declaringType = metadata.GetTypeDefinition(ctorMethodDef.GetDeclaringType()); SRM.TypeDefinition declaringType = metadata.GetTypeDefinition(ctorMethodDef.GetDeclaringType());
bool declaringTypeIsBeforeFieldInit = declaringType.HasFlag(TypeAttributes.BeforeFieldInit); bool declaringTypeIsBeforeFieldInit = declaringType.HasFlag(TypeAttributes.BeforeFieldInit);
while (true) int pos = 0;
while (pos < staticCtor.Body.Statements.Count)
{ {
ExpressionStatement es = staticCtor.Body.Statements.FirstOrDefault() as ExpressionStatement; ExpressionStatement es = staticCtor.Body.Statements.ElementAtOrDefault(pos) as ExpressionStatement;
if (es == null) if (es == null)
break; break;
AssignmentExpression assignment = es.Expression as AssignmentExpression; AssignmentExpression assignment = es.Expression as AssignmentExpression;
@ -329,7 +330,8 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
// Only move fields that are constants, if the declaring type is not marked beforefieldinit. // Only move fields that are constants, if the declaring type is not marked beforefieldinit.
if (!declaringTypeIsBeforeFieldInit && fieldOrProperty is not IField { IsConst: true }) if (!declaringTypeIsBeforeFieldInit && fieldOrProperty is not IField { IsConst: true })
{ {
break; pos++;
continue;
} }
var fieldOrPropertyDecl = members.FirstOrDefault(f => f.GetSymbol() == fieldOrProperty) as EntityDeclaration; var fieldOrPropertyDecl = members.FirstOrDefault(f => f.GetSymbol() == fieldOrProperty) as EntityDeclaration;
if (fieldOrPropertyDecl == null) if (fieldOrPropertyDecl == null)

Loading…
Cancel
Save