mirror of
https://github.com/johnkerl/miller.git
synced 2026-07-23 16:08:43 +00:00
bind-stack allocate CST iterate
This commit is contained in:
parent
bc98f13ee5
commit
ffeaa50ebc
4 changed files with 53 additions and 19 deletions
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue