André Wendt wrote:
> I just stumble upon this: Object>>#at:put: calls <primitive:61>. If that
> fails, the following lines read
>
> index isInteger ifTrue:
> [self class isVariable
> ifTrue: [(index >= 1 and: [index <= self size])
> ifTrue: [self errorImproperStore]
>
> Why is it an improper store if the index is an integer, the receiver
> class is variable, and the index is within bounds? Someone please
> enlighten me...
Because it's the only failure mode that's left. It happens when you
create non-pointer subclasses, for example:
Object variableWordSubclass: #MyWordArray
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Sample-Objects'
and now:
wa := MyWordArray new: 10.
wa at: 1 put: 0. "works"
wa at: 2 put: nil. "fails"
wa at: 3 put: -1. "fails"
wa at: 4 put: 16r100000000. "fails"
wa at: 5 put: Smalltalk. "fails"
etc.
> (If this is merely reporting "there was an error in the primitive
> although everything's alright", then I feel the message should be
> something other than "Improper store into indexable object".)
Think about this for a second. What possible other failure mode could
there be in the at:put: primitive?
Cheers,
- Andreas