]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.typeparams] cmd/compile: don't export/import type parameter indices anymore
authorDan Scales <danscales@google.com>
Fri, 6 Aug 2021 23:29:09 +0000 (16:29 -0700)
committerDan Scales <danscales@google.com>
Sat, 7 Aug 2021 06:00:09 +0000 (06:00 +0000)
types2 now determines type parameter indices lazily, so we don't need
them just as we are importing. We set them in types1 as we are importing
the type param list itself.

type param indices are not strongly needed in types1 - we only use them
in one place which could be rewritten. But I kept them in analogy to
types2 (TypeParam.Index).

Fixes #47451

Change-Id: I30631f95c45a259354eaf7ec5194f71e799eb358
Reviewed-on: https://go-review.googlesource.com/c/go/+/340532
Run-TryBot: Dan Scales <danscales@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
Trust: Dan Scales <danscales@google.com>

src/cmd/compile/internal/importer/iimport.go
src/cmd/compile/internal/typecheck/iexport.go
src/cmd/compile/internal/typecheck/iimport.go
src/cmd/compile/internal/types/type.go

index 523b00313da619c328af44bda2fc57019ee059dd..99eb96441599e30131aaa302612f680401f3e37e 100644 (file)
@@ -364,10 +364,6 @@ func (r *importReader) obj(name string) {
                if r.p.exportVersion < iexportVersionGenerics {
                        errorf("unexpected type param type")
                }
-               // Type parameter indices are lazily "allocated".
-               // There's no need to export them anymore.
-               // TODO change the export format accordingly
-               _ = int(r.int64())
                name0, sub := parseSubscript(name)
                tn := types2.NewTypeName(pos, r.currPkg, name0, nil)
                t := (*types2.Checker)(nil).NewTypeParam(tn, nil)
index d877b03e4896206f588f1c285150c3fc4dfb778b..2944908bcbc74c009f200d1194c6c1ffc1f7a050 100644 (file)
@@ -531,7 +531,6 @@ func (p *iexporter) doDecl(n *ir.Name) {
                        // A typeparam has a name, and has a type bound rather
                        // than an underlying type.
                        w.pos(n.Pos())
-                       w.int64(int64(n.Type().Index()))
                        w.typ(n.Type().Bound())
                        break
                }
index 2957212fb2e8efee2c4449a1757d333a83942ae1..2e8b18c0b7cd335d846169e06e6f3f7618f078ce 100644 (file)
@@ -388,8 +388,9 @@ func (r *importReader) doDecl(sym *types.Sym) *ir.Name {
                        // this types2-to-types1 translation.
                        return sym.Def.(*ir.Name)
                }
-               index := int(r.int64())
-               t := types.NewTypeParam(sym, index)
+               // The typeparam index is set at the point where the containing type
+               // param list is imported.
+               t := types.NewTypeParam(sym, 0)
                // Nname needed to save the pos.
                nname := ir.NewDeclNameAt(pos, ir.OTYPE, sym)
                sym.Def = nname
@@ -875,6 +876,9 @@ func (r *importReader) typeList() []*types.Type {
        ts := make([]*types.Type, n)
        for i := range ts {
                ts[i] = r.typ()
+               if ts[i].IsTypeParam() {
+                       ts[i].SetIndex(i)
+               }
        }
        return ts
 }
@@ -887,6 +891,7 @@ func (r *importReader) tparamList() []*types.Field {
        fs := make([]*types.Field, n)
        for i := range fs {
                typ := r.typ()
+               typ.SetIndex(i)
                fs[i] = types.NewField(typ.Pos(), typ.Sym(), typ)
        }
        return fs
index 1f01498ca19fb49e66b094a6ea94624fdb5ad69a..099080f48f3c6aba98d217f77c302fc46fe170e0 100644 (file)
@@ -1885,6 +1885,12 @@ func (t *Type) Index() int {
        return t.Extra.(*Typeparam).index
 }
 
+// SetIndex sets the index of the type param within its param list.
+func (t *Type) SetIndex(i int) {
+       t.wantEtype(TTYPEPARAM)
+       t.Extra.(*Typeparam).index = i
+}
+
 // SetBound sets the bound of a typeparam.
 func (t *Type) SetBound(bound *Type) {
        t.wantEtype(TTYPEPARAM)