mapvar iterate

This commit is contained in:
John Kerl 2016-10-29 10:09:06 -04:00
parent 29a71b82fe
commit 2d902cdb03
6 changed files with 52 additions and 11 deletions

View file

@ -96,6 +96,24 @@ local_stack_frame_t* local_stack_pop(local_stack_t* pstack) {
return sllv_pop(pstack->pframes);
}
// ----------------------------------------------------------------
mv_t local_stack_frame_get_map(local_stack_frame_t* pframe,
int vardef_frame_relative_index, sllmv_t* pmvkeys)
{
LOCAL_STACK_TRACE(printf("LOCAL STACK FRAME %p GET %d\n", pframe, vardef_frame_relative_index));
LOCAL_STACK_BOUNDS_CHECK(pframe, "GET", FALSE, vardef_frame_relative_index);
local_stack_frame_entry_t* pentry = &pframe->pvars[vardef_frame_relative_index];
mlhmmv_value_t* pmvalue = &pentry->value;
// xxx encapsulate
if (pmvalue->is_terminal) {
return mv_absent();
} else {
int error = 0;
return *mlhmmv_get_terminal_from_level(pmvalue->u.pnext_level, pmvkeys, &error);
}
}
// ----------------------------------------------------------------
void local_stack_frame_assign_map(local_stack_frame_t* pframe,
int vardef_frame_relative_index, sllmv_t* pmvkeys,

View file

@ -78,12 +78,24 @@ void local_stack_frame_exit(local_stack_frame_t* pframe);
void local_stack_frame_throw_type_mismatch(local_stack_frame_entry_t* pentry, mv_t* pval);
// ----------------------------------------------------------------
static inline mlhmmv_value_t* local_stack_frame_get(local_stack_frame_t* pframe, int vardef_frame_relative_index) {
static inline mv_t local_stack_frame_get_non_map(local_stack_frame_t* pframe,
int vardef_frame_relative_index)
{
LOCAL_STACK_TRACE(printf("LOCAL STACK FRAME %p GET %d\n", pframe, vardef_frame_relative_index));
LOCAL_STACK_BOUNDS_CHECK(pframe, "GET", FALSE, vardef_frame_relative_index);
return &pframe->pvars[vardef_frame_relative_index].value;
// xxx encapsulate
local_stack_frame_entry_t* pentry = &pframe->pvars[vardef_frame_relative_index];
mlhmmv_value_t* pvalue = &pentry->value;
if (pvalue->is_terminal) {
return pvalue->u.mlrval;
} else {
return mv_absent();
}
}
mv_t local_stack_frame_get_map(local_stack_frame_t* pframe,
int vardef_frame_relative_index, sllmv_t* pmvkeys);
// ----------------------------------------------------------------
static inline void local_stack_frame_define(local_stack_frame_t* pframe, char* variable_name,
int vardef_frame_relative_index, int type_mask, mv_t val)
@ -106,7 +118,7 @@ static inline void local_stack_frame_define(local_stack_frame_t* pframe, char* v
// ----------------------------------------------------------------
static inline void local_stack_frame_assign(local_stack_frame_t* pframe,
static inline void local_stack_frame_assign_non_map(local_stack_frame_t* pframe,
int vardef_frame_relative_index, mv_t val)
{
LOCAL_STACK_TRACE(printf("LOCAL STACK FRAME %p SET %d\n", pframe, vardef_frame_relative_index));

View file

@ -304,6 +304,7 @@ static void mlhmmv_level_move(mlhmmv_level_t* plevel, mv_t* plevel_key, mlhmmv_v
}
// ----------------------------------------------------------------
// xxx merge these two
mv_t* mlhmmv_get_terminal(mlhmmv_t* pmap, sllmv_t* pmvkeys, int* perror) {
mlhmmv_level_entry_t* plevel_entry = mlhmmv_get_entry_at_level(pmap->proot_level, pmvkeys->phead, perror);
if (plevel_entry == NULL) {
@ -316,6 +317,18 @@ mv_t* mlhmmv_get_terminal(mlhmmv_t* pmap, sllmv_t* pmvkeys, int* perror) {
return &plevel_entry->level_value.u.mlrval;
}
mv_t* mlhmmv_get_terminal_from_level(mlhmmv_level_t* plevel, sllmv_t* pmvkeys, int* perror) {
mlhmmv_level_entry_t* plevel_entry = mlhmmv_get_entry_at_level(plevel, pmvkeys->phead, perror);
if (plevel_entry == NULL) {
return NULL;
}
if (!plevel_entry->level_value.is_terminal) {
*perror = MLHMMV_ERROR_KEYLIST_TOO_SHALLOW;
return NULL;
}
return &plevel_entry->level_value.u.mlrval;
}
// ----------------------------------------------------------------
static mlhmmv_level_entry_t* mlhmmv_get_entry_at_level(mlhmmv_level_t* plevel, sllmve_t* prestkeys, int* perror) {
if (perror)

View file

@ -88,6 +88,7 @@ void mlhmmv_put_terminal(mlhmmv_t* pmap, sllmv_t* pmvkeys, mv_t* pterminal_value
// Note: this returns a pointer to the map's data, not to a copy.
// The caller shouldn't free it, or modify it.
mv_t* mlhmmv_get_terminal(mlhmmv_t* pmap, sllmv_t* pmvkeys, int* perror);
mv_t* mlhmmv_get_terminal_from_level(mlhmmv_level_t* plevel, sllmv_t* pmvkeys, int* perror);
// These are an optimization for assignment from full srec, e.g. '@records[$key1][$key2] = $*'.
// Using mlhmmv_get_or_create_level, the CST logic can get or create the @records[$key1][$key2]

View file

@ -2254,7 +2254,7 @@ static void handle_local_non_map_variable_assignment(
mv_t val = prhs_evaluator->pprocess_func(prhs_evaluator->pvstate, pvars);
if (mv_is_present(&val)) {
local_stack_frame_t* pframe = local_stack_get_top_frame(pvars->plocal_stack);
local_stack_frame_assign(pframe, pstatement->local_lhs_frame_relative_index, val);
local_stack_frame_assign_non_map(pframe, pstatement->local_lhs_frame_relative_index, val);
} else {
mv_free(&val);
}
@ -2504,7 +2504,7 @@ static void handle_unset_local_variable(
cst_outputs_t* pcst_outputs)
{
local_stack_frame_t* pframe = local_stack_get_top_frame(pvars->plocal_stack);
local_stack_frame_assign(pframe, pvararg->unset_local_variable_frame_relative_index, mv_absent());
local_stack_frame_assign_non_map(pframe, pvararg->unset_local_variable_frame_relative_index, mv_absent());
}
static void handle_unset_vararg_oosvar(

View file

@ -764,13 +764,10 @@ typedef struct _rval_evaluator_from_local_variable_state_t {
mv_t rval_evaluator_from_local_variable_func(void* pvstate, variables_t* pvars) {
rval_evaluator_from_local_variable_state_t* pstate = pvstate;
local_stack_frame_t* pframe = local_stack_get_top_frame(pvars->plocal_stack);
mlhmmv_value_t* pmval = local_stack_frame_get(pframe, pstate->vardef_frame_relative_index);
if (pmval->is_terminal) {
return mv_copy(&pmval->u.mlrval); // xxx temp
} else {
return mv_absent();
}
mv_t val = local_stack_frame_get_non_map(pframe, pstate->vardef_frame_relative_index);
return mv_copy(&val);
}
static void rval_evaluator_from_local_variable_free(rval_evaluator_t* pevaluator) {
rval_evaluator_from_local_variable_state_t* pstate = pevaluator->pvstate;
free(pstate);