]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: unified IR support for implicit interfaces
authorMatthew Dempsky <mdempsky@google.com>
Wed, 2 Feb 2022 01:41:46 +0000 (17:41 -0800)
committerMatthew Dempsky <mdempsky@google.com>
Tue, 1 Mar 2022 07:36:46 +0000 (07:36 +0000)
Change-Id: Ibdaa0750f7bc47b513c047fdf4b7145ebba9e870
Reviewed-on: https://go-review.googlesource.com/c/go/+/386001
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: David Chase <drchase@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Trust: Matthew Dempsky <mdempsky@google.com>

src/cmd/compile/internal/noder/reader.go
src/cmd/compile/internal/noder/reader2.go
src/cmd/compile/internal/noder/writer.go

index 82add23abdc35ae0f2e4ff3fadd6d3072725f554..e97cf4e6b6a6ddbf08d8f5e7ab2fcf183f54dcd0 100644 (file)
@@ -449,6 +449,8 @@ func (r *reader) interfaceType() *types.Type {
        tpkg := types.LocalPkg // TODO(mdempsky): Remove after iexport is gone.
 
        nmethods, nembeddeds := r.Len(), r.Len()
+       implicit := nmethods == 0 && nembeddeds == 1 && r.Bool()
+       assert(!implicit) // implicit interfaces only appear in constraints
 
        fields := make([]*types.Field, nmethods+nembeddeds)
        methods, embeddeds := fields[:nmethods], fields[nmethods:]
index a8960fdbec032340300500e8ff965e95caf0da02..8d1f9087a503c7261c2f74761bf3028f75b9ba0c 100644 (file)
@@ -295,6 +295,7 @@ func (r *reader2) unionType() *types2.Union {
 func (r *reader2) interfaceType() *types2.Interface {
        methods := make([]*types2.Func, r.Len())
        embeddeds := make([]types2.Type, r.Len())
+       implicit := len(methods) == 0 && len(embeddeds) == 1 && r.Bool()
 
        for i := range methods {
                pos := r.pos()
@@ -307,7 +308,11 @@ func (r *reader2) interfaceType() *types2.Interface {
                embeddeds[i] = r.typ()
        }
 
-       return types2.NewInterfaceType(methods, embeddeds)
+       iface := types2.NewInterfaceType(methods, embeddeds)
+       if implicit {
+               iface.MarkImplicit()
+       }
+       return iface
 }
 
 func (r *reader2) signature(recv *types2.Var, rtparams, tparams []*types2.TypeParam) *types2.Signature {
index 432a2a719521ff044fbcff71829f7c267e5d0e31..59e9409b97d505dfdf30047a8473bbc73caa7c99 100644 (file)
@@ -396,6 +396,15 @@ func (w *writer) interfaceType(typ *types2.Interface) {
        w.Len(typ.NumExplicitMethods())
        w.Len(typ.NumEmbeddeds())
 
+       if typ.NumExplicitMethods() == 0 && typ.NumEmbeddeds() == 1 {
+               w.Bool(typ.IsImplicit())
+       } else {
+               // Implicit interfaces always have 0 explicit methods and 1
+               // embedded type, so we skip writing out the implicit flag
+               // otherwise as a space optimization.
+               assert(!typ.IsImplicit())
+       }
+
        for i := 0; i < typ.NumExplicitMethods(); i++ {
                m := typ.ExplicitMethod(i)
                sig := m.Type().(*types2.Signature)