From db7f4f7799d3a8d19d51f55cdf0a60072de40eea Mon Sep 17 00:00:00 2001 From: John Kerl Date: Fri, 4 Nov 2016 22:55:44 -0400 Subject: [PATCH] cst-federation: assignment statements --- c/mapping/mlr_dsl_cst.h | 1 + c/mapping/mlr_dsl_cst_assignment_statements.c | 119 ++++++++++++++++++ c/mapping/mlr_dsl_cst_statements.c | 79 ------------ 3 files changed, 120 insertions(+), 79 deletions(-) diff --git a/c/mapping/mlr_dsl_cst.h b/c/mapping/mlr_dsl_cst.h index 8592980a5..9ae917487 100644 --- a/c/mapping/mlr_dsl_cst.h +++ b/c/mapping/mlr_dsl_cst.h @@ -393,6 +393,7 @@ mlr_dsl_cst_statement_allocator_t alloc_srec_assignment; mlr_dsl_cst_statement_allocator_t alloc_indirect_srec_assignment; mlr_dsl_cst_statement_allocator_t alloc_local_non_map_variable_assignment; mlr_dsl_cst_statement_allocator_t alloc_local_map_variable_assignment; +mlr_dsl_cst_statement_allocator_t alloc_oosvar_assignment; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // mapping/mlr_dsl_cst_for_srec_statements.c diff --git a/c/mapping/mlr_dsl_cst_assignment_statements.c b/c/mapping/mlr_dsl_cst_assignment_statements.c index 9e1e6ce8a..44859c8cf 100644 --- a/c/mapping/mlr_dsl_cst_assignment_statements.c +++ b/c/mapping/mlr_dsl_cst_assignment_statements.c @@ -333,3 +333,122 @@ static void handle_local_map_variable_assignment( mv_free(&rhs_value); } } + +// ================================================================ +// All assignments produce a mlrval on the RHS and store it on the left -- except if both LHS and RHS +// are oosvars in which case there are recursive copies, or in case of $* on the LHS or RHS. + +typedef struct _oosvar_assignment_state_t { + + sllv_t* plhs_keylist_evaluators; + + rval_evaluator_t* prhs_evaluator; + sllv_t* prhs_keylist_evaluators; + +} oosvar_assignment_state_t; + +static mlr_dsl_cst_statement_handler_t handle_oosvar_assignment; +static mlr_dsl_cst_statement_handler_t handle_oosvar_to_oosvar_assignment; +static mlr_dsl_cst_statement_freer_t free_oosvar_assignment; + +// ---------------------------------------------------------------- +mlr_dsl_cst_statement_t* alloc_oosvar_assignment(mlr_dsl_cst_t* pcst, mlr_dsl_ast_node_t* pnode, + int type_inferencing, int context_flags) +{ + oosvar_assignment_state_t* pstate = mlr_malloc_or_die(sizeof(oosvar_assignment_state_t)); + + mlr_dsl_ast_node_t* pleft = pnode->pchildren->phead->pvvalue; + mlr_dsl_ast_node_t* pright = pnode->pchildren->phead->pnext->pvvalue; + + MLR_INTERNAL_CODING_ERROR_IF(pleft->type != MD_AST_NODE_TYPE_OOSVAR_KEYLIST); + + pstate->plhs_keylist_evaluators = allocate_keylist_evaluators_from_oosvar_node(pcst, pleft, + type_inferencing, context_flags); + + mlr_dsl_cst_statement_handler_t* pstatement_handler = NULL; + if (pleft->type == MD_AST_NODE_TYPE_OOSVAR_KEYLIST && pright->type == MD_AST_NODE_TYPE_OOSVAR_KEYLIST) { + pstatement_handler = handle_oosvar_to_oosvar_assignment; + pstate->prhs_keylist_evaluators = allocate_keylist_evaluators_from_oosvar_node(pcst, pright, + type_inferencing, context_flags); + pstate->prhs_evaluator = NULL; + } else { + pstatement_handler = handle_oosvar_assignment; + pstate->prhs_keylist_evaluators = NULL; + pstate->prhs_evaluator = rval_evaluator_alloc_from_ast(pright, pcst->pfmgr, + type_inferencing, context_flags); + } + + return mlr_dsl_cst_statement_valloc( + pnode, + pstatement_handler, + free_oosvar_assignment, + pstate); +} + +// ---------------------------------------------------------------- +static void free_oosvar_assignment(mlr_dsl_cst_statement_t* pstatement) { + oosvar_assignment_state_t* pstate = pstatement->pvstate; + + for (sllve_t* pe = pstate->plhs_keylist_evaluators->phead; pe != NULL; pe = pe->pnext) { + rval_evaluator_t* pev = pe->pvvalue; + pev->pfree_func(pev); + } + if (pstate->prhs_evaluator != NULL) { + pstate->prhs_evaluator->pfree_func(pstate->prhs_evaluator); + } + if (pstate->prhs_keylist_evaluators != NULL) { + for (sllve_t* pe = pstate->prhs_keylist_evaluators->phead; pe != NULL; pe = pe->pnext) { + rval_evaluator_t* pev = pe->pvvalue; + pev->pfree_func(pev); + } + } + + free(pstate); +} + +// ---------------------------------------------------------------- +static void handle_oosvar_assignment( + mlr_dsl_cst_statement_t* pstatement, + variables_t* pvars, + cst_outputs_t* pcst_outputs) +{ + oosvar_assignment_state_t* pstate = pstatement->pvstate; + + rval_evaluator_t* prhs_evaluator = pstate->prhs_evaluator; + mv_t rhs_value = prhs_evaluator->pprocess_func(prhs_evaluator->pvstate, pvars); + + if (mv_is_present(&rhs_value)) { + int all_non_null_or_error = TRUE; + sllmv_t* pmvkeys = evaluate_list(pstate->plhs_keylist_evaluators, pvars, + &all_non_null_or_error); + if (all_non_null_or_error) + mlhmmv_put_terminal(pvars->poosvars, pmvkeys, &rhs_value); + sllmv_free(pmvkeys); + } + mv_free(&rhs_value); +} + +// ---------------------------------------------------------------- +static void handle_oosvar_to_oosvar_assignment( + mlr_dsl_cst_statement_t* pstatement, + variables_t* pvars, + cst_outputs_t* pcst_outputs) +{ + oosvar_assignment_state_t* pstate = pstatement->pvstate; + + int lhs_all_non_null_or_error = TRUE; + sllmv_t* plhskeys = evaluate_list(pstate->plhs_keylist_evaluators, pvars, + &lhs_all_non_null_or_error); + + if (lhs_all_non_null_or_error) { + int rhs_all_non_null_or_error = TRUE; + sllmv_t* prhskeys = evaluate_list(pstate->prhs_keylist_evaluators, pvars, + &rhs_all_non_null_or_error); + if (rhs_all_non_null_or_error) { + mlhmmv_copy(pvars->poosvars, plhskeys, prhskeys); + } + sllmv_free(prhskeys); + } + + sllmv_free(plhskeys); +} diff --git a/c/mapping/mlr_dsl_cst_statements.c b/c/mapping/mlr_dsl_cst_statements.c index b9d7dea68..52bc6ad15 100644 --- a/c/mapping/mlr_dsl_cst_statements.c +++ b/c/mapping/mlr_dsl_cst_statements.c @@ -26,7 +26,6 @@ static mlr_dsl_cst_statement_t* alloc_local_non_map_variable_definition( int context_flags, int type_mask); -static mlr_dsl_cst_statement_allocator_t alloc_oosvar_assignment; static mlr_dsl_cst_statement_allocator_t alloc_oosvar_from_full_srec_assignment; static mlr_dsl_cst_statement_allocator_t alloc_full_srec_from_oosvar_assignment; @@ -40,11 +39,8 @@ static mlr_dsl_cst_statement_allocator_t alloc_for_local_map; static mlr_dsl_cst_statement_allocator_t alloc_for_local_map_key_only; // ---------------------------------------------------------------- -static mlr_dsl_cst_statement_handler_t handle_oosvar_assignment; -static mlr_dsl_cst_statement_handler_t handle_oosvar_to_oosvar_assignment; static mlr_dsl_cst_statement_handler_t handle_oosvar_from_full_srec_assignment; static mlr_dsl_cst_statement_handler_t handle_full_srec_from_oosvar_assignment; -static mlr_dsl_cst_statement_handler_t handle_oosvar_assignment; static mlr_dsl_cst_statement_handler_t handle_env_assignment; static mlr_dsl_cst_statement_handler_t handle_local_non_map_variable_definition; static mlr_dsl_cst_statement_handler_t handle_local_map_variable_declaration; @@ -618,36 +614,6 @@ static mlr_dsl_cst_statement_t* alloc_local_non_map_variable_definition(mlr_dsl_ return pstatement; } -// ---------------------------------------------------------------- -static mlr_dsl_cst_statement_t* alloc_oosvar_assignment(mlr_dsl_cst_t* pcst, mlr_dsl_ast_node_t* pnode, - int type_inferencing, int context_flags) -{ - mlr_dsl_cst_statement_t* pstatement = alloc_blank(pnode); - - mlr_dsl_ast_node_t* pleft = pnode->pchildren->phead->pvvalue; - mlr_dsl_ast_node_t* pright = pnode->pchildren->phead->pnext->pvvalue; - - MLR_INTERNAL_CODING_ERROR_IF(pleft->type != MD_AST_NODE_TYPE_OOSVAR_KEYLIST); - - sllv_t* poosvar_target_keylist_evaluators = allocate_keylist_evaluators_from_oosvar_node(pcst, pleft, - type_inferencing, context_flags); - - if (pleft->type == MD_AST_NODE_TYPE_OOSVAR_KEYLIST && pright->type == MD_AST_NODE_TYPE_OOSVAR_KEYLIST) { - pstatement->pstatement_handler = handle_oosvar_to_oosvar_assignment; - pstatement->poosvar_rhs_keylist_evaluators = allocate_keylist_evaluators_from_oosvar_node(pcst, pright, - type_inferencing, context_flags); - } else { - pstatement->pstatement_handler = handle_oosvar_assignment; - pstatement->poosvar_rhs_keylist_evaluators = NULL; - } - - pstatement->poosvar_target_keylist_evaluators = poosvar_target_keylist_evaluators; - pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pright, pcst->pfmgr, - type_inferencing, context_flags); - - return pstatement; -} - // ---------------------------------------------------------------- static mlr_dsl_cst_statement_t* alloc_oosvar_from_full_srec_assignment(mlr_dsl_cst_t* pcst, mlr_dsl_ast_node_t* pnode, int type_inferencing, int context_flags) @@ -1329,51 +1295,6 @@ static void handle_local_map_variable_declaration( } // ---------------------------------------------------------------- -static void handle_oosvar_assignment( - mlr_dsl_cst_statement_t* pstatement, - variables_t* pvars, - cst_outputs_t* pcst_outputs) -{ - rval_evaluator_t* prhs_evaluator = pstatement->prhs_evaluator; - mv_t rhs_value = prhs_evaluator->pprocess_func(prhs_evaluator->pvstate, pvars); - - if (mv_is_present(&rhs_value)) { - int all_non_null_or_error = TRUE; - sllmv_t* pmvkeys = evaluate_list(pstatement->poosvar_target_keylist_evaluators, pvars, - &all_non_null_or_error); - if (all_non_null_or_error) - mlhmmv_put_terminal(pvars->poosvars, pmvkeys, &rhs_value); - sllmv_free(pmvkeys); - } - mv_free(&rhs_value); -} - -// ---------------------------------------------------------------- -// All assignments produce a mlrval on the RHS and store it on the left -- except if both LHS and RHS -// are oosvars in which case there are recursive copies, or in case of $* on the LHS or RHS. - -static void handle_oosvar_to_oosvar_assignment( - mlr_dsl_cst_statement_t* pstatement, - variables_t* pvars, - cst_outputs_t* pcst_outputs) -{ - int lhs_all_non_null_or_error = TRUE; - sllmv_t* plhskeys = evaluate_list(pstatement->poosvar_target_keylist_evaluators, pvars, - &lhs_all_non_null_or_error); - - if (lhs_all_non_null_or_error) { - int rhs_all_non_null_or_error = TRUE; - sllmv_t* prhskeys = evaluate_list(pstatement->poosvar_rhs_keylist_evaluators, pvars, - &rhs_all_non_null_or_error); - if (rhs_all_non_null_or_error) { - mlhmmv_copy(pvars->poosvars, plhskeys, prhskeys); - } - sllmv_free(prhskeys); - } - - sllmv_free(plhskeys); -} - static void handle_oosvar_from_full_srec_assignment( mlr_dsl_cst_statement_t* pstatement, variables_t* pvars,