diff options
-rw-r--r-- | src/ctinput.cc | 2 | ||||
-rw-r--r-- | src/pdarun.c | 37 | ||||
-rw-r--r-- | src/pdarun.h | 2 | ||||
-rw-r--r-- | src/pool.c | 16 | ||||
-rw-r--r-- | src/pool.h | 9 | ||||
-rw-r--r-- | src/program.c | 4 |
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, @@ -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 ); } /* @@ -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; |