From ffeaa50ebca8f87abb21ecc44aac0fe547ca7e73 Mon Sep 17 00:00:00 2001 From: John Kerl Date: Fri, 14 Oct 2016 15:34:13 -0400 Subject: [PATCH] bind-stack allocate CST iterate --- c/mapping/mapper_put_or_filter.c | 2 +- c/mapping/mlr_dsl_cst.c | 12 ++++-------- c/mapping/mlr_dsl_cst.h | 31 ++++++++++++++++++++---------- c/mapping/mlr_dsl_cst_statements.c | 27 ++++++++++++++++++++++++++ 4 files changed, 53 insertions(+), 19 deletions(-) diff --git a/c/mapping/mapper_put_or_filter.c b/c/mapping/mapper_put_or_filter.c index 7437e1eca..67caf5eb2 100644 --- a/c/mapping/mapper_put_or_filter.c +++ b/c/mapping/mapper_put_or_filter.c @@ -558,7 +558,7 @@ static sllv_t* mapper_put_or_filter_process(lrec_t* pinrec, context_t* pctx, voi .pwriter_opts = pstate->pwriter_opts, }; - mlr_dsl_cst_handle_statement_block(pstate->pcst->pmain_block, &variables, &cst_outputs); + mlr_dsl_cst_handle_top_level_statement_block(pstate->pcst->pmain_block, &variables, &cst_outputs); if (should_emit_rec && !pstate->put_output_disabled) { // Write the output fields from the typed overlay back to the lrec. diff --git a/c/mapping/mlr_dsl_cst.c b/c/mapping/mlr_dsl_cst.c index c3ab10cfa..62a6b919c 100644 --- a/c/mapping/mlr_dsl_cst.c +++ b/c/mapping/mlr_dsl_cst.c @@ -78,7 +78,6 @@ mlr_dsl_cst_t* mlr_dsl_cst_alloc(mlr_dsl_ast_t* past, int print_ast, int trace_s blocked_ast_allocate_locals(pcst->paast, trace_stack_allocation); pcst->pbegin_blocks = sllv_alloc(); - pcst->pmain_block = sllv_alloc(); pcst->pend_blocks = sllv_alloc(); pcst->pfmgr = fmgr_alloc(); pcst->psubr_defsites = lhmsv_alloc(); @@ -163,15 +162,16 @@ mlr_dsl_cst_t* mlr_dsl_cst_alloc(mlr_dsl_ast_t* past, int print_ast, int trace_s mlr_dsl_ast_node_print(pcst->paast->pmain_block); } //printf("MVARN=%d\n", pcst->paast->pmain_block->max_var_depth); + pcst->pmain_block = cst_top_level_statement_block_alloc(pcst->paast->pmain_block->max_var_depth); for (sllve_t* pe = pcst->paast->pmain_block->pchildren->phead; pe != NULL; pe = pe->pnext) { mlr_dsl_ast_node_t* pnode = pe->pvvalue; // The last statement of mlr filter must be a bare boolean. if (do_final_filter && pe->pnext == NULL) { - sllv_append(pcst->pmain_block, mlr_dsl_cst_alloc_final_filter_statement( + sllv_append(pcst->pmain_block->pstatements, mlr_dsl_cst_alloc_final_filter_statement( pcst, pnode, negate_final_filter, type_inferencing, context_flags | IN_MLR_FINAL_FILTER)); } else { - sllv_append(pcst->pmain_block, mlr_dsl_cst_alloc_statement(pcst, pnode, + sllv_append(pcst->pmain_block->pstatements, mlr_dsl_cst_alloc_statement(pcst, pnode, type_inferencing, context_flags)); } } @@ -205,10 +205,6 @@ void mlr_dsl_cst_free(mlr_dsl_cst_t* pcst) { } } - for (sllve_t* pe = pcst->pmain_block->phead; pe != NULL; pe = pe->pnext) { - mlr_dsl_cst_statement_free(pe->pvvalue); - } - if (pcst->pend_blocks != NULL) { for (sllve_t* pe = pcst->pend_blocks->phead; pe != NULL; pe = pe->pnext) { sllv_t* pblock = pe->pvvalue; @@ -219,7 +215,7 @@ void mlr_dsl_cst_free(mlr_dsl_cst_t* pcst) { } sllv_free(pcst->pbegin_blocks); - sllv_free(pcst->pmain_block); + cst_top_level_statement_block_free(pcst->pmain_block); sllv_free(pcst->pend_blocks); fmgr_free(pcst->pfmgr); diff --git a/c/mapping/mlr_dsl_cst.h b/c/mapping/mlr_dsl_cst.h index 0093c3ef7..c1eab5d79 100644 --- a/c/mapping/mlr_dsl_cst.h +++ b/c/mapping/mlr_dsl_cst.h @@ -113,9 +113,9 @@ typedef struct _mlr_dsl_cst_statement_vararg_t { } mlr_dsl_cst_statement_vararg_t; // Handler for statement lists: begin/main/end; cond/if/for/while/do-while. -typedef void mlr_dsl_cst_statement_list_handler_t( - sllv_t* pcst_statements, - variables_t* pvars, +typedef void mlr_dsl_cst_statement_block_handler_t( + sllv_t* pcst_statements, // xxx rename / work in block + variables_t* pvars, cst_outputs_t* pcst_outputs); // ---------------------------------------------------------------- @@ -148,7 +148,7 @@ typedef struct _mlr_dsl_cst_statement_t { // There are two variants of statement-list handlers: one for inside loop bodies which has to check break/continue // flags after each statement, and another for outside loop bodies which doesn't need to check those. (This is a // micro-optimization.) For bodyless statements (e.g. assignment) this is null. - mlr_dsl_cst_statement_list_handler_t* pblock_handler; + mlr_dsl_cst_statement_block_handler_t* pblock_handler; // Assignment to oosvar sllv_t* poosvar_lhs_keylist_evaluators; @@ -230,9 +230,9 @@ typedef struct _mlr_dsl_cst_statement_t { // MLR_DSL_CST OBJECT typedef struct _mlr_dsl_cst_t { - sllv_t* pbegin_blocks; - sllv_t* pmain_block; - sllv_t* pend_blocks; + sllv_t* pbegin_blocks; // xxx + cst_top_level_statement_block_t* pmain_block; + sllv_t* pend_blocks; // xxx // Function manager for built-in functions as well as user-defined functions (which are CST-specific). fmgr_t* pfmgr; @@ -273,18 +273,29 @@ void mlr_dsl_cst_free(mlr_dsl_cst_t* pcst); void mlr_dsl_cst_statement_free(mlr_dsl_cst_statement_t* pstatement); // Top-level entry point, e.g. from mapper_put. -void mlr_dsl_cst_handle_statement_blocks( +void mlr_dsl_cst_handle_top_level_statement_blocks( + sllv_t* ptop_level_blocks, // block bodies for begins, main, ends + variables_t* pvars, + cst_outputs_t* pcst_outputs); + +void mlr_dsl_cst_handle_top_level_statement_block( + cst_top_level_statement_block_t* ptop_level_block, + variables_t* pvars, + cst_outputs_t* pcst_outputs); + +// Top-level entry point, e.g. from mapper_put. +void mlr_dsl_cst_handle_statement_blocks( // xxx rm sllv_t* pcst_blocks, // block bodies for begin, main, end; cond, if, for, while variables_t* pvars, cst_outputs_t* pcst_outputs); -void mlr_dsl_cst_handle_statement_block( +void mlr_dsl_cst_handle_statement_block( // xxx rm sllv_t* pcst_block, // block bodies for begin, main, end; cond, if, for, while variables_t* pvars, cst_outputs_t* pcst_outputs); // Recursive entry point: block bodies for begin, main, end; cond, if, for, while. -void mlr_dsl_cst_handle_statement_list( +void mlr_dsl_cst_handle_statement_list( // xxx rename to handle statement block sllv_t* pcst_statements, variables_t* pvars, cst_outputs_t* pcst_outputs); diff --git a/c/mapping/mlr_dsl_cst_statements.c b/c/mapping/mlr_dsl_cst_statements.c index f53b029d3..a4c304867 100644 --- a/c/mapping/mlr_dsl_cst_statements.c +++ b/c/mapping/mlr_dsl_cst_statements.c @@ -2040,6 +2040,33 @@ static void cst_statement_vararg_free(mlr_dsl_cst_statement_vararg_t* pvararg) { free(pvararg); } +// ================================================================ +// Top-level entry point, e.g. from mapper_put. +void mlr_dsl_cst_handle_top_level_statement_blocks( + sllv_t* ptop_level_blocks, // block bodies for begins, main, ends + variables_t* pvars, + cst_outputs_t* pcst_outputs) +{ + for (sllve_t* pe = ptop_level_blocks->phead; pe != NULL; pe = pe->pnext) { + mlr_dsl_cst_handle_top_level_statement_block(pe->pvvalue, pvars, pcst_outputs); + } +} + +void mlr_dsl_cst_handle_top_level_statement_block( + cst_top_level_statement_block_t* ptop_level_block, + variables_t* pvars, + cst_outputs_t* pcst_outputs) +{ + // xxx check in-use + local_stack_enter(ptop_level_block->pstack); + + // xxx adapt callee to also handle local stack + mlr_dsl_cst_handle_statement_list(ptop_level_block->pstatements, pvars, pcst_outputs); + + bind_stack_clear(pvars->pbind_stack); // clear the baseframe // xxx rm + local_stack_exit(ptop_level_block->pstack); +} + // ================================================================ // xxx copy to ..._for_filter // xxx rename to ..._for_put