The Trunk: Kernel-nice.1107.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

The Trunk: Kernel-nice.1107.mcz

commits-2
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!