From 84f95aa811ed4fdb316f787fe2af80b30d531abf Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Wed, 29 Sep 2021 16:42:55 -0400 Subject: 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 Run-TryBot: Than McIntosh TryBot-Result: Gopher Robot --- src/internal/coverage/stringtab/stringtab.go | 37 ++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) (limited to 'src/internal/coverage/stringtab/stringtab.go') 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))) + } +} -- cgit v1.3