diff options
author | Adrian Thurston <thurston@complang.org> | 2015-12-02 10:50:17 -0500 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2015-12-02 10:50:17 -0500 |
commit | 9bfd3f5510bdf3da7c4084a046cbba5ba7d673fe (patch) | |
tree | 268696fcacc5dafc3365357bf2cb4d919a78af14 | |
parent | 5e75abcbc165994b9c28fe98c1944da4ce31a7cb (diff) | |
download | colm-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.c | 20 | ||||
-rw-r--r-- | src/pdarun.h | 1 | ||||
-rw-r--r-- | src/reduce.cc | 3 |
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" |