int isnil(Node *n);
int isnilinter(Type *t);
int isptrto(Type *t, int et);
-int isselect(Node *n);
int isslice(Type *t);
int istype(Type *t, int et);
void linehist(char *file, int32 off, int relative);
return p[0] == '_' && p[1] == '\0';
}
-int
-isselect(Node *n)
-{
- Sym *s;
-
- if(n == N)
- return 0;
- n = n->left;
- s = pkglookup("selectsend", runtimepkg);
- if(s == n->sym)
- return 1;
- s = pkglookup("selectrecv", runtimepkg);
- if(s == n->sym)
- return 1;
- s = pkglookup("selectrecv2", runtimepkg);
- if(s == n->sym)
- return 1;
- s = pkglookup("selectdefault", runtimepkg);
- if(s == n->sym)
- return 1;
- return 0;
-}
-
int
isinter(Type *t)
{
ll = ascompatte(n->op, n->isddd, getinarg(t), n->list, 0, init);
n->list = reorder1(ll);
- if(isselect(n)) {
- // special prob with selectsend and selectrecv:
- // if chan is nil, they don't know big the channel
- // element is and therefore don't know how to find
- // the output bool, so we clear it before the call.
- Node *b;
- b = nodbool(0);
- typecheck(&b, Erv);
- lr = ascompatte(n->op, 0, getoutarg(t), list1(b), 0, init);
- n->list = concat(n->list, lr);
- }
goto ret;
case OCALLMETH:
void
runtime·selectsend(Select *sel, Hchan *c, void *elem, bool selected)
{
+ selected = false;
+ FLUSH(&selected);
+
// nil cases do not compete
if(c == nil)
return;
void
runtime·selectrecv(Select *sel, Hchan *c, void *elem, bool selected)
{
+ selected = false;
+ FLUSH(&selected);
+
// nil cases do not compete
if(c == nil)
return;
void
runtime·selectrecv2(Select *sel, Hchan *c, void *elem, bool *received, bool selected)
{
+ selected = false;
+ FLUSH(&selected);
+
// nil cases do not compete
if(c == nil)
return;
void
runtime·selectdefault(Select *sel, bool selected)
{
+ selected = false;
+ FLUSH(&selected);
+
selectdefault(sel, runtime·getcallerpc(&sel), (byte*)&selected - (byte*)&sel);
}