]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: clarify that itab.hash of dynamic entries is unused
authorDmitry Vyukov <dvyukov@google.com>
Tue, 22 Oct 2019 12:20:51 +0000 (14:20 +0200)
committerDmitry Vyukov <dvyukov@google.com>
Wed, 6 Nov 2019 09:08:53 +0000 (09:08 +0000)
The hash is used in type switches. However, compiler statically generates itab's
for all interface/type pairs used in switches (which are added to itabTable
in itabsinit). The dynamically-generated itab's never participate in type switches,
and thus the hash is irrelevant.

Change-Id: I4f6e37be31b8f5605cca7a1806cb04708e948cea
Reviewed-on: https://go-review.googlesource.com/c/go/+/202448
Run-TryBot: Dmitry Vyukov <dvyukov@google.com>
Reviewed-by: Keith Randall <khr@golang.org>
src/runtime/iface.go

index 243e51fc480021955e6a6abfd9f8fa20258ff82d..05de282aa758eab136e5fd7c88caf15ee675a19b 100644 (file)
@@ -66,6 +66,12 @@ func getitab(inter *interfacetype, typ *_type, canfail bool) *itab {
        m = (*itab)(persistentalloc(unsafe.Sizeof(itab{})+uintptr(len(inter.mhdr)-1)*sys.PtrSize, 0, &memstats.other_sys))
        m.inter = inter
        m._type = typ
+       // The hash is used in type switches. However, compiler statically generates itab's
+       // for all interface/type pairs used in switches (which are added to itabTable
+       // in itabsinit). The dynamically-generated itab's never participate in type switches,
+       // and thus the hash is irrelevant.
+       // Note: m.hash is _not_ the hash used for the runtime itabTable hash table.
+       m.hash = 0
        m.init()
        itabAdd(m)
        unlock(&itabLock)
@@ -233,7 +239,6 @@ imethods:
                return iname
        }
        m.fun[0] = uintptr(fun0)
-       m.hash = typ.hash
        return ""
 }