]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[2.7] properly free memory in pgen. (GH-7869) (closes bpo-27780
authorBenjamin Peterson <benjamin@python.org>
Sat, 23 Jun 2018 04:04:21 +0000 (21:04 -0700)
committerGitHub <noreply@github.com>
Sat, 23 Jun 2018 04:04:21 +0000 (21:04 -0700)
(cherry picked from commit 9ac11a752a19c3b8607582a3d5ccb615c467124b)

Co-authored-by: Benjamin Peterson <benjamin@python.org>
Include/grammar.h
Parser/grammar.c
Parser/pgen.c
Parser/pgenmain.c

index 8426da30d9c65341ff7fc78cb37db64afd0072a3..decf2e6126bcd77f68d86b1060511447ad77fdfd 100644 (file)
@@ -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);
index fa1dd7cdf87aacd6242ca0405cb5a873bf29fc90..fcd22191103afebb443be941c54370780d595dc1 100644 (file)
@@ -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)
 {
index f3031aea0b6d141d884827614b77ff6b3d28d665..5968a498a7b8aed3b3980d5603d67cba2c33c56c 100644 (file)
@@ -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;
 }
 
index 88fa7f19b84a84480feeb9d85a8eca3ae90df6e9..0b47295c1b47cd5845e6e910e31e7b7bdcb2c382 100644 (file)
@@ -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 */
 }