diff --git a/c/containers/xvfuncs.c b/c/containers/xvfuncs.c index b78ea6741..4b33b61ef 100644 --- a/c/containers/xvfuncs.c +++ b/c/containers/xvfuncs.c @@ -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) diff --git a/c/containers/xvfuncs.h b/c/containers/xvfuncs.h index 94e0a2137..292821bb9 100644 --- a/c/containers/xvfuncs.h +++ b/c/containers/xvfuncs.h @@ -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); diff --git a/c/dsl/function_manager.c b/c/dsl/function_manager.c index acdb38bfe..58c818c33 100644 --- a/c/dsl/function_manager.c +++ b/c/dsl/function_manager.c @@ -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; diff --git a/c/dsl/rval_evaluators.h b/c/dsl/rval_evaluators.h index 777104d89..c947c58ff 100644 --- a/c/dsl/rval_evaluators.h +++ b/c/dsl/rval_evaluators.h @@ -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); diff --git a/c/dsl/rxval_func_evaluators.c b/c/dsl/rxval_func_evaluators.c index 4d4e2b5e7..6c314b4d3 100644 --- a/c/dsl/rxval_func_evaluators.c +++ b/c/dsl/rxval_func_evaluators.c @@ -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;