]> Cypherpunks repositories - gostls13.git/commitdiff
select
authorKen Thompson <ken@golang.org>
Sun, 27 Jul 2008 18:42:52 +0000 (11:42 -0700)
committerKen Thompson <ken@golang.org>
Sun, 27 Jul 2008 18:42:52 +0000 (11:42 -0700)
R=r
DELTA=29  (27 added, 1 deleted, 1 changed)
OCL=13503
CL=13503

src/cmd/gc/walk.c

index 45dc62dbbd0410b208784ed366aae65088dc2953..8a494f72e9bf5011f89642e47f1896792707a731 100644 (file)
@@ -974,13 +974,40 @@ selcase(Node *n, Node *var)
        goto out;
 
 recv:
-       walktype(c->left, Elv);         // elem
+       if(c->right != N)
+               goto recv2;
+
+       walktype(c->left, Erv);         // chan
+
+       t = fixchan(c->left->type);
+       if(t == T)
+               return;
+
+       // selectrecv(sel *byte, hchan *chan any, elem *any) (selected bool);
+       on = syslook("selectrecv", 1);
+       argtype(on, t->type);
+       argtype(on, t->type);
+
+       a = c->left;                    // nil elem
+       a = nod(OLITERAL, N, N);
+       a->val.ctype = CTNIL;
+       a->val.vval = 0;
+
+       r = a;
+       a = c->left;                    // chan
+       r = list(a, r);
+       a = var;                        // sel-var
+       r = list(a, r);
+       goto out;
+
+recv2: 
        walktype(c->right, Erv);        // chan
 
        t = fixchan(c->right->type);
        if(t == T)
                return;
 
+       walktype(c->left, Elv); // elem
        convlit(c->left, t->type);
        if(!ascompat(t->type, c->left->type)) {
                badtype(c->op, t->type, c->left->type);
@@ -1958,7 +1985,6 @@ chanop(Node *n, int top)
                r = a;
                a = n->left;                    // elem
                if(a == N) {
-                       a = nil;
                        a = nod(OLITERAL, N, N);
                        a->val.ctype = CTNIL;
                        a->val.vval = 0;