diff --git a/c/dsl/function_manager.c b/c/dsl/function_manager.c index 555051d28..1500a3f8d 100644 --- a/c/dsl/function_manager.c +++ b/c/dsl/function_manager.c @@ -41,31 +41,51 @@ static function_lookup_t FUNCTION_LOOKUP_TABLE[]; static void fmgr_check_arity_with_report(fmgr_t* pfmgr, char* function_name, int user_provided_arity, int* pvariadic); -static rval_evaluator_t* fmgr_alloc_evaluator_from_variadic_func_name(char* function_name, rval_evaluator_t** pargs, int nargs); +static rval_evaluator_t* fmgr_alloc_evaluator_from_variadic_func_name( + char* function_name, rval_evaluator_t** pargs, int nargs); -static rval_evaluator_t* fmgr_alloc_evaluator_from_zary_func_name(char* function_name); +static rval_evaluator_t* fmgr_alloc_evaluator_from_zary_func_name( + char* function_name); -static rval_evaluator_t* fmgr_alloc_evaluator_from_unary_func_name(char* fnnm, rval_evaluator_t* parg1); +static rval_evaluator_t* fmgr_alloc_evaluator_from_unary_func_name( + char* function_name, rval_evaluator_t* parg1); -static rval_evaluator_t* fmgr_alloc_evaluator_from_binary_func_name(char* fnnm, +static rval_evaluator_t* fmgr_alloc_evaluator_from_binary_func_name( + char* function_name, rval_evaluator_t* parg1, rval_evaluator_t* parg2); -static rval_evaluator_t* fmgr_alloc_evaluator_from_binary_regex_arg2_func_name(char* fnnm, +static rval_evaluator_t* fmgr_alloc_evaluator_from_binary_regex_arg2_func_name( + char* function_name, rval_evaluator_t* parg1, char* regex_string, int ignore_case); -static rval_evaluator_t* fmgr_alloc_evaluator_from_ternary_func_name(char* fnnm, +static rval_evaluator_t* fmgr_alloc_evaluator_from_ternary_func_name( + char* function_name, rval_evaluator_t* parg1, rval_evaluator_t* parg2, rval_evaluator_t* parg3); -static rval_evaluator_t* fmgr_alloc_evaluator_from_ternary_regex_arg2_func_name(char* fnnm, +static rval_evaluator_t* fmgr_alloc_evaluator_from_ternary_regex_arg2_func_name( + char* function_name, rval_evaluator_t* parg1, char* regex_string, int ignore_case, rval_evaluator_t* parg3); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -static rxval_evaluator_t* fmgr_alloc_xevaluator_from_variadic_func_name(char* function_name, rxval_evaluator_t** pargs, int nargs); -static rxval_evaluator_t* fmgr_alloc_xevaluator_from_unary_func_name(char* fnnm, rxval_evaluator_t* parg1); -static rxval_evaluator_t* fmgr_alloc_xevaluator_from_binary_func_name(char* fnnm, rxval_evaluator_t* parg1, - rxval_evaluator_t* pargs2); -static rxval_evaluator_t* fmgr_alloc_xevaluator_from_ternary_func_name(char* fnnm, rxval_evaluator_t* parg1, - rxval_evaluator_t* pargs2, rxval_evaluator_t* pargs3); +// xxx cmt why ASTs here +static rxval_evaluator_t* fmgr_alloc_xevaluator_from_variadic_func_name( + char* function_name, sllv_t* parg_nodes, + fmgr_t* pf, int ti /*type_inferencing*/, int cf /*context_flags*/); + +static rxval_evaluator_t* fmgr_alloc_xevaluator_from_unary_func_name( + char* function_name, + mlr_dsl_ast_node_t* parg1, + fmgr_t* pf, int ti /*type_inferencing*/, int cf /*context_flags*/); + +static rxval_evaluator_t* fmgr_alloc_xevaluator_from_binary_func_name( + char* function_name, + mlr_dsl_ast_node_t* parg1, mlr_dsl_ast_node_t* pargs2, + fmgr_t* pf, int ti /*type_inferencing*/, int cf /*context_flags*/); + +static rxval_evaluator_t* fmgr_alloc_xevaluator_from_ternary_func_name( + char* function_name, + mlr_dsl_ast_node_t* parg1, mlr_dsl_ast_node_t* pargs2, mlr_dsl_ast_node_t* pargs3, + fmgr_t* pf, int ti /*type_inferencing*/, int cf /*context_flags*/); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - static void resolve_func_callsite(fmgr_t* pfmgr, rval_evaluator_t* pev); @@ -1151,58 +1171,26 @@ static rxval_evaluator_t* construct_builtin_function_callsite_xevaluator( rxval_evaluator_t* pxevaluator = NULL; if (variadic) { - int nargs = pnode->pchildren->length; - rxval_evaluator_t** pargs = mlr_malloc_or_die(nargs * sizeof(rxval_evaluator_t*)); - int i = 0; - for (sllve_t* pe = pnode->pchildren->phead; pe != NULL; pe = pe->pnext, i++) { - mlr_dsl_ast_node_t* pchild = pe->pvvalue; - pargs[i] = rxval_evaluator_alloc_from_ast(pchild, pfmgr, type_inferencing, context_flags); - } - pxevaluator = fmgr_alloc_xevaluator_from_variadic_func_name(function_name, pargs, nargs); - // xxx free args if xeval is null + pxevaluator = fmgr_alloc_xevaluator_from_variadic_func_name(function_name, pnode->pchildren, + pfmgr, type_inferencing, context_flags); } else if (user_provided_arity == 1) { mlr_dsl_ast_node_t* parg1_node = pnode->pchildren->phead->pvvalue; - rxval_evaluator_t* parg1 = rxval_evaluator_alloc_from_ast(parg1_node, pfmgr, type_inferencing, context_flags); - pxevaluator = fmgr_alloc_xevaluator_from_unary_func_name(function_name, parg1); -// xxx gross to alloc & free right away like this ... -// xxx can't free since unresolved callsites may point in here. -// xxx better to pass args as ASTs here and let them be constructed only on function-name match. -// if (pxevaluator == NULL) { -// parg1->pfree_func(parg1); -// } + pxevaluator = fmgr_alloc_xevaluator_from_unary_func_name(function_name, parg1_node, + pfmgr, type_inferencing, context_flags); } else if (user_provided_arity == 2) { mlr_dsl_ast_node_t* parg1_node = pnode->pchildren->phead->pvvalue; mlr_dsl_ast_node_t* parg2_node = pnode->pchildren->phead->pnext->pvvalue; - rxval_evaluator_t* parg1 = rxval_evaluator_alloc_from_ast(parg1_node, pfmgr, type_inferencing, context_flags); - rxval_evaluator_t* parg2 = rxval_evaluator_alloc_from_ast(parg2_node, pfmgr, type_inferencing, context_flags); - pxevaluator = fmgr_alloc_xevaluator_from_binary_func_name(function_name, parg1, parg2); -// xxx gross to alloc & free right away like this ... -// xxx can't free since unresolved callsites may point in here. -// xxx better to pass args as ASTs here and let them be constructed only on function-name match. -// if (pxevaluator == NULL) { -// parg1->pfree_func(parg1); -// parg2->pfree_func(parg2); -// } + pxevaluator = fmgr_alloc_xevaluator_from_binary_func_name(function_name, parg1_node, parg2_node, + pfmgr, type_inferencing, context_flags); } else if (user_provided_arity == 3) { mlr_dsl_ast_node_t* parg1_node = pnode->pchildren->phead->pvvalue; mlr_dsl_ast_node_t* parg2_node = pnode->pchildren->phead->pnext->pvvalue; mlr_dsl_ast_node_t* parg3_node = pnode->pchildren->phead->pnext->pnext->pvvalue; - rxval_evaluator_t* parg1 = rxval_evaluator_alloc_from_ast(parg1_node, pfmgr, type_inferencing, context_flags); - rxval_evaluator_t* parg2 = rxval_evaluator_alloc_from_ast(parg2_node, pfmgr, type_inferencing, context_flags); - rxval_evaluator_t* parg3 = rxval_evaluator_alloc_from_ast(parg3_node, pfmgr, type_inferencing, context_flags); - pxevaluator = fmgr_alloc_xevaluator_from_ternary_func_name(function_name, parg1, parg2, parg3); -// xxx gross to alloc & free right away like this ... -// xxx can't free since unresolved callsites may point in here. -// xxx better to pass args as ASTs here and let them be constructed only on function-name match. -// if (pxevaluator == NULL) { -// parg1->pfree_func(parg1); -// parg2->pfree_func(parg2); -// parg3->pfree_func(parg3); -// } - + pxevaluator = fmgr_alloc_xevaluator_from_ternary_func_name(function_name, parg1_node, parg2_node, parg3_node, + pfmgr, type_inferencing, context_flags); } return pxevaluator; @@ -1211,129 +1199,139 @@ static rxval_evaluator_t* construct_builtin_function_callsite_xevaluator( // ---------------------------------------------------------------- static rxval_evaluator_t* fmgr_alloc_xevaluator_from_variadic_func_name( char* function_name, - rxval_evaluator_t** pargs, - int nargs) + sllv_t* parg_nodes, + fmgr_t* pfmgr, + int type_inferencing, + int context_flags) { if (streq(function_name, "mapsum")) { - return rxval_evaluator_alloc_from_variadic_func(variadic_mapsum_xfunc, pargs, nargs); + return rxval_evaluator_alloc_from_variadic_func(variadic_mapsum_xfunc, parg_nodes, + pfmgr, type_inferencing, context_flags); } else if (streq(function_name, "mapdiff")) { - return rxval_evaluator_alloc_from_variadic_func(variadic_mapdiff_xfunc, pargs, nargs); + return rxval_evaluator_alloc_from_variadic_func(variadic_mapdiff_xfunc, parg_nodes, + pfmgr, type_inferencing, context_flags); } else { return NULL; } } // ---------------------------------------------------------------- -static rxval_evaluator_t* fmgr_alloc_xevaluator_from_unary_func_name(char* fnnm, rxval_evaluator_t* parg1) { +static rxval_evaluator_t* fmgr_alloc_xevaluator_from_unary_func_name(char* fnnm, + mlr_dsl_ast_node_t* parg1, + fmgr_t* pf, int ti /*type_inferencing*/, int cf /*context_flags*/) +{ if (streq(fnnm, "asserting_absent")) { - return rxval_evaluator_alloc_from_A_x_func(b_x_is_absent_no_free_xfunc, parg1, "absent"); + return rxval_evaluator_alloc_from_A_x_func(b_x_is_absent_no_free_xfunc, parg1, pf, ti, cf, "absent"); } else if (streq(fnnm, "asserting_bool")) { - return rxval_evaluator_alloc_from_A_x_func(b_x_is_boolean_no_free_xfunc, parg1, "boolean"); + return rxval_evaluator_alloc_from_A_x_func(b_x_is_boolean_no_free_xfunc, parg1, pf, ti, cf, "boolean"); } else if (streq(fnnm, "asserting_boolean")) { - return rxval_evaluator_alloc_from_A_x_func(b_x_is_boolean_no_free_xfunc, parg1, "boolean"); + return rxval_evaluator_alloc_from_A_x_func(b_x_is_boolean_no_free_xfunc, parg1, pf, ti, cf, "boolean"); } else if (streq(fnnm, "asserting_empty")) { - return rxval_evaluator_alloc_from_A_x_func(b_x_is_empty_no_free_xfunc, parg1, "empty"); + return rxval_evaluator_alloc_from_A_x_func(b_x_is_empty_no_free_xfunc, parg1, pf, ti, cf, "empty"); } else if (streq(fnnm, "asserting_empty_map")) { - return rxval_evaluator_alloc_from_A_x_func(b_x_is_empty_map_no_free_xfunc, parg1, "empty_map"); + return rxval_evaluator_alloc_from_A_x_func(b_x_is_empty_map_no_free_xfunc, parg1, pf, ti, cf, "empty_map"); } else if (streq(fnnm, "asserting_float")) { - return rxval_evaluator_alloc_from_A_x_func(b_x_is_float_no_free_xfunc, parg1, "float"); + return rxval_evaluator_alloc_from_A_x_func(b_x_is_float_no_free_xfunc, parg1, pf, ti, cf, "float"); } else if (streq(fnnm, "asserting_int")) { - return rxval_evaluator_alloc_from_A_x_func(b_x_is_int_no_free_xfunc, parg1, "int"); + return rxval_evaluator_alloc_from_A_x_func(b_x_is_int_no_free_xfunc, parg1, pf, ti, cf, "int"); } else if (streq(fnnm, "asserting_map")) { - return rxval_evaluator_alloc_from_A_x_func(b_x_is_map_no_free_xfunc, parg1, "map"); + return rxval_evaluator_alloc_from_A_x_func(b_x_is_map_no_free_xfunc, parg1, pf, ti, cf, "map"); } else if (streq(fnnm, "asserting_nonempty_map")) { - return rxval_evaluator_alloc_from_A_x_func(b_x_is_nonempty_map_no_free_xfunc, parg1, "nonempty_map"); + return rxval_evaluator_alloc_from_A_x_func(b_x_is_nonempty_map_no_free_xfunc, parg1, pf, ti, cf, + "nonempty_map"); } else if (streq(fnnm, "asserting_not_empty")) { - return rxval_evaluator_alloc_from_A_x_func(b_x_is_not_empty_no_free_xfunc, parg1, "not_empty"); + return rxval_evaluator_alloc_from_A_x_func(b_x_is_not_empty_no_free_xfunc, parg1, pf, ti, cf, "not_empty"); } else if (streq(fnnm, "asserting_not_map")) { - return rxval_evaluator_alloc_from_A_x_func(b_x_is_not_map_no_free_xfunc, parg1, "not_map"); + return rxval_evaluator_alloc_from_A_x_func(b_x_is_not_map_no_free_xfunc, parg1, pf, ti, cf, "not_map"); } else if (streq(fnnm, "asserting_not_null")) { - return rxval_evaluator_alloc_from_A_x_func(b_x_is_not_null_no_free_xfunc, parg1, "not_null"); + return rxval_evaluator_alloc_from_A_x_func(b_x_is_not_null_no_free_xfunc, parg1, pf, ti, cf, "not_null"); } else if (streq(fnnm, "asserting_null")) { - return rxval_evaluator_alloc_from_A_x_func(b_x_is_null_no_free_xfunc, parg1, "null"); + return rxval_evaluator_alloc_from_A_x_func(b_x_is_null_no_free_xfunc, parg1, pf, ti, cf, "null"); } else if (streq(fnnm, "asserting_numeric")) { - return rxval_evaluator_alloc_from_A_x_func(b_x_is_numeric_no_free_xfunc, parg1, "numeric"); + return rxval_evaluator_alloc_from_A_x_func(b_x_is_numeric_no_free_xfunc, parg1, pf, ti, cf, "numeric"); } else if (streq(fnnm, "asserting_present")) { - return rxval_evaluator_alloc_from_A_x_func(b_x_is_present_no_free_xfunc, parg1, "present"); + return rxval_evaluator_alloc_from_A_x_func(b_x_is_present_no_free_xfunc, parg1, pf, ti, cf, "present"); } else if (streq(fnnm, "asserting_string")) { - return rxval_evaluator_alloc_from_A_x_func(b_x_is_string_no_free_xfunc, parg1, "string"); + return rxval_evaluator_alloc_from_A_x_func(b_x_is_string_no_free_xfunc, parg1, pf, ti, cf, "string"); } else if (streq(fnnm, "is_absent")) { - return rxval_evaluator_alloc_from_x_x_func(b_x_is_absent_xfunc, parg1); + return rxval_evaluator_alloc_from_x_x_func(b_x_is_absent_xfunc, parg1, pf, ti, cf); } else if (streq(fnnm, "is_bool")) { - return rxval_evaluator_alloc_from_x_x_func(b_x_is_boolean_xfunc, parg1); + return rxval_evaluator_alloc_from_x_x_func(b_x_is_boolean_xfunc, parg1, pf, ti, cf); } else if (streq(fnnm, "is_boolean")) { - return rxval_evaluator_alloc_from_x_x_func(b_x_is_boolean_xfunc, parg1); + return rxval_evaluator_alloc_from_x_x_func(b_x_is_boolean_xfunc, parg1, pf, ti, cf); } else if (streq(fnnm, "is_empty")) { - return rxval_evaluator_alloc_from_x_x_func(b_x_is_empty_xfunc, parg1); + return rxval_evaluator_alloc_from_x_x_func(b_x_is_empty_xfunc, parg1, pf, ti, cf); } else if (streq(fnnm, "is_empty_map")) { - return rxval_evaluator_alloc_from_x_x_func(b_x_is_empty_map_xfunc, parg1); + return rxval_evaluator_alloc_from_x_x_func(b_x_is_empty_map_xfunc, parg1, pf, ti, cf); } else if (streq(fnnm, "is_float")) { - return rxval_evaluator_alloc_from_x_x_func(b_x_is_float_xfunc, parg1); + return rxval_evaluator_alloc_from_x_x_func(b_x_is_float_xfunc, parg1, pf, ti, cf); } else if (streq(fnnm, "is_int")) { - return rxval_evaluator_alloc_from_x_x_func(b_x_is_int_xfunc, parg1); + return rxval_evaluator_alloc_from_x_x_func(b_x_is_int_xfunc, parg1, pf, ti, cf); } else if (streq(fnnm, "is_map")) { - return rxval_evaluator_alloc_from_x_x_func(b_x_is_map_xfunc, parg1); + return rxval_evaluator_alloc_from_x_x_func(b_x_is_map_xfunc, parg1, pf, ti, cf); } else if (streq(fnnm, "is_nonempty_map")) { - return rxval_evaluator_alloc_from_x_x_func(b_x_is_nonempty_map_xfunc, parg1); + return rxval_evaluator_alloc_from_x_x_func(b_x_is_nonempty_map_xfunc, parg1, pf, ti, cf); } else if (streq(fnnm, "is_not_empty")) { - return rxval_evaluator_alloc_from_x_x_func(b_x_is_not_empty_xfunc, parg1); + return rxval_evaluator_alloc_from_x_x_func(b_x_is_not_empty_xfunc, parg1, pf, ti, cf); } else if (streq(fnnm, "is_not_map")) { - return rxval_evaluator_alloc_from_x_x_func(b_x_is_not_map_xfunc, parg1); + return rxval_evaluator_alloc_from_x_x_func(b_x_is_not_map_xfunc, parg1, pf, ti, cf); } else if (streq(fnnm, "is_not_null")) { - return rxval_evaluator_alloc_from_x_x_func(b_x_is_not_null_xfunc, parg1); + return rxval_evaluator_alloc_from_x_x_func(b_x_is_not_null_xfunc, parg1, pf, ti, cf); } else if (streq(fnnm, "is_null")) { - return rxval_evaluator_alloc_from_x_x_func(b_x_is_null_xfunc, parg1); + return rxval_evaluator_alloc_from_x_x_func(b_x_is_null_xfunc, parg1, pf, ti, cf); } else if (streq(fnnm, "is_numeric")) { - return rxval_evaluator_alloc_from_x_x_func(b_x_is_numeric_xfunc, parg1); + return rxval_evaluator_alloc_from_x_x_func(b_x_is_numeric_xfunc, parg1, pf, ti, cf); } else if (streq(fnnm, "is_present")) { - return rxval_evaluator_alloc_from_x_x_func(b_x_is_present_xfunc, parg1); + return rxval_evaluator_alloc_from_x_x_func(b_x_is_present_xfunc, parg1, pf, ti, cf); } else if (streq(fnnm, "is_string")) { - return rxval_evaluator_alloc_from_x_x_func(b_x_is_string_xfunc, parg1); + return rxval_evaluator_alloc_from_x_x_func(b_x_is_string_xfunc, parg1, pf, ti, cf); } else if (streq(fnnm, "typeof")) { - return rxval_evaluator_alloc_from_x_x_func(s_x_typeof_xfunc, parg1); + return rxval_evaluator_alloc_from_x_x_func(s_x_typeof_xfunc, parg1, pf, ti, cf); } else if (streq(fnnm, "length")) { - return rxval_evaluator_alloc_from_x_x_func(i_x_length_xfunc, parg1); + return rxval_evaluator_alloc_from_x_x_func(i_x_length_xfunc, parg1, pf, ti, cf); } else if (streq(fnnm, "depth")) { - return rxval_evaluator_alloc_from_x_x_func(i_x_depth_xfunc, parg1); + return rxval_evaluator_alloc_from_x_x_func(i_x_depth_xfunc, parg1, pf, ti, cf); } else if (streq(fnnm, "leafcount")) { - return rxval_evaluator_alloc_from_x_x_func(i_x_leafcount_xfunc, parg1); + return rxval_evaluator_alloc_from_x_x_func(i_x_leafcount_xfunc, parg1, pf, ti, cf); } else { return NULL; } } // ---------------------------------------------------------------- -static rxval_evaluator_t* fmgr_alloc_xevaluator_from_binary_func_name(char* fnnm, rxval_evaluator_t* parg1, - rxval_evaluator_t* parg2) +static rxval_evaluator_t* fmgr_alloc_xevaluator_from_binary_func_name(char* fnnm, + mlr_dsl_ast_node_t* parg1, mlr_dsl_ast_node_t* parg2, + fmgr_t* pf, int ti /*type_inferencing*/, int cf /*context_flags*/) { if (streq(fnnm, "haskey")) { - return rxval_evaluator_alloc_from_x_mx_func(b_xx_haskey_xfunc, parg1, parg2); + return rxval_evaluator_alloc_from_x_mx_func(b_xx_haskey_xfunc, parg1, parg2, pf, ti, cf); } else if (streq(fnnm, "splitnv")) { - return rxval_evaluator_alloc_from_x_ss_func(m_ss_splitnv_xfunc, parg1, parg2); + return rxval_evaluator_alloc_from_x_ss_func(m_ss_splitnv_xfunc, parg1, parg2, pf, ti, cf); } else if (streq(fnnm, "splitnvx")) { - return rxval_evaluator_alloc_from_x_ss_func(m_ss_splitnvx_xfunc, parg1, parg2); + return rxval_evaluator_alloc_from_x_ss_func(m_ss_splitnvx_xfunc, parg1, parg2, pf, ti, cf); } else if (streq(fnnm, "joink")) { - return rxval_evaluator_alloc_from_x_ms_func(s_ms_joink_xfunc, parg1, parg2); + return rxval_evaluator_alloc_from_x_ms_func(s_ms_joink_xfunc, parg1, parg2, pf, ti, cf); } else if (streq(fnnm, "joinv")) { - return rxval_evaluator_alloc_from_x_ms_func(s_ms_joinv_xfunc, parg1, parg2); + return rxval_evaluator_alloc_from_x_ms_func(s_ms_joinv_xfunc, parg1, parg2, pf, ti, cf); } else { return NULL; } } // ---------------------------------------------------------------- -static rxval_evaluator_t* fmgr_alloc_xevaluator_from_ternary_func_name(char* fnnm, rxval_evaluator_t* parg1, - rxval_evaluator_t* parg2, rxval_evaluator_t* parg3) +static rxval_evaluator_t* fmgr_alloc_xevaluator_from_ternary_func_name(char* fnnm, + mlr_dsl_ast_node_t* parg1, mlr_dsl_ast_node_t* parg2, mlr_dsl_ast_node_t* parg3, + fmgr_t* pf, int ti /*type_inferencing*/, int cf /*context_flags*/) { if (streq(fnnm, "joinkv")) { - return rxval_evaluator_alloc_from_x_mss_func(s_mss_joinkv_xfunc, parg1, parg2, parg3); + return rxval_evaluator_alloc_from_x_mss_func(s_mss_joinkv_xfunc, parg1, parg2, parg3, pf, ti, cf); } else if (streq(fnnm, "splitkv")) { - return rxval_evaluator_alloc_from_x_sss_func(m_sss_splitkv_xfunc, parg1, parg2, parg3); + return rxval_evaluator_alloc_from_x_sss_func(m_sss_splitkv_xfunc, parg1, parg2, parg3, pf, ti, cf); } else if (streq(fnnm, "splitkvx")) { - return rxval_evaluator_alloc_from_x_sss_func(m_sss_splitkvx_xfunc, parg1, parg2, parg3); + return rxval_evaluator_alloc_from_x_sss_func(m_sss_splitkvx_xfunc, parg1, parg2, parg3, pf, ti, cf); } else { return NULL; } diff --git a/c/dsl/mlr_dsl_cst_func_subr.c b/c/dsl/mlr_dsl_cst_func_subr.c index a7e11138d..43d8666e6 100644 --- a/c/dsl/mlr_dsl_cst_func_subr.c +++ b/c/dsl/mlr_dsl_cst_func_subr.c @@ -218,7 +218,7 @@ static boxed_xval_t cst_udf_process_callback(void* pvstate, int arity, boxed_xva local_stack_subframe_exit(pframe, ptop_level_block->pblock->subframe_var_count); local_stack_frame_exit(local_stack_pop(pvars->plocal_stack)); - return box_ephemeral_xval(retval); // xxx check ephemeral + return box_ephemeral_xval(retval); // xxx check ephemeral, once these are boxed through the call chain } static void cst_udf_type_check_return_value(cst_udf_state_t* pstate, mlhmmv_xvalue_t* pretval) { diff --git a/c/dsl/rxval_evaluators.h b/c/dsl/rxval_evaluators.h index 5aa36596e..42a4a082e 100644 --- a/c/dsl/rxval_evaluators.h +++ b/c/dsl/rxval_evaluators.h @@ -66,47 +66,74 @@ 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); + xv_variadic_func_t* pfunc, + sllv_t* parg_nodes, + fmgr_t* pfmgr, + int type_inferencing, + int context_flags); rxval_evaluator_t* rxval_evaluator_alloc_from_x_x_func( - xv_unary_func_t* pfunc, - rxval_evaluator_t* parg1); + xv_unary_func_t* pfunc, + mlr_dsl_ast_node_t* parg1_node, + fmgr_t* pfmgr, + int type_inferencing, + int context_flags); rxval_evaluator_t* rxval_evaluator_alloc_from_x_m_func( - xv_unary_func_t* pfunc, - rxval_evaluator_t* parg1); + xv_unary_func_t* pfunc, + mlr_dsl_ast_node_t* parg1_node, + fmgr_t* pfmgr, + int type_inferencing, + int context_flags); rxval_evaluator_t* rxval_evaluator_alloc_from_x_mx_func( - xv_binary_func_t* pfunc, - rxval_evaluator_t* parg1, - rxval_evaluator_t* parg2); + xv_binary_func_t* pfunc, + mlr_dsl_ast_node_t* parg1_node, + mlr_dsl_ast_node_t* parg2_node, + fmgr_t* pfmgr, + int type_inferencing, + int context_flags); rxval_evaluator_t* rxval_evaluator_alloc_from_x_ms_func( - xv_binary_func_t* pfunc, - rxval_evaluator_t* parg1, - rxval_evaluator_t* parg2); + xv_binary_func_t* pfunc, + mlr_dsl_ast_node_t* parg1_node, + mlr_dsl_ast_node_t* parg2_node, + fmgr_t* pfmgr, + int type_inferencing, + int context_flags); rxval_evaluator_t* rxval_evaluator_alloc_from_x_ss_func( - xv_binary_func_t* pfunc, - rxval_evaluator_t* parg1, - rxval_evaluator_t* parg2); + xv_binary_func_t* pfunc, + mlr_dsl_ast_node_t* parg1_node, + mlr_dsl_ast_node_t* parg2_node, + fmgr_t* pfmgr, + int type_inferencing, + int context_flags); rxval_evaluator_t* rxval_evaluator_alloc_from_x_mss_func( - xv_ternary_func_t* pfunc, - rxval_evaluator_t* parg1, - rxval_evaluator_t* parg2, - rxval_evaluator_t* parg3); + xv_ternary_func_t* pfunc, + mlr_dsl_ast_node_t* parg1_node, + mlr_dsl_ast_node_t* parg2_node, + mlr_dsl_ast_node_t* parg3_node, + fmgr_t* pfmgr, + int type_inferencing, + int context_flags); rxval_evaluator_t* rxval_evaluator_alloc_from_x_sss_func( - xv_ternary_func_t* pfunc, - rxval_evaluator_t* parg1, - rxval_evaluator_t* parg2, - rxval_evaluator_t* parg3); + xv_ternary_func_t* pfunc, + mlr_dsl_ast_node_t* parg1_node, + mlr_dsl_ast_node_t* parg2_node, + mlr_dsl_ast_node_t* parg3_node, + fmgr_t* pfmgr, + int type_inferencing, + int context_flags); rxval_evaluator_t* rxval_evaluator_alloc_from_A_x_func( - xv_unary_func_t* pfunc, - rxval_evaluator_t* parg1, char* desc); + xv_unary_func_t* pfunc, + mlr_dsl_ast_node_t* parg1_node, + fmgr_t* pfmgr, + int type_inferencing, + int context_flags, + char* desc); #endif // RXVAL_EVALUATORS_H diff --git a/c/dsl/rxval_func_evaluators.c b/c/dsl/rxval_func_evaluators.c index 11655ca1d..84cd23eb9 100644 --- a/c/dsl/rxval_func_evaluators.c +++ b/c/dsl/rxval_func_evaluators.c @@ -58,12 +58,23 @@ static void rxval_evaluator_variadic_free(rxval_evaluator_t* pxevaluator) { } rxval_evaluator_t* rxval_evaluator_alloc_from_variadic_func( - xv_variadic_func_t* pfunc, - rxval_evaluator_t** pargs, - int nargs) + xv_variadic_func_t* pfunc, + sllv_t* parg_nodes, + fmgr_t* pfmgr, + int type_inferencing, + int context_flags) { rxval_evaluator_variadic_state_t* pstate = mlr_malloc_or_die(sizeof(rxval_evaluator_variadic_state_t)); pstate->pfunc = pfunc; + + int nargs = parg_nodes->length; + rxval_evaluator_t** pargs = mlr_malloc_or_die(nargs * sizeof(rxval_evaluator_t*)); + int i = 0; + for (sllve_t* pe = parg_nodes->phead; pe != NULL; pe = pe->pnext, i++) { + mlr_dsl_ast_node_t* pnode = pe->pvvalue; + pargs[i] = rxval_evaluator_alloc_from_ast(pnode, pfmgr, type_inferencing, context_flags); + } + pstate->pargs = pargs; pstate->nargs = nargs; pstate->pbxvals = mlr_malloc_or_die(nargs * sizeof(boxed_xval_t)); @@ -102,10 +113,16 @@ static void rxval_evaluator_x_x_free(rxval_evaluator_t* pxevaluator) { free(pxevaluator); } -rxval_evaluator_t* rxval_evaluator_alloc_from_x_x_func(xv_unary_func_t* pfunc, rxval_evaluator_t* parg1) { +rxval_evaluator_t* rxval_evaluator_alloc_from_x_x_func( + xv_unary_func_t* pfunc, + mlr_dsl_ast_node_t* parg1_node, + fmgr_t* pfmgr, + int type_inferencing, + int context_flags) +{ rxval_evaluator_x_x_state_t* pstate = mlr_malloc_or_die(sizeof(rxval_evaluator_x_x_state_t)); pstate->pfunc = pfunc; - pstate->parg1 = parg1; + pstate->parg1 = rxval_evaluator_alloc_from_ast(parg1_node, pfmgr, type_inferencing, context_flags); rxval_evaluator_t* pxevaluator = mlr_malloc_or_die(sizeof(rxval_evaluator_t)); pxevaluator->pvstate = pstate; @@ -144,10 +161,16 @@ static void rxval_evaluator_x_m_free(rxval_evaluator_t* pxevaluator) { free(pxevaluator); } -rxval_evaluator_t* rxval_evaluator_alloc_from_x_m_func(xv_unary_func_t* pfunc, rxval_evaluator_t* parg1) { +rxval_evaluator_t* rxval_evaluator_alloc_from_x_m_func( + xv_unary_func_t* pfunc, + mlr_dsl_ast_node_t* parg1_node, + fmgr_t* pfmgr, + int type_inferencing, + int context_flags) +{ rxval_evaluator_x_m_state_t* pstate = mlr_malloc_or_die(sizeof(rxval_evaluator_x_m_state_t)); pstate->pfunc = pfunc; - pstate->parg1 = parg1; + pstate->parg1 = rxval_evaluator_alloc_from_ast(parg1_node, pfmgr, type_inferencing, context_flags); rxval_evaluator_t* pxevaluator = mlr_malloc_or_die(sizeof(rxval_evaluator_t)); pxevaluator->pvstate = pstate; @@ -196,13 +219,18 @@ static void rxval_evaluator_x_mx_free(rxval_evaluator_t* pxevaluator) { free(pxevaluator); } -rxval_evaluator_t* rxval_evaluator_alloc_from_x_mx_func(xv_binary_func_t* pfunc, - rxval_evaluator_t* parg1, rxval_evaluator_t* parg2) +rxval_evaluator_t* rxval_evaluator_alloc_from_x_mx_func( + xv_binary_func_t* pfunc, + mlr_dsl_ast_node_t* parg1_node, + mlr_dsl_ast_node_t* parg2_node, + fmgr_t* pfmgr, + int type_inferencing, + int context_flags) { rxval_evaluator_x_mx_state_t* pstate = mlr_malloc_or_die(sizeof(rxval_evaluator_x_mx_state_t)); pstate->pfunc = pfunc; - pstate->parg1 = parg1; - pstate->parg2 = parg2; + pstate->parg1 = rxval_evaluator_alloc_from_ast(parg1_node, pfmgr, type_inferencing, context_flags); // xxx arg ord unif thru api + pstate->parg2 = rxval_evaluator_alloc_from_ast(parg2_node, pfmgr, type_inferencing, context_flags); rxval_evaluator_t* pxevaluator = mlr_malloc_or_die(sizeof(rxval_evaluator_t)); pxevaluator->pvstate = pstate; @@ -255,13 +283,18 @@ static void rxval_evaluator_x_ms_free(rxval_evaluator_t* pxevaluator) { free(pxevaluator); } -rxval_evaluator_t* rxval_evaluator_alloc_from_x_ms_func(xv_binary_func_t* pfunc, - rxval_evaluator_t* parg1, rxval_evaluator_t* parg2) +rxval_evaluator_t* rxval_evaluator_alloc_from_x_ms_func( + xv_binary_func_t* pfunc, + mlr_dsl_ast_node_t* parg1_node, + mlr_dsl_ast_node_t* parg2_node, + fmgr_t* pfmgr, + int type_inferencing, + int context_flags) { rxval_evaluator_x_ms_state_t* pstate = mlr_malloc_or_die(sizeof(rxval_evaluator_x_ms_state_t)); pstate->pfunc = pfunc; - pstate->parg1 = parg1; - pstate->parg2 = parg2; + pstate->parg1 = rxval_evaluator_alloc_from_ast(parg1_node, pfmgr, type_inferencing, context_flags); + pstate->parg2 = rxval_evaluator_alloc_from_ast(parg2_node, pfmgr, type_inferencing, context_flags); rxval_evaluator_t* pxevaluator = mlr_malloc_or_die(sizeof(rxval_evaluator_t)); pxevaluator->pvstate = pstate; @@ -320,13 +353,18 @@ static void rxval_evaluator_x_ss_free(rxval_evaluator_t* pxevaluator) { free(pxevaluator); } -rxval_evaluator_t* rxval_evaluator_alloc_from_x_ss_func(xv_binary_func_t* pfunc, - rxval_evaluator_t* parg1, rxval_evaluator_t* parg2) +rxval_evaluator_t* rxval_evaluator_alloc_from_x_ss_func( + xv_binary_func_t* pfunc, + mlr_dsl_ast_node_t* parg1_node, + mlr_dsl_ast_node_t* parg2_node, + fmgr_t* pfmgr, + int type_inferencing, + int context_flags) { rxval_evaluator_x_ss_state_t* pstate = mlr_malloc_or_die(sizeof(rxval_evaluator_x_ss_state_t)); pstate->pfunc = pfunc; - pstate->parg1 = parg1; - pstate->parg2 = parg2; + pstate->parg1 = rxval_evaluator_alloc_from_ast(parg1_node, pfmgr, type_inferencing, context_flags); + pstate->parg2 = rxval_evaluator_alloc_from_ast(parg2_node, pfmgr, type_inferencing, context_flags); rxval_evaluator_t* pxevaluator = mlr_malloc_or_die(sizeof(rxval_evaluator_t)); pxevaluator->pvstate = pstate; @@ -390,14 +428,20 @@ static void rxval_evaluator_x_mss_free(rxval_evaluator_t* pxevaluator) { free(pxevaluator); } -rxval_evaluator_t* rxval_evaluator_alloc_from_x_mss_func(xv_ternary_func_t* pfunc, - rxval_evaluator_t* parg1, rxval_evaluator_t* parg2, rxval_evaluator_t* parg3) +rxval_evaluator_t* rxval_evaluator_alloc_from_x_mss_func( + xv_ternary_func_t* pfunc, + mlr_dsl_ast_node_t* parg1_node, + mlr_dsl_ast_node_t* parg2_node, + mlr_dsl_ast_node_t* parg3_node, + fmgr_t* pfmgr, + int type_inferencing, + int context_flags) { rxval_evaluator_x_mss_state_t* pstate = mlr_malloc_or_die(sizeof(rxval_evaluator_x_mss_state_t)); pstate->pfunc = pfunc; - pstate->parg1 = parg1; - pstate->parg2 = parg2; - pstate->parg3 = parg3; + pstate->parg1 = rxval_evaluator_alloc_from_ast(parg1_node, pfmgr, type_inferencing, context_flags); + pstate->parg2 = rxval_evaluator_alloc_from_ast(parg2_node, pfmgr, type_inferencing, context_flags); + pstate->parg3 = rxval_evaluator_alloc_from_ast(parg3_node, pfmgr, type_inferencing, context_flags); rxval_evaluator_t* pxevaluator = mlr_malloc_or_die(sizeof(rxval_evaluator_t)); pxevaluator->pvstate = pstate; @@ -468,14 +512,20 @@ static void rxval_evaluator_x_sss_free(rxval_evaluator_t* pxevaluator) { free(pxevaluator); } -rxval_evaluator_t* rxval_evaluator_alloc_from_x_sss_func(xv_ternary_func_t* pfunc, - rxval_evaluator_t* parg1, rxval_evaluator_t* parg2, rxval_evaluator_t* parg3) +rxval_evaluator_t* rxval_evaluator_alloc_from_x_sss_func( + xv_ternary_func_t* pfunc, + mlr_dsl_ast_node_t* parg1_node, + mlr_dsl_ast_node_t* parg2_node, + mlr_dsl_ast_node_t* parg3_node, + fmgr_t* pfmgr, + int type_inferencing, + int context_flags) { rxval_evaluator_x_sss_state_t* pstate = mlr_malloc_or_die(sizeof(rxval_evaluator_x_sss_state_t)); pstate->pfunc = pfunc; - pstate->parg1 = parg1; - pstate->parg2 = parg2; - pstate->parg3 = parg3; + pstate->parg1 = rxval_evaluator_alloc_from_ast(parg1_node, pfmgr, type_inferencing, context_flags); + pstate->parg2 = rxval_evaluator_alloc_from_ast(parg2_node, pfmgr, type_inferencing, context_flags); + pstate->parg3 = rxval_evaluator_alloc_from_ast(parg3_node, pfmgr, type_inferencing, context_flags); rxval_evaluator_t* pxevaluator = mlr_malloc_or_die(sizeof(rxval_evaluator_t)); pxevaluator->pvstate = pstate; @@ -516,10 +566,18 @@ static void rxval_evaluator_A_x_free(rxval_evaluator_t* pevaluator) { free(pevaluator); } -rxval_evaluator_t* rxval_evaluator_alloc_from_A_x_func(xv_unary_func_t* pfunc, rxval_evaluator_t* parg1, char* desc) { +rxval_evaluator_t* rxval_evaluator_alloc_from_A_x_func( + xv_unary_func_t* pfunc, + mlr_dsl_ast_node_t* parg1_node, + fmgr_t* pfmgr, + int type_inferencing, + int context_flags, + char* desc) +{ + rxval_evaluator_A_x_state_t* pstate = mlr_malloc_or_die(sizeof(rxval_evaluator_A_x_state_t)); pstate->pfunc = pfunc; - pstate->parg1 = parg1; + pstate->parg1 = rxval_evaluator_alloc_from_ast(parg1_node, pfmgr, type_inferencing, context_flags); pstate->desc = mlr_strdup_or_die(desc); rxval_evaluator_t* pevaluator = mlr_malloc_or_die(sizeof(rxval_evaluator_t));