From: Keith Randall Date: Thu, 7 Aug 2014 19:33:20 +0000 (-0700) Subject: runtime: test distribution of interface hashes. X-Git-Tag: go1.4beta1~886 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=3d7e3691207fd9dabfe12a560ecac473e7e59737;p=gostls13.git runtime: test distribution of interface hashes. LGTM=dvyukov R=dvyukov, khr CC=golang-codereviews https://golang.org/cl/121030043 --- diff --git a/src/pkg/runtime/alg.go b/src/pkg/runtime/alg.go index f2bb202c68..ea4156f1ed 100644 --- a/src/pkg/runtime/alg.go +++ b/src/pkg/runtime/alg.go @@ -163,3 +163,13 @@ func int32Hash(i uint32, seed uintptr) uintptr { func int64Hash(i uint64, seed uintptr) uintptr { return goalg(&algarray[alg_MEM64]).hash(noescape(unsafe.Pointer(&i)), 8, seed) } + +func efaceHash(i interface{}, seed uintptr) uintptr { + return goalg(&algarray[alg_NILINTER]).hash(noescape(unsafe.Pointer(&i)), unsafe.Sizeof(i), seed) +} + +func ifaceHash(i interface { + F() +}, seed uintptr) uintptr { + return goalg(&algarray[alg_INTER]).hash(noescape(unsafe.Pointer(&i)), unsafe.Sizeof(i), seed) +} diff --git a/src/pkg/runtime/export_test.go b/src/pkg/runtime/export_test.go index 01b47e17af..32c34aade6 100644 --- a/src/pkg/runtime/export_test.go +++ b/src/pkg/runtime/export_test.go @@ -76,6 +76,8 @@ var StringHash = stringHash var BytesHash = bytesHash var Int32Hash = int32Hash var Int64Hash = int64Hash +var EfaceHash = efaceHash +var IfaceHash = ifaceHash var HashLoad = &hashLoad diff --git a/src/pkg/runtime/hash_test.go b/src/pkg/runtime/hash_test.go index 1c11e0538d..41fff98eb0 100644 --- a/src/pkg/runtime/hash_test.go +++ b/src/pkg/runtime/hash_test.go @@ -344,6 +344,64 @@ func (k *Int64Key) name() string { return "int64" } +type EfaceKey struct { + i interface{} +} + +func (k *EfaceKey) clear() { + k.i = nil +} +func (k *EfaceKey) random(r *rand.Rand) { + k.i = uint64(r.Int63()) +} +func (k *EfaceKey) bits() int { + // use 64 bits. This tests inlined interfaces + // on 64-bit targets and indirect interfaces on + // 32-bit targets. + return 64 +} +func (k *EfaceKey) flipBit(i int) { + k.i = k.i.(uint64) ^ uint64(1)<