PARROT_EXPORT void Parrot_pcc_invoke_sub_from_c_args(PARROT_INTERP, ARGIN(PMC *sub_obj), ARGIN(const char *sig), ...) { ASSERT_ARGS(Parrot_pcc_invoke_sub_from_c_args) PMC *call_obj; va_list args; const char *arg_sig, *ret_sig; PMC * const old_call_obj = Parrot_pcc_get_signature(interp, CURRENT_CONTEXT(interp)); Parrot_pcc_split_signature_string(sig, &arg_sig, &ret_sig); va_start(args, sig); call_obj = Parrot_pcc_build_call_from_varargs(interp, PMCNULL, arg_sig, &args); Parrot_pcc_set_signature(interp, CURRENT_CONTEXT(interp), call_obj); Parrot_pcc_invoke_from_sig_object(interp, sub_obj, call_obj); call_obj = Parrot_pcc_get_signature(interp, CURRENT_CONTEXT(interp)); Parrot_pcc_fill_params_from_varargs(interp, call_obj, ret_sig, &args, PARROT_ERRORS_RESULT_COUNT_FLAG); va_end(args); Parrot_pcc_set_signature(interp, CURRENT_CONTEXT(interp), old_call_obj); }
PARROT_EXPORT void Parrot_pcc_invoke_method_from_c_args(PARROT_INTERP, ARGIN(PMC* pmc), ARGMOD(STRING *method_name), ARGIN(const char *signature), ...) { ASSERT_ARGS(Parrot_pcc_invoke_method_from_c_args) PMC *call_obj; PMC *sub_obj; va_list args; const char *arg_sig, *ret_sig; PMC *arg_flags; PMC * const old_call_obj = Parrot_pcc_get_signature(interp, CURRENT_CONTEXT(interp)); Parrot_pcc_split_signature_string(signature, &arg_sig, &ret_sig); va_start(args, signature); call_obj = Parrot_pcc_build_call_from_varargs(interp, PMCNULL, arg_sig, &args); /* inlined version of pcc_add_invocant */ arg_flags = PARROT_CALLCONTEXT(call_obj)->arg_flags; VTABLE_unshift_integer(interp, arg_flags, PARROT_ARG_PMC | PARROT_ARG_INVOCANT); Parrot_CallContext_unshift_pmc(interp, call_obj, pmc); Parrot_pcc_set_signature(interp, CURRENT_CONTEXT(interp), call_obj); /* Find the subroutine object as a named method on pmc */ sub_obj = VTABLE_find_method(interp, pmc, method_name); if (UNLIKELY(PMC_IS_NULL(sub_obj))) Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_METHOD_NOT_FOUND, "Method '%Ss' not found", method_name); /* Invoke the subroutine object with the given CallContext object */ Parrot_pcc_invoke_from_sig_object(interp, sub_obj, call_obj); call_obj = Parrot_pcc_get_signature(interp, CURRENT_CONTEXT(interp)); Parrot_pcc_fill_params_from_varargs(interp, call_obj, ret_sig, &args, PARROT_ERRORS_RESULT_COUNT_FLAG); va_end(args); Parrot_pcc_set_signature(interp, CURRENT_CONTEXT(interp), old_call_obj); }