/* ** exprData.c */ # include /* for isdigit */ # include "splintMacros.nf" # include "basic.h" # include "cgrammar.h" # include "cgrammar_tokens.h" # include "exprChecks.h" # include "exprNodeSList.h" void exprData_freeShallow (/*@only@*/ exprData data, exprKind kind) { /*@-compdestroy@*/ if (data == exprData_undefined) { return; } switch (kind) { case XPR_INITBLOCK: case XPR_CALL: exprNode_freeShallow (data->call->fcn); exprNodeList_freeShallow (data->call->args); sfree (data->call); break; case XPR_COMMA: case XPR_FETCH: case XPR_OP: case XPR_ASSIGN: case XPR_IF: case XPR_WHILE: case XPR_DOWHILE: case XPR_STMTLIST: case XPR_SWITCH: case XPR_FOR: exprNode_freeShallow (data->op->a); exprNode_freeShallow (data->op->b); sfree (data->op); break; case XPR_STMT: case XPR_PREOP: case XPR_POSTOP: case XPR_PARENS: exprNode_freeShallow (data->uop->a); sfree (data->uop); break; case XPR_FTCASE: case XPR_CASE: case XPR_RETURN: case XPR_WHILEPRED: case XPR_BLOCK: exprNode_freeShallow (data->single); break; case XPR_CAST: case XPR_VAARG: exprNode_freeShallow (data->cast->exp); /* NO: qtype_free (data->cast->q); */ sfree (data->cast); break; case XPR_ITERCALL: exprNodeList_freeShallow (data->itercall->args); sfree (data->itercall); break; case XPR_ITER: exprNodeList_freeShallow (data->iter->args); exprNode_freeShallow (data->iter->body); sfree (data->iter); break; case XPR_FORPRED: case XPR_COND: case XPR_IFELSE: exprNode_freeShallow (data->triple->pred); exprNode_freeShallow (data->triple->tbranch); exprNode_freeShallow (data->triple->fbranch); sfree (data->triple); break; case XPR_INIT: exprNode_freeShallow (data->init->exp); /* NO: idDecl_free (data->init->id); */ sfree (data->init); break; case XPR_FACCESS: case XPR_ARROW: exprNode_freeShallow (data->field->rec); /* NO: cstring_free (data->field->field); */ sfree (data->field); break; case XPR_LABEL: case XPR_CONST: case XPR_VAR: break; case XPR_OFFSETOF: case XPR_ALIGNOFT: case XPR_ALIGNOF: case XPR_SIZEOFT: case XPR_SIZEOF: case XPR_GOTO: case XPR_CONTINUE: case XPR_BREAK: case XPR_NULLRETURN: case XPR_TOK: case XPR_FTDEFAULT: case XPR_DEFAULT: break; case XPR_STRINGLITERAL: case XPR_NUMLIT: llcontbuglit ("exprData_freeShallow: not shallow!"); break; case XPR_EMPTY: llcontbuglit ("XPR_EMPTY case!"); break; case XPR_BODY: llcontbuglit ("XPR_BODY case!"); break; case XPR_NODE: llcontbuglit ("XPR_NODE case!"); break; } sfree (data); /*@=compdestroy@*/ } void exprData_free (/*@only@*/ exprData data, exprKind kind) { if (data == exprData_undefined) { return; } switch (kind) { case XPR_INITBLOCK: case XPR_CALL: exprNode_free (data->call->fcn); exprNodeList_free (data->call->args); sfree (data->call); break; case XPR_LABEL: case XPR_CONST: case XPR_VAR: cstring_free (data->id); break; case XPR_COMMA: case XPR_FETCH: case XPR_OP: case XPR_ASSIGN: case XPR_IF: case XPR_WHILE: case XPR_DOWHILE: case XPR_STMTLIST: case XPR_SWITCH: case XPR_FOR: exprNode_free (data->op->a); exprNode_free (data->op->b); sfree (data->op); break; case XPR_STMT: case XPR_PREOP: case XPR_POSTOP: case XPR_PARENS: exprNode_free (data->uop->a); sfree (data->uop); break; case XPR_OFFSETOF: qtype_free (data->offset->q); cstringList_free (data->offset->field); sfree (data->offset); break; case XPR_ALIGNOFT: case XPR_SIZEOFT: qtype_free (data->qt); break; case XPR_FTCASE: case XPR_CASE: case XPR_SIZEOF: case XPR_ALIGNOF: case XPR_RETURN: case XPR_WHILEPRED: case XPR_BLOCK: exprNode_free (data->single); break; case XPR_CAST: case XPR_VAARG: exprNode_free (data->cast->exp); qtype_free (data->cast->q); sfree (data->cast); break; case XPR_ITERCALL: exprNodeList_free (data->itercall->args); sfree (data->itercall); break; case XPR_ITER: exprNodeList_free (data->iter->args); exprNode_free (data->iter->body); sfree (data->iter); break; case XPR_FORPRED: case XPR_COND: case XPR_IFELSE: exprNode_free (data->triple->pred); exprNode_free (data->triple->tbranch); exprNode_free (data->triple->fbranch); sfree (data->triple); break; case XPR_GOTO: case XPR_STRINGLITERAL: case XPR_NUMLIT: cstring_free (data->literal); break; case XPR_CONTINUE: case XPR_BREAK: case XPR_NULLRETURN: break; case XPR_FTDEFAULT: case XPR_DEFAULT: case XPR_TOK: break; case XPR_INIT: exprNode_free (data->init->exp); idDecl_free (data->init->id); sfree (data->init); break; case XPR_FACCESS: case XPR_ARROW: exprNode_free (data->field->rec); cstring_free (data->field->field); sfree (data->field); break; case XPR_EMPTY: llcontbuglit ("XPR_EMPTY case!"); break; case XPR_BODY: llcontbuglit ("XPR_BODY case!"); break; case XPR_NODE: llcontbuglit ("XPR_NODE case!"); break; } sfree (data); } /*@exposed@*/ exprNode exprData_getInitNode (exprData data) /*@*/ { llassert (data != exprData_undefined); return (data->init->exp); } /*@exposed@*/ idDecl exprData_getInitId (exprData data) /*@*/ { llassert (data != exprData_undefined); return (data->init->id); } /*@exposed@*/ exprNode exprData_getOpA (exprData data) /*@*/ { llassert (data != exprData_undefined); return (data->op->a); } /*@exposed@*/ exprNode exprData_getOpB (exprData data) /*@*/ { llassertretval (data != exprData_undefined, exprNode_undefined); return (data->op->b); } /*@observer@*/ lltok exprData_getOpTok (exprData data) /*@*/ { llassert (data != exprData_undefined); return (data->op->op); } /*@exposed@*/ exprNode exprData_getPairA (exprData data) /*@*/ { llassertretval (data != exprData_undefined, exprNode_undefined); return (data->pair->a); } /*@exposed@*/ exprNode exprData_getPairB (exprData data) /*@*/ { llassertretval (data != exprData_undefined, exprNode_undefined); return (data->pair->b); } /*@exposed@*/ uentry exprData_getIterSname (exprData data) /*@*/ { llassertretval (data != exprData_undefined, uentry_undefined); return (data->iter->sname); } /*@exposed@*/ exprNodeList exprData_getIterAlist (exprData data) /*@*/ { llassert (data != exprData_undefined); return (data->iter->args); } /*@exposed@*/ exprNode exprData_getIterBody (exprData data) /*@*/ { llassertretval (data != exprData_undefined, exprNode_undefined); return (data->iter->body); } /*@exposed@*/ uentry exprData_getIterEname (exprData data) /*@*/ { llassertretval (data != exprData_undefined, uentry_undefined); return (data->iter->ename); } /*@exposed@*/ exprNode exprData_getFcn (exprData data) /*@*/ { llassertretval (data != exprData_undefined, exprNode_undefined); return (data->call->fcn); } /*@exposed@*/ exprNodeList exprData_getArgs (exprData data) /*@*/ { llassert (data != exprData_undefined); return (data->call->args); } /*@exposed@*/ exprNode exprData_getTriplePred (exprData data) /*@*/ { llassert (data != exprData_undefined); return (data->triple->pred); } /*@exposed@*/ uentry exprData_getIterCallIter (exprData data) /*@*/ { llassert (data != exprData_undefined); return (data->itercall->iter); } /*@exposed@*/ exprNodeList exprData_getIterCallArgs (exprData data) /*@*/ { llassert (data != exprData_undefined); return (data->itercall->args); } /*@exposed@*/ exprNode exprData_getTripleInit (exprData data) /*@*/ { llassert (data != exprData_undefined); return (data->triple->pred); } /*@exposed@*/ exprNode exprData_getTripleTrue (exprData data) /*@*/ { llassert (data != exprData_undefined); return (data->triple->tbranch); } /*@exposed@*/ exprNode exprData_getTripleTest (exprData data) /*@*/ { llassert (data != exprData_undefined); return (data->triple->tbranch); } /*@exposed@*/ exprNode exprData_getTripleFalse (exprData data) /*@*/ { llassert (data != exprData_undefined); return (data->triple->fbranch); } /*@exposed@*/ exprNode exprData_getTripleInc (exprData data) /*@*/ { llassert (data != exprData_undefined); return (data->triple->fbranch); } /*@exposed@*/ exprNode exprData_getFieldNode (exprData data) /*@*/ { llassert (data != exprData_undefined); return (data->field->rec); } /*@exposed@*/ cstring exprData_getFieldName (exprData data) /*@*/ { llassert (data != exprData_undefined); return (data->field->field); } /*@observer@*/ lltok exprData_getUopTok (exprData data) /*@*/ { llassert (data != exprData_undefined); return (data->uop->op); } /*@exposed@*/ exprNode exprData_getUopNode (exprData data) /*@*/ { llassert (data != exprData_undefined); return (data->uop->a); } /*@exposed@*/ exprNode exprData_getCastNode (exprData data) /*@*/ { llassert (data != exprData_undefined); return (data->cast->exp); } /*@observer@*/ lltok exprData_getCastTok (exprData data) /*@*/ { llassert (data != exprData_undefined); return (data->cast->tok); } /*@exposed@*/ qtype exprData_getCastType (exprData data) /*@*/ { llassert (data != exprData_undefined); return (data->cast->q); } /*@exposed@*/ cstring exprData_getLiteral (exprData data) /*@*/ { llassert (data != exprData_undefined); return (data->literal); } /*@exposed@*/ cstring exprData_getId (exprData data) /*@*/ { llassert (data != exprData_undefined); return (data->id); } /*@observer@*/ lltok exprData_getTok (exprData data) /*@*/ { llassert (data != exprData_undefined); return data->tok; } /*@exposed@*/ qtype exprData_getType (exprData data) /*@*/ { llassert (data != exprData_undefined); return (data->qt); } /*@exposed@*/ qtype exprData_getOffsetType (exprData data) /*@*/ { llassert (data != exprData_undefined); return (data->offset->q); } /*@exposed@*/ cstringList exprData_getOffsetName (exprData data) /*@*/ { llassert (data != exprData_undefined); return (data->offset->field); } /*@exposed@*/ exprNode exprData_getSingle (exprData data) /*@*/ { exprNode ret; llassert (data != exprData_undefined); ret = data->single; return (ret); } /*@only@*/ exprData exprData_makeOp (/*@keep@*/ exprNode a, /*@keep@*/ exprNode b, /*@keep@*/ lltok op) { exprData ed = (exprData) dmalloc (sizeof (*ed)); ed->op = (exprOp) dmalloc (sizeof (*ed->op)); ed->op->a = a; ed->op->b = b; ed->op->op = op; return ed; } /*@only@*/ exprData exprData_makeUop (/*@keep@*/ exprNode a, /*@keep@*/ lltok op) { exprData ed = (exprData) dmalloc (sizeof (*ed)); ed->uop = (exprUop) dmalloc (sizeof (*ed->uop)); ed->uop->a = a; ed->uop->op = op; return ed; } /*@only@*/ exprData exprData_makeSingle (/*@only@*/ exprNode a) { exprData ed = (exprData) dmalloc (sizeof (*ed)); ed->single = a; return ed; } /*@only@*/ exprData exprData_makeTok (/*@only@*/ lltok op) { exprData ed = (exprData) dmalloc (sizeof (*ed)); ed->tok = op; return ed; } /*@only@*/ exprData exprData_makeIter (/*@exposed@*/ uentry sname, /*@keep@*/ exprNodeList args, /*@keep@*/ exprNode body, /*@exposed@*/ uentry ename) { exprData ed = (exprData) dmalloc (sizeof (*ed)); ed->iter = (exprIter) dmalloc (sizeof (*ed->iter)); ed->iter->sname = uentry_isVar (sname) ? uentry_copy (sname) : sname; ed->iter->args = args; ed->iter->body = body; ed->iter->ename = uentry_isVar (ename) ? uentry_copy (ename) : ename; return ed; } /*@only@*/ exprData exprData_makeTriple (/*@keep@*/ exprNode pred, /*@keep@*/ exprNode tbranch, /*@keep@*/ exprNode fbranch) { exprData ed = (exprData) dmalloc (sizeof (*ed)); ed->triple = (exprTriple) dmalloc (sizeof (*ed->triple)); ed->triple->pred = pred; ed->triple->tbranch = tbranch; ed->triple->fbranch = fbranch; return ed; } /*@only@*/ exprData exprData_makeCall (/*@keep@*/ exprNode fcn, /*@keep@*/ exprNodeList args) { exprData ed = (exprData) dmalloc (sizeof (*ed)); ed->call = (exprCall) dmalloc (sizeof (*ed->call)); ed->call->fcn = fcn; ed->call->args = args; return ed; } /*@only@*/ exprData exprData_makeIterCall (/*@dependent@*/ uentry iter, /*@keep@*/ exprNodeList args) { exprData ed = (exprData) dmalloc (sizeof (*ed)); ed->itercall = (exprIterCall) dmalloc (sizeof (*ed->itercall)); ed->itercall->iter = uentry_isVar (iter) ? uentry_copy (iter) : iter; ed->itercall->args = args; return ed; } /*@only@*/ exprData exprData_makeField (/*@keep@*/ exprNode rec, /*@keep@*/ cstring field) { exprData ed = (exprData) dmalloc (sizeof (*ed)); ed->field = (exprField) dmalloc (sizeof (*ed->field)); ed->field->rec = rec; ed->field->field = field; return ed; } /*@only@*/ exprData exprData_makeOffsetof (/*@only@*/ qtype q, /*@keep@*/ cstringList s) { exprData ed = (exprData) dmalloc (sizeof (*ed)); ed->offset = (exprOffsetof) dmalloc (sizeof (*ed->offset)); ed->offset->q = q; ed->offset->field = s; return ed; } /*@only@*/ exprData exprData_makeSizeofType (/*@only@*/ qtype q) { exprData ed = (exprData) dmalloc (sizeof (*ed)); ed->qt = q; return ed; } /*@only@*/ exprData exprData_makeCast (/*@keep@*/ lltok tok, /*@keep@*/ exprNode e, /*@only@*/ qtype q) { exprData ed = (exprData) dmalloc (sizeof (*ed)); ed->cast = (exprCast) dmalloc (sizeof (*ed->cast)); ed->cast->tok = tok; ed->cast->exp = e; ed->cast->q = q; return ed; } /*@only@*/ exprData exprData_makeInit (/*@keep@*/ idDecl t, /*@keep@*/ exprNode e) { exprData ed = (exprData) dmalloc (sizeof (*ed)); ed->init = (exprInit) dmalloc (sizeof (*ed->init)); ed->init->exp = e; ed->init->id = t; return ed; } /*@only@*/ exprData exprData_makeCond (/*@keep@*/ exprNode pred, /*@keep@*/ exprNode ifclause, /*@keep@*/ exprNode elseclause) { return exprData_makeTriple (pred, ifclause, elseclause); } /*@only@*/ exprData exprData_makeFor (/*@keep@*/ exprNode init, /*@keep@*/ exprNode pred, /*@keep@*/ exprNode inc) { return exprData_makeTriple (init, pred, inc); } /*@only@*/ exprData exprData_makeLiteral (/*@only@*/ cstring s) { exprData ed = (exprData) dmalloc (sizeof (*ed)); ed->literal = s; return ed; } /*@only@*/ exprData exprData_makeId (/*@temp@*/ uentry id) { exprData ed = (exprData) dmalloc (sizeof (*ed)); ed->id = cstring_copy (uentry_rawName (id)); return ed; } /*@only@*/ exprData exprData_makePair (/*@keep@*/ exprNode a, /*@keep@*/ exprNode b) { exprData ed = (exprData) dmalloc (sizeof (*ed)); ed->pair = (exprPair) dmalloc (sizeof (*ed->pair)); ed->pair->a = a; ed->pair->b = b; return ed; }