]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.typeparams] cmd/compile: factor out implicit/explicit handling
authorCuong Manh Le <cuong.manhle.vn@gmail.com>
Wed, 16 Jun 2021 03:29:21 +0000 (10:29 +0700)
committerCuong Manh Le <cuong.manhle.vn@gmail.com>
Wed, 16 Jun 2021 06:10:32 +0000 (06:10 +0000)
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>
src/cmd/compile/internal/noder/reader.go
src/cmd/compile/internal/noder/sync.go
src/cmd/compile/internal/noder/writer.go

index 18ecbff3ccffa436063076ffd4042668a87726b9..803acaa88dc3858794916f2ebe8385e80c9c1d9e 100644 (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
 
index d77a78447984246a03d20874ad3915466a41c66c..7326a6edbeff0db62d9b5a2373ca5d8cd0ce1763 100644 (file)
@@ -151,4 +151,5 @@ const (
        syncLocalIdent
        syncTypeParamNames
        syncTypeParamBounds
+       syncImplicitTypes
 )
index b39dd8651b3f8640ff124e042914f531c94b6e44..1475540d84ca7d38b0d15d02fb9941f385b9a527 100644 (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 {