finish ChanValue: Len and Cap.
R=r
DELTA=45 (45 added, 0 deleted, 0 changed)
OCL=33873
CL=33881
diff --git a/src/pkg/reflect/all_test.go b/src/pkg/reflect/all_test.go
index 3a1c220..2a30ddd 100644
--- a/src/pkg/reflect/all_test.go
+++ b/src/pkg/reflect/all_test.go
@@ -757,6 +757,17 @@
if cv.TryRecv() != nil {
t.Errorf("TryRecv on sync chan succeeded");
}
+
+ // len/cap
+ cv = MakeChan(Typeof(c).(*ChanType), 10);
+ c = cv.Interface().(chan int);
+ for i := 0; i < 3; i++ {
+ c <- i;
+ }
+ if l, m := cv.Len(), cv.Cap(); l != len(c) || m != cap(c) {
+ t.Errorf("Len/Cap = %d/%d want %d/%d", l, m, len(c), cap(c));
+ }
+
}
// Difficult test for function call because of
diff --git a/src/pkg/reflect/value.go b/src/pkg/reflect/value.go
index daa3f11..014ea93 100644
--- a/src/pkg/reflect/value.go
+++ b/src/pkg/reflect/value.go
@@ -636,6 +636,8 @@
func chanrecv(ch, val *byte, pres *bool)
func chanclosed(ch *byte) bool
func chanclose(ch *byte)
+func chanlen(ch *byte) int32
+func chancap(ch *byte) int32
// Closed returns the result of closed(c) on the underlying channel.
func (v *ChanValue) Closed() bool {
@@ -649,6 +651,16 @@
chanclose(ch);
}
+func (v *ChanValue) Len() int {
+ ch := *(**byte)(v.addr);
+ return int(chanlen(ch));
+}
+
+func (v *ChanValue) Cap() int {
+ ch := *(**byte)(v.addr);
+ return int(chancap(ch));
+}
+
// internal send; non-blocking if b != nil
func (v *ChanValue) send(x Value, b *bool) {
t := v.Type().(*ChanType);
diff --git a/src/pkg/runtime/chan.c b/src/pkg/runtime/chan.c
index 00d0207..46cf18a 100644
--- a/src/pkg/runtime/chan.c
+++ b/src/pkg/runtime/chan.c
@@ -917,6 +917,18 @@
return (c->closed & Rclosed) != 0;
}
+int32
+chanlen(Hchan *c)
+{
+ return c->qcount;
+}
+
+int32
+chancap(Hchan *c)
+{
+ return c->dataqsiz;
+}
+
// closedchan(sel *byte) bool;
void
diff --git a/src/pkg/runtime/reflect.cgo b/src/pkg/runtime/reflect.cgo
index 81c1d4a..7406e9b 100644
--- a/src/pkg/runtime/reflect.cgo
+++ b/src/pkg/runtime/reflect.cgo
@@ -86,6 +86,14 @@
r = chanclosed((Hchan*)ch);
}
+func chanlen(ch *byte) (r int32) {
+ r = chanlen((Hchan*)ch);
+}
+
+func chancap(ch *byte) (r int32) {
+ r = chancap((Hchan*)ch);
+}
+
/*
* Go wrappers around the functions in iface.c
diff --git a/src/pkg/runtime/runtime.h b/src/pkg/runtime/runtime.h
index 1e89a45..d4936af 100644
--- a/src/pkg/runtime/runtime.h
+++ b/src/pkg/runtime/runtime.h
@@ -493,5 +493,7 @@
void chanrecv(Hchan*, void*, bool*);
void chanclose(Hchan*);
bool chanclosed(Hchan*);
+int32 chanlen(Hchan*);
+int32 chancap(Hchan*);
void ifaceE2I(struct InterfaceType*, Eface, Iface*);