int libpbc_config_getswitch (pool * p, const char *key, int def) { return (gswitch (p, key, def)); }
void genstmt(NODE *n) { VREG *muuo_ac; if (n == NULL) return; switch (n->Nop) { case N_STATEMENT: { NODE *beg, *next; if (n->Nleft && n->Nleft->Nop == N_DATA) { /* Check for auto inits */ genadata(n->Nleft); /* Yep, do them */ n = n->Nright; /* then move on to real statements */ } for(beg = n; n != NULL; n = n->Nright) { if(n->Nop != N_STATEMENT) int_error("genstmt: bad stmt %N", n); if(n->Nleft == NULL) continue; /* Check out following stmt for possible optimizations */ if(n->Nright && (next = n->Nright->Nleft) != NULL && optgen) { switch(next->Nop) { /* Hack to encourage tail recursion */ case Q_RETURN: /* If next will be RETURN */ if(next->Nright == NULL) { /* and has no return val */ NODE *v; /* Then try to optimize */ if((v = laststmt(n->Nleft)) != NULL && v->Nop == N_FNCALL) v->Nflag |= NF_RETEXPR; } break; /* If next stmt is a GOTO, ensure that any jumps * within current stmt to end of stmt will * instead go directly to object of the GOTO. * Avoids jumping to jumps... * We do a similar hack for BREAK and CONTINUE, * which are similar to GOTOs except that their * destination is kept in variables global to the * code generation routines. */ case Q_CASE: /* Not sure about this one yet */ case N_LABEL: case Q_GOTO: n->Nleft->Nendlab = next->Nxfsym; break; case Q_BREAK: n->Nleft->Nendlab = brklabel; break; case Q_CONTINUE: n->Nleft->Nendlab = looplabel; break; default: ; /* do nothing */ } /* end of Nop switch */ } /* end of next-stmt check */ /* Optimize label usage */ if(n->Nright == NULL /* If this is last stmt in list */ && optgen) n->Nleft->Nendlab = beg->Nendlab; /* Copy from 1st */ genstmt(n->Nleft); } break; } /* end of N_STATEMENT case block */ case Q_CASE: codlabel(n->Nxfsym); /* send forward label */ n->Nleft->Nendlab = n->Nendlab; /* propagate end label */ genstmt (n->Nleft); /* finish rest of body */ break; case N_LABEL: if (n->Nxfsym->Sname[0] == '%' && isdigit(n->Nxfsym->Sname[1])) code_debugcall(n); else codgolab(n->Nxfsym); /* send goto label */ n->Nleft->Nendlab = n->Nendlab; /* propagate end label */ genstmt(n->Nleft); /* finish rest of body */ break; case Q_BREAK: code6(P_JRST, NULL, brklabel); break; case Q_GOTO: code6(P_JRST, NULL, n->Nxfsym); break; case Q_CONTINUE: code6(P_JRST, NULL, looplabel); break; case Q_DO: gdo(n); break; case Q_FOR: gfor(n); break; case Q_IF: gif(n); break; case Q_RETURN: greturn(n); break; case Q_SWITCH: gswitch(n); break; case Q_WHILE: gwhile(n); break; #if SYS_CSI /* Added 1/91 for in-line monitor calls; KAR */ case Q_MUUO: muuo_ac = gmuuo(n); vrfree(muuo_ac); break; #endif case N_EXPRLIST: /* Same as expression stmt */ default: /* None of above, assume expression stmt */ genxrelease(n); /* Generate it and flush any result */ break; } }