IKVM11  11
Java SE 11 Virtual Machine for .NET
Loading...
Searching...
No Matches
SequencePointEncoder.cs
Go to the documentation of this file.
1using System;
2using System.Diagnostics;
3using System.Reflection.Metadata;
4using System.Reflection.Metadata.Ecma335;
5
7{
8
13 {
14
15 readonly BlobBuilder writer;
16
19 int prevOffset = -1;
22
27 public SequencePointEncoder(BlobBuilder writer)
28 {
29 this.writer = writer ?? throw new ArgumentNullException(nameof(writer));
30 }
31
38 public void LocalSignature(StandaloneSignatureHandle localSignature)
39 {
41 throw new InvalidOperationException("Local Signature already encoded.");
43 throw new InvalidOperationException("Sequence point already encoded.");
44
45 // write local signature
46 writer.WriteCompressedInteger(MetadataTokens.GetRowNumber(localSignature));
47
49 }
50
62 public void SequencePoint(DocumentHandle document, int offset, int startLine, int startColumn, int endLine, int endColumn, ref DocumentHandle previousDocument)
63 {
64 if (localSignatureEncoded == false)
65 throw new InvalidOperationException("Local signature not already encoded.");
66 if (offset <= prevOffset)
67 throw new ArgumentException("Subsequent sequence points must appear at an offset greater than the previous sequence point.");
68
69 // document passed, and different from previous, write new document-record
70 if (document.IsNil == false && document != previousDocument)
71 {
72 // this isn't the initial header document, but a document-record, which requires a zero IL offset
74 writer.WriteCompressedInteger(0);
75
76 writer.WriteCompressedInteger(MetadataTokens.GetRowNumber(document));
77 previousDocument = document;
78 }
79
80 // IL offset or delta IL offset
81 if (prevOffset == -1)
82 writer.WriteCompressedInteger(offset);
83 else
84 writer.WriteCompressedInteger(offset - prevOffset);
85
86 // hidden or non-hidden sequence point
87 if (startLine == System.Reflection.Metadata.SequencePoint.HiddenLine)
88 {
89 writer.WriteCompressedInteger(0);
90 writer.WriteCompressedInteger(0);
91 }
92 else
93 {
94 var deltaLines = endLine - startLine;
95 var deltaColumns = endColumn - startColumn;
96 Debug.Assert(startLine == System.Reflection.Metadata.SequencePoint.HiddenLine || deltaLines > 0 || deltaColumns > 0);
97
98 // write change in lines; then change in columns (signed if change in lines)
99 writer.WriteCompressedInteger(deltaLines);
100 if (deltaLines == 0)
101 writer.WriteCompressedInteger(deltaColumns);
102 else
103 writer.WriteCompressedSignedInteger(deltaColumns);
104
105 // delta start lines & columns
106 if (prevNonHiddenStartLine == -1)
107 {
108 Debug.Assert(prevNonHiddenStartColumn == -1);
109 writer.WriteCompressedInteger(startLine);
110 writer.WriteCompressedInteger(startColumn);
111 }
112 else
113 {
114 writer.WriteCompressedSignedInteger(startLine - prevNonHiddenStartLine);
115 writer.WriteCompressedSignedInteger(startColumn - prevNonHiddenStartColumn);
116 }
117
118 prevNonHiddenStartLine = startLine;
119 prevNonHiddenStartColumn = startColumn;
120 }
121
122 prevOffset = offset;
124 }
125
126 }
127
128}
SequencePointEncoder(BlobBuilder writer)
initializes a new instance.
void LocalSignature(StandaloneSignatureHandle localSignature)
Encodes the local signature.
void SequencePoint(DocumentHandle document, int offset, int startLine, int startColumn, int endLine, int endColumn, ref DocumentHandle previousDocument)
Encodes a new sequence point. previousDocument is used to determine whether a new document record is...