From d44761387516ceaac00f00bc19417495d23cf7e3 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Thu, 17 Mar 2016 01:39:59 -0700 Subject: [PATCH] cmd/compile: simplify typehash We never need a type hash for a method type, so skip trying to overwrite Thistuple. Change-Id: I8de6480ba5fd321dfa134facf7661461d298840e Reviewed-on: https://go-review.googlesource.com/20795 Reviewed-by: Russ Cox --- src/cmd/compile/internal/gc/subr.go | 29 +++++++---------------------- 1 file changed, 7 insertions(+), 22 deletions(-) diff --git a/src/cmd/compile/internal/gc/subr.go b/src/cmd/compile/internal/gc/subr.go index 126959b2c1..26d45700e5 100644 --- a/src/cmd/compile/internal/gc/subr.go +++ b/src/cmd/compile/internal/gc/subr.go @@ -1219,30 +1219,15 @@ func syslook(name string) *Node { return s.Def } -// compute a hash value for type t. -// if t is a method type, ignore the receiver -// so that the hash can be used in interface checks. -// %T already contains -// all the necessary logic to generate a representation -// of the type that completely describes it. -// using smprint here avoids duplicating that code. -// using md5 here is overkill, but i got tired of -// accidental collisions making the runtime think -// two types are equal when they really aren't. +// typehash computes a hash value for type t to use in type switch +// statements. func typehash(t *Type) uint32 { - var p string + // Tconv already contains all the necessary logic to generate + // a representation that completely describes the type, so using + // it here avoids duplicating that code. + p := Tconv(t, FmtLeft|FmtUnsigned) - if t.Thistuple != 0 { - // hide method receiver from Tpretty - t.Thistuple = 0 - - p = Tconv(t, FmtLeft|FmtUnsigned) - t.Thistuple = 1 - } else { - p = Tconv(t, FmtLeft|FmtUnsigned) - } - - //print("typehash: %s\n", p); + // Using MD5 is overkill, but reduces accidental collisions. h := md5.Sum([]byte(p)) return binary.LittleEndian.Uint32(h[:4]) } -- 2.48.1