void opinc(Node *n, Node *res) { Value *v; chklval(n->left); v = n->left->sym->v; res->op = OCONST; res->type = v->type; res->nstore = v->vstore; switch(v->type) { case TINT: if(n->op == OPDEC) v->vstore.u0.sival -= fmtsize(v); else v->vstore.u0.sival += fmtsize(v); break; case TFLOAT: if(n->op == OPDEC) v->vstore.u0.sfval--; else v->vstore.u0.sfval++; break; default: error("bad type for post --/++"); } }
void ocall(Node *n, Node *res) { Lsym *s; Rplace *rsav; res->op = OCONST; /* Default return value */ res->type = TLIST; res->l = 0; chklval(n->left); s = n->left->sym; if(n->builtin && !s->builtin){ error("no builtin %s", s->name); return; } if(s->builtin && (n->builtin || s->proc == 0)) { (*s->builtin)(res, n->right); return; } if(s->proc == 0) error("no function %s", s->name); rsav = ret; call(s->name, n->right, s->proc->left, s->proc->right, res); ret = rsav; }
void oasgn(Node *n, Node *res) { Node *lp, r; Value *v; lp = n->left; switch(lp->op) { case OINDM: windir(cormap, lp->left, n->right, res); break; case OINDC: windir(symmap, lp->left, n->right, res); break; default: chklval(lp); v = lp->sym->v; expr(n->right, &r); v->set = 1; v->type = r.type; v->vstore = r.nstore; res->op = OCONST; res->type = v->type; res->nstore = v->vstore; res->nstore.comt = v->vstore.comt; } }
void oeinc(Node *n, Node *res) { Value *v; chklval(n->left); v = n->left->sym->v; res->op = OCONST; res->type = v->type; switch(v->type) { case TINT: if(n->op == OEDEC) v->ival -= fmtsize(v); else v->ival += fmtsize(v); break; case TFLOAT: if(n->op == OEDEC) v->fval--; else v->fval++; break; default: error("bad type for pre --/++"); } res->Store = v->Store; }