The Trunk: Kernel-ul.522.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-ul.522.mcz

commits-2
Levente Uzonyi uploaded a new version of Kernel to project The Trunk:
http://source.squeak.org/trunk/Kernel-ul.522.mcz

==================== Summary ====================

Name: Kernel-ul.522
Author: ul
Time: 8 December 2010, 4:08:19.384 am
UUID: 6927b03c-21df-1746-9a0d-115b717a5e40
Ancestors: Kernel-ul.521

- implemented Fraction >> #negative and ScaledDecimal >> #negative for better performance. These methods don't allocate new objects.
- reimplemented SmallInteger printing methods (printOn:base:*) without String allocation. They are as fast as the previous versions were for base 10.
- reimplemented ScaledDecimal printing. It avoids object allocations and has better performance than the previous version. ScaledDecimals can also be printed without the scale part by using #printFractionAsDecimalOn:.

=============== Diff against Kernel-ul.521 ===============

Item was added:
+ ----- Method: Fraction>>negative (in category 'testing') -----
+ negative
+
+ ^numerator negative!

Item was added:
+ ----- Method: ScaledDecimal>>negative (in category 'testing') -----
+ negative
+
+ ^fraction negative!

Item was added:
+ ----- Method: ScaledDecimal>>printFractionAsDecimalOn: (in category 'printing') -----
+ printFractionAsDecimalOn: stream
+
+ | aFraction integerPart fractionPart |
+ fraction negative
+ ifFalse: [ aFraction := fraction ]
+ ifTrue: [
+ aFraction := fraction negated.
+ stream nextPut: $- ].
+ integerPart := aFraction truncated.
+ integerPart printOn: stream.
+ scale = 0 ifTrue: [ ^self ].
+ stream nextPut: $..
+ fractionPart := ((aFraction - integerPart) * (10 raisedToInteger: scale)) truncated.
+ fractionPart
+ printOn: stream
+ base: 10
+ length: scale
+ padded: true!

Item was changed:
  ----- Method: ScaledDecimal>>printOn: (in category 'printing') -----
+ printOn: stream
+
+ self
+ printFractionAsDecimalOn: stream;
+ printScaleOn: stream!
- printOn: aStream
- "Reimplementation - Object 'printing' method."
- | aFraction tmpFractionPart |
- self < 0 ifTrue: [aStream nextPut: $-].
- aFraction := fraction abs.
- aStream nextPutAll: aFraction truncated printString.
- scale = 0 ifTrue: [^ aStream nextPutAll: 's0'].
- aStream nextPut: $..
- tmpFractionPart := aFraction fractionPart.
- 1 to: scale
- do:
- [:dummy |
- tmpFractionPart := tmpFractionPart * 10.
- aStream nextPut: (Character digitValue: tmpFractionPart truncated).
- tmpFractionPart := tmpFractionPart fractionPart].
- aStream nextPut: $s.
- scale printOn: aStream!

Item was added:
+ ----- Method: ScaledDecimal>>printScaleOn: (in category 'printing') -----
+ printScaleOn: stream
+
+ stream nextPut: $s.
+ scale printOn: stream!

Item was changed:
  ----- Method: SmallInteger>>printOn:base: (in category 'printing') -----
+ printOn: stream base: base
- printOn: aStream base: b
  "Append a representation of this number in base b on aStream."
 
+ self printOn: stream base: base length: 0 padded: false!
- self < 0
- ifTrue: [aStream nextPut: $-.
- aStream nextPutAll: (self negated printStringBase: b).
- ^self].
-
- "allocating a String seems faster than streaming for SmallInteger"
- aStream nextPutAll: (self printStringBase: b)!

Item was added:
+ ----- Method: SmallInteger>>printOn:base:length:padded: (in category 'printing') -----
+ printOn: stream base: base length: minimumLength padded: padWithZeroes
+
+ | n numberOfDigits totalLength divisor |
+ self < 0
+ ifTrue: [
+ n := self negated.
+ totalLength := 1 ]
+ ifFalse: [
+ n := self.
+ totalLength := 0 ].
+ numberOfDigits := n numberOfDigitsInBase: base.
+ totalLength := totalLength + numberOfDigits.
+ padWithZeroes ifFalse: [
+ [ totalLength < minimumLength ] whileTrue: [
+ stream space.
+ totalLength := totalLength + 1 ] ].
+ n = self ifFalse: [ stream nextPut: $- ].
+ padWithZeroes ifTrue: [
+ [ totalLength < minimumLength ] whileTrue: [
+ stream nextPut: $0.
+ totalLength := totalLength + 1 ] ].
+ divisor := (base raisedToInteger: numberOfDigits - 1).
+ [ divisor > 0 ] whileTrue: [
+ | digit |
+ digit := n // divisor.
+ stream nextPut: ('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' at: digit + 1).
+ n := n - (digit * divisor).
+ divisor := divisor // base ]!

Item was changed:
  ----- Method: SmallInteger>>printOn:base:nDigits: (in category 'printing') -----
  printOn: aStream base: b nDigits: n
  "Append a representation of this number in base b on aStream using nDigits.
  self must be positive."
 
+ self printOn: aStream base: b length: n padded: true!
- "allocating a String seems faster than streaming for SmallInteger"
- aStream nextPutAll: (self printStringBase: b nDigits: n)!