diff --git a/c/mapping/mlr_dsl_cst.h b/c/mapping/mlr_dsl_cst.h index 69ec3687b..e35a7357b 100644 --- a/c/mapping/mlr_dsl_cst.h +++ b/c/mapping/mlr_dsl_cst.h @@ -164,9 +164,6 @@ typedef struct _mlr_dsl_cst_statement_t { mlr_dsl_cst_statement_freer_t* pstatement_freer; - // For mlr filter - int negate_final_filter; - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Specific to each statement type: @@ -382,6 +379,12 @@ mlr_dsl_cst_statement_allocator_t alloc_if_head; mlr_dsl_cst_statement_allocator_t alloc_while; mlr_dsl_cst_statement_allocator_t alloc_do_while; mlr_dsl_cst_statement_allocator_t alloc_bare_boolean; +mlr_dsl_cst_statement_t* alloc_final_filter( + mlr_dsl_cst_t* pcst, + mlr_dsl_ast_node_t* pnode, + int negate_final_filter, + int type_inferencing, + int context_flags); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // mapping/mlr_dsl_cst_for_srec_statements.c diff --git a/c/mapping/mlr_dsl_cst_condish_statements.c b/c/mapping/mlr_dsl_cst_condish_statements.c index 837e955c4..3576569ac 100644 --- a/c/mapping/mlr_dsl_cst_condish_statements.c +++ b/c/mapping/mlr_dsl_cst_condish_statements.c @@ -513,3 +513,64 @@ static void handle_bare_boolean( if (mv_is_non_null(&val)) mv_set_boolean_strict(&val); } + +// ================================================================ +typedef struct _final_filter_state_t { + rval_evaluator_t* pexpression_evaluator; + int negate_final_filter; +} final_filter_state_t; + +static mlr_dsl_cst_statement_handler_t handle_final_filter; +static mlr_dsl_cst_statement_freer_t free_final_filter; + +// ---------------------------------------------------------------- +mlr_dsl_cst_statement_t* alloc_final_filter( + mlr_dsl_cst_t* pcst, + mlr_dsl_ast_node_t* pnode, + int negate_final_filter, + int type_inferencing, + int context_flags) +{ + final_filter_state_t* pstate = mlr_malloc_or_die(sizeof(final_filter_state_t)); + + pstate->pexpression_evaluator = rval_evaluator_alloc_from_ast( + pnode, pcst->pfmgr, type_inferencing, context_flags); + + pstate->negate_final_filter = negate_final_filter; + + return mlr_dsl_cst_statement_valloc( + pnode, + handle_final_filter, + free_final_filter, + pstate); +} + +// ---------------------------------------------------------------- +// xxx move all frees between allocs & handles. and header-file order too. + +static void free_final_filter(mlr_dsl_cst_statement_t* pstatement) { // final_filter + final_filter_state_t* pstate = pstatement->pvstate; + + pstate->pexpression_evaluator->pfree_func(pstate->pexpression_evaluator); + + free(pstate); +} + +// ---------------------------------------------------------------- +static void handle_final_filter( + mlr_dsl_cst_statement_t* pstatement, + variables_t* pvars, + cst_outputs_t* pcst_outputs) +{ + final_filter_state_t* pstate = pstatement->pvstate; + rval_evaluator_t* pexpression_evaluator = pstate->pexpression_evaluator; + + mv_t val = pexpression_evaluator->pprocess_func(pexpression_evaluator->pvstate, pvars); + + if (mv_is_non_null(&val)) { + mv_set_boolean_strict(&val); + *pcst_outputs->pshould_emit_rec = val.u.boolv ^ pstate->negate_final_filter; + } else { + *pcst_outputs->pshould_emit_rec = FALSE; + } +} diff --git a/c/mapping/mlr_dsl_cst_statements.c b/c/mapping/mlr_dsl_cst_statements.c index cec6e12d1..b17cb30d2 100644 --- a/c/mapping/mlr_dsl_cst_statements.c +++ b/c/mapping/mlr_dsl_cst_statements.c @@ -62,14 +62,6 @@ static mlr_dsl_cst_statement_allocator_t alloc_break; static mlr_dsl_cst_statement_allocator_t alloc_continue; static mlr_dsl_cst_statement_allocator_t alloc_filter; -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -static mlr_dsl_cst_statement_t* alloc_final_filter( - mlr_dsl_cst_t* pcst, - mlr_dsl_ast_node_t* pnode, - int negate_final_filter, - int type_inferencing, - int context_flags); - // ---------------------------------------------------------------- static mlr_dsl_cst_statement_handler_t handle_return_void; static mlr_dsl_cst_statement_handler_t handle_return_value_from_local_non_map_variable; @@ -96,7 +88,6 @@ static mlr_dsl_cst_statement_handler_t handle_unset; static mlr_dsl_cst_statement_handler_t handle_unset_all; static mlr_dsl_cst_statement_handler_t handle_filter; -static mlr_dsl_cst_statement_handler_t handle_final_filter; static mlr_dsl_cst_statement_handler_t handle_for_oosvar; static mlr_dsl_cst_statement_handler_t handle_for_oosvar_key_only; @@ -577,7 +568,6 @@ static mlr_dsl_cst_statement_t* alloc_blank(mlr_dsl_ast_node_t* past_node) { pstatement->pstatement_handler = NULL; pstatement->pstatement_freer = NULL; pstatement->pblock_handler = NULL; - pstatement->negate_final_filter = FALSE; pstatement->pvstate = FALSE; // xxx pre-federation @@ -625,7 +615,6 @@ mlr_dsl_cst_statement_t* mlr_dsl_cst_statement_valloc( pstatement->pblock = NULL; pstatement->pblock_handler = NULL; pstatement->pstatement_freer = pstatement_freer; - pstatement->negate_final_filter = FALSE; pstatement->pvstate = pvstate; return pstatement; } @@ -645,7 +634,6 @@ mlr_dsl_cst_statement_t* mlr_dsl_cst_statement_valloc_with_block( pstatement->pblock = pblock; pstatement->pblock_handler = pblock_handler; pstatement->pstatement_freer = pstatement_freer; - pstatement->negate_final_filter = FALSE; pstatement->pvstate = pvstate; return pstatement; } @@ -1317,18 +1305,6 @@ static mlr_dsl_cst_statement_t* alloc_filter(mlr_dsl_cst_t* pcst, mlr_dsl_ast_no return pstatement; } -// ---------------------------------------------------------------- -static mlr_dsl_cst_statement_t* alloc_final_filter(mlr_dsl_cst_t* pcst, mlr_dsl_ast_node_t* pnode, - int negate_final_filter, int type_inferencing, int context_flags) -{ - mlr_dsl_cst_statement_t* pstatement = alloc_blank(pnode); - - pstatement->pstatement_handler = handle_final_filter; - pstatement->negate_final_filter = negate_final_filter; - pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pnode, pcst->pfmgr, type_inferencing, context_flags); - return pstatement; -} - // ---------------------------------------------------------------- // Example ASTs, with and without indexing on the left-hand-side oosvar name: @@ -2092,23 +2068,6 @@ static void handle_filter( } } -// ---------------------------------------------------------------- -static void handle_final_filter( - mlr_dsl_cst_statement_t* pstatement, - variables_t* pvars, - cst_outputs_t* pcst_outputs) -{ - rval_evaluator_t* prhs_evaluator = pstatement->prhs_evaluator; - - mv_t val = prhs_evaluator->pprocess_func(prhs_evaluator->pvstate, pvars); - if (mv_is_non_null(&val)) { - mv_set_boolean_strict(&val); - *pcst_outputs->pshould_emit_rec = val.u.boolv ^ pstatement->negate_final_filter; - } else { - *pcst_outputs->pshould_emit_rec = FALSE; - } -} - // ---------------------------------------------------------------- static void handle_for_oosvar( mlr_dsl_cst_statement_t* pstatement,