2010/10/26 M.-A. Lemburg <span dir="ltr"><<a href="mailto:mal@egenix.com">mal@egenix.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div><div class="h5">
Cesare Di Mauro wrote:<br> > I can provide another patch that will not use EXTENDED_ARG (no VM changes),<br>
> and uses *args and/or **kwargs function calls when there are more than 255<br>
> arguments or keyword arguments.<br>
><br>
> But I need some days.<br>
><br>
> If needed, I'll post it at most on this week-end.<br>
<br>
</div></div>You mean a version that pushes the *args tuple and **kws dict<br>
on the stack and then uses those for calling the function/method ?<br>
<br>
I think that would be a lot more efficient than pushing/popping<br>
hundreds of parameters on/off the stack.<br>
<div><div class="h5"><br>
--<br> Marc-Andre Lemburg</div></div></blockquote><div><br></div><div>I was referring to the solution (which I prefer) that I proposed answering to Greg, two days ago.</div><div><br></div><div>Unfortunately, the stack must be used whatever the solution we will use.</div>
<div><br></div><div>Pushing the "final" tuple and/or dictionary is a possible optimization, but we can use it only when we have a tuple or dict of constants; otherwise we need to use the stack.</div><div><br></div>
<div>Good case:  f(1, 2, 3, a = 1, b = 2)</div><div>We can push (1, 2, 3) tuple and {'a' : 1, 'b' : 2}, then calling f with CALL_FUNCTION_VAR_KW opcode passing narg = nkarg = 0.</div><div><br></div><div>Worst case: f(1, x, 3, a = x, b = 2)</div>
<div>We can't push the tuple and dict as a whole, because they need first to be built using the stack.</div><div><br></div><div>The good case is possible, and I have already done some work in wpython collecting constants on parameters push (even partial constant sequences), but some additional work must be done recognizing costants-only tuple / dict.</div>
<div><br></div><div>However, the worst case rest unresolved.</div><div><br></div><div>Cesare</div>