Carl Friedrich Bolz <[EMAIL PROTECTED]> 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 > > > _______________________________________________ [email protected] http://codespeak.net/mailman/listinfo/pypy-dev
