[Python-checkins] cpython (3.6): properly free memory in pgen

benjamin.peterson python-checkins at python.org
Sun Sep 18 21:00:41 EDT 2016


https://hg.python.org/cpython/rev/bdbe09afcd20
changeset:   103932:bdbe09afcd20
branch:      3.6
parent:      103930:91285b24f1c2
user:        Benjamin Peterson <benjamin at python.org>
date:        Sun Sep 18 18:00:25 2016 -0700
summary:
  properly free memory in pgen

files:
  Include/grammar.h |   1 +
  Parser/grammar.c  |  17 +++++++++++++++++
  Parser/pgen.c     |  18 ++++++++++++++++--
  Parser/pgenmain.c |   1 +
  4 files changed, 35 insertions(+), 2 deletions(-)


diff --git a/Include/grammar.h b/Include/grammar.h
--- a/Include/grammar.h
+++ b/Include/grammar.h
@@ -69,6 +69,7 @@
 /* FUNCTIONS */
 
 grammar *newgrammar(int start);
+void freegrammar(grammar *g);
 dfa *adddfa(grammar *g, int type, const 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
--- a/Parser/grammar.c
+++ b/Parser/grammar.c
@@ -28,6 +28,23 @@
     return g;
 }
 
+void
+freegrammar(grammar *g)
+{
+    int i;
+    for (i = 0; i < g->g_ndfas; i++) {
+        free(g->g_dfa[i].d_name);
+        for (int 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, const char *name)
 {
diff --git a/Parser/pgen.c b/Parser/pgen.c
--- a/Parser/pgen.c
+++ b/Parser/pgen.c
@@ -117,6 +117,16 @@
     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 @@
 
     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 @@
     g = maketables(gr);
     translatelabels(g);
     addfirstsets(g);
-    PyObject_FREE(gr);
+    freenfagrammar(gr);
     return g;
 }
 
diff --git a/Parser/pgenmain.c b/Parser/pgenmain.c
--- a/Parser/pgenmain.c
+++ b/Parser/pgenmain.c
@@ -80,6 +80,7 @@
         printf("Writing %s ...\n", graminit_h);
     printnonterminals(g, fp);
     fclose(fp);
+    freegrammar(g);
     Py_Exit(0);
     return 0; /* Make gcc -Wall happy */
 }

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list