mirror of
https://github.com/johnkerl/miller.git
synced 2026-07-26 09:23:55 +00:00
mapvar-assign iterate
This commit is contained in:
parent
ed7c2ab04b
commit
e2729e797b
3 changed files with 56 additions and 9 deletions
|
|
@ -301,14 +301,6 @@ mlr_dsl_cst_statement_t* alloc_nonindexed_local_variable_assignment(mlr_dsl_cst_
|
|||
MLR_INTERNAL_CODING_ERROR_IF(pleft->type != MD_AST_NODE_TYPE_NONINDEXED_LOCAL_VARIABLE);
|
||||
MLR_INTERNAL_CODING_ERROR_IF(pleft->pchildren != NULL);
|
||||
|
||||
// xxx XXX mapvar case: rhs is MAP_LITERAL
|
||||
// xxx XXX mapvar case: rhs is FULL_SREC
|
||||
// xxx XXX mapvar case: rhs is OOSVAR_KEYLIST
|
||||
// xxx XXX mapvar case: rhs is FULL_OOSVAR
|
||||
// xxx XXX mapvar case: rhs is NONINDEXED_LOCAL_VARIABLE
|
||||
// xxx XXX mapvar case: rhs is INDEXED_LOCAL_VARIABLE
|
||||
// xxx XXX mapvar case: rhs is FUNCTION_CALLSITE
|
||||
|
||||
pstate->lhs_variable_name = pleft->text;
|
||||
MLR_INTERNAL_CODING_ERROR_IF(pleft->vardef_frame_relative_index == MD_UNUSED_INDEX);
|
||||
pstate->lhs_frame_relative_index = pleft->vardef_frame_relative_index;
|
||||
|
|
|
|||
|
|
@ -167,6 +167,9 @@ rxval_evaluator_t* rxval_evaluator_alloc_from_nonindexed_local_variable(
|
|||
rxval_evaluator_t* rxval_evaluator_alloc_from_indexed_local_variable(
|
||||
mlr_dsl_ast_node_t* past, fmgr_t* pfmgr, int type_inferencing, int context_flags);
|
||||
|
||||
rxval_evaluator_t* rxval_evaluator_alloc_from_oosvar_keylist(
|
||||
mlr_dsl_ast_node_t* past, fmgr_t* pfmgr, int type_inferencing, int context_flags);
|
||||
|
||||
rxval_evaluator_t* rxval_evaluator_alloc_wrapping_rval(
|
||||
mlr_dsl_ast_node_t* past, fmgr_t* pfmgr, int type_inferencing, int context_flags);
|
||||
|
||||
|
|
|
|||
|
|
@ -45,7 +45,8 @@ rxval_evaluator_t* rxval_evaluator_alloc_from_ast(mlr_dsl_ast_node_t* pnode, fmg
|
|||
break;
|
||||
|
||||
case MD_AST_NODE_TYPE_OOSVAR_KEYLIST:
|
||||
return NULL; // xxx XXX mapvar stub
|
||||
return rxval_evaluator_alloc_from_oosvar_keylist(
|
||||
pnode, pfmgr, type_inferencing, context_flags);
|
||||
break;
|
||||
|
||||
case MD_AST_NODE_TYPE_FULL_OOSVAR:
|
||||
|
|
@ -156,6 +157,57 @@ rxval_evaluator_t* rxval_evaluator_alloc_from_indexed_local_variable(
|
|||
return prxval_evaluator;
|
||||
}
|
||||
|
||||
// ================================================================
|
||||
typedef struct _rxval_evaluator_from_oosvar_keylist_state_t {
|
||||
sllv_t* pkeylist_evaluators;
|
||||
} rxval_evaluator_from_oosvar_keylist_state_t;
|
||||
|
||||
mlhmmv_value_t rxval_evaluator_from_oosvar_keylist_func(void* pvstate, variables_t* pvars) {
|
||||
rxval_evaluator_from_oosvar_keylist_state_t* pstate = pvstate;
|
||||
|
||||
int all_non_null_or_error = TRUE;
|
||||
sllmv_t* pmvkeys = evaluate_list(pstate->pkeylist_evaluators, pvars, &all_non_null_or_error);
|
||||
|
||||
if (all_non_null_or_error) {
|
||||
|
||||
int lookup_error = FALSE;
|
||||
mlhmmv_value_t* pxval = mlhmmv_get_value_from_level(pvars->poosvars->proot_level,
|
||||
pmvkeys, &lookup_error);
|
||||
sllmv_free(pmvkeys);
|
||||
return mlhmmv_copy_aux(pxval);
|
||||
} else {
|
||||
sllmv_free(pmvkeys);
|
||||
return mlhmmv_value_transfer_terminal(mv_absent());
|
||||
}
|
||||
}
|
||||
|
||||
static void rxval_evaluator_from_oosvar_keylist_free(rxval_evaluator_t* prxval_evaluator) {
|
||||
rxval_evaluator_from_oosvar_keylist_state_t* pstate = prxval_evaluator->pvstate;
|
||||
for (sllve_t* pe = pstate->pkeylist_evaluators->phead; pe != NULL; pe = pe->pnext) {
|
||||
rval_evaluator_t* prval_evaluator = pe->pvvalue;
|
||||
prval_evaluator->pfree_func(prval_evaluator);
|
||||
}
|
||||
sllv_free(pstate->pkeylist_evaluators);
|
||||
free(pstate);
|
||||
free(prxval_evaluator);
|
||||
}
|
||||
|
||||
rxval_evaluator_t* rxval_evaluator_alloc_from_oosvar_keylist(
|
||||
mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr, int type_inferencing, int context_flags)
|
||||
{
|
||||
rxval_evaluator_from_oosvar_keylist_state_t* pstate = mlr_malloc_or_die(
|
||||
sizeof(rxval_evaluator_from_oosvar_keylist_state_t));
|
||||
pstate->pkeylist_evaluators = allocate_keylist_evaluators_from_ast_node(
|
||||
pnode, pfmgr, type_inferencing, context_flags);
|
||||
|
||||
rxval_evaluator_t* prxval_evaluator = mlr_malloc_or_die(sizeof(rxval_evaluator_t));
|
||||
prxval_evaluator->pvstate = pstate;
|
||||
prxval_evaluator->pprocess_func = rxval_evaluator_from_oosvar_keylist_func;
|
||||
prxval_evaluator->pfree_func = rxval_evaluator_from_oosvar_keylist_free;
|
||||
|
||||
return prxval_evaluator;
|
||||
}
|
||||
|
||||
// ================================================================
|
||||
typedef struct _rxval_evaluator_wrapping_rval_state_t {
|
||||
rval_evaluator_t* prval_evaluator;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue