From d0f32b93c1281e111235d6f0162077f63956b57b Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Thu, 24 Oct 2019 11:31:25 +0200 Subject: [PATCH] Make sure mappingInfo is not null when passed to typedefs, methoddefs, properties and events. --- .../CSharp/RequiredNamespaceCollector.cs | 32 ++++++++----------- ILSpy/LoadedAssembly.cs | 3 +- 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/ICSharpCode.Decompiler/CSharp/RequiredNamespaceCollector.cs b/ICSharpCode.Decompiler/CSharp/RequiredNamespaceCollector.cs index 8c23d752a..8e7922292 100644 --- a/ICSharpCode.Decompiler/CSharp/RequiredNamespaceCollector.cs +++ b/ICSharpCode.Decompiler/CSharp/RequiredNamespaceCollector.cs @@ -55,10 +55,10 @@ namespace ICSharpCode.Decompiler.CSharp { if (entity == null || entity.MetadataToken.IsNil) return; + if (mappingInfo == null) + mappingInfo = CSharpDecompiler.GetCodeMappingInfo(entity.ParentModule.PEFile, entity.MetadataToken); switch (entity) { case ITypeDefinition td: - if (mappingInfo == null) - mappingInfo = CSharpDecompiler.GetCodeMappingInfo(entity.ParentModule.PEFile, entity.MetadataToken); namespaces.Add(td.Namespace); HandleAttributes(td.GetAttributes()); HandleTypeParameters(td.TypeParameters); @@ -100,23 +100,19 @@ namespace ICSharpCode.Decompiler.CSharp CollectNamespacesForTypeReference(param.Type); } HandleTypeParameters(method.TypeParameters); - if (!method.MetadataToken.IsNil) { - if (mappingInfo == null) - mappingInfo = CSharpDecompiler.GetCodeMappingInfo(entity.ParentModule.PEFile, entity.MetadataToken); - var reader = module.PEFile.Reader; - var parts = mappingInfo.GetMethodParts((MethodDefinitionHandle)method.MetadataToken).ToList(); - foreach (var part in parts) { - HandleOverrides(part.GetMethodImplementations(module.metadata), module); - var methodDef = module.metadata.GetMethodDefinition(part); - if (method.HasBody) { - MethodBodyBlock body; - try { - body = reader.GetMethodBody(methodDef.RelativeVirtualAddress); - } catch (BadImageFormatException) { - continue; - } - CollectNamespacesFromMethodBody(body, module); + var reader = module.PEFile.Reader; + var parts = mappingInfo.GetMethodParts((MethodDefinitionHandle)method.MetadataToken).ToList(); + foreach (var part in parts) { + HandleOverrides(part.GetMethodImplementations(module.metadata), module); + var methodDef = module.metadata.GetMethodDefinition(part); + if (method.HasBody) { + MethodBodyBlock body; + try { + body = reader.GetMethodBody(methodDef.RelativeVirtualAddress); + } catch (BadImageFormatException) { + continue; } + CollectNamespacesFromMethodBody(body, module); } } break; diff --git a/ILSpy/LoadedAssembly.cs b/ILSpy/LoadedAssembly.cs index ee01784c2..78b3e1854 100644 --- a/ILSpy/LoadedAssembly.cs +++ b/ILSpy/LoadedAssembly.cs @@ -156,7 +156,8 @@ namespace ICSharpCode.ILSpy // runs on background thread if (state is Stream stream) { // Read the module from a precrafted stream - module = new PEFile(fileName, stream, stream is MemoryStream ? PEStreamOptions.PrefetchEntireImage : PEStreamOptions.Default, metadataOptions: options); + var streamOptions = stream is MemoryStream ? PEStreamOptions.PrefetchEntireImage : PEStreamOptions.Default; + module = new PEFile(fileName, stream, streamOptions, metadataOptions: options); } else { // Read the module from disk (by default) stream = new FileStream(fileName, FileMode.Open, FileAccess.Read);