diff options
| author | Mark Freeman <mark@golang.org> | 2026-04-01 15:37:39 -0400 |
|---|---|---|
| committer | Mark Freeman <mark@golang.org> | 2026-04-03 10:09:56 -0700 |
| commit | ae1edbeb2f77c8242ab7adf57b2449ae4740544d (patch) | |
| tree | 9749bce93a54f3eb24c99f3064806fd4528e8764 /src/cmd/compile/internal/noder/reader.go | |
| parent | 330aec810997f89262fa04939a00425194e94216 (diff) | |
| download | go-ae1edbeb2f77c8242ab7adf57b2449ae4740544d.tar.xz | |
cmd/compile/internal/noder: decode generic methods and pipe receivers
Change-Id: I7a66fba400a743f4ef2fb989cd8e74e955e22b0f
Reviewed-on: https://go-review.googlesource.com/c/go/+/762020
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Mark Freeman <markfreeman@google.com>
Reviewed-by: Robert Griesemer <gri@google.com>
Diffstat (limited to 'src/cmd/compile/internal/noder/reader.go')
| -rw-r--r-- | src/cmd/compile/internal/noder/reader.go | 38 |
1 files changed, 30 insertions, 8 deletions
diff --git a/src/cmd/compile/internal/noder/reader.go b/src/cmd/compile/internal/noder/reader.go index ebb5043a05..e0545a86db 100644 --- a/src/cmd/compile/internal/noder/reader.go +++ b/src/cmd/compile/internal/noder/reader.go @@ -784,14 +784,22 @@ func (pr *pkgReader) objIdxMayFail(idx index, implicits, explicits []*types.Type return name, nil case pkgbits.ObjFunc: - if sym.Name == "init" { - sym = Renameinit() - } - npos := r.pos() setBasePos(npos) + + var sel *types.Sym + var recv *types.Field + if r.Version().Has(pkgbits.GenericMethods) && r.Bool() { + sel = r.selector() + r.recvTypeParamNames() + recv = r.param() + } else { + if sym.Name == "init" { + sym = Renameinit() + } + } r.typeParamNames() - typ := r.signature(nil) + typ := r.signature(recv) fpos := r.pos() fn := ir.NewFunc(fpos, npos, sym, typ) @@ -819,7 +827,7 @@ func (pr *pkgReader) objIdxMayFail(idx index, implicits, explicits []*types.Type } } - rext.funcExt(name, nil) + rext.funcExt(name, sel) return name, nil case pkgbits.ObjType: @@ -1021,7 +1029,11 @@ func (pr *pkgReader) objDictIdx(sym *types.Sym, idx index, implicits, explicits } nimplicits := r.Len() - nexplicits := r.Len() + nreceivers := 0 + if r.Version().Has(pkgbits.GenericMethods) { + nreceivers = r.Len() + } + nexplicits := r.Len() + nreceivers if nimplicits > len(implicits) || nexplicits != len(explicits) { return nil, fmt.Errorf("%v has %v+%v params, but instantiated with %v+%v args", sym, nimplicits, nexplicits, len(implicits), len(explicits)) @@ -1029,6 +1041,7 @@ func (pr *pkgReader) objDictIdx(sym *types.Sym, idx index, implicits, explicits dict.targs = append(implicits[:nimplicits:nimplicits], explicits...) dict.implicits = nimplicits + dict.receivers = nreceivers // Within the compiler, we can just skip over the type parameters. for range dict.targs[dict.implicits:] { @@ -1095,10 +1108,19 @@ func (pr *pkgReader) objDictIdx(sym *types.Sym, idx index, implicits, explicits return &dict, nil } +func (r *reader) recvTypeParamNames() { + r.Sync(pkgbits.SyncTypeParamNames) + + for range r.dict.targs[r.dict.implicits : r.dict.implicits+r.dict.receivers] { + r.pos() + r.localIdent() + } +} + func (r *reader) typeParamNames() { r.Sync(pkgbits.SyncTypeParamNames) - for range r.dict.targs[r.dict.implicits:] { + for range r.dict.targs[r.dict.implicits+r.dict.receivers:] { r.pos() r.localIdent() } |
