aboutsummaryrefslogtreecommitdiff
path: root/src/internal/coverage/stringtab
diff options
context:
space:
mode:
authorThan McIntosh <thanm@google.com>2021-09-29 16:42:55 -0400
committerThan McIntosh <thanm@google.com>2022-09-26 20:52:13 +0000
commit84f95aa811ed4fdb316f787fe2af80b30d531abf (patch)
tree606169df535b939938e1f0f4e6507bc23ff98106 /src/internal/coverage/stringtab
parentf951f697c45ace2f00dccd8d2533463b6538dc36 (diff)
downloadgo-84f95aa811ed4fdb316f787fe2af80b30d531abf.tar.xz
internal/coverage: add coverage meta-data decoder
Add a coverage meta-data decoder, which provides APIs for reading encoded coverage meta-data and expanding it usable form. This package is intended to be used in the coverage tooling that reads data files emitted from coverage runs. Along with the new decoding package is a unit test that runs the encode/decode paths together to check to make sure that "decode(encode(X)) == X". Updates #51430. Change-Id: I81d27d8da0b2fcfa5039114a6e35a4b463d19b3c Reviewed-on: https://go-review.googlesource.com/c/go/+/353454 Reviewed-by: David Chase <drchase@google.com> Run-TryBot: Than McIntosh <thanm@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
Diffstat (limited to 'src/internal/coverage/stringtab')
-rw-r--r--src/internal/coverage/stringtab/stringtab.go37
1 files changed, 35 insertions, 2 deletions
diff --git a/src/internal/coverage/stringtab/stringtab.go b/src/internal/coverage/stringtab/stringtab.go
index 2aba3321be..f093e2cd15 100644
--- a/src/internal/coverage/stringtab/stringtab.go
+++ b/src/internal/coverage/stringtab/stringtab.go
@@ -6,13 +6,16 @@ package stringtab
import (
"fmt"
+ "internal/coverage/slicereader"
"internal/coverage/uleb128"
"io"
)
-// This package implements a string table writer utility for use in
-// emitting coverage meta-data and counter-data files.
+// This package implements string table writer and reader utilities,
+// for use in emitting and reading/decoding coverage meta-data and
+// counter-data files.
+// Writer implements a string table writing utility.
type Writer struct {
stab map[string]uint32
strs []string
@@ -87,3 +90,33 @@ func (stw *Writer) Write(w io.Writer) error {
}
return nil
}
+
+type Reader struct {
+ r *slicereader.Reader
+ strs []string
+}
+
+func NewReader(r *slicereader.Reader) *Reader {
+ str := &Reader{
+ r: r,
+ }
+ return str
+}
+
+func (str *Reader) Entries() int {
+ return len(str.strs)
+}
+
+func (str *Reader) Get(idx uint32) string {
+ return str.strs[idx]
+}
+
+func (str *Reader) Read() {
+ // Read the table itself.
+ numEntries := int(str.r.ReadULEB128())
+ str.strs = make([]string, 0, numEntries)
+ for idx := 0; idx < numEntries; idx++ {
+ slen := str.r.ReadULEB128()
+ str.strs = append(str.strs, str.r.ReadString(int64(slen)))
+ }
+}