]> Cypherpunks repositories - gostls13.git/commitdiff
finish ChanValue: Len and Cap.
authorRuss Cox <rsc@golang.org>
Wed, 26 Aug 2009 19:42:22 +0000 (12:42 -0700)
committerRuss Cox <rsc@golang.org>
Wed, 26 Aug 2009 19:42:22 +0000 (12:42 -0700)
R=r
DELTA=45  (45 added, 0 deleted, 0 changed)
OCL=33873
CL=33881

src/pkg/reflect/all_test.go
src/pkg/reflect/value.go
src/pkg/runtime/chan.c
src/pkg/runtime/reflect.cgo
src/pkg/runtime/runtime.h

index 3a1c220daf780d79143b2b67177df9f7b353b053..2a30ddd87589904319a0ceb28062b57f9af8db00 100644 (file)
@@ -757,6 +757,17 @@ func TestChan(t *testing.T) {
        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
index daa3f11baaa3646b1e0397bea8e38397334b429d..014ea933c6eee215fd053fa2684b7d3521ca8f67 100644 (file)
@@ -636,6 +636,8 @@ func chansend(ch, val *byte, pres *bool)
 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 @@ func (v *ChanValue) Close() {
        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);
index 00d0207493a8bf135bf4df145eabefe70d81ff23..46cf18a1872a9130957b00394237c61cd3f06f42 100644 (file)
@@ -917,6 +917,18 @@ chanclosed(Hchan *c)
        return (c->closed & Rclosed) != 0;
 }
 
+int32
+chanlen(Hchan *c)
+{
+       return c->qcount;
+}
+
+int32
+chancap(Hchan *c)
+{
+       return c->dataqsiz;
+}
+
 
 // closedchan(sel *byte) bool;
 void
index 81c1d4a12309299a89b92c2dbbb04c96d13e1ec3..7406e9bc39af82d66cda3c443cfa8735c58fa75c 100644 (file)
@@ -86,6 +86,14 @@ func chanclosed(ch *byte) (r bool) {
        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
index 1e89a4578056b47553926712d8ccd21e0cb30c97..d4936afa306c9357066d88c894518d41dbee82ac 100644 (file)
@@ -493,5 +493,7 @@ void        chansend(Hchan*, void*, bool*);
 void   chanrecv(Hchan*, void*, bool*);
 void   chanclose(Hchan*);
 bool   chanclosed(Hchan*);
+int32  chanlen(Hchan*);
+int32  chancap(Hchan*);
 
 void   ifaceE2I(struct InterfaceType*, Eface, Iface*);