From 7e8853d2c115c3f56bfd9d694eeeab0e57d2f495 Mon Sep 17 00:00:00 2001 From: Sven Boemer Date: Tue, 4 Jun 2024 00:29:54 +0000 Subject: [PATCH 1/7] Preserve custom debug info on types --- Mono.Cecil.Cil/PortablePdb.cs | 20 ++++++++++ Mono.Cecil.Cil/Symbols.cs | 2 + Mono.Cecil/AssemblyReader.cs | 12 ++++++ Mono.Cecil/AssemblyWriter.cs | 3 ++ Mono.Cecil/TypeDefinition.cs | 38 ++++++++++++++++++- Test/Mono.Cecil.Tests/PortablePdbTests.cs | 25 ++++++++++++ symbols/mdb/Mono.Cecil.Mdb/MdbReader.cs | 4 ++ symbols/mdb/Mono.Cecil.Mdb/MdbWriter.cs | 4 ++ symbols/pdb/Mono.Cecil.Pdb/NativePdbReader.cs | 4 ++ symbols/pdb/Mono.Cecil.Pdb/NativePdbWriter.cs | 4 ++ 10 files changed, 115 insertions(+), 1 deletion(-) diff --git a/Mono.Cecil.Cil/PortablePdb.cs b/Mono.Cecil.Cil/PortablePdb.cs index 6664bee32..be74f8657 100644 --- a/Mono.Cecil.Cil/PortablePdb.cs +++ b/Mono.Cecil.Cil/PortablePdb.cs @@ -145,6 +145,11 @@ void ReadStateMachineKickOffMethod (MethodDebugInformation method_info) method_info.kickoff_method = debug_reader.ReadStateMachineKickoffMethod (method_info.method); } + public void Read (TypeDefinition type) + { + type.custom_infos = debug_reader.GetCustomDebugInformation (type); + } + void ReadCustomDebugInformations (MethodDebugInformation info) { info.method.custom_infos = debug_reader.GetCustomDebugInformation (info.method); @@ -221,6 +226,11 @@ public MethodDebugInformation Read (MethodDefinition method) return reader.Read (method); } + public void Read (TypeDefinition type) + { + reader.Read (type); + } + public void Dispose () { reader.Dispose (); @@ -319,6 +329,11 @@ public void Write () } } + public void Write (TypeDefinition type) + { + pdb_metadata.AddCustomDebugInformations (type); + } + public ImageDebugHeader GetDebugHeader () { if (IsEmbedded) @@ -519,6 +534,11 @@ public void Write (MethodDebugInformation info) writer.Write (info); } + public void Write (TypeDefinition type) + { + writer.Write (type); + } + public ImageDebugHeader GetDebugHeader () { ImageDebugHeader pdbDebugHeader = writer.GetDebugHeader (); diff --git a/Mono.Cecil.Cil/Symbols.cs b/Mono.Cecil.Cil/Symbols.cs index 744e7a82b..09714eaca 100644 --- a/Mono.Cecil.Cil/Symbols.cs +++ b/Mono.Cecil.Cil/Symbols.cs @@ -854,6 +854,7 @@ public interface ISymbolReader : IDisposable { ISymbolWriterProvider GetWriterProvider (); bool ProcessDebugHeader (ImageDebugHeader header); MethodDebugInformation Read (MethodDefinition method); + void Read (TypeDefinition type); } public interface ISymbolReaderProvider { @@ -1116,6 +1117,7 @@ public interface ISymbolWriter : IDisposable { ImageDebugHeader GetDebugHeader (); void Write (MethodDebugInformation info); void Write (); + void Write (TypeDefinition type); } public interface ISymbolWriterProvider { diff --git a/Mono.Cecil/AssemblyReader.cs b/Mono.Cecil/AssemblyReader.cs index 4564071e8..ff084d966 100644 --- a/Mono.Cecil/AssemblyReader.cs +++ b/Mono.Cecil/AssemblyReader.cs @@ -404,6 +404,7 @@ void ReadTypesSymbols (Collection types, ISymbolReader symbol_re { for (int i = 0; i < types.Count; i++) { var type = types [i]; + symbol_reader.Read (type); if (type.HasNestedTypes) ReadTypesSymbols (type.NestedTypes, symbol_reader); @@ -3160,6 +3161,17 @@ void InitializeCustomDebugInformations () } } + public bool HasCustomDebugInformation (ICustomDebugInformationProvider provider) + { + InitializeCustomDebugInformations (); + + Row [] rows; + if (!metadata.CustomDebugInformations.TryGetValue (provider.MetadataToken, out rows)) + return false; + + return rows.Length > 0; + } + public Collection GetCustomDebugInformation (ICustomDebugInformationProvider provider) { InitializeCustomDebugInformations (); diff --git a/Mono.Cecil/AssemblyWriter.cs b/Mono.Cecil/AssemblyWriter.cs index 836aa2172..3cc0569e1 100644 --- a/Mono.Cecil/AssemblyWriter.cs +++ b/Mono.Cecil/AssemblyWriter.cs @@ -1487,6 +1487,9 @@ void AddType (TypeDefinition type) if (type.HasNestedTypes) AddNestedTypes (type); + if (symbol_writer != null && type.custom_infos != null) + symbol_writer.Write (type); + WindowsRuntimeProjections.ApplyProjection (type, treatment); } diff --git a/Mono.Cecil/TypeDefinition.cs b/Mono.Cecil/TypeDefinition.cs index 872e4c253..074c07796 100644 --- a/Mono.Cecil/TypeDefinition.cs +++ b/Mono.Cecil/TypeDefinition.cs @@ -10,12 +10,13 @@ using System; using System.Threading; +using Mono.Cecil.Cil; using Mono.Cecil.Metadata; using Mono.Collections.Generic; namespace Mono.Cecil { - public sealed class TypeDefinition : TypeReference, IMemberDefinition, ISecurityDeclarationProvider { + public sealed class TypeDefinition : TypeReference, IMemberDefinition, ISecurityDeclarationProvider, ICustomDebugInformationProvider { uint attributes; TypeReference base_type; @@ -34,6 +35,8 @@ public sealed class TypeDefinition : TypeReference, IMemberDefinition, ISecurity Collection custom_attributes; Collection security_declarations; + internal Collection custom_infos; + public TypeAttributes Attributes { get { return (TypeAttributes) attributes; } set { @@ -284,6 +287,39 @@ public override Collection GenericParameters { get { return generic_parameters ?? (this.GetGenericParameters (ref generic_parameters, Module)); } } + public bool HasCustomDebugInformations { + get { + if (custom_infos != null) + return custom_infos.Count > 0; + + if (module.HasImage ()) + module.Read (this, (provider, reader) => { + var symbol_reader = reader.module.symbol_reader; + if (symbol_reader != null) + symbol_reader.Read (provider); + }); + + return !custom_infos.IsNullOrEmpty (); + } + } + + public Collection CustomDebugInformations { + get { + if (custom_infos != null) + return custom_infos; + + if (module.HasImage ()) + module.Read (this, (provider, reader) => { + var symbol_reader = reader.module.symbol_reader; + if (symbol_reader != null) + symbol_reader.Read (provider); + }); + + Interlocked.CompareExchange (ref custom_infos, new Collection (), null); + return custom_infos; + } + } + #region TypeAttributes public bool IsNotPublic { diff --git a/Test/Mono.Cecil.Tests/PortablePdbTests.cs b/Test/Mono.Cecil.Tests/PortablePdbTests.cs index a89f79d83..153dab745 100644 --- a/Test/Mono.Cecil.Tests/PortablePdbTests.cs +++ b/Test/Mono.Cecil.Tests/PortablePdbTests.cs @@ -646,6 +646,26 @@ public void PortablePdbLineInfo() }, symbolReaderProvider: typeof (PortablePdbReaderProvider), symbolWriterProvider: typeof (PortablePdbWriterProvider)); } + [Test] + public void TypeDefinitionDebugInformation () + { + TestModule ("TypeDefinitionDebugInformation.dll", module => { + var enum_type = module.GetType ("TypeDefinitionDebugInformation.Enum"); + Assert.IsTrue (enum_type.HasCustomDebugInformations); + var binary_custom_debug_info = enum_type.CustomDebugInformations.OfType ().FirstOrDefault (); + Assert.IsNotNull (binary_custom_debug_info); + Assert.AreEqual (new Guid ("932E74BC-DBA9-4478-8D46-0F32A7BAB3D3"), binary_custom_debug_info.Identifier); + Assert.AreEqual (new byte [] { 0x1 }, binary_custom_debug_info.Data); + + var interface_type = module.GetType ("TypeDefinitionDebugInformation.Interface"); + Assert.IsTrue (interface_type.HasCustomDebugInformations); + binary_custom_debug_info = interface_type.CustomDebugInformations.OfType ().FirstOrDefault (); + Assert.IsNotNull (binary_custom_debug_info); + Assert.AreEqual (new Guid ("932E74BC-DBA9-4478-8D46-0F32A7BAB3D3"), binary_custom_debug_info.Identifier); + Assert.AreEqual (new byte [] { 0x1 }, binary_custom_debug_info.Data); + }, symbolReaderProvider: typeof (PortablePdbReaderProvider), symbolWriterProvider: typeof (PortablePdbWriterProvider)); + } + public sealed class SymbolWriterProvider : ISymbolWriterProvider { readonly DefaultSymbolWriterProvider writer_provider = new DefaultSymbolWriterProvider (); @@ -730,6 +750,11 @@ public void Write () symbol_writer.Write (); } + public void Write (TypeDefinition type) + { + symbol_writer.Write (type); + } + public void Dispose () { symbol_writer.Dispose (); diff --git a/symbols/mdb/Mono.Cecil.Mdb/MdbReader.cs b/symbols/mdb/Mono.Cecil.Mdb/MdbReader.cs index 3e2dd18e4..b433deccc 100644 --- a/symbols/mdb/Mono.Cecil.Mdb/MdbReader.cs +++ b/symbols/mdb/Mono.Cecil.Mdb/MdbReader.cs @@ -186,6 +186,10 @@ SequencePoint LineToSequencePoint (LineNumberEntry line) }; } + public void Read (TypeDefinition type) + { + } + public void Dispose () { symbol_file.Dispose (); diff --git a/symbols/mdb/Mono.Cecil.Mdb/MdbWriter.cs b/symbols/mdb/Mono.Cecil.Mdb/MdbWriter.cs index 4d4ce933b..794408e92 100644 --- a/symbols/mdb/Mono.Cecil.Mdb/MdbWriter.cs +++ b/symbols/mdb/Mono.Cecil.Mdb/MdbWriter.cs @@ -173,6 +173,10 @@ public void Write () // after the entire image of the assembly is written (since it's computed from the hash of that) } + public void Write (TypeDefinition type) + { + } + public void Dispose () { writer.WriteSymbolFile (module.Mvid); diff --git a/symbols/pdb/Mono.Cecil.Pdb/NativePdbReader.cs b/symbols/pdb/Mono.Cecil.Pdb/NativePdbReader.cs index 484704447..e9f92730e 100644 --- a/symbols/pdb/Mono.Cecil.Pdb/NativePdbReader.cs +++ b/symbols/pdb/Mono.Cecil.Pdb/NativePdbReader.cs @@ -355,6 +355,10 @@ Document GetDocument (PdbSource source) return document; } + public void Read (TypeDefinition type) + { + } + public void Dispose () { pdb_file.Dispose (); diff --git a/symbols/pdb/Mono.Cecil.Pdb/NativePdbWriter.cs b/symbols/pdb/Mono.Cecil.Pdb/NativePdbWriter.cs index 7bb9c6f15..7452b74fa 100644 --- a/symbols/pdb/Mono.Cecil.Pdb/NativePdbWriter.cs +++ b/symbols/pdb/Mono.Cecil.Pdb/NativePdbWriter.cs @@ -265,6 +265,10 @@ public void Write () writer.Close (); } + public void Write (TypeDefinition type) + { + } + public void Dispose () { } From c9a02db6a15e89959249007217ab9e426869634d Mon Sep 17 00:00:00 2001 From: Sven Boemer Date: Tue, 4 Jun 2024 17:22:56 +0000 Subject: [PATCH 2/7] Use ICustomDebugInformationProvider in ISymbolReader/ISymbolWriter --- Mono.Cecil.Cil/PortablePdb.cs | 16 ++++++++-------- Mono.Cecil.Cil/Symbols.cs | 4 ++-- Mono.Cecil/AssemblyReader.cs | 2 +- Mono.Cecil/TypeDefinition.cs | 4 ++-- Test/Mono.Cecil.Tests/PortablePdbTests.cs | 4 ++-- symbols/mdb/Mono.Cecil.Mdb/MdbReader.cs | 3 ++- symbols/mdb/Mono.Cecil.Mdb/MdbWriter.cs | 2 +- symbols/pdb/Mono.Cecil.Pdb/NativePdbReader.cs | 3 ++- symbols/pdb/Mono.Cecil.Pdb/NativePdbWriter.cs | 2 +- 9 files changed, 21 insertions(+), 19 deletions(-) diff --git a/Mono.Cecil.Cil/PortablePdb.cs b/Mono.Cecil.Cil/PortablePdb.cs index be74f8657..480addbd6 100644 --- a/Mono.Cecil.Cil/PortablePdb.cs +++ b/Mono.Cecil.Cil/PortablePdb.cs @@ -145,9 +145,9 @@ void ReadStateMachineKickOffMethod (MethodDebugInformation method_info) method_info.kickoff_method = debug_reader.ReadStateMachineKickoffMethod (method_info.method); } - public void Read (TypeDefinition type) + public Collections.Generic.Collection Read (ICustomDebugInformationProvider provider) { - type.custom_infos = debug_reader.GetCustomDebugInformation (type); + return debug_reader.GetCustomDebugInformation (provider); } void ReadCustomDebugInformations (MethodDebugInformation info) @@ -226,9 +226,9 @@ public MethodDebugInformation Read (MethodDefinition method) return reader.Read (method); } - public void Read (TypeDefinition type) + public Collections.Generic.Collection Read (ICustomDebugInformationProvider provider) { - reader.Read (type); + return reader.Read (provider); } public void Dispose () @@ -329,9 +329,9 @@ public void Write () } } - public void Write (TypeDefinition type) + public void Write (ICustomDebugInformationProvider provider) { - pdb_metadata.AddCustomDebugInformations (type); + pdb_metadata.AddCustomDebugInformations (provider); } public ImageDebugHeader GetDebugHeader () @@ -534,9 +534,9 @@ public void Write (MethodDebugInformation info) writer.Write (info); } - public void Write (TypeDefinition type) + public void Write (ICustomDebugInformationProvider provider) { - writer.Write (type); + writer.Write (provider); } public ImageDebugHeader GetDebugHeader () diff --git a/Mono.Cecil.Cil/Symbols.cs b/Mono.Cecil.Cil/Symbols.cs index 09714eaca..6d909060d 100644 --- a/Mono.Cecil.Cil/Symbols.cs +++ b/Mono.Cecil.Cil/Symbols.cs @@ -854,7 +854,7 @@ public interface ISymbolReader : IDisposable { ISymbolWriterProvider GetWriterProvider (); bool ProcessDebugHeader (ImageDebugHeader header); MethodDebugInformation Read (MethodDefinition method); - void Read (TypeDefinition type); + Collection Read (ICustomDebugInformationProvider provider); } public interface ISymbolReaderProvider { @@ -1117,7 +1117,7 @@ public interface ISymbolWriter : IDisposable { ImageDebugHeader GetDebugHeader (); void Write (MethodDebugInformation info); void Write (); - void Write (TypeDefinition type); + void Write (ICustomDebugInformationProvider provider); } public interface ISymbolWriterProvider { diff --git a/Mono.Cecil/AssemblyReader.cs b/Mono.Cecil/AssemblyReader.cs index ff084d966..a21d0a966 100644 --- a/Mono.Cecil/AssemblyReader.cs +++ b/Mono.Cecil/AssemblyReader.cs @@ -404,7 +404,7 @@ void ReadTypesSymbols (Collection types, ISymbolReader symbol_re { for (int i = 0; i < types.Count; i++) { var type = types [i]; - symbol_reader.Read (type); + type.custom_infos = symbol_reader.Read (type); if (type.HasNestedTypes) ReadTypesSymbols (type.NestedTypes, symbol_reader); diff --git a/Mono.Cecil/TypeDefinition.cs b/Mono.Cecil/TypeDefinition.cs index 074c07796..127cb0ff3 100644 --- a/Mono.Cecil/TypeDefinition.cs +++ b/Mono.Cecil/TypeDefinition.cs @@ -296,7 +296,7 @@ public bool HasCustomDebugInformations { module.Read (this, (provider, reader) => { var symbol_reader = reader.module.symbol_reader; if (symbol_reader != null) - symbol_reader.Read (provider); + custom_infos = symbol_reader.Read (provider); }); return !custom_infos.IsNullOrEmpty (); @@ -312,7 +312,7 @@ public Collection CustomDebugInformations { module.Read (this, (provider, reader) => { var symbol_reader = reader.module.symbol_reader; if (symbol_reader != null) - symbol_reader.Read (provider); + custom_infos = symbol_reader.Read (provider); }); Interlocked.CompareExchange (ref custom_infos, new Collection (), null); diff --git a/Test/Mono.Cecil.Tests/PortablePdbTests.cs b/Test/Mono.Cecil.Tests/PortablePdbTests.cs index 153dab745..bae1436bc 100644 --- a/Test/Mono.Cecil.Tests/PortablePdbTests.cs +++ b/Test/Mono.Cecil.Tests/PortablePdbTests.cs @@ -750,9 +750,9 @@ public void Write () symbol_writer.Write (); } - public void Write (TypeDefinition type) + public void Write (ICustomDebugInformationProvider provider) { - symbol_writer.Write (type); + symbol_writer.Write (provider); } public void Dispose () diff --git a/symbols/mdb/Mono.Cecil.Mdb/MdbReader.cs b/symbols/mdb/Mono.Cecil.Mdb/MdbReader.cs index b433deccc..f19212f60 100644 --- a/symbols/mdb/Mono.Cecil.Mdb/MdbReader.cs +++ b/symbols/mdb/Mono.Cecil.Mdb/MdbReader.cs @@ -186,8 +186,9 @@ SequencePoint LineToSequencePoint (LineNumberEntry line) }; } - public void Read (TypeDefinition type) + public Collection Read (ICustomDebugInformationProvider provider) { + return new Collection (); } public void Dispose () diff --git a/symbols/mdb/Mono.Cecil.Mdb/MdbWriter.cs b/symbols/mdb/Mono.Cecil.Mdb/MdbWriter.cs index 794408e92..81a0d539d 100644 --- a/symbols/mdb/Mono.Cecil.Mdb/MdbWriter.cs +++ b/symbols/mdb/Mono.Cecil.Mdb/MdbWriter.cs @@ -173,7 +173,7 @@ public void Write () // after the entire image of the assembly is written (since it's computed from the hash of that) } - public void Write (TypeDefinition type) + public void Write (ICustomDebugInformationProvider provider) { } diff --git a/symbols/pdb/Mono.Cecil.Pdb/NativePdbReader.cs b/symbols/pdb/Mono.Cecil.Pdb/NativePdbReader.cs index e9f92730e..400fb0b48 100644 --- a/symbols/pdb/Mono.Cecil.Pdb/NativePdbReader.cs +++ b/symbols/pdb/Mono.Cecil.Pdb/NativePdbReader.cs @@ -355,8 +355,9 @@ Document GetDocument (PdbSource source) return document; } - public void Read (TypeDefinition type) + public Collection Read (ICustomDebugInformationProvider provider) { + return new Collection (); } public void Dispose () diff --git a/symbols/pdb/Mono.Cecil.Pdb/NativePdbWriter.cs b/symbols/pdb/Mono.Cecil.Pdb/NativePdbWriter.cs index 7452b74fa..2e51c70a1 100644 --- a/symbols/pdb/Mono.Cecil.Pdb/NativePdbWriter.cs +++ b/symbols/pdb/Mono.Cecil.Pdb/NativePdbWriter.cs @@ -265,7 +265,7 @@ public void Write () writer.Close (); } - public void Write (TypeDefinition type) + public void Write (ICustomDebugInformationProvider provider) { } From e533f35b3ade6870d97419cd5f33c07127bb8ccb Mon Sep 17 00:00:00 2001 From: Sven Boemer Date: Tue, 4 Jun 2024 17:32:03 +0000 Subject: [PATCH 3/7] Move get logic to Mixin helpers --- Mono.Cecil.Cil/PortablePdb.cs | 5 +++-- Mono.Cecil.Cil/Symbols.cs | 33 +++++++++++++++++++++++++++++++++ Mono.Cecil/TypeDefinition.cs | 24 ++---------------------- 3 files changed, 38 insertions(+), 24 deletions(-) diff --git a/Mono.Cecil.Cil/PortablePdb.cs b/Mono.Cecil.Cil/PortablePdb.cs index 480addbd6..4f58ebf52 100644 --- a/Mono.Cecil.Cil/PortablePdb.cs +++ b/Mono.Cecil.Cil/PortablePdb.cs @@ -13,6 +13,7 @@ using System.IO; using System.IO.Compression; using System.Security.Cryptography; +using Mono.Collections.Generic; using Mono.Cecil.Metadata; using Mono.Cecil.PE; @@ -145,7 +146,7 @@ void ReadStateMachineKickOffMethod (MethodDebugInformation method_info) method_info.kickoff_method = debug_reader.ReadStateMachineKickoffMethod (method_info.method); } - public Collections.Generic.Collection Read (ICustomDebugInformationProvider provider) + public Collection Read (ICustomDebugInformationProvider provider) { return debug_reader.GetCustomDebugInformation (provider); } @@ -226,7 +227,7 @@ public MethodDebugInformation Read (MethodDefinition method) return reader.Read (method); } - public Collections.Generic.Collection Read (ICustomDebugInformationProvider provider) + public Collection Read (ICustomDebugInformationProvider provider) { return reader.Read (provider); } diff --git a/Mono.Cecil.Cil/Symbols.cs b/Mono.Cecil.Cil/Symbols.cs index 6d909060d..c6b7d4332 100644 --- a/Mono.Cecil.Cil/Symbols.cs +++ b/Mono.Cecil.Cil/Symbols.cs @@ -1226,5 +1226,38 @@ public static bool IsPortablePdb (Stream stream) stream.Position = position; } } + + public static bool GetHasCustomDebugInformations ( + this ICustomDebugInformationProvider self, + ref Collection collection, + ModuleDefinition module) + { + if (module.HasImage ()) + module.Read (ref collection, self, (provider, reader) => { + var symbol_reader = reader.module.symbol_reader; + if (symbol_reader != null) + return symbol_reader.Read (provider); + return null; + }); + + return !collection.IsNullOrEmpty (); + } + + public static Collection GetCustomDebugInformations ( + this ICustomDebugInformationProvider self, + ref Collection collection, + ModuleDefinition module) + { + if (module.HasImage ()) + module.Read (ref collection, self, (provider, reader) => { + var symbol_reader = reader.module.symbol_reader; + if (symbol_reader != null) + return symbol_reader.Read (self); + return null; + }); + + Interlocked.CompareExchange (ref collection, new Collection (), null); + return collection; + } } } diff --git a/Mono.Cecil/TypeDefinition.cs b/Mono.Cecil/TypeDefinition.cs index 127cb0ff3..92d6ab299 100644 --- a/Mono.Cecil/TypeDefinition.cs +++ b/Mono.Cecil/TypeDefinition.cs @@ -292,32 +292,12 @@ public bool HasCustomDebugInformations { if (custom_infos != null) return custom_infos.Count > 0; - if (module.HasImage ()) - module.Read (this, (provider, reader) => { - var symbol_reader = reader.module.symbol_reader; - if (symbol_reader != null) - custom_infos = symbol_reader.Read (provider); - }); - - return !custom_infos.IsNullOrEmpty (); + return this.GetHasCustomDebugInformations (ref custom_infos, Module); } } public Collection CustomDebugInformations { - get { - if (custom_infos != null) - return custom_infos; - - if (module.HasImage ()) - module.Read (this, (provider, reader) => { - var symbol_reader = reader.module.symbol_reader; - if (symbol_reader != null) - custom_infos = symbol_reader.Read (provider); - }); - - Interlocked.CompareExchange (ref custom_infos, new Collection (), null); - return custom_infos; - } + get { return custom_infos ?? (this.GetCustomDebugInformations (ref custom_infos, module)); } } #region TypeAttributes From babace93b72cc7c527476cfc8f0b4d8705a518ee Mon Sep 17 00:00:00 2001 From: Sven Boemer Date: Tue, 4 Jun 2024 21:57:35 +0000 Subject: [PATCH 4/7] Add test dll/pdb --- .../TypeDefinitionDebugInformation.dll | Bin 0 -> 4096 bytes .../TypeDefinitionDebugInformation.pdb | Bin 0 -> 10488 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Test/Resources/assemblies/TypeDefinitionDebugInformation.dll create mode 100644 Test/Resources/assemblies/TypeDefinitionDebugInformation.pdb diff --git a/Test/Resources/assemblies/TypeDefinitionDebugInformation.dll b/Test/Resources/assemblies/TypeDefinitionDebugInformation.dll new file mode 100644 index 0000000000000000000000000000000000000000..2ab61566fc7a56279ee2d660e777bf93a02e437e GIT binary patch literal 4096 zcmeHKU1%It6h1dU+ilv$g#M7Cv{SdWmD=5nNwuxUZjw!GG)ZH2oBD^z?B?!fbarN$ znN71`H6ZGP5Bgw1p$|$yXcgKA3q=$k{Ckj!3W9=YAF2;hP((yaY5mTf+3Y6K6s%9` z+1&5mbMBdQ&(FPcCqoauK=nk_fOh2y(HZni3583;ET)?`zST@`E`th1R7C`8rS)Lvw;0qGz)~Bsh%dDW>x;H_5sTx(Azf=?dL&)=r>Np zLYg323E4|qh|&w^mf|(v{fbH${JsiYg4E zJk7pLcShsUj(A7=ZZ_6PCh!dyk32!t1|PSfMN*z)Sb3K<5{QpOj2uW&5(6$>ge6zyuL-Z^CE<&_V zFz%x7#dWkErbCpa93(OE3GiKFd|ctn3fC$5pc;RpESwO>lu6$%XM&eFAx?^&Jf>F> z(MCE6StGbmsD*aW*lZKUfh!d@1AY3iu?-#w#C8rwT7e;24{V~Ffi2XoaJRy4g#!xj zQ}}>F9VoE5!n6TxB}ITOw2ijXL-Yehk(W;3YU%=BPY(klB!S!M7_fsr0^UKN1AFOP z;Jr$o0yfN6vgmtDDk|Q_6nM>(8>6J$jqFa^s+J&NF zD&N9FoGhc~h#6fbhUiHDs1RKz;a&;oei;{ar#xM=9W_Et^qCprqTa+#rWm4u0 z%isuAR%;@TPMT(rdFr!Dg{!E~6-nkynPr0%&3d*|ktYp3Z`rPAWZjA=@H^^fL^>(y zOdDD01_g$T*dJh--Wx1FzvuMD#PP1@X3l^7>>g^+gb3GbBpNYjZDqDOd}{CbldWGg z?cozn4Se1jaAK)06s`}ohQqw+nKtmLOV_PC=;*~^+v=Oi$|8H5o^tF%u7KV$bym9s zwMB>f(!I7LyNktJg4}gY?~2A@pn1*Q#!4D)(bUVs*k@sWLW4#`(1xW`jJLL+MwNKH zrLk%|UX1wpa>d{h5b8yx94GQlAO4QS&e@qJq0v+_m1}(Es{^0C-~W1DQ~zr(p8c6^#HQ?mjJeYpbWRNSP0W+7w?i)$-PqDW z#dOCraBMv{W@jF~n(`!{<*O(~i<22j?d!gE=WP`DI=wyc75R{dd!8EmU~FdX*LyoZ zJs;d%9N%RgYdl&^l{?O#8ApYara7b=78Tqq$}QFQ=h-V;U}It0790H6N`wl&jc9g$ zh}WQG=MLyVekXMe*deB-f8&pa_x;= zxl{HAcKCGj{;#DZ7y+v~Ik02kn?k~-MLDvS+Gcg@r!lKT>SA6e4|+B@pH4Mgf>8mV zJZKq^=l{ggmr5s&xcy%zWjF`)2ySqJJItm671bJLM5Ke0%6yv2kmK$`%PH%|-1;ob zPzmc*Ja+KheE)LFekC$~!o_z8`&pc`!wX&OI&r)r#a!HDSjWLi)jYN1zK_o}LM##J zv)`W5wcxi|6Zy6H6QxPm;;%z|6QbgR2C+t7t-zTsBBz{zJWXMBQb*lV{_GFrTt)V$ zk~il3iu_Z4`E?(`dN#Z*p(b8U^#4RX_-k*z{e@Mj)`ak#%Ju6;&0OTFfPG~mOBznb a{7P1z;d(A0&HtaF<@N>g|JnaU2L1qU#&?JS literal 0 HcmV?d00001 diff --git a/Test/Resources/assemblies/TypeDefinitionDebugInformation.pdb b/Test/Resources/assemblies/TypeDefinitionDebugInformation.pdb new file mode 100644 index 0000000000000000000000000000000000000000..0b7ab7b62e4aba278dcf03b574ff7ed78dee12fe GIT binary patch literal 10488 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 literal 0 HcmV?d00001 From ec3d6f87a8693d94aff34340cf720be9a840218d Mon Sep 17 00:00:00 2001 From: Sven Boemer Date: Thu, 6 Jun 2024 00:09:37 +0000 Subject: [PATCH 5/7] PR feedback - Use static lambdas - Check HasCustomDebugInformation - Test writing modified CustomDebugInformation - Formatting fixes --- Directory.Build.props | 1 + Mono.Cecil.Cil/Symbols.cs | 12 +++--- Mono.Cecil/AssemblyWriter.cs | 2 +- Test/Mono.Cecil.Tests/BaseTestFixture.cs | 49 ++++++++++++++++++++++ Test/Mono.Cecil.Tests/ILProcessorTests.cs | 50 ----------------------- Test/Mono.Cecil.Tests/PortablePdbTests.cs | 16 ++++++++ 6 files changed, 74 insertions(+), 56 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 5b9f0da9d..a37508076 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -9,6 +9,7 @@ $(MSBuildThisFileDirectory)\cecil.snk $(DefineConstants);NET_CORE + latest true diff --git a/Mono.Cecil.Cil/Symbols.cs b/Mono.Cecil.Cil/Symbols.cs index c6b7d4332..294eb16db 100644 --- a/Mono.Cecil.Cil/Symbols.cs +++ b/Mono.Cecil.Cil/Symbols.cs @@ -1232,13 +1232,14 @@ public static bool GetHasCustomDebugInformations ( ref Collection collection, ModuleDefinition module) { - if (module.HasImage ()) - module.Read (ref collection, self, (provider, reader) => { + if (module.HasImage ()) { + module.Read (ref collection, self, static (provider, reader) => { var symbol_reader = reader.module.symbol_reader; if (symbol_reader != null) return symbol_reader.Read (provider); return null; }); + } return !collection.IsNullOrEmpty (); } @@ -1248,13 +1249,14 @@ public static Collection GetCustomDebugInformations ( ref Collection collection, ModuleDefinition module) { - if (module.HasImage ()) - module.Read (ref collection, self, (provider, reader) => { + if (module.HasImage ()) { + module.Read (ref collection, self, static (provider, reader) => { var symbol_reader = reader.module.symbol_reader; if (symbol_reader != null) - return symbol_reader.Read (self); + return symbol_reader.Read (provider); return null; }); + } Interlocked.CompareExchange (ref collection, new Collection (), null); return collection; diff --git a/Mono.Cecil/AssemblyWriter.cs b/Mono.Cecil/AssemblyWriter.cs index 3cc0569e1..ee234c81f 100644 --- a/Mono.Cecil/AssemblyWriter.cs +++ b/Mono.Cecil/AssemblyWriter.cs @@ -1487,7 +1487,7 @@ void AddType (TypeDefinition type) if (type.HasNestedTypes) AddNestedTypes (type); - if (symbol_writer != null && type.custom_infos != null) + if (symbol_writer != null && type.HasCustomDebugInformations) symbol_writer.Write (type); WindowsRuntimeProjections.ApplyProjection (type, treatment); diff --git a/Test/Mono.Cecil.Tests/BaseTestFixture.cs b/Test/Mono.Cecil.Tests/BaseTestFixture.cs index 046791bfa..12de4227a 100644 --- a/Test/Mono.Cecil.Tests/BaseTestFixture.cs +++ b/Test/Mono.Cecil.Tests/BaseTestFixture.cs @@ -2,6 +2,7 @@ using System.IO; using System.Runtime.CompilerServices; using Mono.Cecil.Cil; +using Mono.Cecil.Pdb; using NUnit.Framework; using Mono.Cecil.PE; @@ -154,6 +155,54 @@ static void Run (TestCase testCase) using (var runner = new TestRunner (testCase, TestCaseType.WriteFromImmediate)) runner.RunTest (); } + + public enum RoundtripType { + None, + Pdb, + PortablePdb + } + + protected static ModuleDefinition RoundtripModule(ModuleDefinition module, RoundtripType roundtripType) + { + if (roundtripType == RoundtripType.None) + return module; + + var file = Path.Combine (Path.GetTempPath (), "RoundtripModule.dll"); + if (File.Exists (file)) + File.Delete (file); + + ISymbolWriterProvider symbolWriterProvider; + switch (roundtripType) { + case RoundtripType.Pdb when Platform.HasNativePdbSupport: + symbolWriterProvider = new PdbWriterProvider (); + break; + case RoundtripType.PortablePdb: + default: + symbolWriterProvider = new PortablePdbWriterProvider (); + break; + } + + module.Write (file, new WriterParameters { + SymbolWriterProvider = symbolWriterProvider, + }); + module.Dispose (); + + ISymbolReaderProvider symbolReaderProvider; + switch (roundtripType) { + case RoundtripType.Pdb when Platform.HasNativePdbSupport: + symbolReaderProvider = new PdbReaderProvider (); + break; + case RoundtripType.PortablePdb: + default: + symbolReaderProvider = new PortablePdbReaderProvider (); + break; + } + + return ModuleDefinition.ReadModule (file, new ReaderParameters { + SymbolReaderProvider = symbolReaderProvider, + InMemory = true + }); + } } abstract class TestCase { diff --git a/Test/Mono.Cecil.Tests/ILProcessorTests.cs b/Test/Mono.Cecil.Tests/ILProcessorTests.cs index fd462c365..93ca078c8 100644 --- a/Test/Mono.Cecil.Tests/ILProcessorTests.cs +++ b/Test/Mono.Cecil.Tests/ILProcessorTests.cs @@ -3,10 +3,8 @@ using System.IO; using System.Linq; -using Mono.Cecil; using Mono.Cecil.Cil; using Mono.Cecil.Mdb; -using Mono.Cecil.Pdb; using NUnit.Framework; namespace Mono.Cecil.Tests { @@ -499,12 +497,6 @@ static MethodBody CreateTestMethodWithLocalScopes (RoundtripType roundtripType, return methodBody; } - public enum RoundtripType { - None, - Pdb, - PortablePdb - } - static MethodBody RoundtripMethodBody(MethodBody methodBody, RoundtripType roundtripType, bool forceUnresolvedScopes = false, bool reverseScopeOrder = false) { var newModule = RoundtripModule (methodBody.Method.Module, roundtripType); @@ -540,47 +532,5 @@ static void ReverseScopeOrder(ScopeDebugInformation scope) foreach (var subScope in scope.Scopes) ReverseScopeOrder (subScope); } - - static ModuleDefinition RoundtripModule(ModuleDefinition module, RoundtripType roundtripType) - { - if (roundtripType == RoundtripType.None) - return module; - - var file = Path.Combine (Path.GetTempPath (), "TestILProcessor.dll"); - if (File.Exists (file)) - File.Delete (file); - - ISymbolWriterProvider symbolWriterProvider; - switch (roundtripType) { - case RoundtripType.Pdb when Platform.HasNativePdbSupport: - symbolWriterProvider = new PdbWriterProvider (); - break; - case RoundtripType.PortablePdb: - default: - symbolWriterProvider = new PortablePdbWriterProvider (); - break; - } - - module.Write (file, new WriterParameters { - SymbolWriterProvider = symbolWriterProvider, - }); - module.Dispose (); - - ISymbolReaderProvider symbolReaderProvider; - switch (roundtripType) { - case RoundtripType.Pdb when Platform.HasNativePdbSupport: - symbolReaderProvider = new PdbReaderProvider (); - break; - case RoundtripType.PortablePdb: - default: - symbolReaderProvider = new PortablePdbReaderProvider (); - break; - } - - return ModuleDefinition.ReadModule (file, new ReaderParameters { - SymbolReaderProvider = symbolReaderProvider, - InMemory = true - }); - } } } diff --git a/Test/Mono.Cecil.Tests/PortablePdbTests.cs b/Test/Mono.Cecil.Tests/PortablePdbTests.cs index bae1436bc..126d23ef4 100644 --- a/Test/Mono.Cecil.Tests/PortablePdbTests.cs +++ b/Test/Mono.Cecil.Tests/PortablePdbTests.cs @@ -666,6 +666,22 @@ public void TypeDefinitionDebugInformation () }, symbolReaderProvider: typeof (PortablePdbReaderProvider), symbolWriterProvider: typeof (PortablePdbWriterProvider)); } + [Test] + public void ModifyTypeDefinitionDebugInformation () + { + using (var module = GetResourceModule ("TypeDefinitionDebugInformation.dll", new ReaderParameters { SymbolReaderProvider = new PortablePdbReaderProvider () })) { + var enum_type = module.GetType ("TypeDefinitionDebugInformation.Enum"); + var binary_custom_debug_info = enum_type.CustomDebugInformations.OfType ().FirstOrDefault (); + binary_custom_debug_info.Data = new byte [] { 0x2 }; + + var outputModule = RoundtripModule (module, RoundtripType.None); + enum_type = outputModule.GetType ("TypeDefinitionDebugInformation.Enum"); + binary_custom_debug_info = enum_type.CustomDebugInformations.OfType ().FirstOrDefault (); + Assert.IsNotNull (binary_custom_debug_info); + Assert.AreEqual (new byte [] { 0x2 }, binary_custom_debug_info.Data); + } + } + public sealed class SymbolWriterProvider : ISymbolWriterProvider { readonly DefaultSymbolWriterProvider writer_provider = new DefaultSymbolWriterProvider (); From 045585912c7d5bd3ca590811f991d923391c44ce Mon Sep 17 00:00:00 2001 From: Sven Boemer Date: Thu, 6 Jun 2024 10:34:31 -0700 Subject: [PATCH 6/7] Update Test/Mono.Cecil.Tests/PortablePdbTests.cs Co-authored-by: Jackson Schuster <36744439+jtschuster@users.noreply.github.com> --- Test/Mono.Cecil.Tests/PortablePdbTests.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Test/Mono.Cecil.Tests/PortablePdbTests.cs b/Test/Mono.Cecil.Tests/PortablePdbTests.cs index 126d23ef4..c2b04524b 100644 --- a/Test/Mono.Cecil.Tests/PortablePdbTests.cs +++ b/Test/Mono.Cecil.Tests/PortablePdbTests.cs @@ -672,6 +672,7 @@ public void ModifyTypeDefinitionDebugInformation () using (var module = GetResourceModule ("TypeDefinitionDebugInformation.dll", new ReaderParameters { SymbolReaderProvider = new PortablePdbReaderProvider () })) { var enum_type = module.GetType ("TypeDefinitionDebugInformation.Enum"); var binary_custom_debug_info = enum_type.CustomDebugInformations.OfType ().FirstOrDefault (); + Assert.AreEqual (new byte [] { 0x1 }, binary_custom_debug_info.Data); binary_custom_debug_info.Data = new byte [] { 0x2 }; var outputModule = RoundtripModule (module, RoundtripType.None); From 187563ca866b0be8d5d9f5c3e43307a0623844da Mon Sep 17 00:00:00 2001 From: Sven Boemer Date: Thu, 6 Jun 2024 23:57:16 +0000 Subject: [PATCH 7/7] Build for netstandard2.0 --- .../TypeDefinitionDebugInformation.dll | Bin 4096 -> 4608 bytes .../TypeDefinitionDebugInformation.pdb | Bin 10488 -> 7604 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Test/Resources/assemblies/TypeDefinitionDebugInformation.dll b/Test/Resources/assemblies/TypeDefinitionDebugInformation.dll index 2ab61566fc7a56279ee2d660e777bf93a02e437e..6b41377d0a42ba73d66b64b18b966cd1d813986b 100644 GIT binary patch delta 1306 zcmYk6O>7%Q6vzK>?QGUg>e{5Fj*80K4tC-gV;Tig5K)a=(m)eZ#fchKDs1d+y6VPG z*ITN9!081+4ye|iklIQ;6evg>V&H%f2ZVYlA3{O`2?13lD2G;so7)S#nb;L0&F}r+ zn~(QqcC_pI`rx^@;z$0T-$1)vM_lir91!Gyx)tmnYJ9j5`Z@)?C<6O{mah@(>wOvM zW&h_SQ1oI-##^LR@F9&uI`^QrK_k@beMTt?d%sb9pv60gc96S*F4#I?a}M%ifhPyz z%Fs5EHa*c6itlv-{Aq7mNlgqYK;jMH9NY6k&$*6OS+0rwGF?24ZDM{7Io4sJC+Da3 zv)#vjhP+KBSr=jUWcRVK z@~nNh#08JwF2_{%lK6*4p{ikwVqraqCz!pGA?Bp5o5U873GZx z0i+c|gsEbH8N@I%jK?MSO6Db}Bo9k2N*YWRYs?2>Nv-kA7=*^94l{Qki&PyCAVyjA z;3;;cw~zjMSUi9D`MmIp6Dz9bQzK!G`0@eocQt)zk}!~+IZ&KyA3W2p@|jomWOIaK zXvcGov0|R7Iw$vAwN=|#n_)L1mgt=|I!{dycFTiV-H)6|isvaVxu|T*+jjNL^l96* zR&A35fvL&~)3Ny0z;*QSv`)MH?xBxC)3ajfDef8mFJuCp(XFr8$FBHYTwq)Xc;9u$ z`;T2+iC(|mdbW|ca&z;?*`4CFkGIzKUQA%%K!iX delta 979 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 literal 10488 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