mapvar-assign iterate

This commit is contained in:
John Kerl 2016-11-09 22:42:37 -05:00
parent ed7c2ab04b
commit e2729e797b
3 changed files with 56 additions and 9 deletions

View file

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

View file

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

View file

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