Mercurial > cpython-lru_cache-weakref
view Parser/node.c @ 17581:c1937faabb23 2.1
Added support for optional explanation parameter to the \versionadded
macro.
Refactored do_cmd_versionadded() and do_cmd_versionchanged() to do most
of the work in a helper function, with the do_cmd_*() wrappers just supplying
a portion of the replacement text.
| author | Fred Drake <fdrake@acm.org> |
|---|---|
| date | Wed, 18 Apr 2001 17:29:14 +0000 |
| parents | fb6b51033c3b |
| children | 21bd86e00bce 76e9a14fb7c5 |
line wrap: on
line source
/* Parse tree node implementation */ #include "Python.h" #include "node.h" #include "errcode.h" node * PyNode_New(int type) { node *n = PyMem_NEW(node, 1); if (n == NULL) return NULL; n->n_type = type; n->n_str = NULL; n->n_lineno = 0; n->n_nchildren = 0; n->n_child = NULL; return n; } #define XXX 3 /* Node alignment factor to speed up realloc */ #define XXXROUNDUP(n) ((n) == 1 ? 1 : ((n) + XXX - 1) / XXX * XXX) int PyNode_AddChild(register node *n1, int type, char *str, int lineno) { register int nch = n1->n_nchildren; register int nch1 = nch+1; register node *n; if (nch == INT_MAX || nch < 0) return E_OVERFLOW; if (XXXROUNDUP(nch) < nch1) { n = n1->n_child; nch1 = XXXROUNDUP(nch1); PyMem_RESIZE(n, node, nch1); if (n == NULL) return E_NOMEM; n1->n_child = n; } n = &n1->n_child[n1->n_nchildren++]; n->n_type = type; n->n_str = str; n->n_lineno = lineno; n->n_nchildren = 0; n->n_child = NULL; return 0; } /* Forward */ static void freechildren(node *); void PyNode_Free(node *n) { if (n != NULL) { freechildren(n); PyMem_DEL(n); } } static void freechildren(node *n) { int i; for (i = NCH(n); --i >= 0; ) freechildren(CHILD(n, i)); if (n->n_child != NULL) PyMem_DEL(n->n_child); if (STR(n) != NULL) PyMem_DEL(STR(n)); }
