Hi Ben, On Fri, Dec 16, 2005 at 04:24:09PM +0000, [EMAIL PROTECTED] wrote: > def CALL_FUNCTION(f, oparg): > if oparg & 0xff == oparg: > w_function = f.valuestack.pop() > #pseudo code > w_args = f.valuestack.pop(oparg) > w_result = f.space.call_function(w_function, *w_args) > f.valuestack.push(w_result) > else: > # general case > f.call_function(oparg) > > Doesn't this do the same thing? f.space.call_function seems to be able to > handle any number of positional args.
Well, the real code you are quoting contains comment "XXX start of hack for performance" and "XXX end of hack for performance" around the first part. Indeed, none of this is necessary. It does give a good performance boost, though, because it avoids having to build a list from the arguments popped off the start. If you are confused by space.call_function() containing *again* a list of if/elif fast paths, remember that in the C version there are different versions of space.call_function() created, one for each number of argument (we do this for all *arg functions). In each version, each if/elif condition is known at compile-time, so only one of the branches is left. It's not actually testing again the number of arguments at run-time. A bientot, Armin. _______________________________________________ [email protected] http://codespeak.net/mailman/listinfo/pypy-dev
