Commit cb584707 authored by Russ Cox's avatar Russ Cox

gc: remove non-blocking send, receive syntax

R=ken2
CC=golang-dev
https://golang.org/cl/4126043
parent f4e76d83
...@@ -66,10 +66,8 @@ char *runtimeimport = ...@@ -66,10 +66,8 @@ char *runtimeimport =
"func \"\".mapiter2 (hiter *any) (key any, val any)\n" "func \"\".mapiter2 (hiter *any) (key any, val any)\n"
"func \"\".makechan (elem *uint8, hint int64) chan any\n" "func \"\".makechan (elem *uint8, hint int64) chan any\n"
"func \"\".chanrecv1 (hchan <-chan any) any\n" "func \"\".chanrecv1 (hchan <-chan any) any\n"
"func \"\".chanrecv2 (hchan <-chan any) (elem any, pres bool)\n"
"func \"\".chanrecv3 (hchan <-chan any) (elem any, closed bool)\n" "func \"\".chanrecv3 (hchan <-chan any) (elem any, closed bool)\n"
"func \"\".chansend1 (hchan chan<- any, elem any)\n" "func \"\".chansend1 (hchan chan<- any, elem any)\n"
"func \"\".chansend2 (hchan chan<- any, elem any) bool\n"
"func \"\".closechan (hchan any)\n" "func \"\".closechan (hchan any)\n"
"func \"\".closedchan (hchan any) bool\n" "func \"\".closedchan (hchan any) bool\n"
"func \"\".selectnbsend (hchan chan<- any, elem any) bool\n" "func \"\".selectnbsend (hchan chan<- any, elem any) bool\n"
......
...@@ -356,7 +356,7 @@ enum ...@@ -356,7 +356,7 @@ enum
OARRAY, OARRAY,
OARRAYBYTESTR, OARRAYRUNESTR, OARRAYBYTESTR, OARRAYRUNESTR,
OSTRARRAYBYTE, OSTRARRAYRUNE, OSTRARRAYBYTE, OSTRARRAYRUNE,
OAS, OAS2, OAS2MAPW, OAS2FUNC, OAS2RECV, OAS2RECVCLOSED, OAS2MAPR, OAS2DOTTYPE, OASOP, OAS, OAS2, OAS2MAPW, OAS2FUNC, OAS2RECVCLOSED, OAS2MAPR, OAS2DOTTYPE, OASOP,
OBAD, OBAD,
OCALL, OCALLFUNC, OCALLMETH, OCALLINTER, OCALL, OCALLFUNC, OCALLMETH, OCALLINTER,
OCAP, OCAP,
...@@ -383,7 +383,7 @@ enum ...@@ -383,7 +383,7 @@ enum
ONOT, OCOM, OPLUS, OMINUS, ONOT, OCOM, OPLUS, OMINUS,
OOROR, OOROR,
OPANIC, OPRINT, OPRINTN, OPANIC, OPRINT, OPRINTN,
OSEND, OSENDNB, OSEND,
OSLICE, OSLICEARR, OSLICESTR, OSLICE, OSLICEARR, OSLICESTR,
ORECOVER, ORECOVER,
ORECV, ORECV,
......
...@@ -764,6 +764,7 @@ expr: ...@@ -764,6 +764,7 @@ expr:
{ {
$$ = nod(ORSH, $1, $3); $$ = nod(ORSH, $1, $3);
} }
/* not an expression anymore, but left in so we can give a good error */
| expr LCOMM expr | expr LCOMM expr
{ {
$$ = nod(OSEND, $1, $3); $$ = nod(OSEND, $1, $3);
......
...@@ -92,10 +92,8 @@ func mapiter2(hiter *any) (key any, val any) ...@@ -92,10 +92,8 @@ func mapiter2(hiter *any) (key any, val any)
// *byte is really *runtime.Type // *byte is really *runtime.Type
func makechan(elem *byte, hint int64) (hchan chan any) func makechan(elem *byte, hint int64) (hchan chan any)
func chanrecv1(hchan <-chan any) (elem any) func chanrecv1(hchan <-chan any) (elem any)
func chanrecv2(hchan <-chan any) (elem any, pres bool)
func chanrecv3(hchan <-chan any) (elem any, closed bool) func chanrecv3(hchan <-chan any) (elem any, closed bool)
func chansend1(hchan chan<- any, elem any) func chansend1(hchan chan<- any, elem any)
func chansend2(hchan chan<- any, elem any) (pres bool)
func closechan(hchan any) func closechan(hchan any)
func closedchan(hchan any) bool func closedchan(hchan any) bool
......
...@@ -94,7 +94,6 @@ init1(Node *n, NodeList **out) ...@@ -94,7 +94,6 @@ init1(Node *n, NodeList **out)
case OAS2FUNC: case OAS2FUNC:
case OAS2MAPR: case OAS2MAPR:
case OAS2DOTTYPE: case OAS2DOTTYPE:
case OAS2RECV:
case OAS2RECVCLOSED: case OAS2RECVCLOSED:
if(n->defn->initorder) if(n->defn->initorder)
break; break;
......
...@@ -668,10 +668,7 @@ reswitch: ...@@ -668,10 +668,7 @@ reswitch:
goto ret; goto ret;
case OSEND: case OSEND:
if(0 && top == Erv) { if(top & Erv) {
// can happen because grammar for if header accepts
// simple_stmt for condition. Falling through would give
// an error "c <- v used as value" but we can do better.
yyerror("send statement %#N used as value; use select for non-blocking send", n); yyerror("send statement %#N used as value; use select for non-blocking send", n);
goto error; goto error;
} }
...@@ -698,10 +695,6 @@ reswitch: ...@@ -698,10 +695,6 @@ reswitch:
// TODO: more aggressive // TODO: more aggressive
n->etype = 0; n->etype = 0;
n->type = T; n->type = T;
if(top & Erv) {
n->op = OSENDNB;
n->type = types[TBOOL];
}
goto ret; goto ret;
case OSLICE: case OSLICE:
...@@ -2383,8 +2376,6 @@ typecheckas2(Node *n) ...@@ -2383,8 +2376,6 @@ typecheckas2(Node *n)
n->op = OAS2MAPR; n->op = OAS2MAPR;
goto common; goto common;
case ORECV: case ORECV:
n->op = OAS2RECV;
goto common;
yyerror("cannot use multiple-value assignment for non-blocking receive; use select"); yyerror("cannot use multiple-value assignment for non-blocking receive; use select");
goto out; goto out;
case ODOTTYPE: case ODOTTYPE:
......
...@@ -403,7 +403,6 @@ walkstmt(Node **np) ...@@ -403,7 +403,6 @@ walkstmt(Node **np)
case OAS: case OAS:
case OAS2: case OAS2:
case OAS2DOTTYPE: case OAS2DOTTYPE:
case OAS2RECV:
case OAS2RECVCLOSED: case OAS2RECVCLOSED:
case OAS2FUNC: case OAS2FUNC:
case OAS2MAPW: case OAS2MAPW:
...@@ -823,19 +822,6 @@ walkexpr(Node **np, NodeList **init) ...@@ -823,19 +822,6 @@ walkexpr(Node **np, NodeList **init)
n = liststmt(concat(concat(list1(r), ll), lpost)); n = liststmt(concat(concat(list1(r), ll), lpost));
goto ret; goto ret;
case OAS2RECV:
// a,b = <-c
*init = concat(*init, n->ninit);
n->ninit = nil;
r = n->rlist->n;
walkexprlistsafe(n->list, init);
walkexpr(&r->left, init);
fn = chanfn("chanrecv2", 2, r->left->type);
r = mkcall1(fn, getoutargx(fn->type), init, r->left);
n->rlist->n = r;
n->op = OAS2FUNC;
goto as2func;
case OAS2RECVCLOSED: case OAS2RECVCLOSED:
// a = <-c; b = closed(c) but atomic // a = <-c; b = closed(c) but atomic
*init = concat(*init, n->ninit); *init = concat(*init, n->ninit);
...@@ -1421,10 +1407,6 @@ walkexpr(Node **np, NodeList **init) ...@@ -1421,10 +1407,6 @@ walkexpr(Node **np, NodeList **init)
n = mkcall1(chanfn("chansend1", 2, n->left->type), T, init, n->left, n->right); n = mkcall1(chanfn("chansend1", 2, n->left->type), T, init, n->left, n->right);
goto ret; goto ret;
case OSENDNB:
n = mkcall1(chanfn("chansend2", 2, n->left->type), n->type, init, n->left, n->right);
goto ret;
case OCLOSURE: case OCLOSURE:
n = walkclosure(n, init); n = walkclosure(n, init);
goto ret; goto ret;
......
...@@ -402,25 +402,6 @@ runtime·chansend1(Hchan* c, ...) ...@@ -402,25 +402,6 @@ runtime·chansend1(Hchan* c, ...)
runtime·chansend(c, ae, nil); runtime·chansend(c, ae, nil);
} }
// chansend2(hchan *chan any, elem any) (pres bool);
#pragma textflag 7
void
runtime·chansend2(Hchan* c, ...)
{
int32 o;
byte *ae, *ap;
if(c == nil)
runtime·panicstring("send to nil channel");
o = runtime·rnd(sizeof(c), c->elemalign);
ae = (byte*)&c + o;
o = runtime·rnd(o+c->elemsize, Structrnd);
ap = (byte*)&c + o;
runtime·chansend(c, ae, ap);
}
// chanrecv1(hchan *chan any) (elem any); // chanrecv1(hchan *chan any) (elem any);
#pragma textflag 7 #pragma textflag 7
void void
...@@ -435,28 +416,6 @@ runtime·chanrecv1(Hchan* c, ...) ...@@ -435,28 +416,6 @@ runtime·chanrecv1(Hchan* c, ...)
runtime·chanrecv(c, ae, nil, nil); runtime·chanrecv(c, ae, nil, nil);
} }
// chanrecv2(hchan *chan any) (elem any, pres bool);
#pragma textflag 7
void
runtime·chanrecv2(Hchan* c, ...)
{
int32 o;
byte *ae, *ap;
if(c == nil)
runtime·panicstring("receive from nil channel");
o = runtime·rnd(sizeof(c), Structrnd);
ae = (byte*)&c + o;
o = runtime·rnd(o+c->elemsize, 1);
ap = (byte*)&c + o;
runtime·chanrecv(c, ae, ap, nil);
if(!*ap)
c->elemalg->copy(c->elemsize, ae, nil);
}
// chanrecv3(hchan *chan any) (elem any, closed bool); // chanrecv3(hchan *chan any) (elem any, closed bool);
#pragma textflag 7 #pragma textflag 7
void void
......
// errchk $G -e $D/$F.go
// Copyright 2010 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package main
var c chan int
var v int
func main() {
if c <- v { // ERROR "send statement.*value.*select"
}
}
var _ = c <- v // ERROR "send statement.*value.*select"
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment