Nicolas Cellier uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-nice.1107.mcz
==================== Summary ====================
Name: Kernel-nice.1107 Author: nice Time: 2 June 2017, 12:13:19.450751 am UUID: 597f9f85-fe7b-430a-8ba2-1dd548dc246f Ancestors: Kernel-eem.1106
Correct digitLength for negative SmallInteger
The length was overestimated for some numbers, for example self assert: -16rFF01 digitLength = 2.
With old code it would answer 3. Indeed, the binary representation is 16r...FFFFFF00FF After shifting once, we got 16r....FFFFFF00, that is -256 and we shifted yet another time.
digitLength works on magnitude (like LargeInteger) so we have to take absolute value, but care of SmallInteger minVal abs which is a LargePositiveInteger with same trick as digitAt:
=============== Diff against Kernel-eem.1106 ===============
Item was changed: ----- Method: SmallInteger>>digitLength (in category 'system primitives') ----- digitLength "Answer the number of indexable fields in the receiver. This value is the same as the largest legal subscript. Included so that a SmallInteger can behave like a LargePositiveInteger or LargeNegativeInteger."
| value length | length := 1. + (value := self) < -255 - value := self. - value >= 0 ifTrue: + [length := 2. + value := (-256 - self bitShift: -8) + 1 "carefully negate SmallInteger minVal"]. + [value > 255] whileTrue: + [value := value bitShift: -8. + length := length + 1]. - [[value > 255] whileTrue: - [value := value bitShift: -8. - length := length + 1]] - ifFalse: - [[value < -255] whileTrue: - [value := value bitShift: -8. - length := length + 1]]. ^length!
squeak-dev@lists.squeakfoundation.org