]> Cypherpunks repositories - gostls13.git/commitdiff
go/types: don't print instance markers for type hashes
authorRobert Findley <rfindley@google.com>
Tue, 31 Aug 2021 21:59:05 +0000 (17:59 -0400)
committerRobert Findley <rfindley@google.com>
Tue, 31 Aug 2021 23:46:12 +0000 (23:46 +0000)
This is a port of CL 345891 to go/types.

Change-Id: I5abcb9c9c5110923a743f0c47d9b34b2baabab68
Reviewed-on: https://go-review.googlesource.com/c/go/+/346555
Trust: Robert Findley <rfindley@google.com>
Run-TryBot: Robert Findley <rfindley@google.com>
Reviewed-by: Robert Griesemer <gri@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>

src/go/types/subst.go
src/go/types/typestring.go

index 4be489e266c2ecf2bbf56fd84ffc0a306b78d969..f1bdbc34bd116d75e66aae5ab826f07970cdd8a6 100644 (file)
@@ -259,28 +259,23 @@ func (subst *subster) typ(typ Type) Type {
 var instanceHashing = 0
 
 func instantiatedHash(typ *Named, targs []Type) string {
+       var buf bytes.Buffer
+
        assert(instanceHashing == 0)
        instanceHashing++
-       var buf bytes.Buffer
        w := newTypeWriter(&buf, nil)
        w.typeName(typ.obj)
        w.typeList(targs)
        instanceHashing--
 
-       // With respect to the represented type, whether a
-       // type is fully expanded or stored as instance
-       // does not matter - they are the same types.
-       // Remove the instanceMarkers printed for instances.
-       res := buf.Bytes()
-       i := 0
-       for _, b := range res {
-               if b != instanceMarker {
-                       res[i] = b
-                       i++
+       if debug {
+               // there should be no instance markers in type hashes
+               for _, b := range buf.Bytes() {
+                       assert(b != instanceMarker)
                }
        }
 
-       return string(res[:i])
+       return buf.String()
 }
 
 // typOrNil is like typ but if the argument is nil it is replaced with Typ[Invalid].
index 45ed632335f7fa06562f24bcef7bb5214a0c81ea..46e749c84af06b73cb2621b7382e17e40b5f0186 100644 (file)
@@ -204,7 +204,11 @@ func (w *typeWriter) typ(typ Type) {
                }
 
        case *Named:
-               if t.instPos != nil {
+               // Instance markers indicate unexpanded instantiated
+               // types. Write them to aid debugging, but don't write
+               // them when we need an instance hash: whether a type
+               // is fully expanded or not doesn't matter for identity.
+               if instanceHashing == 0 && t.instPos != nil {
                        w.byte(instanceMarker)
                }
                w.typeName(t.obj)