static void orderstmt(Node*, NodeList**);
static void orderstmtlist(NodeList*, NodeList**);
+static void orderblock(NodeList **l);
static void orderexpr(Node**, NodeList**);
static void orderexprlist(NodeList*, NodeList**);
void
order(Node *fn)
{
- NodeList *out;
-
- out = nil;
- orderstmtlist(fn->nbody, &out);
- fn->nbody = out;
+ orderblock(&fn->nbody);
}
static void
static void
orderinit(Node *n, NodeList **out)
{
- *out = concat(*out, n->ninit);
+ orderstmtlist(n->ninit, out);
n->ninit = nil;
}
return;
lno = setlineno(n);
+
+ orderinit(n, out);
+
switch(n->op) {
default:
fatal("orderstmt %O", n->op);
case ORECOVER:
case ORECV:
case OSEND:
- orderinit(n, out);
orderexpr(&n->left, out);
orderexpr(&n->right, out);
orderexprlist(n->list, out);
case OAS2FUNC:
// Special: avoid copy of func call n->rlist->n.
- orderinit(n, out);
orderexprlist(n->list, out);
ordercall(n->rlist->n, out);
*out = list(*out, n);
case OAS2RECV:
// Special: avoid copy of receive.
- orderinit(n, out);
orderexprlist(n->list, out);
orderexpr(&n->rlist->n->left, out); // arg to recv
*out = list(*out, n);
case OBLOCK:
case OEMPTY:
// Special: does not save n onto out.
- orderinit(n, out);
orderstmtlist(n->list, out);
break;
case OGOTO:
case OLABEL:
// Special: n->left is not an expression; save as is.
- orderinit(n, out);
*out = list(*out, n);
break;
case OCALLINTER:
case OCALLMETH:
// Special: handle call arguments.
- orderinit(n, out);
ordercall(n, out);
*out = list(*out, n);
break;
case ODEFER:
case OPROC:
// Special: order arguments to inner call but not call itself.
- orderinit(n, out);
ordercall(n->left, out);
*out = list(*out, n);
break;
case OFOR:
- orderinit(n, out);
orderexprinplace(&n->ntest);
orderstmtinplace(&n->nincr);
orderblock(&n->nbody);
break;
case OIF:
- orderinit(n, out);
orderexprinplace(&n->ntest);
orderblock(&n->nbody);
orderblock(&n->nelse);
break;
case ORANGE:
- orderinit(n, out);
orderexpr(&n->right, out);
for(l=n->list; l; l=l->next)
orderexprinplace(&l->n);
break;
case OSELECT:
- orderinit(n, out);
for(l=n->list; l; l=l->next) {
if(l->n->op != OXCASE)
fatal("order select case %O", l->n->op);
break;
case OSWITCH:
- orderinit(n, out);
orderexpr(&n->ntest, out);
for(l=n->list; l; l=l->next) {
if(l->n->op != OXCASE)