[pypy-dev] call_function
Ben.Young at risk.sungard.com
Ben.Young at risk.sungard.com
Fri Dec 16 15:23:56 CET 2005
Carl Friedrich Bolz <cfbolz at gmx.de> wrote on 16/12/2005 14:08:38:
> Hi Ben!
>
> > I was having a quick look at how function calling is implemented in
PyPy
> > and I can't seem to understand why the CALL_FUNCTION opcode and the
space
> > call_function method seem to do duplicate things.
> >
> > Whay doesn't CALL_FUNCTION just pop oparg items off the stack and call
the
> > space call_function? It doesn't seem like the functionality would be
any
> > different as the varargs cases are handled differently anyway?
>
> Well, the way we handle function arguments is definitively a bit
> convoluted. But for this case what you plan would not suffice: the oparg
> argument to the CALL_FUNCTION bytecode is not just the number of
> arguments of that function. Quoting from the CPython docs
> (http://python.org/doc/2.4.2/lib/bytecodes.html):
>
> CALL_FUNCTION argc
> Calls a function. The low byte of argc indicates the number of
> positional parameters, the high byte the number of keyword parameters.
> On the stack, the opcode finds the keyword parameters first. For each
> keyword argument, the value is on top of the key. Below the keyword
> parameters, the positional parameters are on the stack, with the
> right-most parameter on top. Below the parameters, the function object
> to call is on the stack.
>
> That is why the fast paths in our CALL_FUNCTION implementation work: the
> test oparg == 1 tests that the function has exactly one positional and
> no keyword argument.
>
Well, you always check the high byte is zero and then call down. It just
seems like then fact that there are 4 fastcall "hacks" doesn't need to be
known at this level (as it is already known at the level below (i.e in the
space))
Thanks for the reply.
Cheers,
Ben
> Cheers,
>
> Carl Friedrich
>
>
>
More information about the Pypy-dev
mailing list