[squeak-dev] The Trunk: Kernel-nice.256.mcz

commits at source.squeak.org commits at source.squeak.org
Sun Oct 4 19:51:26 UTC 2009


Nicolas Cellier uploaded a new version of Kernel to project The Trunk:
http://source.squeak.org/trunk/Kernel-nice.256.mcz

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

Name: Kernel-nice.256
Author: nice
Time: 4 October 2009, 9:50:10 am
UUID: a9171183-4c69-4fea-9279-058519685204
Ancestors: Kernel-nice.255

Fix for http://bugs.squeak.org/view.php?id=6781
self should: [0.0 raisedTo: -1.0] raise: ZeroDivide.

I used the license clean fix from Pharo here and also introduce license clean #raisedToInteger: #/ #reciprocal #one by GabrielOmarCotelli

This code is MIT as Gabriel signed the pharo agreement.

=============== Diff against Kernel-nice.255 ===============

Item was changed:
+ ----- Method: Fraction>>reciprocal (in category 'private') -----
- ----- Method: Fraction>>reciprocal (in category 'arithmetic') -----
  reciprocal
+ 	
+ 	numerator abs = 1 ifTrue: [^denominator * numerator].
+ 	^self class numerator: denominator denominator: numerator!
- 	"Refer to the comment in Number|reciprocal."
- 	#Numeric.
- 	"Changed 200/01/19 For ANSI <number> support."
- 	numerator = 0 ifTrue: [^ (ZeroDivide dividend: self) signal"<- Chg"].
- 	numerator = 1 ifTrue: [^ denominator].
- 	numerator = -1 ifTrue: [^ denominator negated].
- 	^ Fraction numerator: denominator denominator: numerator!

Item was added:
+ ----- Method: Number class>>one (in category 'constants') -----
+ one
+ 
+ 	^1!

Item was changed:
  ----- Method: Number>>reciprocal (in category 'arithmetic') -----
  reciprocal
+ 	"Returns the reciprocal of self.
+ 	In case self is 0 the / signals ZeroDivide"
+ 	
+ 	^1 / self!
- 	"Answer 1 divided by the receiver. Create an error notification if the 
- 	receiver is 0."
- 	#Numeric.
- 	"Changed 200/01/19 For ANSI <number> support."
- 	self = 0 ifTrue: [^ (ZeroDivide dividend: self) signal"<- Chg"].
- 	^ 1 / self!

Item was changed:
  ----- Method: Float class>>one (in category 'constants') -----
  one
+ 	
+ 	^1.0!
- 	#Numeric.
- 	"add 200/01/19 For <number> protocol support."
- 	^ 1.0!

Item was changed:
  ----- Method: Float>>reciprocal (in category 'arithmetic') -----
  reciprocal
+ 
+ 	"Returns the reciprocal.
+ 	If self is 0.0 the / signals a ZeroDivide"
+ 	
+ 	^1.0 / self!
- 	#Numeric.
- 	"Changed 200/01/19 For ANSI <number> support."
- 	self = 0 ifTrue: ["<- Chg"
- 		^ (ZeroDivide dividend: self) signal"<- Chg"].
- 	"<- Chg"
- 	^ 1.0 / self!

Item was changed:
  ----- Method: Float>>/ (in category 'arithmetic') -----
  / aNumber 
  	"Primitive. Answer the result of dividing receiver by aNumber.
  	Fail if the argument is not a Float. Essential. See Object documentation
  	whatIsAPrimitive."
  
  	<primitive: 50>
+ 	aNumber = 0.0 ifTrue: [ ZeroDivide signalWithDividend: self].
+ 	^aNumber adaptToFloat: self andSend: #/!
- 	aNumber isZero ifTrue: [^(ZeroDivide dividend: self) signal].
- 	^ aNumber adaptToFloat: self andSend: #/!

Item was changed:
  ----- Method: Number>>raisedToInteger: (in category 'mathematical functions') -----
+ raisedToInteger: anInteger
+ 
+ 	"The 0 raisedToInteger: 0 is an special case. In some contexts must be 1 and in others must
+ 	be handled as an indeterminate form.
+ 	I take the first context because that's the way that was previously handled.
+ 	Maybe further discussion is required on this topic."
+ 	
+ 	|bitProbe result|
+ 
+ 	anInteger negative ifTrue: [^(self raisedToInteger: anInteger negated) reciprocal].
+ 	bitProbe := 1 bitShift: anInteger highBit - 1.
+  	result := self class one.
+   	[
+ 		(anInteger bitAnd: bitProbe) = 0 ifFalse: [result := result * self].
+        bitProbe := bitProbe bitShift: -1.
+ 		bitProbe > 0 ]
+ 	whileTrue: [result := result * result].
+ 	
+ 	^result!
- raisedToInteger: operand 
- 	"Answer the receiver raised to the power operand, an Integer."
- 	| count result |
- 	#Numeric.
- 	"Changed 200/01/19 For ANSI <number> support."
- 	operand isInteger ifFalse: [^ ArithmeticError signal: 'parameter is not an Integer'"<- Chg"].
- 	operand = 0 ifTrue: [^ self class one].
- 	operand = 1 ifTrue: [^ self].
- 	operand < 0 ifTrue: [^ (self raisedToInteger: operand negated) reciprocal].
- 	count := 1.
- 	[(count := count + count) < operand] whileTrue.
- 	result := self class one.
- 	[count > 0]
- 		whileTrue: 
- 			[result := result * result.
- 			(operand bitAnd: count)
- 				= 0 ifFalse: [result := result * self].
- 			count := count bitShift: -1].
- 	^ result!

Item was changed:
  ----- Method: SmallInteger>>/ (in category 'arithmetic') -----
  / aNumber 
  	"Primitive. This primitive (for /) divides the receiver by the argument
  	and returns the result if the division is exact. Fail if the result is not a
  	whole integer. Fail if the argument is 0 or is not a SmallInteger. Optional.
  	No Lookup. See Object documentation whatIsAPrimitive."
  
  	<primitive: 10>
  	aNumber isZero ifTrue: [^(ZeroDivide dividend: self) signal].
+ 	^(aNumber isMemberOf: SmallInteger)
+ 		ifTrue: [(Fraction numerator: self denominator: aNumber) reduced]
+ 		ifFalse: [super / aNumber]!
- 	(aNumber isMemberOf: SmallInteger)
- 		ifTrue: [^(Fraction numerator: self denominator: aNumber) reduced]
- 		ifFalse: [^super / aNumber]!

Item was changed:
  ----- Method: Number>>integerPart (in category 'truncation and round off') -----
  integerPart
+ 	"Added for ANSI compatibility"
+ 	^self truncated!
- 	"Answer the integer part of the receiver."
- 	#Numeric.
- 	"2000/03/04  Harmon R. Added ANSI <number> protocol"
- 	^ self truncated!

Item was changed:
  ----- Method: Number>>fractionPart (in category 'truncation and round off') -----
  fractionPart
+ 	
+ 	"Added for ANSI compatibility"
+ 	
+ 	^self - self integerPart!
- 	"Answer the fractional part of the receiver."
- 	#Numeric.
- 	"2000/03/04  Harmon R. Added ANSI <number> protocol"
- 	^ self - self truncated!

Item was changed:
  ----- Method: Number>>raisedTo: (in category 'mathematical functions') -----
  raisedTo: aNumber 
  	"Answer the receiver raised to aNumber."
  
  	aNumber isInteger ifTrue:
  		["Do the special case of integer power"
  		^ self raisedToInteger: aNumber].
  	self < 0 ifTrue:
  		[ self error: self printString, ' raised to a non-integer power' ].
+ 	0 = aNumber ifTrue: [^ self class one].	"Special case of exponent=0"
+ 	1 = aNumber ifTrue: [^ self].	"Special case of exponent=1"
+ 	0 = self ifTrue: [				"Special case of self = 0"
+ 		aNumber < 0
+ 			ifTrue: [^ (ZeroDivide dividend: self) signal]
+ 			ifFalse: [^ self]].
- 	aNumber = 0 ifTrue: [^ 1].		"Special case of exponent=0"
- 	(self = 0) | (aNumber = 1) ifTrue:
- 		[^ self].						"Special case of exponent=1"
  	^ (aNumber * self ln) exp		"Otherwise use logarithms"!

Item was removed:
- ----- Method: Float>>raisedTo: (in category 'mathematical functions') -----
- raisedTo: aNumber
- 	"Answer the receiver raised to aNumber."
- 
- 	aNumber isInteger ifTrue:
- 		["Do the special case of integer power"
- 		^ self raisedToInteger: aNumber].
- 	self < 0.0 ifTrue:
- 		[ ArithmeticError signal: ' raised to a non-integer power' ].
- 	0.0 = aNumber ifTrue: [^ 1.0].				"special case for exponent = 0.0"
- 	(self= 0.0) | (aNumber = 1.0) ifTrue: [^ self].	"special case for self = 1.0"
- 	^ (self ln * aNumber asFloat) exp			"otherwise use logarithms"
- !

Item was removed:
- ----- Method: Integer class>>one (in category 'constants') -----
- one
- 	#Numeric.
- 	"add 200/01/19 For <number> protocol support."
- 	^ 1!

Item was removed:
- ----- Method: Fraction class>>one (in category 'constants') -----
- one
- 	#Numeric.
- 	"add 200/01/19 For <number> protocol support."
- 	^ self numerator: 1 denominator: 1!




More information about the Squeak-dev mailing list