Skip to content

Commit

Permalink
internal/pkgbits: add Index type
Browse files Browse the repository at this point in the history
Element indices are very common in the pkgbits API, so introduce a new
defined type to help make that clearer.

Change-Id: I8f9493e2335601c740eb403d1fdcd11183122907
Reviewed-on: https://go-review.googlesource.com/c/go/+/407435
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
  • Loading branch information
mdempsky committed May 25, 2022
1 parent 8841699 commit 4e4db1e
Show file tree
Hide file tree
Showing 11 changed files with 93 additions and 87 deletions.
5 changes: 3 additions & 2 deletions src/cmd/compile/internal/importer/support.go
Expand Up @@ -11,6 +11,7 @@ import (
"cmd/compile/internal/types2"
"fmt"
"go/token"
"internal/pkgbits"
"sync"
)

Expand Down Expand Up @@ -140,12 +141,12 @@ func (t anyType) String() string { return "any" }

// See cmd/compile/internal/noder.derivedInfo.
type derivedInfo struct {
idx int
idx pkgbits.Index
needed bool
}

// See cmd/compile/internal/noder.typeInfo.
type typeInfo struct {
idx int
idx pkgbits.Index
derived bool
}
12 changes: 6 additions & 6 deletions src/cmd/compile/internal/importer/ureader.go
Expand Up @@ -78,7 +78,7 @@ type readerTypeBound struct {
boundIdx int
}

func (pr *pkgReader) newReader(k pkgbits.RelocKind, idx int, marker pkgbits.SyncMarker) *reader {
func (pr *pkgReader) newReader(k pkgbits.RelocKind, idx pkgbits.Index, marker pkgbits.SyncMarker) *reader {
return &reader{
Decoder: pr.NewDecoder(k, idx, marker),
p: pr,
Expand All @@ -104,7 +104,7 @@ func (r *reader) posBase() *syntax.PosBase {
return r.p.posBaseIdx(r.Reloc(pkgbits.RelocPosBase))
}

func (pr *pkgReader) posBaseIdx(idx int) *syntax.PosBase {
func (pr *pkgReader) posBaseIdx(idx pkgbits.Index) *syntax.PosBase {
if b := pr.posBases[idx]; b != nil {
return b
}
Expand Down Expand Up @@ -134,7 +134,7 @@ func (r *reader) pkg() *types2.Package {
return r.p.pkgIdx(r.Reloc(pkgbits.RelocPkg))
}

func (pr *pkgReader) pkgIdx(idx int) *types2.Package {
func (pr *pkgReader) pkgIdx(idx pkgbits.Index) *types2.Package {
// TODO(mdempsky): Consider using some non-nil pointer to indicate
// the universe scope, so we don't need to keep re-reading it.
if pkg := pr.pkgs[idx]; pkg != nil {
Expand Down Expand Up @@ -187,7 +187,7 @@ func (r *reader) typ() types2.Type {
func (r *reader) typInfo() typeInfo {
r.Sync(pkgbits.SyncType)
if r.Bool() {
return typeInfo{idx: r.Len(), derived: true}
return typeInfo{idx: pkgbits.Index(r.Len()), derived: true}
}
return typeInfo{idx: r.Reloc(pkgbits.RelocType), derived: false}
}
Expand Down Expand Up @@ -364,7 +364,7 @@ func (r *reader) obj() (types2.Object, []types2.Type) {
return obj, targs
}

func (pr *pkgReader) objIdx(idx int) (*types2.Package, string) {
func (pr *pkgReader) objIdx(idx pkgbits.Index) (*types2.Package, string) {
rname := pr.newReader(pkgbits.RelocName, idx, pkgbits.SyncObject1)

objPkg, objName := rname.qualifiedIdent()
Expand Down Expand Up @@ -434,7 +434,7 @@ func (pr *pkgReader) objIdx(idx int) (*types2.Package, string) {
return objPkg, objName
}

func (pr *pkgReader) objDictIdx(idx int) *readerDict {
func (pr *pkgReader) objDictIdx(idx pkgbits.Index) *readerDict {
r := pr.newReader(pkgbits.RelocObjDict, idx, pkgbits.SyncObject1)

var dict readerDict
Expand Down
16 changes: 8 additions & 8 deletions src/cmd/compile/internal/noder/linker.go
Expand Up @@ -37,8 +37,8 @@ import (
type linker struct {
pw pkgbits.PkgEncoder

pkgs map[string]int
decls map[*types.Sym]int
pkgs map[string]pkgbits.Index
decls map[*types.Sym]pkgbits.Index
}

func (l *linker) relocAll(pr *pkgReader, relocs []pkgbits.RelocEnt) []pkgbits.RelocEnt {
Expand All @@ -50,7 +50,7 @@ func (l *linker) relocAll(pr *pkgReader, relocs []pkgbits.RelocEnt) []pkgbits.Re
return res
}

func (l *linker) relocIdx(pr *pkgReader, k pkgbits.RelocKind, idx int) int {
func (l *linker) relocIdx(pr *pkgReader, k pkgbits.RelocKind, idx pkgbits.Index) pkgbits.Index {
assert(pr != nil)

absIdx := pr.AbsIdx(k, idx)
Expand All @@ -59,7 +59,7 @@ func (l *linker) relocIdx(pr *pkgReader, k pkgbits.RelocKind, idx int) int {
return ^newidx
}

var newidx int
var newidx pkgbits.Index
switch k {
case pkgbits.RelocString:
newidx = l.relocString(pr, idx)
Expand All @@ -85,11 +85,11 @@ func (l *linker) relocIdx(pr *pkgReader, k pkgbits.RelocKind, idx int) int {
return newidx
}

func (l *linker) relocString(pr *pkgReader, idx int) int {
func (l *linker) relocString(pr *pkgReader, idx pkgbits.Index) pkgbits.Index {
return l.pw.StringIdx(pr.StringIdx(idx))
}

func (l *linker) relocPkg(pr *pkgReader, idx int) int {
func (l *linker) relocPkg(pr *pkgReader, idx pkgbits.Index) pkgbits.Index {
path := pr.PeekPkgPath(idx)

if newidx, ok := l.pkgs[path]; ok {
Expand All @@ -114,7 +114,7 @@ func (l *linker) relocPkg(pr *pkgReader, idx int) int {
return w.Flush()
}

func (l *linker) relocObj(pr *pkgReader, idx int) int {
func (l *linker) relocObj(pr *pkgReader, idx pkgbits.Index) pkgbits.Index {
path, name, tag := pr.PeekObj(idx)
sym := types.NewPkg(path, "").Lookup(name)

Expand Down Expand Up @@ -184,7 +184,7 @@ func (l *linker) relocObj(pr *pkgReader, idx int) int {
return w.Idx
}

func (l *linker) relocCommon(pr *pkgReader, w *pkgbits.Encoder, k pkgbits.RelocKind, idx int) {
func (l *linker) relocCommon(pr *pkgReader, w *pkgbits.Encoder, k pkgbits.RelocKind, idx pkgbits.Index) {
r := pr.NewDecoderRaw(k, idx)
w.Relocs = l.relocAll(pr, r.Relocs)
io.Copy(&w.Data, &r.Data)
Expand Down
20 changes: 10 additions & 10 deletions src/cmd/compile/internal/noder/reader.go
Expand Up @@ -35,7 +35,7 @@ type pkgReader struct {

// offset for rewriting the given index into the output,
// but bitwise inverted so we can detect if we're missing the entry or not.
newindex []int
newindex []pkgbits.Index
}

func newPkgReader(pr pkgbits.PkgDecoder) *pkgReader {
Expand All @@ -46,13 +46,13 @@ func newPkgReader(pr pkgbits.PkgDecoder) *pkgReader {
pkgs: make([]*types.Pkg, pr.NumElems(pkgbits.RelocPkg)),
typs: make([]*types.Type, pr.NumElems(pkgbits.RelocType)),

newindex: make([]int, pr.TotalElems()),
newindex: make([]pkgbits.Index, pr.TotalElems()),
}
}

type pkgReaderIndex struct {
pr *pkgReader
idx int
idx pkgbits.Index
dict *readerDict
}

Expand All @@ -62,7 +62,7 @@ func (pri pkgReaderIndex) asReader(k pkgbits.RelocKind, marker pkgbits.SyncMarke
return r
}

func (pr *pkgReader) newReader(k pkgbits.RelocKind, idx int, marker pkgbits.SyncMarker) *reader {
func (pr *pkgReader) newReader(k pkgbits.RelocKind, idx pkgbits.Index, marker pkgbits.SyncMarker) *reader {
return &reader{
Decoder: pr.NewDecoder(k, idx, marker),
p: pr,
Expand Down Expand Up @@ -182,7 +182,7 @@ func (r *reader) posBase() *src.PosBase {
return r.inlPosBase(r.p.posBaseIdx(r.Reloc(pkgbits.RelocPosBase)))
}

func (pr *pkgReader) posBaseIdx(idx int) *src.PosBase {
func (pr *pkgReader) posBaseIdx(idx pkgbits.Index) *src.PosBase {
if b := pr.posBases[idx]; b != nil {
return b
}
Expand Down Expand Up @@ -266,7 +266,7 @@ func (r *reader) pkg() *types.Pkg {
return r.p.pkgIdx(r.Reloc(pkgbits.RelocPkg))
}

func (pr *pkgReader) pkgIdx(idx int) *types.Pkg {
func (pr *pkgReader) pkgIdx(idx pkgbits.Index) *types.Pkg {
if pkg := pr.pkgs[idx]; pkg != nil {
return pkg
}
Expand Down Expand Up @@ -322,7 +322,7 @@ func (r *reader) typWrapped(wrapped bool) *types.Type {
func (r *reader) typInfo() typeInfo {
r.Sync(pkgbits.SyncType)
if r.Bool() {
return typeInfo{idx: r.Len(), derived: true}
return typeInfo{idx: pkgbits.Index(r.Len()), derived: true}
}
return typeInfo{idx: r.Reloc(pkgbits.RelocType), derived: false}
}
Expand Down Expand Up @@ -573,7 +573,7 @@ func (r *reader) obj() ir.Node {
return r.p.objIdx(idx, implicits, explicits)
}

func (pr *pkgReader) objIdx(idx int, implicits, explicits []*types.Type) ir.Node {
func (pr *pkgReader) objIdx(idx pkgbits.Index, implicits, explicits []*types.Type) ir.Node {
rname := pr.newReader(pkgbits.RelocName, idx, pkgbits.SyncObject1)
_, sym := rname.qualifiedIdent()
tag := pkgbits.CodeObj(rname.Code(pkgbits.SyncCodeObj))
Expand Down Expand Up @@ -712,7 +712,7 @@ func (r *reader) mangle(sym *types.Sym) *types.Sym {
return sym.Pkg.Lookup(buf.String())
}

func (pr *pkgReader) objDictIdx(sym *types.Sym, idx int, implicits, explicits []*types.Type) *readerDict {
func (pr *pkgReader) objDictIdx(sym *types.Sym, idx pkgbits.Index, implicits, explicits []*types.Type) *readerDict {
r := pr.newReader(pkgbits.RelocObjDict, idx, pkgbits.SyncObject1)

var dict readerDict
Expand Down Expand Up @@ -757,7 +757,7 @@ func (pr *pkgReader) objDictIdx(sym *types.Sym, idx int, implicits, explicits []

dict.itabs = make([]itabInfo2, r.Len())
for i := range dict.itabs {
typ := pr.typIdx(typeInfo{idx: r.Len(), derived: true}, &dict, true)
typ := pr.typIdx(typeInfo{idx: pkgbits.Index(r.Len()), derived: true}, &dict, true)
ifaceInfo := r.typInfo()

var lsym *obj.LSym
Expand Down
10 changes: 5 additions & 5 deletions src/cmd/compile/internal/noder/unified.go
Expand Up @@ -257,14 +257,14 @@ func writeUnifiedExport(out io.Writer) {
l := linker{
pw: pkgbits.NewPkgEncoder(base.Debug.SyncFrames),

pkgs: make(map[string]int),
decls: make(map[*types.Sym]int),
pkgs: make(map[string]pkgbits.Index),
decls: make(map[*types.Sym]pkgbits.Index),
}

publicRootWriter := l.pw.NewEncoder(pkgbits.RelocMeta, pkgbits.SyncPublic)
assert(publicRootWriter.Idx == pkgbits.PublicRootIdx)

var selfPkgIdx int
var selfPkgIdx pkgbits.Index

{
pr := localPkgReader
Expand Down Expand Up @@ -294,11 +294,11 @@ func writeUnifiedExport(out io.Writer) {
}

{
var idxs []int
var idxs []pkgbits.Index
for _, idx := range l.decls {
idxs = append(idxs, idx)
}
sort.Ints(idxs)
sort.Slice(idxs, func(i, j int) bool { return idxs[i] < idxs[j] })

w := publicRootWriter

Expand Down

0 comments on commit 4e4db1e

Please sign in to comment.