blob: 910192d3ac612bcf35d05dbab7977f3df9738088 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Jeremy Hylton94988062000-06-20 19:10:44 +000011#include <limits.h>
12
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000013/* Parse tree node implementation */
14
Guido van Rossum3f5da241990-12-20 15:06:42 +000015#include "pgenheaders.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000016#include "node.h"
Jeremy Hylton94988062000-06-20 19:10:44 +000017#include "errcode.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000018
19node *
Thomas Wouters23c9e002000-07-22 19:20:54 +000020PyNode_New(int type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000021{
Guido van Rossum86bea461997-04-29 21:03:06 +000022 node *n = PyMem_NEW(node, 1);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000023 if (n == NULL)
24 return NULL;
25 n->n_type = type;
26 n->n_str = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000027 n->n_lineno = 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000028 n->n_nchildren = 0;
29 n->n_child = NULL;
30 return n;
31}
32
33#define XXX 3 /* Node alignment factor to speed up realloc */
34#define XXXROUNDUP(n) ((n) == 1 ? 1 : ((n) + XXX - 1) / XXX * XXX)
35
Jeremy Hylton94988062000-06-20 19:10:44 +000036int
Thomas Wouters23c9e002000-07-22 19:20:54 +000037PyNode_AddChild(register node *n1, int type, char *str, int lineno)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000038{
39 register int nch = n1->n_nchildren;
40 register int nch1 = nch+1;
41 register node *n;
Jeremy Hylton94988062000-06-20 19:10:44 +000042 if (nch == SHRT_MAX || nch < 0)
43 return E_OVERFLOW;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000044 if (XXXROUNDUP(nch) < nch1) {
45 n = n1->n_child;
46 nch1 = XXXROUNDUP(nch1);
Guido van Rossum86bea461997-04-29 21:03:06 +000047 PyMem_RESIZE(n, node, nch1);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000048 if (n == NULL)
Jeremy Hylton94988062000-06-20 19:10:44 +000049 return E_NOMEM;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000050 n1->n_child = n;
51 }
52 n = &n1->n_child[n1->n_nchildren++];
53 n->n_type = type;
54 n->n_str = str;
Guido van Rossum3f5da241990-12-20 15:06:42 +000055 n->n_lineno = lineno;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000056 n->n_nchildren = 0;
57 n->n_child = NULL;
Jeremy Hylton94988062000-06-20 19:10:44 +000058 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000059}
Guido van Rossum03a24cd1990-11-18 17:37:06 +000060
Guido van Rossum3f5da241990-12-20 15:06:42 +000061/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000062static void freechildren(node *);
Guido van Rossum3f5da241990-12-20 15:06:42 +000063
64
65void
Thomas Wouters23c9e002000-07-22 19:20:54 +000066PyNode_Free(node *n)
Guido van Rossum3f5da241990-12-20 15:06:42 +000067{
68 if (n != NULL) {
69 freechildren(n);
Guido van Rossum86bea461997-04-29 21:03:06 +000070 PyMem_DEL(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +000071 }
72}
73
Guido van Rossum03a24cd1990-11-18 17:37:06 +000074static void
Thomas Wouters23c9e002000-07-22 19:20:54 +000075freechildren(node *n)
Guido van Rossum03a24cd1990-11-18 17:37:06 +000076{
77 int i;
78 for (i = NCH(n); --i >= 0; )
79 freechildren(CHILD(n, i));
80 if (n->n_child != NULL)
Guido van Rossum86bea461997-04-29 21:03:06 +000081 PyMem_DEL(n->n_child);
Guido van Rossum03a24cd1990-11-18 17:37:06 +000082 if (STR(n) != NULL)
Guido van Rossum86bea461997-04-29 21:03:06 +000083 PyMem_DEL(STR(n));
Guido van Rossum03a24cd1990-11-18 17:37:06 +000084}