xvfuncs iterate

This commit is contained in:
John Kerl 2016-12-04 22:20:12 -05:00
parent e3a0a716c4
commit ffef9d1bf3
5 changed files with 44 additions and 10 deletions

View file

@ -16,7 +16,7 @@ boxed_xval_t b_x_haskey_xfunc(boxed_xval_t* pmapval, boxed_xval_t* pkeyval) {
}
// ----------------------------------------------------------------
boxed_xval_t b_x_length_xfunc(boxed_xval_t* pxval1) {
boxed_xval_t i_x_length_xfunc(boxed_xval_t* pxval1) {
if (pxval1->xval.is_terminal) {
return box_ephemeral_val(
mv_from_int(1)

View file

@ -160,7 +160,7 @@ static inline boxed_xval_t b_x_typeof_xfunc(boxed_xval_t* pbxval1) {
// ----------------------------------------------------------------
boxed_xval_t b_x_haskey_xfunc(boxed_xval_t* pmapval, boxed_xval_t* pkeyval);
boxed_xval_t b_x_length_xfunc(boxed_xval_t* pbxval1);
boxed_xval_t i_x_length_xfunc(boxed_xval_t* pbxval1);
// xxx to do (non-inline):
//boxed_xval_t i_m_depth_xfunc(boxed_xval_t* pbxval1);

View file

@ -1149,17 +1149,15 @@ static rxval_evaluator_t* fmgr_alloc_xevaluator_from_variadic_func_name(
// ----------------------------------------------------------------
static rxval_evaluator_t* fmgr_alloc_xevaluator_from_unary_func_name(char* fnnm, rxval_evaluator_t* parg1) {
if (streq(fnnm, "ismap")) {
return rxval_evaluator_alloc_from_b_m_func(NULL/*xxx temp*/, parg1);
return rxval_evaluator_alloc_from_b_x_func(b_x_ismap_xfunc, parg1);
} else if (streq(fnnm, "isscalar")) {
return rxval_evaluator_alloc_from_b_m_func(NULL/*xxx temp*/, parg1);
return rxval_evaluator_alloc_from_b_m_func(b_x_isscalar_xfunc, parg1);
} else if (streq(fnnm, "isemptymap")) {
return rxval_evaluator_alloc_from_b_m_func(NULL/*xxx temp*/, parg1);
return rxval_evaluator_alloc_from_b_m_func(b_x_isemptymap_xfunc, parg1);
} else if (streq(fnnm, "isnonemptymap")) {
return rxval_evaluator_alloc_from_b_m_func(NULL/*xxx temp*/, parg1);
} else if (streq(fnnm, "haskey")) {
return rxval_evaluator_alloc_from_b_m_func(NULL/*xxx temp*/, parg1);
return rxval_evaluator_alloc_from_b_m_func(b_x_isnonemptymap_xfunc, parg1);
} else if (streq(fnnm, "length")) {
return rxval_evaluator_alloc_from_b_m_func(NULL/*xxx temp*/, parg1);
return rxval_evaluator_alloc_from_b_m_func(i_x_length_xfunc, parg1);
} else {
return NULL;
}
@ -1170,7 +1168,7 @@ static rxval_evaluator_t* fmgr_alloc_xevaluator_from_binary_func_name(char* fnnm
rxval_evaluator_t* parg2)
{
if (streq(fnnm, "haskey")) {
return rxval_evaluator_alloc_from_b_mx_func(NULL/*xxx temp*/, parg1, parg2);
return rxval_evaluator_alloc_from_b_mx_func(b_x_haskey_xfunc, parg1, parg2);
} else {
return NULL;
}
@ -1198,6 +1196,8 @@ static void resolve_func_callsite(fmgr_t* pfmgr, rval_evaluator_t* pev) {
// xxx XXX builtin xev
// xxx XXX need to differentiate between map-in,map-out, map-in,scalar-out, and scalar-in,scalar-out
pevaluator = construct_builtin_function_callsite_evaluator(pfmgr, pcallsite);
if (pevaluator != NULL) {
*pev = *pevaluator;

View file

@ -193,6 +193,7 @@ rxval_evaluator_t* rxval_evaluator_alloc_wrapping_rval(
// rxval_func_evaluators.c
rxval_evaluator_t* rxval_evaluator_alloc_from_variadic_func(xv_variadic_func_t* pfunc, rxval_evaluator_t** pargs, int nargs);
rxval_evaluator_t* rxval_evaluator_alloc_from_b_x_func(xv_unary_func_t* pfunc, rxval_evaluator_t* parg1);
rxval_evaluator_t* rxval_evaluator_alloc_from_b_m_func(xv_unary_func_t* pfunc, rxval_evaluator_t* parg1);
rxval_evaluator_t* rxval_evaluator_alloc_from_b_mx_func(xv_binary_func_t* pfunc, rxval_evaluator_t* parg1,
rxval_evaluator_t* parg2);

View file

@ -67,6 +67,39 @@ rxval_evaluator_t* rxval_evaluator_alloc_from_variadic_func(
return pxevaluator;
}
// ----------------------------------------------------------------
typedef struct _rxval_evaluator_b_x_state_t {
xv_unary_func_t* pfunc;
rxval_evaluator_t* parg1;
} rxval_evaluator_b_x_state_t;
static boxed_xval_t rxval_evaluator_b_x_func(void* pvstate, variables_t* pvars) {
rxval_evaluator_b_x_state_t* pstate = pvstate;
boxed_xval_t bxval1 = pstate->parg1->pprocess_func(pstate->parg1->pvstate, pvars);
return pstate->pfunc(&bxval1);
}
static void rxval_evaluator_b_x_free(rxval_evaluator_t* pxevaluator) {
rxval_evaluator_b_x_state_t* pstate = pxevaluator->pvstate;
pstate->parg1->pfree_func(pstate->parg1);
free(pstate);
free(pxevaluator);
}
rxval_evaluator_t* rxval_evaluator_alloc_from_b_x_func(xv_unary_func_t* pfunc, rxval_evaluator_t* parg1) {
rxval_evaluator_b_x_state_t* pstate = mlr_malloc_or_die(sizeof(rxval_evaluator_b_x_state_t));
pstate->pfunc = pfunc;
pstate->parg1 = parg1;
rxval_evaluator_t* pxevaluator = mlr_malloc_or_die(sizeof(rxval_evaluator_t));
pxevaluator->pvstate = pstate;
pxevaluator->pprocess_func = rxval_evaluator_b_x_func;
pxevaluator->pfree_func = rxval_evaluator_b_x_free;
return pxevaluator;
}
// ----------------------------------------------------------------
typedef struct _rxval_evaluator_b_m_state_t {
xv_unary_func_t* pfunc;