From 02881c8c94cd7bcc283524363b2b7ef11768c424 Mon Sep 17 00:00:00 2001 From: Jerome Haltom Date: Tue, 6 Feb 2024 17:24:33 -0600 Subject: [PATCH] Setup document right. --- .../Diagnostics/PortablePdbSymbolWriter.cs | 37 +++++++++++++------ .../Emit/SequencePointEncoder.cs | 2 + 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/IKVM.Reflection/Diagnostics/PortablePdbSymbolWriter.cs b/src/IKVM.Reflection/Diagnostics/PortablePdbSymbolWriter.cs index 60c20db7a7..7539a0d825 100644 --- a/src/IKVM.Reflection/Diagnostics/PortablePdbSymbolWriter.cs +++ b/src/IKVM.Reflection/Diagnostics/PortablePdbSymbolWriter.cs @@ -1,9 +1,9 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; -using System.Linq; using System.Diagnostics; using System.Diagnostics.SymbolStore; +using System.Linq; using System.Reflection.Metadata; using System.Reflection.Metadata.Ecma335; @@ -106,7 +106,7 @@ public void SetSource(byte[] source) /// /// Track local variable information. /// - protected sealed class LocalVar + protected readonly struct LocalVar { readonly System.Reflection.FieldAttributes attributes; @@ -279,15 +279,15 @@ internal Method(int token, StandaloneSignatureHandle localSignatureHandle) /// /// Describes a sequence point on a method. /// - protected class SequencePoint + protected readonly struct SequencePoint { - Document document; - int[] offsets; - int[] lines; - int[] columns; - int[] endLines; - int[] endColumns; + readonly Document document; + readonly int[] offsets; + readonly int[] lines; + readonly int[] columns; + readonly int[] endLines; + readonly int[] endColumns; /// /// Initializes a new instance. @@ -520,7 +520,7 @@ public virtual void WriteTo(MetadataBuilder metadata, out int userEntryPoint) void WriteMethod(MetadataBuilder metadata, Method method, Dictionary documentCache) { // find first document and set as initial, as it will be directly on method debug information - var initialDocument = method.SequencePoints.Select(i => i.Document).FirstOrDefault(i => i != null); + var initialDocument = GetSingleDocument(method.SequencePoints); var initialDocumentHandle = initialDocument != null ? GetOrWriteDocument(metadata, initialDocument, documentCache) : default; var currentDocumentHandle = initialDocumentHandle; @@ -533,6 +533,17 @@ void WriteMethod(MetadataBuilder metadata, Method method, Dictionary + /// Returns the single unique in a set of sequence points, or null if there is no single unique document. + /// + /// + /// + Document GetSingleDocument(IEnumerable sequencePoints) + { + var s = sequencePoints.Select(i => i.Document).Distinct().Take(2).ToList(); + return s.Count == 1 ? s[0] : null; + } + /// /// Writes the sequence points for the method. /// @@ -556,8 +567,10 @@ void WriteSequencePoints(MetadataBuilder metadata, Method method, Dictionary i.Document).FirstOrDefault(); + var firstDocumentHandle = firstDocument != null ? GetOrWriteDocument(metadata, firstDocument, documentCache) : default; + enc.Header(method.LocalSignatureHandle, firstDocumentHandle, ref previousDocument); // add the sequence points recorded on the method foreach (var sequencePoint in method.SequencePoints) diff --git a/src/IKVM.Reflection/Emit/SequencePointEncoder.cs b/src/IKVM.Reflection/Emit/SequencePointEncoder.cs index 5df156d443..4811620e29 100644 --- a/src/IKVM.Reflection/Emit/SequencePointEncoder.cs +++ b/src/IKVM.Reflection/Emit/SequencePointEncoder.cs @@ -33,6 +33,8 @@ public SequencePointEncoder(BlobBuilder writer) /// Encodes the local signature. /// /// + /// + ///