bind-stack allocate CST iterate

This commit is contained in:
John Kerl 2016-10-14 15:34:13 -04:00
parent bc98f13ee5
commit ffeaa50ebc
4 changed files with 53 additions and 19 deletions

View file

@ -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.

View file

@ -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);

View file

@ -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);

View file

@ -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