}
void
-gettype(Node *n, NodeList **init)
+gettype(Node **np, NodeList **init)
{
if(debug['W'])
- dump("\nbefore gettype", n);
- walkexpr(n, Erv, init);
+ dump("\nbefore gettype", *np);
+ walkexpr(np, Erv, init);
if(debug['W'])
- dump("after gettype", n);
+ dump("after gettype", *np);
}
void
return;
}
- if(n->type != T || n->diag)
+ if(n->walkdef == 1)
return;
-
- if(n->trecur) {
+ if(n->walkdef == 2) {
// TODO(rsc): better loop message
fatal("loop");
}
- n->trecur = 1;
+ n->walkdef = 2;
init = nil;
switch(n->op) {
case OLITERAL:
if(n->ntype != N) {
- walkexpr(n->ntype, Etype, &init);
+ walkexpr(&n->ntype, Etype, &init);
n->type = n->ntype->type;
n->ntype = N;
if(n->type == T) {
}
}
e = n->defn;
- if(e == N) {
+ n->defn = N;
+ if(e == N)
dump("walkdef", n);
- }
- walkexpr(e, Erv, &init);
+ walkexpr(&e, Erv, &init);
if(e->op != OLITERAL) {
yyerror("const initializer must be constant");
goto ret;
ret:
lineno = lno;
- n->trecur = 0;
+ n->walkdef = 1;
}
void
walkstmtlist(NodeList *l)
{
for(; l; l=l->next)
- walkstmt(l->n);
+ walkstmt(&l->n);
}
void
-walkstmt(Node *n)
+walkstmt(Node **np)
{
NodeList *init;
NodeList *ll;
int lno;
-
+ Node *n;
+
+ n = *np;
if(n == N)
return;
case OPANIC:
case OPANICN:
case OEMPTY:
- init = nil;
- walkexpr(n, Etop, &init);
- n->ninit = concat(n->ninit, init);
+ init = n->ninit;
+ n->ninit = nil;
+ walkexpr(&n, Etop, &init);
+ n->ninit = concat(init, n->ninit);
break;
case OBREAK:
yyerror("case statement out of place");
n->op = OCASE;
case OCASE:
- walkstmt(n->right);
+ walkstmt(&n->right);
break;
case ODEFER:
hasdefer = 1;
- walkexpr(n->left, Etop, &n->ninit);
+ walkexpr(&n->left, Etop, &n->ninit);
break;
case OFOR:
walkstmtlist(n->ninit);
walkbool(&n->ntest);
- walkstmt(n->nincr);
+ walkstmt(&n->nincr);
walkstmtlist(n->nbody);
break;
break;
case OPROC:
- walkexpr(n->left, Etop, &n->ninit);
+ walkexpr(&n->left, Etop, &n->ninit);
break;
case ORETURN:
n->op = OFALL;
break;
}
-}
-
-void
-indir(Node *nl, Node *nr)
-{
- if(nr != N && nl != nr)
- *nl = *nr;
+
+ *np = n;
}
void
if(!isfixedarray(t))
return;
n = nod(OIND, n, N);
- walkexpr(n, Elv, nil);
+ walkexpr(&n, Elv, nil);
*nn = n;
}
walkexprlist(NodeList *l, int top, NodeList **init)
{
for(; l; l=l->next)
- walkexpr(l->n, top, init);
+ walkexpr(&l->n, top, init);
}
void
-walkexpr(Node *n, int top, NodeList **init)
+walkexpr(Node **np, int top, NodeList **init)
{
Node *r, *l;
NodeList *ll, *lr;
Sym *s;
int et, cl, cr, typeok, op;
int32 lno;
+ Node *n;
+
+ n = *np;
if(n == N)
return;
+
lno = setlineno(n);
typeok = top & Etype;
top &= ~Etype;
-loop:
- if(n == N)
- goto ret;
-
- setlineno(n);
-
if(debug['w'] > 1 && top == Etop)
dump("walk-before", n);
if(l == nil) {
t->bound = -1;
} else {
- walkexpr(l, Erv | Etype, init);
+ walkexpr(&l, Erv | Etype, init);
switch(l->op) {
default:
yyerror("invalid array bound %O", l->op);
break;
}
}
- walkexpr(r, Etype, init);
+ walkexpr(&r, Etype, init);
t->type = r->type;
n->op = OTYPE;
n->type = t;
case OTMAP:
l = n->left;
r = n->right;
- walkexpr(l, Etype, init);
- walkexpr(r, Etype, init);
+ walkexpr(&l, Etype, init);
+ walkexpr(&r, Etype, init);
n->op = OTYPE;
n->type = maptype(l->type, r->type);
goto ret;
case OTCHAN:
t = typ(TCHAN);
l = n->left;
- walkexpr(l, Etype, init);
+ walkexpr(&l, Etype, init);
t->type = l->type;
t->chan = n->etype;
n->op = OTYPE;
goto ret;
case OKEY:
- walkexpr(n->left, top | typeok, init);
- n = n->right;
- goto loop;
+ walkexpr(&n->left, top | typeok, init);
+ walkexpr(&n->right, top | typeok, init);
+ goto ret;
case OPRINT:
if(top != Etop)
goto nottop;
walkexprlist(n->list, Erv, init);
- indir(n, prcompat(n->list, 0, 0));
+ n = prcompat(n->list, 0, 0);
+//dump("prcompat", n);
goto ret;
case OPRINTN:
if(top != Etop)
goto nottop;
walkexprlist(n->list, Erv, init);
- indir(n, prcompat(n->list, 1, 0));
+ n = prcompat(n->list, 1, 0);
goto ret;
case OPANIC:
if(top != Etop)
goto nottop;
walkexprlist(n->list, Erv, init);
- indir(n, prcompat(n->list, 0, 1));
+ n = prcompat(n->list, 0, 1);
goto ret;
case OPANICN:
if(top != Etop)
goto nottop;
walkexprlist(n->list, Erv, init);
- indir(n, prcompat(n->list, 2, 1));
+ n = prcompat(n->list, 2, 1);
goto ret;
case OLITERAL:
// builtin OLEN, OCAP, etc.
n->op = n->left->etype;
n->left = N;
+//dump("do", n);
goto reswitch;
}
- walkexpr(n->left, Erv | Etype, init);
+ walkexpr(&n->left, Erv | Etype, init);
defaultlit(&n->left, T);
t = n->left->type;
goto nottop;
*init = concat(*init, n->ninit);
n->ninit = nil;
+ walkexpr(&n->left, Elv, init);
+ walkexpr(&n->right, Erv, init);
l = n->left;
r = n->right;
- walkexpr(l, Elv, init);
if(l == N || r == N)
goto ret;
- walkexpr(r, Erv, init);
- indir(n, ascompatee1(n->op, n->left, n->right, init));
+ r = ascompatee1(n->op, l, r, init);
+ if(r != N)
+ n = r;
goto ret;
case OAS2:
walkexprlist(n->rlist, Erv, init);
ll = ascompatee(OAS, n->list, n->rlist, init);
ll = reorder3(ll);
- indir(n, liststmt(ll));
+ n = liststmt(ll);
goto ret;
}
case OCALL:
if(cr == 1) {
// a,b,... = fn()
- walkexpr(r, Erv, init);
+ walkexpr(&r, Erv, init);
if(r->type == T || r->type->etype != TSTRUCT)
break;
ll = ascompatet(n->op, n->list, &r->type, 0, init);
- indir(n, liststmt(concat(list1(r), ll)));
+ n = liststmt(concat(list1(r), ll));
goto ret;
}
break;
case OINDEX:
if(cl == 2 && cr == 1) {
// a,b = map[] - mapaccess2
- walkexpr(r->left, Erv, init);
+ walkexpr(&r->left, Erv, init);
implicitstar(&r->left);
if(!istype(r->left->type, TMAP))
break;
l = mapop(n, top, init);
if(l == N)
break;
- indir(n, l);
+ n = l;
goto ret;
}
break;
case ORECV:
if(cl == 2 && cr == 1) {
// a,b = <chan - chanrecv2
- walkexpr(r->left, Erv, init);
+ walkexpr(&r->left, Erv, init);
if(!istype(r->left->type, TCHAN))
break;
l = chanop(n, top, init);
if(l == N)
break;
- indir(n, l);
+ n = l;
goto ret;
}
break;
break;
r = ifacecvt(r->type, r->left, et);
ll = ascompatet(n->op, n->list, &r->type, 0, init);
- indir(n, liststmt(concat(list1(r), ll)));
+ n = liststmt(concat(list1(r), ll));
goto ret;
}
break;
l = mapop(n, top, init);
if(l == N)
break;
- indir(n, l);
+ n = l;
goto ret;
}
break;
case OCONV:
if(top != Erv)
goto nottop;
- walkconv(n, init);
+ walkconv(&n, init);
goto ret;
case OCONVNOP:
goto ret;
case OCOMPOS:
- walkexpr(n->right, Etype, init);
+ walkexpr(&n->right, Etype, init);
t = n->right->type;
n->type = t;
if(t == T)
r = maplit(n, N, init);
break;
}
- indir(n, r);
+ n = r;
goto ret;
case ONOT:
evconst(n);
if(n->op == OLITERAL)
goto ret;
- walkexpr(n->left, Erv, init);
+ walkexpr(&n->left, Erv, init);
if(n->left == N || n->left->type == T)
goto ret;
et = n->left->type->etype;
case OASOP:
if(top != Etop)
goto nottop;
- walkexpr(n->left, Elv, init);
+ walkexpr(&n->left, Elv, init);
l = n->left;
if(l->op == OINDEX && istype(l->left->type, TMAP))
- indir(n, mapop(n, top, init));
+ n = mapop(n, top, init);
if(n->etype == OLSH || n->etype == ORSH)
goto shft;
goto com;
case ORSH:
if(top != Erv)
goto nottop;
- walkexpr(n->left, Erv, init);
+ walkexpr(&n->left, Erv, init);
shft:
- walkexpr(n->right, Erv, init);
+ walkexpr(&n->right, Erv, init);
if(n->left == N || n->right == N)
goto ret;
evconst(n);
case ODIV:
if(top != Erv)
goto nottop;
- walkexpr(n->left, Erv, init);
+ walkexpr(&n->left, Erv, init);
com:
- walkexpr(n->right, Erv, init);
+ walkexpr(&n->right, Erv, init);
if(n->left == N || n->right == N)
goto ret;
evconst(n);
break;
}
if(istype(n->left->type, TSTRING)) {
- indir(n, stringop(n, top, init));
+ n = stringop(n, top, init);
goto ret;
}
break;
case OGT:
case OADD:
if(istype(n->left->type, TSTRING)) {
- indir(n, stringop(n, top, nil));
+ n = stringop(n, top, nil);
goto ret;
}
break;
case OCOM:
if(top != Erv)
goto nottop;
- walkexpr(n->left, Erv, init);
+ walkexpr(&n->left, Erv, init);
if(n->left == N)
goto ret;
evconst(n);
yyerror("too many arguments to len");
n->left = n->list->n;
}
- walkexpr(n->left, Erv, init);
+ walkexpr(&n->left, Erv, init);
defaultlit(&n->left, T);
implicitstar(&n->left);
t = n->left->type;
yyerror("too many arguments to cap");
n->left = n->list->n;
}
- walkexpr(n->left, Erv, init);
+ walkexpr(&n->left, Erv, init);
defaultlit(&n->left, T);
implicitstar(&n->left);
t = n->left->type;
if(top == Etop)
goto nottop;
- walkexpr(n->left, Erv, init);
- walkexpr(n->right, Erv, init);
+ walkexpr(&n->left, Erv, init);
+ walkexpr(&n->right, Erv, init);
if(n->left == N || n->right == N)
goto ret;
break;
if(!isint[n->right->type->etype])
goto badt;
- indir(n, stringop(n, top, nil));
+ n = stringop(n, top, nil);
break;
case TMAP:
goto badt;
n->type = t->type;
if(top == Erv)
- indir(n, mapop(n, top, nil));
+ n = mapop(n, top, nil);
break;
case TARRAY:
case OCLOSE:
if(top != Etop)
goto nottop;
- walkexpr(n->left, Erv, init); // chan
- indir(n, chanop(n, top, nil));
+ walkexpr(&n->left, Erv, init); // chan
+ n = chanop(n, top, nil);
goto ret;
case OCLOSED:
if(top == Elv)
goto nottop;
- walkexpr(n->left, Erv, init); // chan
- indir(n, chanop(n, top, nil));
+ walkexpr(&n->left, Erv, init); // chan
+ n = chanop(n, top, nil);
goto ret;
case OSEND:
if(top == Elv)
goto nottop;
- walkexpr(n->left, Erv, init); // chan
- walkexpr(n->right, Erv, init); // e
- indir(n, chanop(n, top, nil));
+ walkexpr(&n->left, Erv, init); // chan
+ walkexpr(&n->right, Erv, init); // e
+ n = chanop(n, top, nil);
goto ret;
case ORECV:
if(top == Elv)
goto nottop;
if(n->right == N) {
- walkexpr(n->left, Erv, init); // chan
- indir(n, chanop(n, top, init)); // returns e blocking
+ walkexpr(&n->left, Erv, init); // chan
+ n = chanop(n, top, init); // returns e blocking
goto ret;
}
- walkexpr(n->left, Elv, init); // e
- walkexpr(n->right, Erv, init); // chan
- indir(n, chanop(n, top, nil)); // returns bool non-blocking
+ walkexpr(&n->left, Elv, init); // e
+ walkexpr(&n->right, Erv, init); // chan
+ n = chanop(n, top, nil); // returns bool non-blocking
goto ret;
case OSLICE:
if(top == Etop)
goto nottop;
- walkexpr(n->left, top, init);
- walkexpr(n->right, Erv, init);
+ walkexpr(&n->left, top, init);
+ walkexpr(&n->right, Erv, init);
if(n->left == N || n->right == N)
goto ret;
defaultlit(&n->left, T);
if(t == T)
goto ret;
if(t->etype == TSTRING) {
- indir(n, stringop(n, top, nil));
+ n = stringop(n, top, nil);
goto ret;
}
if(t->etype == TARRAY) {
- indir(n, arrayop(n, top));
+ n = arrayop(n, top);
goto ret;
}
badtype(OSLICE, n->left->type, T);
goto nottop;
defaultlit(&n->left, T);
if(n->left->op == OCOMPOS) {
- walkexpr(n->left->right, Etype, init);
+ walkexpr(&n->left->right, Etype, init);
n->left->type = n->left->right->type;
if(n->left->type == T)
goto ret;
tempname(nvar, ptrto(n->left->type));
nas = nod(OAS, nvar, callnew(n->left->type));
- walkexpr(nas, Etop, init);
+ walkexpr(&nas, Etop, init);
*init = list(*init, nas);
nstar = nod(OIND, nvar, N);
goto badlit;
}
-// walkexpr(n->left->left, Erv, init);
- indir(n, nvar);
+// walkexpr(&n->left->left, Erv, init);
+ n = nvar;
goto ret;
}
}
if(n->left == N)
goto ret;
- walkexpr(n->left, Elv, init);
+ walkexpr(&n->left, Elv, init);
t = n->left->type;
if(t == T)
goto ret;
top = Erv;
if(n->left == N)
goto ret;
- walkexpr(n->left, top | Etype, init);
+ walkexpr(&n->left, top | Etype, init);
defaultlit(&n->left, T);
if(n->left->op == OTYPE) {
n->op = OTYPE;
case OMAKE:
if(top != Erv)
goto nottop;
- indir(n, makecompat(n));
+ n = makecompat(n);
goto ret;
case ONEW:
yyerror("missing argument to new");
goto ret;
}
- l = n->list->n;
if(n->list->next)
yyerror("too many arguments to new");
- walkexpr(l, Etype, init);
+ walkexpr(&n->list->n, Etype, init);
+ l = n->list->n;
if((t = l->type) == T)
;
else
- indir(n, callnew(t));
+ n = callnew(t);
goto ret;
}
if(!okforeq[et] && !isslice(n->left->type))
goto badt;
if(isinter(n->left->type)) {
- indir(n, ifaceop(n));
+ n = ifaceop(n);
goto ret;
}
t = types[TBOOL];
if(isfloat[et]) {
// TODO(rsc): Can do this more efficiently,
// but OSUB is wrong. Should be in back end anyway.
- indir(n, nod(OMUL, n->left, nodintconst(-1)));
- walkexpr(n, Erv, init);
+ n = nod(OMUL, n->left, nodintconst(-1));
+ walkexpr(&n, Erv, init);
goto ret;
}
break;
r->list = list(list1(n->left), n->right);
r = nod(OCONV, r, N);
r->type = n->left->left->type;
- walkexpr(r, Erv, init);
- indir(n, r);
+ walkexpr(&r, Erv, init);
+ n = r;
goto ret;
case OASOP:
break;
l = saferef(n->left, init);
r = nod(OAS, l, nod(n->etype, l, n->right));
- walkexpr(r, Etop, init);
- indir(n, r);
+ walkexpr(&r, Etop, init);
+ n = r;
goto ret;
}
ullmancalc(n);
lineno = lno;
+ *np = n;
}
void
n = *np;
if(n == N)
return;
- walkexpr(n, Erv, &n->ninit);
+ walkexpr(np, Erv, &n->ninit);
defaultlit(np, T);
n = *np;
if(n->type != T && !eqtype(n->type, types[TBOOL]))
void
walkdottype(Node *n, NodeList **init)
{
- walkexpr(n->left, Erv, init);
+ walkexpr(&n->left, Erv, init);
if(n->left == N)
return;
defaultlit(&n->left, T);
if(!isinter(n->left->type))
yyerror("type assertion requires interface on left, have %T", n->left->type);
if(n->right != N) {
- walkexpr(n->right, Etype, init);
+ walkexpr(&n->right, Etype, init);
n->type = n->right->type;
n->right = N;
}
}
void
-walkconv(Node *n, NodeList **init)
+walkconv(Node **np, NodeList **init)
{
int et;
char *what;
Type *t;
Node *l;
-
+ Node *n;
+
+ n = *np;
t = n->type;
if(t == T)
return;
+ walkexpr(&n->left, Erv, init);
l = n->left;
if(l == N)
return;
- walkexpr(l, Erv, init);
if(l->type == T)
return;
if(et == I2Isame || et == E2Esame)
goto nop;
if(et != Inone) {
- indir(n, ifacecvt(t, l, et));
+ n = ifacecvt(t, l, et);
+ *np = n;
return;
}
goto bad;
if(cvttype(t, l->type) == 1) {
nop:
if(l->op == OLITERAL) {
- indir(n, l);
- l->type = t;
+ *n = *l;
+ n->type = t;
return;
}
// leave OCONV node in place
// ifaceas1 will generate a good error
// if the conversion is invalid.
if(t->etype == TINTER || l->type->etype == TINTER) {
- indir(n, ifacecvt(t, l, ifaceas1(t, l->type, 0)));
+ n = ifacecvt(t, l, ifaceas1(t, l->type, 0));
+ *np = n;
return;
}
if(istype(t, TSTRING)) {
et = l->type->etype;
if(isint[et]) {
- indir(n, stringop(n, Erv, nil));
+ n = stringop(n, Erv, nil);
+ *np = n;
return;
}
if((isptr[et] && isfixedarray(l->type->type) && istype(l->type->type->type, TUINT8))
|| (isslice(l->type) && istype(l->type->type, TUINT8))) {
n->op = OARRAY;
- indir(n, stringop(n, Erv, nil));
+ n = stringop(n, Erv, nil);
+ *np = n;
return;
}
if((isptr[et] && isfixedarray(l->type->type) && istype(l->type->type->type, TINT))
|| (isslice(l->type) && istype(l->type->type, TINT))) {
n->op = OARRAY;
- indir(n, stringop(n, Erv, nil));
+ n = stringop(n, Erv, nil);
+ *np = n;
return;
}
}
// convert static array to dynamic array
if(isslice(t) && isptr[l->type->etype] && isfixedarray(l->type->type)) {
if(eqtype(t->type->type, l->type->type->type->type)) {
- indir(n, arrayop(n, Erv));
+ n = arrayop(n, Erv);
+ *np = n;
return;
}
}
if(c->op == ORECV)
goto recv;
- walkexpr(c->left, Erv, init); // chan
- walkexpr(c->right, Erv, init); // elem
+ walkexpr(&c->left, Erv, init); // chan
+ walkexpr(&c->right, Erv, init); // elem
t = fixchan(c->left->type);
if(t == T)
if(c->right != N)
goto recv2;
- walkexpr(c->left, Erv, init); // chan
+ walkexpr(&c->left, Erv, init); // chan
t = fixchan(c->left->type);
if(t == T)
goto out;
recv2:
- walkexpr(c->right, Erv, init); // chan
+ walkexpr(&c->right, Erv, init); // chan
t = fixchan(c->right->type);
if(t == T)
return N;
}
- walkexpr(c->left, Elv, init); // check elem
+ walkexpr(&c->left, Elv, init); // check elem
convlit(&c->left, t->type);
if(!ascompat(t->type, c->left->type)) {
badtype(c->op, t->type, c->left->type);
if(expr == N || expr->op != ORECV)
goto bad;
- walkexpr(expr->left, Erv, init);
+ walkexpr(&expr->left, Erv, init);
t = expr->left->type;
if(t == T)
goto bad;
sel->nbody = res;
sel->left = N;
- // TODO(rsc): is ninit a walkstmtlist or walkexprlist?
walkstmtlist(sel->ninit);
walkstmtlist(sel->nbody);
//dump("sel", sel);
if(t->etype == TINTER) {
if(isptr[n->left->type->etype]) {
n->left = nod(OIND, n->left, N); // implicitstar
- walkexpr(n->left, Elv, nil);
+ walkexpr(&n->left, Elv, nil);
}
n->op = ODOTINTER;
}
rcvr = getthisx(f2->type)->type->type;
if(!eqtype(rcvr, tt)) {
if(rcvr->etype == tptr && eqtype(rcvr->type, tt)) {
- walkexpr(n->left, Elv, nil);
+ walkexpr(&n->left, Elv, nil);
addrescapes(n->left);
n->left = nod(OADDR, n->left, N);
n->left->type = ptrto(tt);
return; // already done
}
- walkexpr(n->left, Erv, init);
+ walkexpr(&n->left, Erv, init);
if(n->right->op != ONAME) {
yyerror("rhs of . must be a name");
return;
convlit(&r, l->type);
if(!ascompat(l->type, r->type)) {
badtype(op, l->type, r->type);
- return nil;
+ return N;
}
if(l->op == ONAME && l->class == PFUNC)
yyerror("cannot assign to function");
*r->left = *var;
r->left->type = r->right->type;
r->left->xoffset += t->width;
- walkexpr(r, Etop, init);
+ walkexpr(&r, Etop, init);
+ lr->n = r;
t = t->down;
}
*init = concat(*init, n);
}
notfirst = fmt;
+ walkexpr(&l->n, Erv, nil);
n = l->n;
- walkexpr(n, Erv, nil);
if(n->op == OLITERAL) {
switch(n->val.ctype) {
case CTINT:
r = nodpanic(0);
else
r = nod(OEMPTY, N, N);
- walkexpr(r, Etop, nil);
+ walkexpr(&r, Etop, nil);
r->ninit = calls;
return r;
}
args = list1(n);
n = nod(OCALL, on, N);
n->list = args;
- walkexpr(n, Etop, nil);
+ walkexpr(&n, Etop, nil);
return n;
}
Node *l, *r;
NodeList *args, *init;
+//dump("makecompat", n);
args = n->list;
if(args == nil) {
yyerror("make requires type argument");
return n;
}
- l = args->n;
r = N;
+ l = args->n;
args = args->next;
init = nil;
- walkexpr(l, Etype, &init);
+ walkexpr(&l, Etype, &init);
if(l->op != OTYPE) {
yyerror("cannot make(expr)");
return n;
args = list1(r);
r = nod(OCALL, on, N);
r->list = args;
- walkexpr(r, Erv, nil);
+ walkexpr(&r, Erv, nil);
return r;
}
break;
}
- walkexpr(r, top, init);
+ walkexpr(&r, top, init);
return r;
}
r = nod(OCALL, on, N);
r->list = args;
- walkexpr(r, top, nil);
+ walkexpr(&r, top, nil);
r->type = n->type;
break;
r = nod(OCALL, on, N);
r->list = args;
- walkexpr(r, Erv, nil);
+ walkexpr(&r, Erv, nil);
r->type = t->type;
break;
r = nod(OCALL, on, N);
r->list = args;
- walkexpr(r, Etop, init);
+ walkexpr(&r, Etop, init);
break;
case OAS2:
r = nod(OCALL, on, N);
r->list = args;
- walkexpr(r, Etop, init);
+ walkexpr(&r, Etop, init);
break;
access2:
a = nod(OCALL, on, N);
a->list = args;
n->rlist = list1(a);
- walkexpr(n, Etop, init);
+ walkexpr(&n, Etop, init);
r = n;
break;
tempname(a, t->down); // tmpi
r = nod(OAS, a, n->left->right); // tmpi := index
n->left->right = a; // m[tmpi]
- walkexpr(r, Etop, init);
+ walkexpr(&r, Etop, init);
*init = list(*init, r);
a = nod(OXXX, N, N);
- indir(a, n->left); // copy of map[tmpi]
+ *a = *n->left; // copy of map[tmpi]
a = nod(n->etype, a, n->right); // m[tmpi] op right
r = nod(OAS, n->left, a); // map[tmpi] = map[tmpi] op right
- walkexpr(r, Etop, init);
+ walkexpr(&r, Etop, init);
break;
}
return r;
r = nod(OCALL, on, N);
r->list = args;
- walkexpr(r, top, nil);
+ walkexpr(&r, top, nil);
r->type = n->type;
break;
r = nod(OCALL, on, N);
r->list = args;
- walkexpr(r, top, nil);
+ walkexpr(&r, top, nil);
n->type = r->type;
break;
r = nod(OCALL, on, N);
r->list = args;
- walkexpr(r, top, nil);
+ walkexpr(&r, top, nil);
r->type = n->type;
break;
r->list = args;
n->rlist->n = r;
r = n;
- walkexpr(r, Etop, init);
+ walkexpr(&r, Etop, init);
break;
case ORECV:
argtype(on, t->type); // any-2
r = nod(OCALL, on, N);
r->list = args;
- walkexpr(r, Erv, nil);
+ walkexpr(&r, Erv, nil);
break;
case OSEND:
argtype(on, t->type); // any-2
r = nod(OCALL, on, N);
r->list = args;
- walkexpr(r, Etop, nil);
+ walkexpr(&r, Etop, nil);
break;
send2:
argtype(on, t->type); // any-2
r = nod(OCALL, on, N);
r->list = args;
- walkexpr(r, Etop, nil);
+ walkexpr(&r, Etop, nil);
break;
}
return r;
r = nod(OCALL, on, N);
r->list = args;
n->left = r;
- walkexpr(n, top, nil);
+ walkexpr(&n, top, nil);
return n;
case OAS:
argtype(on, t->type); // any-1
r = nod(OCALL, on, N);
r->list = args;
- walkexpr(r, top, nil);
+ walkexpr(&r, top, nil);
r->type = t; // if t had a name, going through newarray lost it
break;
r = nod(OCALL, on, N);
r->list = args;
- walkexpr(r, top, nil);
+ walkexpr(&r, top, nil);
break;
}
return r;
r = nod(OCALL, on, N);
r->list = args;
- walkexpr(r, Erv, nil);
+ walkexpr(&r, Erv, nil);
return r;
}
r->list = args;
if(n->op == ONE)
r = nod(ONOT, r, N);
- walkexpr(r, Erv, nil);
+ walkexpr(&r, Erv, nil);
return r;
}
}
if(n->left->op == OINDEX)
if(istype(n->left->left->type, TMAP)) {
- indir(n, mapop(n, Elv, init));
+ n = mapop(n, Elv, init);
goto out;
}
if(n->left->op == OSEND)
if(n->left->type != T) {
- indir(n, chanop(n, Elv, init));
+ n = chanop(n, Elv, init);
goto out;
}
if(isslice(lt) && isptr[rt->etype] && isfixedarray(rt->type)) {
if(!eqtype(lt->type->type, rt->type->type->type))
goto bad;
- indir(n, arrayop(n, Etop));
+ n = arrayop(n, Etop);
goto out;
}
case OCALL:
if(nr->left->op == ONAME && nr->left->etype != 0)
break;
- walkexpr(nr->left, Erv | Etype, &init);
+ walkexpr(&nr->left, Erv | Etype, &init);
if(nr->left->op == OTYPE)
break;
goto call;
case OCALLMETH:
case OCALLINTER:
- walkexpr(nr->left, Erv, &init);
+ walkexpr(&nr->left, Erv, &init);
call:
convlit(&nr->left, types[TFUNC]);
t = nr->left->type;
l = savel->n;
r = saver->n;
- walkexpr(r, Erv, &init);
+ walkexpr(&r, Erv, &init);
defaultlit(&r, T);
saver->n = r;
a = mixedoldnew(l, r->type);
// if so, types are valuetype,bool
if(cl != 2)
goto badt;
- walkexpr(nr->left, Erv, &init);
+ walkexpr(&nr->left, Erv, &init);
implicitstar(&nr->left);
t = nr->left->type;
if(!istype(t, TMAP))
case ORECV:
if(cl != 2)
goto badt;
- walkexpr(nr->left, Erv, &init);
+ walkexpr(&nr->left, Erv, &init);
t = nr->left->type;
if(!istype(t, TCHAN))
goto badt;
n = nod(OFOR, N, N);
init = nil;
- walkexpr(nn->right, Erv, &init);
+ walkexpr(&nn->right, Erv, &init);
implicitstar(&nn->right);
m = nn->right;
local = nn->etype;
// build list of var.field = expr
a = nod(ODOT, var, newname(l->sym));
a = nod(OAS, a, r);
- walkexpr(a, Etop, init);
+ walkexpr(&a, Etop, init);
if(nerr != nerrors)
return var;
*init = list(*init, a);
keyval:
memset(hash, 0, sizeof(hash));
a = nod(OAS, var, N);
- walkexpr(a, Etop, init);
+ walkexpr(&a, Etop, init);
*init = list(*init, a);
for(; nl; nl=nl->next) {
break;
a = nod(OAS, a, r->right);
- walkexpr(a, Etop, init);
+ walkexpr(&a, Etop, init);
if(nerr != nerrors)
break;
a = nod(OMAKE, N, N);
a->list = list(list1(typenod(t)), nodintconst(ninit));
a = nod(OAS, var, a);
- walkexpr(a, Etop, init);
+ walkexpr(&a, Etop, init);
*init = list(*init, a);
} else {
// if entire array isnt initialized,
// then clear the array
if(ninit < b) {
a = nod(OAS, var, N);
- walkexpr(a, Etop, init);
+ walkexpr(&a, Etop, init);
*init = list(*init, a);
}
}
a = nod(OINDEX, var, a);
a = nod(OAS, a, r);
- walkexpr(a, Etop, init); // add any assignments in r to top
+ walkexpr(&a, Etop, init); // add any assignments in r to top
if(nerr != nerrors)
break;
a = nod(OMAKE, N, N);
a->list = list1(typenod(t));
a = nod(OAS, var, a);
- walkexpr(a, Etop, init);
+ walkexpr(&a, Etop, init);
*init = list(*init, a);
memset(hash, 0, sizeof(hash));
a = nod(OINDEX, var, r->left);
a = nod(OAS, a, r->right);
- walkexpr(a, Etop, init);
+ walkexpr(&a, Etop, init);
if(nerr != nerrors)
break;