Hi Stefan,
On Wed, Dec 7, 2011 at 4:09 PM, Stefan Marr squeak@stefan-marr.de wrote:
Hi:
From the current implementation, which I find in the interpreter, and from testing on Cog I assume that primitive 83, that is 'perform:', does easily handle an arbitrary number of parameters.
Is that correct, or does for instance Cog do something else? (it does not seem so)
That's correct. The primitive (InterpreterPrimitives>>primitivePerform) is written in terms of argumentCount and so should cope with any number of arguments up to the maximum (15 is the limit in CompiledMethod, 31 in the bytecode set I believe).
I am just asking, because the number of parameters of the
Object>>#perform:with: variants goes only up to three. And, the comment does not mention it. (at least in a recent Pharo image)
Furthermore, I guess, there is an upper limit on the number of arguments with regard to frame size?
Not in the StackVM or the Cog VM since these are running on a stack, not in a context, and so there's always plenty of headroom to push args on the stack during a perform. At least the method/bytecode set's limit on argumentCount is going to bite before the stack size. Similarly with perform:withArguments:, as long as the number of arguments is <= LargeFrameSize (56 slots?) the primitive will push arguments. Of course, the number of arguments must match the method that is found, and so the real limits are CompiledMethod's and the bytecode set's.
cheers,
Thanks Stefan
-- Stefan Marr Software Languages Lab Vrije Universiteit Brussel Pleinlaan 2 / B-1050 Brussels / Belgium http://soft.vub.ac.be/~smarr Phone: +32 2 629 2974 Fax: +32 2 629 3525