From 482fac74999028af4764645a1f28dd4289b2f255 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Fri, 22 Jun 2018 21:04:21 -0700 Subject: [PATCH] [2.7] properly free memory in pgen. (GH-7869) (closes bpo-27780 (cherry picked from commit 9ac11a752a19c3b8607582a3d5ccb615c467124b) Co-authored-by: Benjamin Peterson --- Include/grammar.h | 1 + Parser/grammar.c | 18 ++++++++++++++++++ Parser/pgen.c | 18 ++++++++++++++++-- Parser/pgenmain.c | 1 + 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/Include/grammar.h b/Include/grammar.h index 8426da30d9c6..decf2e6126bc 100644 --- a/Include/grammar.h +++ b/Include/grammar.h @@ -69,6 +69,7 @@ typedef struct { /* FUNCTIONS */ grammar *newgrammar(int start); +void freegrammar(grammar *g); dfa *adddfa(grammar *g, int type, char *name); int addstate(dfa *d); void addarc(dfa *d, int from, int to, int lbl); diff --git a/Parser/grammar.c b/Parser/grammar.c index fa1dd7cdf87a..fcd22191103a 100644 --- a/Parser/grammar.c +++ b/Parser/grammar.c @@ -32,6 +32,24 @@ newgrammar(int start) 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 * adddfa(grammar *g, int type, char *name) { diff --git a/Parser/pgen.c b/Parser/pgen.c index f3031aea0b6d..5968a498a7b8 100644 --- a/Parser/pgen.c +++ b/Parser/pgen.c @@ -117,6 +117,16 @@ newnfagrammar(void) 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 * addnfa(nfagrammar *gr, char *name) { @@ -488,7 +498,11 @@ makedfa(nfagrammar *gr, nfa *nf, dfa *d) 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); } @@ -669,7 +683,7 @@ pgen(node *n) g = maketables(gr); translatelabels(g); addfirstsets(g); - PyObject_FREE(gr); + freenfagrammar(gr); return g; } diff --git a/Parser/pgenmain.c b/Parser/pgenmain.c index 88fa7f19b84a..0b47295c1b47 100644 --- a/Parser/pgenmain.c +++ b/Parser/pgenmain.c @@ -67,6 +67,7 @@ main(int argc, char **argv) printf("Writing %s ...\n", graminit_h); printnonterminals(g, fp); fclose(fp); + freegrammar(g); Py_Exit(0); return 0; /* Make gcc -Wall happy */ } -- 2.47.3