Calling functions whose signature/arguments are only known at runtime
Allison Randal
allison at parrot.org
Wed Mar 17 15:26:09 UTC 2010
Jonathan Leto wrote:
> Howdy,
>
> On Tue, Mar 16, 2010 at 12:19 PM, Andrew Whitworth
> <wknight8111 at gmail.com> wrote:
>> My initial thought, and this isn't implemented quite yet (though we
>> could put the fire back to my feet to complete it) is to create a
>> CallContext PMC with all the arguments you want and pass that in.
>
> This sounds interesting, what do we get if we go this route? Does it
> make certain things easier/faster/more portable?
The main advantage is that it's a dynamic container to hold arguments
that a) already has to be created for the call, so it's not an extra PMC
to create, and b) does typed storage, so you don't have to create a PMC
to hold each int, num, or str, they're stored directly.
>> Putting arguments into a ResizablePMCArray or Hash and using :flat
>> (Signature "Pf") would similarly resolve the problem.
>
> Good idea! I think that we could make stuff work at the PIR level
> going that route, but I don't think HLL's would work using that
> method. But it gives us a path forward, which is very good. I still
> think that Parrot_ext_call_cb is going to be the way to get HLL
> argument passing working correctly, perhaps wrapped in some kind of
> container PMC.
A flattened aggregate PMC is the way to go at the moment, until we get
:sig_object fully added and fully tested (it's still marked as
"experimental"). If we do callback arguments (and I'm still not entirely
convinced it's a good idea), I'd rather see it integrated with
Parrot_ext_call() than added as a separate function. As in, you have a
signature sub-type 'b' ('c' is already taken for constants), and specify
"IbSbNbPb" and pass in 4 function pointers for how to load the 4
different types.
This gives more flexibility to pass in some direct arguments first in
the signature, and then use the callbacks for any remaining arguments
required (say, "PiPb" for passing in a method object direct and the rest
of the PMC arguments using callbacks). It would also allow you to only
specify callbacks for specific types (PMCs and strings, for example).
It's also a cleaner interface for maintenance, because it doesn't expose
the structs of function pointers we currently use internally for arg
fetching/setting (but may not always use).
Allison
More information about the parrot-dev
mailing list