oops - noone cared for generating fractions with 0 denominator
authorClaus Gittinger <cg@exept.de>
Mon, 31 Mar 2003 11:12:58 +0200
changeset 7140 f65ec31fc081
parent 7139 958ca5839e25
child 7141 033f2c26d8e6
oops - noone cared for generating fractions with 0 denominator
Fraction.st
--- 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!