[EMAIL PROTECTED] wrote on 16/12/2005 14:23:56: > 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 Sorry, I meant "you could always check" here. > 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, > Ben > > > Cheers, > > > > Carl Friedrich > > > > > > > > _______________________________________________ > [email protected] > http://codespeak.net/mailman/listinfo/pypy-dev > > _______________________________________________ [email protected] http://codespeak.net/mailman/listinfo/pypy-dev
