dump("fn", fn->nbody);
}
+int
+isselect(Node *n)
+{
+ Sym *s;
+
+ if(n == N)
+ return 0;
+ n = n->left;
+ s = pkglookup("selectsend", "sys");
+ if(s == n->sym)
+ return 1;
+ s = pkglookup("selectrecv", "sys");
+ if(s == n->sym)
+ return 1;
+ return 0;
+}
+
void
walktype(Node *n, int top)
{
case OCALL:
l = ascompatte(n->op, getinarg(t), &n->right, 0);
n->right = reorder1(l);
+ if(isselect(n)) {
+ // clear output bool - special prob with selectsend
+ r = ascompatte(n->op, getoutarg(t), &boolfalse, 0);
+ n->right = list(n->right, r);
+ }
break;
case OCALLMETH:
l = ascompatte(n->op, getinarg(t), &n->right, 0);
r = ascompatte(n->op, getthis(t), &n->left->left, 0);
- if(l != N)
- r = list(r, l);
+ l = list(r, l);
n->left->left = N;
ullmancalc(n->left);
- n->right = reorder1(r);
+ n->right = reorder1(l);
break;
}
goto ret;
{
Node *a, *r, *on, *c;
Type *t;
+ Iter iter;
c = n->left;
if(c->op == ORECV)
a = var; // sel-var
r = list(a, r);
- a = nod(OCALL, on, r);
- r = nod(OIF, N, N);
- r->ntest = a;
-
- return r;
+ goto out;
recv:
walktype(c->left, Elv); // elem
a = var; // sel-var
r = list(a, r);
+out:
a = nod(OCALL, on, r);
r = nod(OIF, N, N);
r->ntest = a;
return r;
-
}
void
{
int32 i, eo;
Scase *cas;
- byte *as, *ae;
+ byte *ae;
// nil cases do not compete
if(c == nil)
ae = (byte*)&sel + eo;
c->elemalg->copy(c->elemsize, cas->u.elem, ae);
- as = (byte*)&sel + cas->so;
- *as = false;
-
if(debug) {
prints("newselect s=");
sys·printpointer(sel);
{
int32 i, epo;
Scase *cas;
- byte *as;
// nil cases do not compete
if(c == nil)
cas->send = 0;
cas->u.elemp = *(byte**)((byte*)&sel + epo);
- as = (byte*)&sel + cas->so;
- *as = false;
-
if(debug) {
prints("newselect s=");
sys·printpointer(sel);