private BlobHandle SerializeSpans( ImmutableArray <SourceSpan> spans, Dictionary <DebugSourceDocument, int> documentIndex ) { if (spans.Length == 0) { return(default(BlobHandle)); } // 4 bytes per span plus a header, the builder expands by the same amount. var writer = new BlobBuilder(4 + spans.Length * 4); int previousStartLine = -1; int previousStartColumn = -1; DebugSourceDocument previousDocument = spans[0].Document; // header: writer.WriteCompressedInteger(GetOrAddDocument(previousDocument, documentIndex)); for (int i = 0; i < spans.Length; i++) { var currentDocument = spans[i].Document; if (previousDocument != currentDocument) { writer.WriteInt16(0); writer.WriteCompressedInteger(GetOrAddDocument(currentDocument, documentIndex)); previousDocument = currentDocument; } // Delta Lines & Columns: SerializeDeltaLinesAndColumns(writer, spans[i]); // delta Start Lines & Columns: if (previousStartLine < 0) { Debug.Assert(previousStartColumn < 0); writer.WriteCompressedInteger(spans[i].StartLine); writer.WriteCompressedInteger(spans[i].StartColumn); } else { writer.WriteCompressedSignedInteger(spans[i].StartLine - previousStartLine); writer.WriteCompressedSignedInteger(spans[i].StartColumn - previousStartColumn); } previousStartLine = spans[i].StartLine; previousStartColumn = spans[i].StartColumn; } return(GetOrAddBlob(writer)); }
private void SerializeDeltaLinesAndColumns(BlobBuilder writer, SequencePoint sequencePoint) { int deltaLines = sequencePoint.EndLine - sequencePoint.StartLine; int deltaColumns = sequencePoint.EndColumn - sequencePoint.StartColumn; // only hidden sequence points have zero width Debug.Assert(deltaLines != 0 || deltaColumns != 0 || sequencePoint.IsHidden); writer.WriteCompressedInteger(deltaLines); if (deltaLines == 0) { writer.WriteCompressedInteger(deltaColumns); } else { writer.WriteCompressedSignedInteger(deltaColumns); } }
private void SerializeDeltaLinesAndColumns(BlobBuilder writer, SourceSpan span) { int deltaLines = span.EndLine - span.StartLine; int deltaColumns = span.EndColumn - span.StartColumn; // spans can't have zero width Debug.Assert(deltaLines != 0 || deltaColumns != 0); writer.WriteCompressedInteger(deltaLines); if (deltaLines == 0) { writer.WriteCompressedInteger(deltaColumns); } else { writer.WriteCompressedSignedInteger(deltaColumns); } }
private BlobHandle SerializeSequencePoints( StandaloneSignatureHandle localSignatureHandleOpt, ImmutableArray <SequencePoint> sequencePoints, Dictionary <DebugSourceDocument, DocumentHandle> documentIndex, out DocumentHandle singleDocumentHandle) { if (sequencePoints.Length == 0) { singleDocumentHandle = default(DocumentHandle); return(default(BlobHandle)); } var writer = new BlobBuilder(); int previousNonHiddenStartLine = -1; int previousNonHiddenStartColumn = -1; // header: writer.WriteCompressedInteger(MetadataTokens.GetRowNumber(localSignatureHandleOpt)); var previousDocument = TryGetSingleDocument(sequencePoints); singleDocumentHandle = (previousDocument != null) ? GetOrAddDocument(previousDocument, documentIndex) : default(DocumentHandle); for (int i = 0; i < sequencePoints.Length; i++) { var currentDocument = sequencePoints[i].Document; if (previousDocument != currentDocument) { var documentHandle = GetOrAddDocument(currentDocument, documentIndex); // optional document in header or document record: if (previousDocument != null) { writer.WriteCompressedInteger(0); } writer.WriteCompressedInteger(MetadataTokens.GetRowNumber(documentHandle)); previousDocument = currentDocument; } // delta IL offset: if (i > 0) { writer.WriteCompressedInteger(sequencePoints[i].Offset - sequencePoints[i - 1].Offset); } else { writer.WriteCompressedInteger(sequencePoints[i].Offset); } if (sequencePoints[i].IsHidden) { writer.WriteInt16(0); continue; } // Delta Lines & Columns: SerializeDeltaLinesAndColumns(writer, sequencePoints[i]); // delta Start Lines & Columns: if (previousNonHiddenStartLine < 0) { Debug.Assert(previousNonHiddenStartColumn < 0); writer.WriteCompressedInteger(sequencePoints[i].StartLine); writer.WriteCompressedInteger(sequencePoints[i].StartColumn); } else { writer.WriteCompressedSignedInteger(sequencePoints[i].StartLine - previousNonHiddenStartLine); writer.WriteCompressedSignedInteger(sequencePoints[i].StartColumn - previousNonHiddenStartColumn); } previousNonHiddenStartLine = sequencePoints[i].StartLine; previousNonHiddenStartColumn = sequencePoints[i].StartColumn; } return(_debugMetadataOpt.GetOrAddBlob(writer)); }
private BlobIdx SerializeSequencePoints(int localSignatureRowId, ImmutableArray <SequencePoint> sequencePoints, Dictionary <DebugSourceDocument, int> documentIndex) { if (sequencePoints.Length == 0) { return(default(BlobIdx)); } var writer = new BlobBuilder(); int previousNonHiddenStartLine = -1; int previousNonHiddenStartColumn = -1; uint currentDocumentRowId = GetOrAddDocument(sequencePoints[0].Document, documentIndex); // header: writer.WriteCompressedInteger((uint)localSignatureRowId); writer.WriteCompressedInteger(currentDocumentRowId); for (int i = 0; i < sequencePoints.Length; i++) { uint documentRowId = GetOrAddDocument(sequencePoints[i].Document, documentIndex); if (documentRowId != currentDocumentRowId) { // document record: writer.WriteCompressedInteger(0); writer.WriteCompressedInteger(documentRowId); currentDocumentRowId = documentRowId; } // delta IL offset: if (i > 0) { writer.WriteCompressedInteger((uint)(sequencePoints[i].Offset - sequencePoints[i - 1].Offset)); } else { writer.WriteCompressedInteger((uint)sequencePoints[i].Offset); } if (sequencePoints[i].IsHidden) { writer.WriteInt16(0); continue; } // Delta Lines & Columns: SerializeDeltaLinesAndColumns(writer, sequencePoints[i]); // delta Start Lines & Columns: if (previousNonHiddenStartLine < 0) { Debug.Assert(previousNonHiddenStartColumn < 0); writer.WriteCompressedInteger((uint)sequencePoints[i].StartLine); writer.WriteCompressedInteger((uint)sequencePoints[i].StartColumn); } else { writer.WriteCompressedSignedInteger(sequencePoints[i].StartLine - previousNonHiddenStartLine); writer.WriteCompressedSignedInteger(sequencePoints[i].StartColumn - previousNonHiddenStartColumn); } previousNonHiddenStartLine = sequencePoints[i].StartLine; previousNonHiddenStartColumn = sequencePoints[i].StartColumn; } return(_debugHeapsOpt.GetBlobIndex(writer)); }
private static void TestCompressedSignedInteger(byte[] expected, int value) { var writer = new BlobWriter(4); writer.WriteCompressedSignedInteger(value); AssertEx.Equal(expected, writer.ToArray()); var builder = new BlobBuilder(); builder.WriteCompressedSignedInteger(value); AssertEx.Equal(expected, builder.ToArray()); }
private static byte[] CompressSignedInteger(int value) { var writer = new BlobBuilder(); writer.WriteCompressedSignedInteger(value); return writer.ToArray(); }