Hi.

In Pharo we have special logic to debug failure code of primitives. When debugger detects named prim it tries to create same prim method but without failure code. Then if it fails debugger step into primitive failure code.

To create such cleaned primitive method Pharo uses template method like this:

tryNamedPrimitiveTemplate
"This method is a template that the Smalltalk simulator uses to 
execute primitives. See Object documentation whatIsAPrimitive."
<primitive:' module:' error: errorCode>
^ Context primitiveFailTokenFor: errorCode

Then it changes arguments count to be like given method:

theMethod := self class tryNamedPrimitiveTemplateMethod.
theMethod prepareForSimulationWith: arguments size.
self setNamedPrimitiveInformationFrom: aCompiledMethod toMethod: theMethod.

CompiledMethod>>prepareForSimulationWith: numArgs
"This method changes the argument count of a CompiledMethod header to numArgs, its temporary count to numArgs + 1 and change the code handling primitive error to store the error code in the unique temporary of the method"
| newHeader xpc |
newHeader := (((self header bitAnd: 2r01110000000000111111111111111111)
bitOr: (numArgs bitShift: 24))
bitOr: (numArgs + 1 bitShift: 18)).
newHeader := newHeader + (self class headerFlagForEncoder: self encoderClass).
self objectAt: 1 put: newHeader.
xpc := self initialPC.
"long store temp"
(self at: xpc) = 129
ifTrue: [
self at: xpc + 1 put: (16r40 + numArgs).
self at: xpc + 3 put: (16r10 + numArgs)]


Then method executed by:

theMethod flushCache
theMethod valueWithReceiver: aReceiver arguments: arguments

This approach works correctly on Cog and not working in Spur.
In Spur result of theMethod execution become wrong when given method has arguments.
Which means that changing method arguments of CompiledMethod is incorrect for Spur.

Is there any solution to make it working?