diff options
author | Dave Cheney <dave@cheney.net> | 2014-07-18 16:30:38 +1000 |
---|---|---|
committer | Dave Cheney <dave@cheney.net> | 2014-07-18 16:30:38 +1000 |
commit | ca66322e6f510d19ff89f39a7e538fd9b80c0e62 (patch) | |
tree | df16a6dca8bc9d298cbf883e46796137c39d6f23 /src/pkg/runtime/hashmap.go | |
parent | 790269be8a9d7dbba42415cbd21e4278c937a104 (diff) | |
download | go-ca66322e6f510d19ff89f39a7e538fd9b80c0e62.tar.gz |
runtime: add throwgo
Fixes issue 8380.
Also update hashmap.go to use throwgo rather than panic.
LGTM=khr
R=khr, rsc
CC=golang-codereviews
https://codereview.appspot.com/115860045
Diffstat (limited to 'src/pkg/runtime/hashmap.go')
-rw-r--r-- | src/pkg/runtime/hashmap.go | 28 |
1 files changed, 13 insertions, 15 deletions
diff --git a/src/pkg/runtime/hashmap.go b/src/pkg/runtime/hashmap.go index a2d5cf8e3..4cd61f3bd 100644 --- a/src/pkg/runtime/hashmap.go +++ b/src/pkg/runtime/hashmap.go @@ -153,9 +153,8 @@ func evacuated(b *bmap) bool { } func makemap(t *maptype, hint int64) *hmap { - if unsafe.Sizeof(hmap{}) > 48 { - panic("hmap too large") + throwgo("hmap too large") } if hint < 0 || int64(int32(hint)) != hint { @@ -164,7 +163,7 @@ func makemap(t *maptype, hint int64) *hmap { } if !ismapkey(t.key) { - panic("runtime.makemap: unsupported map key type") + throwgo("runtime.makemap: unsupported map key type") } flags := uint32(0) @@ -182,32 +181,31 @@ func makemap(t *maptype, hint int64) *hmap { } bucketsize := dataOffset + bucketCnt*(keysize+valuesize) if bucketsize != uintptr(t.bucket.size) { - panic("bucketsize wrong") + throwgo("bucketsize wrong") } // invariants we depend on. We should probably check these at compile time // somewhere, but for now we'll do it here. - // TODO: make these throw(), not panic() if t.key.align > bucketCnt { - panic("key align too big") + throwgo("key align too big") } if t.elem.align > bucketCnt { - panic("value align too big") + throwgo("value align too big") } if uintptr(t.key.size)%uintptr(t.key.align) != 0 { - panic("key size not a multiple of key align") + throwgo("key size not a multiple of key align") } if uintptr(t.elem.size)%uintptr(t.elem.align) != 0 { - panic("value size not a multiple of value align") + throwgo("value size not a multiple of value align") } if bucketCnt < 8 { - panic("bucketsize too small for proper alignment") + throwgo("bucketsize too small for proper alignment") } if dataOffset%uintptr(t.key.align) != 0 { - panic("need padding in bucket (key)") + throwgo("need padding in bucket (key)") } if dataOffset%uintptr(t.elem.align) != 0 { - panic("need padding in bucket (value)") + throwgo("need padding in bucket (value)") } // find size parameter which will hold the requested # of elements @@ -570,7 +568,7 @@ func mapiterinit(t *maptype, h *hmap, it *hiter) { } if unsafe.Sizeof(hiter{})/ptrSize != 10 { - panic("hash_iter size incorrect") // see ../../cmd/gc/reflect.c + throwgo("hash_iter size incorrect") // see ../../cmd/gc/reflect.c } it.t = t it.h = h @@ -738,7 +736,7 @@ next: func hashGrow(t *maptype, h *hmap) { if h.oldbuckets != nil { - panic("evacuation not done in time") + throwgo("evacuation not done in time") } oldbuckets := h.buckets if checkgc { @@ -798,7 +796,7 @@ func evacuate(t *maptype, h *hmap, oldbucket uintptr) { continue } if top < minTopHash { - panic("bad map state") + throwgo("bad map state") } k2 := k if h.flags&indirectKey != 0 { |