From b311ba5a4456ddfaadb13d78ed608a7e5e47e040 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Wed, 28 Mar 2018 03:00:32 +0200 Subject: [PATCH] Port DelegateConstruction and TransformArrayInitializers --- .../IL/Transforms/DelegateConstruction.cs | 10 +++++++--- .../Transforms/TransformArrayInitializers.cs | 18 +++++++----------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/ICSharpCode.Decompiler/IL/Transforms/DelegateConstruction.cs b/ICSharpCode.Decompiler/IL/Transforms/DelegateConstruction.cs index 3451c2ec6..3532e5bf2 100644 --- a/ICSharpCode.Decompiler/IL/Transforms/DelegateConstruction.cs +++ b/ICSharpCode.Decompiler/IL/Transforms/DelegateConstruction.cs @@ -19,6 +19,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Reflection.Metadata; using ICSharpCode.Decompiler.CSharp; using ICSharpCode.Decompiler.TypeSystem; @@ -137,13 +138,16 @@ namespace ICSharpCode.Decompiler.IL.Transforms if (!IsAnonymousMethod(decompilationContext.CurrentTypeDefinition, targetMethod)) return null; target = value.Arguments[0]; - var methodDefinition = (Mono.Cecil.MethodDefinition)context.TypeSystem.GetCecil(targetMethod); - if (methodDefinition == null) + if (targetMethod.MetadataToken.IsNil) + return null; + var metadata = context.TypeSystem.GetMetadata(); + var methodDefinition = metadata.GetMethodDefinition((MethodDefinitionHandle)targetMethod.MetadataToken); + if (!methodDefinition.HasBody()) return null; var localTypeSystem = context.TypeSystem.GetSpecializingTypeSystem(targetMethod.Substitution); var ilReader = new ILReader(localTypeSystem); ilReader.UseDebugSymbols = context.Settings.UseDebugSymbols; - var function = ilReader.ReadIL(methodDefinition.Body, context.CancellationToken); + var function = ilReader.ReadIL(context.TypeSystem.ModuleDefinition, (MethodDefinitionHandle)targetMethod.MetadataToken, context.TypeSystem.ModuleDefinition.Reader.GetMethodBody(methodDefinition.RelativeVirtualAddress), context.CancellationToken); function.DelegateType = value.Method.DeclaringType; function.CheckInvariant(ILPhase.Normal); diff --git a/ICSharpCode.Decompiler/IL/Transforms/TransformArrayInitializers.cs b/ICSharpCode.Decompiler/IL/Transforms/TransformArrayInitializers.cs index 2c2983685..2bb89905b 100644 --- a/ICSharpCode.Decompiler/IL/Transforms/TransformArrayInitializers.cs +++ b/ICSharpCode.Decompiler/IL/Transforms/TransformArrayInitializers.cs @@ -319,11 +319,11 @@ namespace ICSharpCode.Decompiler.IL.Transforms return true; } - bool MatchInitializeArrayCall(ILInstruction instruction, out IMethod method, out ILVariable array, out Mono.Cecil.FieldReference field) + bool MatchInitializeArrayCall(ILInstruction instruction, out IMethod method, out ILVariable array, out System.Reflection.Metadata.FieldDefinition field) { method = null; array = null; - field = null; + field = default; Call call = instruction as Call; if (call == null || call.Arguments.Count != 2) return false; @@ -337,22 +337,18 @@ namespace ICSharpCode.Decompiler.IL.Transforms IMember member; if (!call.Arguments[1].MatchLdMemberToken(out member)) return false; - field = context.TypeSystem.GetCecil(member) as Mono.Cecil.FieldReference; - if (field == null) + if (member.MetadataToken.IsNil) return false; + field = context.TypeSystem.GetMetadata().GetFieldDefinition((System.Reflection.Metadata.FieldDefinitionHandle)member.MetadataToken); return true; } bool ForwardScanInitializeArrayRuntimeHelper(Block body, int pos, ILVariable array, IType arrayType, int[] arrayLength, out ILInstruction[] values, out int foundPos) { - ILVariable v2; - IMethod method; - Mono.Cecil.FieldReference field; - if (MatchInitializeArrayCall(body.Instructions[pos], out method, out v2, out field) && array == v2) { - var fieldDef = field.ResolveWithinSameModule(); - if (fieldDef != null && fieldDef.InitialValue != null) { + if (MatchInitializeArrayCall(body.Instructions[pos], out var method, out var v2, out var field) && array == v2) { + if (field.HasFlag(System.Reflection.FieldAttributes.HasFieldRVA)) { var valuesList = new List(); - if (DecodeArrayInitializer(arrayType, array, fieldDef.InitialValue, arrayLength, valuesList)) { + if (DecodeArrayInitializer(arrayType, array, field.GetInitialValue(context.TypeSystem.ModuleDefinition.Reader), arrayLength, valuesList)) { values = valuesList.ToArray(); foundPos = pos; return true;