summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2015-12-02 10:50:17 -0500
committerAdrian Thurston <thurston@complang.org>2015-12-02 10:50:17 -0500
commit9bfd3f5510bdf3da7c4084a046cbba5ba7d673fe (patch)
tree268696fcacc5dafc3365357bf2cb4d919a78af14
parent5e75abcbc165994b9c28fe98c1944da4ce31a7cb (diff)
downloadcolm-9bfd3f5510bdf3da7c4084a046cbba5ba7d673fe.tar.gz
clear the data trees as well as parse trees during reduction
This change brings memory consumption in line with a ragel+kelbt parse for large grammars and inputs.
-rw-r--r--src/commit.c20
-rw-r--r--src/pdarun.h1
-rw-r--r--src/reduce.cc3
3 files changed, 18 insertions, 6 deletions
diff --git a/src/commit.c b/src/commit.c
index b21fa7b5..c1c4d205 100644
--- a/src/commit.c
+++ b/src/commit.c
@@ -37,6 +37,17 @@
//#define true 1
//#define false 0
+void commit_clear_kid_list( program_t *prg, tree_t **sp, kid_t *kid )
+{
+ kid_t *next;
+ while ( kid ) {
+ colm_tree_downref( prg, sp, kid->tree );
+ next = kid->next;
+ kid_free( prg, kid );
+ kid = next;
+ }
+}
+
void commit_clear_parse_tree( program_t *prg, tree_t **sp,
struct pda_run *pda_run, parse_tree_t *pt )
{
@@ -62,12 +73,9 @@ free_tree:
vm_push_ptree( pt->right_ignore );
}
- if ( pt->shadow != 0 ) {
- colm_tree_downref( prg, sp, pt->shadow->tree );
- kid_free( prg, pt->shadow );
- }
-
- //printf( "commit_parse_tree_free %p\n", pt );
+ /* Only the root level of the stack has tree
+ * shadows and we are below that. */
+ assert( pt->shadow == 0 );
parse_tree_free( pda_run, pt );
/* Any trees to downref? */
diff --git a/src/pdarun.h b/src/pdarun.h
index 434f6631..1beb28d1 100644
--- a/src/pdarun.h
+++ b/src/pdarun.h
@@ -452,6 +452,7 @@ long colm_parse_finish( tree_t **result, struct colm_program *prg, tree_t **sp,
long colm_parse_undo_frag( struct colm_program *prg, tree_t **sp, struct pda_run *pda_run,
stream_t *input, long steps, long entry );
+void commit_clear_kid_list( program_t *prg, tree_t **sp, kid_t *kid );
void commit_clear_parse_tree( program_t *prg, tree_t **sp,
struct pda_run *pda_run, parse_tree_t *pt );
void commit_reduce( program_t *prg, tree_t **root,
diff --git a/src/reduce.cc b/src/reduce.cc
index 7088e3ed..bf842f76 100644
--- a/src/reduce.cc
+++ b/src/reduce.cc
@@ -584,6 +584,9 @@ void Compiler::writeCommit()
" }\n"
"\n"
" commit_clear_parse_tree( prg, sp, pda_run, lel->child );\n"
+ " commit_clear_kid_list( prg, sp, kid->tree->child );\n"
+ " kid->tree->child = 0;\n"
+ " kid->tree->flags &= ~( AF_LEFT_IGNORE | AF_RIGHT_IGNORE );\n"
" lel->child = 0;\n"
"\n"
" if ( sp != root )\n"