5 # include <ctype.h> /* for isdigit */
6 # include "splintMacros.nf"
9 # include "cgrammar_tokens.h"
11 # include "exprChecks.h"
12 # include "exprNodeSList.h"
14 void exprData_freeShallow (/*@only@*/ exprData data, exprKind kind)
18 if (data == exprData_undefined)
27 exprNode_freeShallow (data->call->fcn);
28 exprNodeList_freeShallow (data->call->args);
41 exprNode_freeShallow (data->op->a);
42 exprNode_freeShallow (data->op->b);
50 exprNode_freeShallow (data->uop->a);
59 exprNode_freeShallow (data->single);
64 exprNode_freeShallow (data->cast->exp);
65 /* NO: qtype_free (data->cast->q); */
70 exprNodeList_freeShallow (data->itercall->args);
71 sfree (data->itercall);
75 exprNodeList_freeShallow (data->iter->args);
76 exprNode_freeShallow (data->iter->body);
83 exprNode_freeShallow (data->triple->pred);
84 exprNode_freeShallow (data->triple->tbranch);
85 exprNode_freeShallow (data->triple->fbranch);
90 exprNode_freeShallow (data->init->exp);
91 /* NO: idDecl_free (data->init->id); */
97 exprNode_freeShallow (data->field->rec);
98 /* NO: cstring_free (data->field->field); */
121 case XPR_STRINGLITERAL:
123 llcontbuglit ("exprData_freeShallow: not shallow!");
127 llcontbuglit ("XPR_EMPTY case!");
131 llcontbuglit ("XPR_BODY case!");
134 llcontbuglit ("XPR_NODE case!");
142 void exprData_free (/*@only@*/ exprData data, exprKind kind)
144 if (data == exprData_undefined)
153 exprNode_free (data->call->fcn);
154 exprNodeList_free (data->call->args);
161 cstring_free (data->id);
174 exprNode_free (data->op->a);
175 exprNode_free (data->op->b);
183 exprNode_free (data->uop->a);
188 qtype_free (data->offset->q);
189 cstringList_free (data->offset->field);
190 sfree (data->offset);
195 qtype_free (data->qt);
205 exprNode_free (data->single);
210 exprNode_free (data->cast->exp);
211 qtype_free (data->cast->q);
216 exprNodeList_free (data->itercall->args);
217 sfree (data->itercall);
221 exprNodeList_free (data->iter->args);
222 exprNode_free (data->iter->body);
229 exprNode_free (data->triple->pred);
230 exprNode_free (data->triple->tbranch);
231 exprNode_free (data->triple->fbranch);
232 sfree (data->triple);
236 case XPR_STRINGLITERAL:
238 cstring_free (data->literal);
252 exprNode_free (data->init->exp);
253 idDecl_free (data->init->id);
259 exprNode_free (data->field->rec);
260 cstring_free (data->field->field);
265 llcontbuglit ("XPR_EMPTY case!");
268 llcontbuglit ("XPR_BODY case!");
271 llcontbuglit ("XPR_NODE case!");
278 /*@exposed@*/ exprNode exprData_getInitNode (exprData data) /*@*/
280 llassert (data != exprData_undefined);
281 return (data->init->exp);
284 /*@exposed@*/ idDecl exprData_getInitId (exprData data) /*@*/
286 llassert (data != exprData_undefined);
287 return (data->init->id);
290 /*@exposed@*/ exprNode exprData_getOpA (exprData data) /*@*/
292 llassert (data != exprData_undefined);
293 return (data->op->a);
296 /*@exposed@*/ exprNode exprData_getOpB (exprData data) /*@*/
298 llassertretval (data != exprData_undefined, exprNode_undefined);
299 return (data->op->b);
302 /*@observer@*/ lltok exprData_getOpTok (exprData data) /*@*/
304 llassert (data != exprData_undefined);
305 return (data->op->op);
308 /*@exposed@*/ exprNode exprData_getPairA (exprData data) /*@*/
310 llassertretval (data != exprData_undefined, exprNode_undefined);
311 return (data->pair->a);
314 /*@exposed@*/ exprNode exprData_getPairB (exprData data) /*@*/
316 llassertretval (data != exprData_undefined, exprNode_undefined);
317 return (data->pair->b);
320 /*@exposed@*/ uentry exprData_getIterSname (exprData data) /*@*/
322 llassertretval (data != exprData_undefined, uentry_undefined);
323 return (data->iter->sname);
326 /*@exposed@*/ exprNodeList exprData_getIterAlist (exprData data) /*@*/
328 llassert (data != exprData_undefined);
329 return (data->iter->args);
332 /*@exposed@*/ exprNode exprData_getIterBody (exprData data) /*@*/
334 llassertretval (data != exprData_undefined, exprNode_undefined);
335 return (data->iter->body);
338 /*@exposed@*/ uentry exprData_getIterEname (exprData data) /*@*/
340 llassertretval (data != exprData_undefined, uentry_undefined);
341 return (data->iter->ename);
344 /*@exposed@*/ exprNode exprData_getFcn (exprData data) /*@*/
346 llassertretval (data != exprData_undefined, exprNode_undefined);
347 return (data->call->fcn);
350 /*@exposed@*/ exprNodeList exprData_getArgs (exprData data) /*@*/
352 llassert (data != exprData_undefined);
353 return (data->call->args);
356 /*@exposed@*/ exprNode exprData_getTriplePred (exprData data) /*@*/
358 llassert (data != exprData_undefined);
359 return (data->triple->pred);
362 /*@exposed@*/ uentry exprData_getIterCallIter (exprData data) /*@*/
364 llassert (data != exprData_undefined);
365 return (data->itercall->iter);
368 /*@exposed@*/ exprNodeList
369 exprData_getIterCallArgs (exprData data) /*@*/
371 llassert (data != exprData_undefined);
372 return (data->itercall->args);
375 /*@exposed@*/ exprNode exprData_getTripleInit (exprData data) /*@*/
377 llassert (data != exprData_undefined);
378 return (data->triple->pred);
381 /*@exposed@*/ exprNode exprData_getTripleTrue (exprData data) /*@*/
383 llassert (data != exprData_undefined);
384 return (data->triple->tbranch);
387 /*@exposed@*/ exprNode exprData_getTripleTest (exprData data) /*@*/
389 llassert (data != exprData_undefined);
390 return (data->triple->tbranch);
393 /*@exposed@*/ exprNode exprData_getTripleFalse (exprData data) /*@*/
395 llassert (data != exprData_undefined);
396 return (data->triple->fbranch);
399 /*@exposed@*/ exprNode exprData_getTripleInc (exprData data) /*@*/
401 llassert (data != exprData_undefined);
402 return (data->triple->fbranch);
405 /*@exposed@*/ exprNode exprData_getFieldNode (exprData data) /*@*/
407 llassert (data != exprData_undefined);
408 return (data->field->rec);
411 /*@exposed@*/ cstring exprData_getFieldName (exprData data) /*@*/
413 llassert (data != exprData_undefined);
414 return (data->field->field);
417 /*@observer@*/ lltok exprData_getUopTok (exprData data) /*@*/
419 llassert (data != exprData_undefined);
420 return (data->uop->op);
423 /*@exposed@*/ exprNode exprData_getUopNode (exprData data) /*@*/
425 llassert (data != exprData_undefined);
426 return (data->uop->a);
429 /*@exposed@*/ exprNode exprData_getCastNode (exprData data) /*@*/
431 llassert (data != exprData_undefined);
432 return (data->cast->exp);
435 /*@observer@*/ lltok exprData_getCastTok (exprData data) /*@*/
437 llassert (data != exprData_undefined);
438 return (data->cast->tok);
441 /*@exposed@*/ qtype exprData_getCastType (exprData data) /*@*/
443 llassert (data != exprData_undefined);
444 return (data->cast->q);
447 /*@exposed@*/ cstring exprData_getLiteral (exprData data) /*@*/
449 llassert (data != exprData_undefined);
450 return (data->literal);
453 /*@exposed@*/ cstring exprData_getId (exprData data) /*@*/
455 llassert (data != exprData_undefined);
459 /*@observer@*/ lltok exprData_getTok (exprData data) /*@*/
461 llassert (data != exprData_undefined);
465 /*@exposed@*/ qtype exprData_getType (exprData data) /*@*/
467 llassert (data != exprData_undefined);
471 /*@exposed@*/ qtype exprData_getOffsetType (exprData data) /*@*/
473 llassert (data != exprData_undefined);
474 return (data->offset->q);
477 /*@exposed@*/ cstringList exprData_getOffsetName (exprData data) /*@*/
479 llassert (data != exprData_undefined);
480 return (data->offset->field);
483 /*@exposed@*/ exprNode exprData_getSingle (exprData data) /*@*/
486 llassert (data != exprData_undefined);
494 exprData_makeOp (/*@keep@*/ exprNode a, /*@keep@*/ exprNode b, /*@keep@*/ lltok op)
496 exprData ed = (exprData) dmalloc (sizeof (*ed));
498 ed->op = (exprOp) dmalloc (sizeof (*ed->op));
506 /*@only@*/ exprData exprData_makeUop (/*@keep@*/ exprNode a, /*@keep@*/ lltok op)
508 exprData ed = (exprData) dmalloc (sizeof (*ed));
510 ed->uop = (exprUop) dmalloc (sizeof (*ed->uop));
517 /*@only@*/ exprData exprData_makeSingle (/*@only@*/ exprNode a)
519 exprData ed = (exprData) dmalloc (sizeof (*ed));
525 /*@only@*/ exprData exprData_makeTok (/*@only@*/ lltok op)
527 exprData ed = (exprData) dmalloc (sizeof (*ed));
534 exprData_makeIter (/*@exposed@*/ uentry sname, /*@keep@*/ exprNodeList args,
535 /*@keep@*/ exprNode body, /*@exposed@*/ uentry ename)
537 exprData ed = (exprData) dmalloc (sizeof (*ed));
539 ed->iter = (exprIter) dmalloc (sizeof (*ed->iter));
540 ed->iter->sname = uentry_isVar (sname) ? uentry_copy (sname) : sname;
541 ed->iter->args = args;
542 ed->iter->body = body;
543 ed->iter->ename = uentry_isVar (ename) ? uentry_copy (ename) : ename;
547 /*@only@*/ exprData exprData_makeTriple (/*@keep@*/ exprNode pred,
548 /*@keep@*/ exprNode tbranch,
549 /*@keep@*/ exprNode fbranch)
551 exprData ed = (exprData) dmalloc (sizeof (*ed));
553 ed->triple = (exprTriple) dmalloc (sizeof (*ed->triple));
554 ed->triple->pred = pred;
555 ed->triple->tbranch = tbranch;
556 ed->triple->fbranch = fbranch;
561 /*@only@*/ exprData exprData_makeCall (/*@keep@*/ exprNode fcn,
562 /*@keep@*/ exprNodeList args)
564 exprData ed = (exprData) dmalloc (sizeof (*ed));
566 ed->call = (exprCall) dmalloc (sizeof (*ed->call));
568 ed->call->args = args;
573 /*@only@*/ exprData exprData_makeIterCall (/*@dependent@*/ uentry iter,
574 /*@keep@*/ exprNodeList args)
576 exprData ed = (exprData) dmalloc (sizeof (*ed));
578 ed->itercall = (exprIterCall) dmalloc (sizeof (*ed->itercall));
579 ed->itercall->iter = uentry_isVar (iter) ? uentry_copy (iter) : iter;
580 ed->itercall->args = args;
585 /*@only@*/ exprData exprData_makeField (/*@keep@*/ exprNode rec,
586 /*@keep@*/ cstring field)
588 exprData ed = (exprData) dmalloc (sizeof (*ed));
590 ed->field = (exprField) dmalloc (sizeof (*ed->field));
591 ed->field->rec = rec;
592 ed->field->field = field;
597 /*@only@*/ exprData exprData_makeOffsetof (/*@only@*/ qtype q,
598 /*@keep@*/ cstringList s)
600 exprData ed = (exprData) dmalloc (sizeof (*ed));
601 ed->offset = (exprOffsetof) dmalloc (sizeof (*ed->offset));
604 ed->offset->field = s;
608 /*@only@*/ exprData exprData_makeSizeofType (/*@only@*/ qtype q)
610 exprData ed = (exprData) dmalloc (sizeof (*ed));
617 exprData_makeCast (/*@keep@*/ lltok tok, /*@keep@*/ exprNode e, /*@only@*/ qtype q)
619 exprData ed = (exprData) dmalloc (sizeof (*ed));
621 ed->cast = (exprCast) dmalloc (sizeof (*ed->cast));
630 exprData_makeInit (/*@keep@*/ idDecl t, /*@keep@*/ exprNode e)
632 exprData ed = (exprData) dmalloc (sizeof (*ed));
634 ed->init = (exprInit) dmalloc (sizeof (*ed->init));
641 /*@only@*/ exprData exprData_makeCond (/*@keep@*/ exprNode pred,
642 /*@keep@*/ exprNode ifclause,
643 /*@keep@*/ exprNode elseclause)
645 return exprData_makeTriple (pred, ifclause, elseclause);
648 /*@only@*/ exprData exprData_makeFor (/*@keep@*/ exprNode init,
649 /*@keep@*/ exprNode pred,
650 /*@keep@*/ exprNode inc)
652 return exprData_makeTriple (init, pred, inc);
656 /*@only@*/ exprData exprData_makeLiteral (/*@only@*/ cstring s)
658 exprData ed = (exprData) dmalloc (sizeof (*ed));
664 /*@only@*/ exprData exprData_makeId (/*@temp@*/ uentry id)
666 exprData ed = (exprData) dmalloc (sizeof (*ed));
667 ed->id = cstring_copy (uentry_rawName (id));
671 /*@only@*/ exprData exprData_makePair (/*@keep@*/ exprNode a, /*@keep@*/ exprNode b)
673 exprData ed = (exprData) dmalloc (sizeof (*ed));
675 ed->pair = (exprPair) dmalloc (sizeof (*ed->pair));