Well I actually wrote the fix as primitiveExecuteMethod "receiver, args, then method are on top of stack. Execute method against receiver and args" newMethod := self popStack. primitiveIndex := self primitiveIndexOf: newMethod. self success: argumentCount - 1 = (self argumentCountOf: newMethod). successFlag ifTrue: [argumentCount := argumentCount - 1. self executeNewMethod. "Recursive xeq affects successFlag" successFlag := true] ifFalse: [self unPop: 1]
to agree with the perform code. The fix is to ensure that successFlag is true.
On Sun, Oct 26, 2008 at 10:45 PM, John M McIntosh < johnmci@smalltalkconsulting.com> wrote:
Er, my only comment on this is that although in C it's defined as
sqInt success(sqInt);
but it's written as success: successValue successFlag := successValue & successFlag.
which resolves as sqInt success(sqInt successValue) { register struct foo * foo = &fum; foo->successFlag = successValue && foo->successFlag; } or sqInt success(sqInt successValue) { foo->successFlag = successValue && foo->successFlag; } or sqInt success(sqInt successValue) { successFlag = successValue && successFlag; }
so what does [ ... ^ self success: true] actually return?
On Oct 26, 2008, at 7:13 PM, Eliot Miranda wrote:
Perhaps #primitiveExecuteMethod should end with an explicit [ ... ^ self
success: true] in its true-branch (this is just a thought, I have as yet not
--
John M. McIntosh johnmci@smalltalkconsulting.com Corporate Smalltalk Consulting Ltd. http://www.smalltalkconsulting.com ===========================================================================