mapvar iterate

This commit is contained in:
John Kerl 2016-10-29 10:24:56 -04:00
parent 2d902cdb03
commit e70bca68f3
4 changed files with 18 additions and 8 deletions

View file

@ -130,12 +130,13 @@ void local_stack_frame_assign_map(local_stack_frame_t* pframe,
mlhmmv_value_t* pmvalue = &pentry->value;
mv_free(&pmvalue->u.mlrval); // xxx make a free method ...
//pmvalue->is_terminal = FALSE;
// xxx expose some logic in mlhmmv.h
// mlhmmv_put_terminal_from_level(pmap->proot_level, pmvkeys->phead, &terminal_value);
// xxx finish coding
// xxx encapsulate
pmvalue->is_terminal = FALSE;
pmvalue->u.pnext_level = mlhmmv_level_alloc();
mlhmmv_put_terminal_from_level(pmvalue->u.pnext_level, pmvkeys->phead, &terminal_value);
pentry->value = mlhmmv_value_transfer_terminal(terminal_value);
LOCAL_STACK_TRACE(printf("VALUE IS:\n"));
LOCAL_STACK_TRACE(mlhmmv_level_print_stacked(pmvalue->u.pnext_level, 0, TRUE, TRUE, "", stdout));
}
// ----------------------------------------------------------------

View file

@ -19,7 +19,7 @@
#include "lib/mlrutil.h"
#include "containers/mlhmmv.h"
static mlhmmv_level_t* mlhmmv_level_alloc();
// xxx temp static mlhmmv_level_t* mlhmmv_level_alloc();
static void mlhmmv_level_init(mlhmmv_level_t *plevel, int length);
static void mlhmmv_level_free(mlhmmv_level_t* plevel);
@ -86,7 +86,8 @@ mlhmmv_t* mlhmmv_alloc() {
return pmap;
}
static mlhmmv_level_t* mlhmmv_level_alloc() {
// xxx temp expose static
mlhmmv_level_t* mlhmmv_level_alloc() {
mlhmmv_level_t* plevel = mlr_malloc_or_die(sizeof(mlhmmv_level_t));
mlhmmv_level_init(plevel, MLHMMV_INITIAL_ARRAY_LENGTH);
return plevel;

View file

@ -69,6 +69,9 @@ typedef struct _mlhmmv_level_t {
mlhmmv_level_entry_t* ptail;
} mlhmmv_level_t;
// xxx temp expose
mlhmmv_level_t* mlhmmv_level_alloc();
// ----------------------------------------------------------------
typedef struct _mlhmmv_t {
mlhmmv_level_t* proot_level;

View file

@ -763,8 +763,9 @@ static mlr_dsl_cst_statement_t* alloc_local_map_variable_assignment(mlr_dsl_cst_
pstatement->local_lhs_frame_relative_index = pleft->vardef_frame_relative_index;
sllv_t* plocal_map_lhs_keylist_evaluators = sllv_alloc();
for (sllve_t* pe = pnode->pchildren->phead; pe != NULL; pe = pe->pnext) {
for (sllve_t* pe = pleft->pchildren->phead; pe != NULL; pe = pe->pnext) {
mlr_dsl_ast_node_t* pkeynode = pe->pvvalue;
mlr_dsl_ast_node_print(pkeynode);
if (pkeynode->type == MD_AST_NODE_TYPE_STRING_LITERAL) {
sllv_append(plocal_map_lhs_keylist_evaluators, rval_evaluator_alloc_from_string(pkeynode->text));
} else {
@ -2271,11 +2272,15 @@ static void handle_local_map_variable_assignment(
if (mv_is_present(&rhs_value)) {
int all_non_null_or_error = TRUE;
printf("LEN=%lld\n", pstatement->plocal_map_lhs_keylist_evaluators->length);
sllmv_t* pmvkeys = evaluate_list(pstatement->plocal_map_lhs_keylist_evaluators, pvars,
&all_non_null_or_error);
if (all_non_null_or_error) {
printf("YES\n");
local_stack_frame_t* pframe = local_stack_get_top_frame(pvars->plocal_stack);
local_stack_frame_assign_map(pframe, pstatement->local_lhs_frame_relative_index, pmvkeys, rhs_value);
} else {
printf("NO\n");
}
sllmv_free(pmvkeys);