On Mon, 14 Mar 2005, William Coleda wrote:
> How does one call a PIR-defined sub from C?
use the Parrot_call_sub_* API.
> My current best guess is, to invoke the PIR sub "Tcl::Joe":
>
> PMC *invokeme;
> STRING *Tcl,*joe;
> Tcl = string_from_const_cstring(INTERP, "Tcl", 3);
> joe = string_from_const_cstring(INTERP, "joe", 3);
> invokeme = Parrot_find_global(INTERP, Tcl, joe);
> VTABLE_invoke(INTERP,invokeme,????);
>
> But I don't know what to put as the argument for "next" to VTABLE_invoke - I
> see some items in dynclasses/*.pmc use the string "next", the code seems to
> allow for NULL - neither of them seem to actually invoke my method. (a .sub
> with a single "print" statement)
>
> Do I need to be setting up the calling conventions in my calling code? Is
> there some other step I'm missing? Is this already documented somewhere?
here's how i do it in mod_parrot, using the Parrot_* datatypes and the
Parrot_call_sub_* API. some of the logic has been factored out into
different functions for code reuse, but you get the idea:
Parrot_PMC get_sub_pmc(Parrot_Interp interp, char *namespace, char *name)
{
Parrot_PMC sub;
sub = Parrot_find_global(
interp,
namespace ? MAKE_PARROT_STRING(namespace) : NULL,
MAKE_PARROT_STRING(name)
);
return(sub);
}
int modparrot_call_sub(Parrot_Interp interp, char *namespace, char *name,
int *ret)
{
Parrot_PMC sub;
sub = get_sub_pmc(interp, namespace, name);
if (!sub) {
return(0);
}
*ret = Parrot_call_sub_ret_int(interp, sub, "Iv");
return(1);
}
-jeff