--- a/Fraction.st Mon Mar 31 11:02:44 2003 +0200
+++ b/Fraction.st Mon Mar 31 11:12:58 2003 +0200
@@ -100,27 +100,43 @@
if (__CanDoQuickAlignedNew(sizeof(struct __Fraction))) { /* OBJECT ALLOCATION */
OBJ newFraction;
int spc;
+ INT iDen;
__qCheckedAlignedNew(newFraction, sizeof(struct __Fraction));
__InstPtr(newFraction)->o_class = self;
- if (__intVal(den) < 0) {
- __FractionInstPtr(newFraction)->f_numerator = __MKSMALLINT(- __intVal(num));
- __FractionInstPtr(newFraction)->f_denominator = __MKSMALLINT(- __intVal(den));
- } else {
- __FractionInstPtr(newFraction)->f_numerator = num;
- __FractionInstPtr(newFraction)->f_denominator = den;
- }
- if (num == __MKSMALLINT(1)) {
- RETURN ( newFraction );
+ iDen = __intVal(den);
+ if (iDen != 0) {
+ if (iDen < 0) {
+ __FractionInstPtr(newFraction)->f_numerator = __MKSMALLINT(- __intVal(num));
+ __FractionInstPtr(newFraction)->f_denominator = __MKSMALLINT(- iDen);
+ } else {
+ __FractionInstPtr(newFraction)->f_numerator = num;
+ __FractionInstPtr(newFraction)->f_denominator = den;
+ }
+ if (num == __MKSMALLINT(1)) {
+ /* no need to reduce */
+ RETURN ( newFraction );
+ }
}
}
}
}
%}.
+ den == 0 ifTrue:[
+ ^ ZeroDivide raiseRequestWith:thisContext.
+ ].
newFraction isNil ifTrue:[
- newFraction := self basicNew setNumerator:num denominator:den.
+ newFraction := self basicNew setNumerator:num denominator:den.
].
^ newFraction reduced
+
+ "
+ Fraction numerator:1 denominator:3
+ Fraction numerator:2 denominator:6
+
+ Fraction numerator:1 denominator:0
+ Fraction numerator:2 denominator:0
+ "
! !
!Fraction class methodsFor:'constants'!
@@ -901,7 +917,7 @@
!Fraction class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic/Fraction.st,v 1.61 2003-03-31 09:02:44 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/Fraction.st,v 1.62 2003-03-31 09:12:58 cg Exp $'
! !
Fraction initialize!