[squeak-dev] The Trunk: Kernel-ul.1008.mcz
commits at source.squeak.org
commits at source.squeak.org
Wed Mar 30 20:39:54 UTC 2016
Levente Uzonyi uploaded a new version of Kernel to project The Trunk:
http://source.squeak.org/trunk/Kernel-ul.1008.mcz
==================== Summary ====================
Name: Kernel-ul.1008
Author: ul
Time: 30 March 2016, 2:54:12.155092 am
UUID: dee08222-ad83-4daf-a90d-a7a4e7b5009f
Ancestors: Kernel-ul.1007
- minor performance improvements for NumberParser and Fraction.
- give some advantage to the same class integer-integer comparison, which is probably the most common case, in Integer >> #=, at the cost of adding a minor overhead to the integer-non-integer comparisons.
- removed Integer >> #hash because it's not used and the implementation become incorrect over time.
=============== Diff against Kernel-ul.1007 ===============
Item was changed:
----- Method: Fraction>>setNumerator:denominator: (in category 'private') -----
setNumerator: n denominator: d
+ d isZero ifTrue: [ ^(ZeroDivide dividend: n) signal ].
+ numerator := n asInteger.
+ (denominator := d asInteger) negative ifTrue: [ "keep sign in numerator"
+ numerator := numerator negated.
+ denominator := denominator negated ]!
- d = 0
- ifTrue: [^(ZeroDivide dividend: n) signal]
- ifFalse:
- [numerator := n asInteger.
- denominator := d asInteger abs. "keep sign in numerator"
- d < 0 ifTrue: [numerator := numerator negated]]!
Item was changed:
----- Method: Integer>>= (in category 'comparing') -----
= aNumber
+ aNumber class == self class ifTrue: [ ^(self digitCompare: aNumber) = 0 ].
+ aNumber isInteger ifTrue: [ ^false ].
- aNumber isInteger ifTrue: [
- aNumber class == self class ifFalse: [ ^false ].
- ^(self digitCompare: aNumber) = 0 ].
aNumber isNumber ifFalse: [ ^false ].
^aNumber adaptToInteger: self andCompare: #=!
Item was removed:
- ----- Method: Integer>>hash (in category 'comparing') -----
- hash
- "Hash is reimplemented because = is implemented."
-
- ^(self lastDigit bitShift: 8) + (self digitAt: 1)!
Item was added:
+ ----- Method: NumberParser>>isExponentLetter: (in category 'testing') -----
+ isExponentLetter: aCharacter
+
+ ^self exponentLetters includes: aCharacter!
Item was changed:
----- Method: NumberParser>>makeFloatFromMantissa:exponent:base: (in category 'parsing-private') -----
makeFloatFromMantissa: m exponent: k base: aRadix
"Convert infinite precision arithmetic into Floating point.
This alogrithm rely on correct IEEE rounding mode
being implemented in Integer>>asFloat and Fraction>>asFloat"
+ k = 0 ifTrue: [ ^m asFloat ].
+ k > 0 ifTrue: [ ^(m * (aRadix raisedToInteger: k)) asFloat ].
+ ^(Fraction numerator: m denominator: (aRadix raisedToInteger: k negated)) asFloat!
- ^(k positive
- ifTrue: [m * (aRadix raisedToInteger: k)]
- ifFalse: [Fraction numerator: m denominator: (aRadix raisedToInteger: k negated)]) asFloat!
Item was changed:
----- Method: NumberParser>>nextElementaryLargeIntegerBase: (in category 'parsing-large int') -----
nextElementaryLargeIntegerBase: aRadix
"Form an unsigned integer with incoming digits from sourceStream.
Return this integer, or zero if no digits found.
Stop reading if end of digits or if a LargeInteger is formed.
Count the number of digits and the position of lastNonZero digit and store them in instVar."
| value digit char |
value := 0.
nDigits := 0.
lastNonZero := 0.
+ [
+ value isLarge ifTrue: [ ^value ].
+ char := sourceStream next ifNil: [ ^value ].
+ ((digit := char digitValue) < 0 or: [digit >= aRadix]) ifTrue: [
+ sourceStream skip: -1.
+ ^value ].
+ nDigits := nDigits + 1.
+ digit = 0
+ ifFalse: [
+ lastNonZero := nDigits.
+ value := value * aRadix + digit ]
+ ifTrue: [ value := value * aRadix ] ] repeat!
- [value isLarge or: [(char := sourceStream next) == nil
- or: [digit := char digitValue.
- (0 > digit or: [digit >= aRadix])
- and: [sourceStream skip: -1.
- true]]]]
- whileFalse: [
- nDigits := nDigits + 1.
- 0 = digit
- ifFalse: [lastNonZero := nDigits].
- value := value * aRadix + digit].
- ^value!
Item was changed:
----- Method: NumberParser>>readExponent (in category 'parsing-private') -----
readExponent
"read the exponent if any (stored in instVar).
Answer true if found, answer false if none.
If exponent letter is not followed by a digit,
this is not considered as an error.
Exponent are always read in base 10."
| eneg epos |
exponent := 0.
+ (self isExponentLetter: sourceStream peek) ifFalse: [^ false].
- sourceStream atEnd ifTrue: [^ false].
- (self exponentLetters includes: sourceStream peek)
- ifFalse: [^ false].
sourceStream next.
eneg := sourceStream peekFor: $-.
epos := eneg not and: [self allowPlusSignInExponent and: [sourceStream peekFor: $+]].
exponent := self nextUnsignedIntegerOrNilBase: 10.
exponent ifNil: ["Oops, there was no digit after the exponent letter.Ungobble the letter"
exponent := 0.
sourceStream
skip: ((eneg or: [epos])
ifTrue: [-2]
ifFalse: [-1]).
^ false].
eneg ifTrue: [exponent := exponent negated].
^true!
More information about the Squeak-dev
mailing list
|