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:
parent
cf1ae5fc36
commit
ee0420d3b5
@ -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
|
||||
|
||||
|
@ -151,4 +151,5 @@ const (
|
||||
syncLocalIdent
|
||||
syncTypeParamNames
|
||||
syncTypeParamBounds
|
||||
syncImplicitTypes
|
||||
)
|
||||
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user