summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2015-10-05 10:17:34 -0400
committerAdrian Thurston <thurston@complang.org>2015-10-05 11:14:34 -0400
commitf19e2b452e5dc2a14a48fe71fa26796b5678b147 (patch)
tree7bd712dfe233202d4adcdbaf95f92f5c99d116f4
parent13d7c884e2a855418d68b8e45041b8ab4a20a85c (diff)
downloadcolm-f19e2b452e5dc2a14a48fe71fa26796b5678b147.tar.gz
put parse tree allocator struct into pda_run as a pointer, allowing override
-rw-r--r--src/ctinput.cc2
-rw-r--r--src/pdarun.c37
-rw-r--r--src/pdarun.h2
-rw-r--r--src/pool.c16
-rw-r--r--src/pool.h9
-rw-r--r--src/program.c4
6 files changed, 38 insertions, 32 deletions
diff --git a/src/ctinput.cc b/src/ctinput.cc
index 6b22d048..7701764a 100644
--- a/src/ctinput.cc
+++ b/src/ctinput.cc
@@ -491,7 +491,7 @@ extern "C" void internalSendNamedLangEl( program_t *prg, tree_t **sp,
colm_increment_steps( pdaRun );
- parse_tree_t *parseTree = parse_tree_allocate( prg );
+ parse_tree_t *parseTree = parse_tree_allocate( pdaRun );
parseTree->id = input->tree->id;
parseTree->flags |= PF_NAMED;
parseTree->shadow = input;
diff --git a/src/pdarun.c b/src/pdarun.c
index 7ac534ed..30e14e14 100644
--- a/src/pdarun.c
+++ b/src/pdarun.c
@@ -298,7 +298,7 @@ static void send_back( program_t *prg, tree_t **sp, struct pda_run *pda_run,
/* Downref the tree that was sent back and free the kid. */
colm_tree_downref( prg, sp, parse_tree->shadow->tree );
kid_free( prg, parse_tree->shadow );
- parse_tree_free( prg, parse_tree );
+ parse_tree_free( pda_run, parse_tree );
}
static void set_region( struct pda_run *pda_run, int empty_ignore, parse_tree_t *tree )
@@ -317,7 +317,7 @@ static void ignore_tree( program_t *prg, struct pda_run *pda_run, tree_t *tree )
colm_increment_steps( pda_run );
- parse_tree_t *parse_tree = parse_tree_allocate( prg );
+ parse_tree_t *parse_tree = parse_tree_allocate( pda_run );
parse_tree->shadow = kid_allocate( prg );
parse_tree->shadow->tree = tree;
@@ -338,7 +338,7 @@ static void ignore_tree_art( program_t *prg, struct pda_run *pda_run, tree_t *tr
colm_increment_steps( pda_run );
- parse_tree_t *parse_tree = parse_tree_allocate( prg );
+ parse_tree_t *parse_tree = parse_tree_allocate( pda_run );
parse_tree->flags |= PF_ARTIFICIAL;
parse_tree->shadow = kid_allocate( prg );
parse_tree->shadow->tree = tree;
@@ -822,7 +822,7 @@ static void send_token( program_t *prg, tree_t **sp,
colm_increment_steps( pda_run );
- parse_tree_t *parse_tree = parse_tree_allocate( prg );
+ parse_tree_t *parse_tree = parse_tree_allocate( pda_run );
parse_tree->id = input->tree->id;
parse_tree->shadow = input;
@@ -840,7 +840,7 @@ static void send_tree( program_t *prg, tree_t **sp, struct pda_run *pda_run, str
colm_increment_steps( pda_run );
- parse_tree_t *parse_tree = parse_tree_allocate( prg );
+ parse_tree_t *parse_tree = parse_tree_allocate( pda_run );
parse_tree->id = input->tree->id;
parse_tree->flags |= PF_ARTIFICIAL;
parse_tree->shadow = input;
@@ -848,7 +848,8 @@ static void send_tree( program_t *prg, tree_t **sp, struct pda_run *pda_run, str
pda_run->parse_input = parse_tree;
}
-static void send_ignore_tree( program_t *prg, tree_t **sp, struct pda_run *pda_run, struct stream_impl *is )
+static void send_ignore_tree( program_t *prg, tree_t **sp,
+ struct pda_run *pda_run, struct stream_impl *is )
{
tree_t *tree = is->funcs->consume_tree( is );
ignore_tree_art( prg, pda_run, tree );
@@ -876,7 +877,7 @@ static void send_collect_ignore( program_t *prg, tree_t **sp,
colm_increment_steps( pda_run );
- parse_tree_t *parse_tree = parse_tree_allocate( prg );
+ parse_tree_t *parse_tree = parse_tree_allocate( pda_run );
parse_tree->id = input->tree->id;
parse_tree->shadow = input;
@@ -922,7 +923,7 @@ static void send_eof( program_t *prg, tree_t **sp, struct pda_run *pda_run, stru
pda_run->pre_region = get_next_pre_region( pda_run );
pda_run->fsm_cs = pda_run->fsm_tables->entry_by_region[pda_run->region];
- parse_tree_t *parse_tree = parse_tree_allocate( prg );
+ parse_tree_t *parse_tree = parse_tree_allocate( pda_run );
parse_tree->id = input->tree->id;
parse_tree->shadow = input;
@@ -1101,7 +1102,8 @@ static tree_t *get_parsed_root( struct pda_run *pda_run, int stop )
return 0;
}
-static void clear_parse_tree( program_t *prg, tree_t **sp, parse_tree_t *pt )
+static void clear_parse_tree( program_t *prg, tree_t **sp,
+ struct pda_run *pda_run, parse_tree_t *pt )
{
tree_t **top = vm_ptop();
@@ -1130,7 +1132,7 @@ free_tree:
kid_free( prg, pt->shadow );
}
- parse_tree_free( prg, pt );
+ parse_tree_free( pda_run, pt );
/* Any trees to downref? */
if ( sp != top ) {
@@ -1144,7 +1146,7 @@ void colm_pda_clear( program_t *prg, tree_t **sp, struct pda_run *pda_run )
clear_fsm_run( prg, pda_run );
/* Remaining stack and parse trees underneath. */
- clear_parse_tree( prg, sp, pda_run->stack_top );
+ clear_parse_tree( prg, sp, pda_run, pda_run->stack_top );
pda_run->stack_top = 0;
/* Traverse the token list downreffing. */
@@ -1167,11 +1169,11 @@ void colm_pda_clear( program_t *prg, tree_t **sp, struct pda_run *pda_run )
pda_run->bt_point = 0;
/* Clear out any remaining ignores. */
- clear_parse_tree( prg, sp, pda_run->accum_ignore );
+ clear_parse_tree( prg, sp, pda_run, pda_run->accum_ignore );
pda_run->accum_ignore = 0;
/* Clear the input list (scanned tokes, sent trees). */
- clear_parse_tree( prg, sp, pda_run->parse_input );
+ clear_parse_tree( prg, sp, pda_run, pda_run->parse_input );
pda_run->parse_input = 0;
colm_rcode_downref_all( prg, sp, &pda_run->reverse_code );
@@ -1191,6 +1193,7 @@ void colm_pda_init( program_t *prg, struct pda_run *pda_run, struct pda_tables *
pda_run->stop_target = stop_target;
pda_run->revert_on = revert_on;
pda_run->target_steps = -1;
+ pda_run->parse_tree_pool = &prg->parse_tree_pool;
debug( prg, REALM_PARSE, "initializing struct pda_run\n" );
@@ -1202,7 +1205,7 @@ void colm_pda_init( program_t *prg, struct pda_run *pda_run, struct pda_tables *
sentinal->tree->refs = 1;
/* Init the element allocation variables. */
- pda_run->stack_top = parse_tree_allocate( prg );
+ pda_run->stack_top = parse_tree_allocate( pda_run );
pda_run->stack_top->state = -1;
pda_run->stack_top->shadow = sentinal;
@@ -1411,7 +1414,7 @@ again:
value->tree->id = prg->rtd->prod_info[pda_run->reduction].lhs_id;
value->tree->prod_num = prg->rtd->prod_info[pda_run->reduction].prod_num;
- pda_run->red_lel = parse_tree_allocate( prg );
+ pda_run->red_lel = parse_tree_allocate( pda_run );
pda_run->red_lel->id = prg->rtd->prod_info[pda_run->reduction].lhs_id;
pda_run->red_lel->next = 0;
pda_run->red_lel->cause_reduce = 0;
@@ -1712,7 +1715,7 @@ parse_error:
/* Free the reduced item. */
colm_tree_downref( prg, sp, pda_run->undo_lel->shadow->tree );
kid_free( prg, pda_run->undo_lel->shadow );
- parse_tree_free( prg, pda_run->undo_lel );
+ parse_tree_free( pda_run, pda_run->undo_lel );
/* If the stacktop had right ignore attached, detach now. */
if ( pda_run->stack_top->flags & PF_RIGHT_IL_ATTACHED )
@@ -1737,7 +1740,7 @@ parse_error:
colm_tree_downref( prg, sp, ignore->shadow->tree );
kid_free( prg, ignore->shadow );
- parse_tree_free( prg, ignore );
+ parse_tree_free( pda_run, ignore );
}
else {
if ( pda_run->shift_count == pda_run->commit_shift_count ) {
diff --git a/src/pdarun.h b/src/pdarun.h
index dd180ab8..276ed775 100644
--- a/src/pdarun.h
+++ b/src/pdarun.h
@@ -357,6 +357,8 @@ struct pda_run
tree_t *parse_error_text;
char not_used;
parse_tree_t *last_final;
+
+ struct pool_alloc *parse_tree_pool;
};
void colm_pda_init( struct colm_program *prg, struct pda_run *pda_run,
diff --git a/src/pool.c b/src/pool.c
index d5da6ab5..916a50c8 100644
--- a/src/pool.c
+++ b/src/pool.c
@@ -176,24 +176,24 @@ long tree_num_lost( program_t *prg )
* parse_tree_t
*/
-parse_tree_t *parse_tree_allocate( program_t *prg )
+parse_tree_t *parse_tree_allocate( struct pda_run *pda_run )
{
- return (parse_tree_t*) pool_alloc_allocate( &prg->parse_tree_pool );
+ return (parse_tree_t*) pool_alloc_allocate( pda_run->parse_tree_pool );
}
-void parse_tree_free( program_t *prg, parse_tree_t *el )
+void parse_tree_free( struct pda_run *pda_run, parse_tree_t *el )
{
- pool_alloc_free( &prg->parse_tree_pool, el );
+ pool_alloc_free( pda_run->parse_tree_pool, el );
}
-void parse_tree_clear( program_t *prg )
+void parse_tree_clear( struct pool_alloc *pool_alloc )
{
- pool_alloc_clear( &prg->parse_tree_pool );
+ pool_alloc_clear( pool_alloc );
}
-long parse_tree_num_lost( program_t *prg )
+long parse_tree_num_lost( struct pool_alloc *pool_alloc )
{
- return pool_alloc_num_lost( &prg->parse_tree_pool );
+ return pool_alloc_num_lost( pool_alloc );
}
/*
diff --git a/src/pool.h b/src/pool.h
index 1879e39e..e9b498d2 100644
--- a/src/pool.h
+++ b/src/pool.h
@@ -45,10 +45,11 @@ void tree_free( program_t *prg, tree_t *el );
void tree_clear( program_t *prg );
long tree_num_lost( program_t *prg );
-parse_tree_t *parse_tree_allocate( program_t *prg );
-void parse_tree_free( program_t *prg, parse_tree_t *el );
-void parse_tree_clear( program_t *prg );
-long parse_tree_num_lost( program_t *prg );
+/* Parse tree allocators go into pda_run structs. */
+parse_tree_t *parse_tree_allocate( struct pda_run *pda_run );
+void parse_tree_free( struct pda_run *pda_run, parse_tree_t *el );
+void parse_tree_clear( struct pool_alloc *pool_alloc );
+long parse_tree_num_lost( struct pool_alloc *pool_alloc );
head_t *head_allocate( program_t *prg );
void head_free( program_t *prg, head_t *el );
diff --git a/src/program.c b/src/program.c
index 2f8e889a..3958da9d 100644
--- a/src/program.c
+++ b/src/program.c
@@ -239,7 +239,7 @@ int colm_delete_program( program_t *prg )
#if DEBUG
long kid_lost = kid_num_lost( prg );
long tree_lost = tree_num_lost( prg );
- long parse_tree_lost = parse_tree_num_lost( prg );
+ long parse_tree_lost = parse_tree_num_lost( &prg->parse_tree_pool );
long head_lost = head_num_lost( prg );
long location_lost = location_num_lost( prg );
@@ -262,7 +262,7 @@ int colm_delete_program( program_t *prg )
kid_clear( prg );
tree_clear( prg );
head_clear( prg );
- parse_tree_clear( prg );
+ parse_tree_clear( &prg->parse_tree_pool );
location_clear( prg );
RunBuf *rb = prg->alloc_run_buf;