Skip to content
This repository has been archived by the owner on May 2, 2018. It is now read-only.

Commit

Permalink
cmd/compile: simplify typehash
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
mdempsky committed Mar 17, 2016
1 parent f6bca3f commit d447613
Showing 1 changed file with 7 additions and 22 deletions.
29 changes: 7 additions & 22 deletions src/cmd/compile/internal/gc/subr.go
Original file line number Diff line number Diff line change
Expand Up @@ -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])
}
Expand Down

0 comments on commit d447613

Please sign in to comment.