1
0
mirror of https://github.com/golang/go synced 2024-11-23 01:30:02 -07:00

reflect: set dir when creating a channel via ChanOf

Fixes #9135

Change-Id: I4d0e4eb52a3d64262f107eb7eae4096a6e47ac08
Reviewed-on: https://go-review.googlesource.com/2238
Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
Michael Fraenkel 2015-01-01 21:38:12 -05:00 committed by Ian Lance Taylor
parent 1ebfb082a7
commit 48d63035ce
2 changed files with 21 additions and 0 deletions

View File

@ -3487,6 +3487,26 @@ func TestChanOf(t *testing.T) {
checkSameType(t, Zero(ChanOf(BothDir, TypeOf(T1(1)))).Interface(), (chan T1)(nil))
}
func TestChanOfDir(t *testing.T) {
// check construction and use of type not in binary
type T string
crt := ChanOf(RecvDir, TypeOf(T("")))
cst := ChanOf(SendDir, TypeOf(T("")))
// check that type already in binary is found
type T1 int
checkSameType(t, Zero(ChanOf(RecvDir, TypeOf(T1(1)))).Interface(), (<-chan T1)(nil))
checkSameType(t, Zero(ChanOf(SendDir, TypeOf(T1(1)))).Interface(), (chan<- T1)(nil))
// check String form of ChanDir
if crt.ChanDir().String() != "<-chan" {
t.Errorf("chan dir: have %q, want %q", crt.ChanDir().String(), "<-chan")
}
if cst.ChanDir().String() != "chan<-" {
t.Errorf("chan dir: have %q, want %q", cst.ChanDir().String(), "chan<-")
}
}
func TestChanOfGC(t *testing.T) {
done := make(chan bool, 1)
go func() {

View File

@ -1425,6 +1425,7 @@ func ChanOf(dir ChanDir, t Type) Type {
prototype := *(**chanType)(unsafe.Pointer(&ichan))
ch := new(chanType)
*ch = *prototype
ch.dir = uintptr(dir)
ch.string = &s
ch.hash = fnv1(typ.hash, 'c', byte(dir))
ch.elem = typ