1
0
mirror of https://github.com/golang/go synced 2024-11-22 20:24:47 -07:00

[dev.typeparams] cmd/compile: factor out implicit/explicit handling

The logic for handling them must keep in sync between reader/writer, so
factoring them out from addBody make it's easier to refer later.

Change-Id: I26447065867d79f4f47cc678a398b9e7bf5d2403
Reviewed-on: https://go-review.googlesource.com/c/go/+/328051
Trust: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
Cuong Manh Le 2021-06-16 10:29:21 +07:00
parent cf1ae5fc36
commit ee0420d3b5
3 changed files with 21 additions and 6 deletions

View File

@ -789,18 +789,25 @@ var bodyReader = map[*ir.Func]pkgReaderIndex{}
// constructed.
var todoBodies []*ir.Func
func (r *reader) addBody(fn *ir.Func) {
r.sync(syncAddBody)
// Keep in sync with writer.implicitTypes
// Also see comment there for why r.implicits and r.explicits should
// never both be non-empty.
func (r *reader) implicitTypes() []*types.Type {
r.sync(syncImplicitTypes)
// See commont in writer.addBody for why r.implicits and r.explicits
// should never both be non-empty.
implicits := r.implicits
if len(implicits) == 0 {
implicits = r.explicits
} else {
assert(len(r.explicits) == 0)
}
return implicits
}
func (r *reader) addBody(fn *ir.Func) {
r.sync(syncAddBody)
implicits := r.implicitTypes()
pri := pkgReaderIndex{r.p, r.reloc(relocBody), implicits}
bodyReader[fn] = pri

View File

@ -151,4 +151,5 @@ const (
syncLocalIdent
syncTypeParamNames
syncTypeParamBounds
syncImplicitTypes
)

View File

@ -665,7 +665,9 @@ func (w *writer) pragmaFlag(p ir.PragmaFlag) {
// @@@ Function bodies
func (w *writer) addBody(sig *types2.Signature, block *syntax.BlockStmt, localsIdx map[types2.Object]int) {
func (w *writer) implicitTypes() map[*types2.TypeParam]int {
w.sync(syncImplicitTypes)
// TODO(mdempsky): Theoretically, I think at this point we want to
// extend the implicit type parameters list with any new explicit
// type parameters.
@ -684,9 +686,14 @@ func (w *writer) addBody(sig *types2.Signature, block *syntax.BlockStmt, localsI
} else {
assert(len(w.explicitIdx) == 0)
}
return implicitIdx
}
func (w *writer) addBody(sig *types2.Signature, block *syntax.BlockStmt, localsIdx map[types2.Object]int) {
w.sync(syncAddBody)
w.reloc(relocBody, w.p.bodyIdx(w.p.curpkg, sig, block, implicitIdx, localsIdx))
implicits := w.implicitTypes()
w.reloc(relocBody, w.p.bodyIdx(w.p.curpkg, sig, block, implicits, localsIdx))
}
func (pw *pkgWriter) bodyIdx(pkg *types2.Package, sig *types2.Signature, block *syntax.BlockStmt, implicitIdx map[*types2.TypeParam]int, localsIdx map[types2.Object]int) int {