mirror of
https://github.com/golang/go
synced 2024-09-04 23:44:16 +00: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.
|
// constructed.
|
||||||
var todoBodies []*ir.Func
|
var todoBodies []*ir.Func
|
||||||
|
|
||||||
func (r *reader) addBody(fn *ir.Func) {
|
// Keep in sync with writer.implicitTypes
|
||||||
r.sync(syncAddBody)
|
// 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
|
implicits := r.implicits
|
||||||
if len(implicits) == 0 {
|
if len(implicits) == 0 {
|
||||||
implicits = r.explicits
|
implicits = r.explicits
|
||||||
} else {
|
} else {
|
||||||
assert(len(r.explicits) == 0)
|
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}
|
pri := pkgReaderIndex{r.p, r.reloc(relocBody), implicits}
|
||||||
bodyReader[fn] = pri
|
bodyReader[fn] = pri
|
||||||
|
|
||||||
|
|
|
@ -151,4 +151,5 @@ const (
|
||||||
syncLocalIdent
|
syncLocalIdent
|
||||||
syncTypeParamNames
|
syncTypeParamNames
|
||||||
syncTypeParamBounds
|
syncTypeParamBounds
|
||||||
|
syncImplicitTypes
|
||||||
)
|
)
|
||||||
|
|
|
@ -665,7 +665,9 @@ func (w *writer) pragmaFlag(p ir.PragmaFlag) {
|
||||||
|
|
||||||
// @@@ Function bodies
|
// @@@ 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
|
// TODO(mdempsky): Theoretically, I think at this point we want to
|
||||||
// extend the implicit type parameters list with any new explicit
|
// extend the implicit type parameters list with any new explicit
|
||||||
// type parameters.
|
// type parameters.
|
||||||
|
@ -684,9 +686,14 @@ func (w *writer) addBody(sig *types2.Signature, block *syntax.BlockStmt, localsI
|
||||||
} else {
|
} else {
|
||||||
assert(len(w.explicitIdx) == 0)
|
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.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 {
|
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 a new issue