[2.7] properly free memory in pgen. (GH-7869) (closes bpo-27780
(cherry picked from commit 9ac11a752a
)
Co-authored-by: Benjamin Peterson <benjamin@python.org>
This commit is contained in:
parent
1c9a72cc99
commit
482fac7499
|
@ -69,6 +69,7 @@ typedef struct {
|
||||||
/* FUNCTIONS */
|
/* FUNCTIONS */
|
||||||
|
|
||||||
grammar *newgrammar(int start);
|
grammar *newgrammar(int start);
|
||||||
|
void freegrammar(grammar *g);
|
||||||
dfa *adddfa(grammar *g, int type, char *name);
|
dfa *adddfa(grammar *g, int type, char *name);
|
||||||
int addstate(dfa *d);
|
int addstate(dfa *d);
|
||||||
void addarc(dfa *d, int from, int to, int lbl);
|
void addarc(dfa *d, int from, int to, int lbl);
|
||||||
|
|
|
@ -32,6 +32,24 @@ newgrammar(int start)
|
||||||
return g;
|
return g;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
freegrammar(grammar *g)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < g->g_ndfas; i++) {
|
||||||
|
int j;
|
||||||
|
free(g->g_dfa[i].d_name);
|
||||||
|
for (j = 0; j < g->g_dfa[i].d_nstates; j++)
|
||||||
|
PyObject_FREE(g->g_dfa[i].d_state[j].s_arc);
|
||||||
|
PyObject_FREE(g->g_dfa[i].d_state);
|
||||||
|
}
|
||||||
|
PyObject_FREE(g->g_dfa);
|
||||||
|
for (i = 0; i < g->g_ll.ll_nlabels; i++)
|
||||||
|
free(g->g_ll.ll_label[i].lb_str);
|
||||||
|
PyObject_FREE(g->g_ll.ll_label);
|
||||||
|
PyObject_FREE(g);
|
||||||
|
}
|
||||||
|
|
||||||
dfa *
|
dfa *
|
||||||
adddfa(grammar *g, int type, char *name)
|
adddfa(grammar *g, int type, char *name)
|
||||||
{
|
{
|
||||||
|
|
|
@ -117,6 +117,16 @@ newnfagrammar(void)
|
||||||
return gr;
|
return gr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
freenfagrammar(nfagrammar *gr)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < gr->gr_nnfas; i++) {
|
||||||
|
PyObject_FREE(gr->gr_nfa[i]->nf_state);
|
||||||
|
}
|
||||||
|
PyObject_FREE(gr->gr_nfa);
|
||||||
|
PyObject_FREE(gr);
|
||||||
|
}
|
||||||
|
|
||||||
static nfa *
|
static nfa *
|
||||||
addnfa(nfagrammar *gr, char *name)
|
addnfa(nfagrammar *gr, char *name)
|
||||||
{
|
{
|
||||||
|
@ -488,7 +498,11 @@ makedfa(nfagrammar *gr, nfa *nf, dfa *d)
|
||||||
|
|
||||||
convert(d, xx_nstates, xx_state);
|
convert(d, xx_nstates, xx_state);
|
||||||
|
|
||||||
/* XXX cleanup */
|
for (int i = 0; i < xx_nstates; i++) {
|
||||||
|
for (int j = 0; j < xx_state[i].ss_narcs; j++)
|
||||||
|
delbitset(xx_state[i].ss_arc[j].sa_bitset);
|
||||||
|
PyObject_FREE(xx_state[i].ss_arc);
|
||||||
|
}
|
||||||
PyObject_FREE(xx_state);
|
PyObject_FREE(xx_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -669,7 +683,7 @@ pgen(node *n)
|
||||||
g = maketables(gr);
|
g = maketables(gr);
|
||||||
translatelabels(g);
|
translatelabels(g);
|
||||||
addfirstsets(g);
|
addfirstsets(g);
|
||||||
PyObject_FREE(gr);
|
freenfagrammar(gr);
|
||||||
return g;
|
return g;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -67,6 +67,7 @@ main(int argc, char **argv)
|
||||||
printf("Writing %s ...\n", graminit_h);
|
printf("Writing %s ...\n", graminit_h);
|
||||||
printnonterminals(g, fp);
|
printnonterminals(g, fp);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
freegrammar(g);
|
||||||
Py_Exit(0);
|
Py_Exit(0);
|
||||||
return 0; /* Make gcc -Wall happy */
|
return 0; /* Make gcc -Wall happy */
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue