SmallInteger.st
branchjv
changeset 17797 71451ae83564
parent 17795 569eec7576f1
child 17807 06cc6c49e291
--- a/SmallInteger.st	Thu Aug 19 21:39:34 2010 +0100
+++ b/SmallInteger.st	Thu Aug 26 11:12:57 2010 +0100
@@ -545,7 +545,7 @@
      Be careful with negative results: 9 // 4 = 2,
      while -9 // 4 = -3.
      The following is always true:
-	(receiver // aNumber) * aNumber + (receiver \\ aNUmber) = receiver
+        (receiver // aNumber) * aNumber + (receiver \\ aNUmber) = receiver
      See #quo: which returns -2 in the latter."
 
 %{  /* NOCONTEXT */
@@ -563,61 +563,61 @@
     INT dividend, divisor, rslt;
 
     if (__isSmallInteger(aNumber)) {
-	divisor = __intVal(aNumber);
-	if (divisor != 0) {
-	    dividend = __intVal(self);
-	    rslt = dividend / divisor;
-	    /*
-	     * Optimized to speed up positive result
-	     */
-	    if (rslt <= 0) {
-		if (rslt == 0) {
-		    if ((dividend ^ divisor) < 0) {
-			/*
-			 * result (negative) has been truncated toward 0.
-			 * Return -1, because we truncate toward negative inf.
-			 */
-			 rslt = -1;
-		    }
-		} else {
-		    /*
-		     * If result (negative) has been truncated toward 0,
-		     * subtract 1, because we truncate toward negative inf.
-		     */
-		    if (divisor > 0) {
-			if (rslt * divisor > dividend) {
-			    rslt--;
-			}
-		    } else {
-			if (rslt * divisor < dividend) {
-			    rslt--;
-			}
-		    }
-		}
-	    }
-	    RETURN ( __mkSmallInteger(rslt) );
-	}
+        divisor = __intVal(aNumber);
+        if (divisor != 0) {
+            dividend = __intVal(self);
+            rslt = dividend / divisor;
+            /*
+             * Optimized to speed up positive result
+             */
+            if (rslt <= 0) {
+                if (rslt == 0) {
+                    if ((dividend ^ divisor) < 0) {
+                        /*
+                         * result (negative) has been truncated toward 0.
+                         * Return -1, because we truncate toward negative inf.
+                         */
+                         rslt = -1;
+                    }
+                } else {
+                    /*
+                     * If result (negative) has been truncated toward 0,
+                     * subtract 1, because we truncate toward negative inf.
+                     */
+                    if (divisor > 0) {
+                        if (rslt * divisor > dividend) {
+                            rslt--;
+                        }
+                    } else {
+                        if (rslt * divisor < dividend) {
+                            rslt--;
+                        }
+                    }
+                }
+            }
+            RETURN ( __mkSmallInteger(rslt) );
+        }
     } else {
-	if (__isFraction(aNumber)) {
-	    OBJ t;
-	    INT num, den;
-
-	    t = __FractionInstPtr(aNumber)->f_numerator;
-	    if (__isSmallInteger(t)) {
-		num = __intVal(t);
-		t = __FractionInstPtr(aNumber)->f_denominator;
-		if (__isSmallInteger(t)) {
-		    den = __intVal(t);
-		    RETURN ( __mkSmallInteger(__intVal(self) * den / num ));
-		}
-	    }
-	}
+        if (__isFraction(aNumber)) {
+            OBJ t;
+            INT num, den;
+
+            t = __FractionInstPtr(aNumber)->f_numerator;
+            if (__isSmallInteger(t)) {
+                num = __intVal(t);
+                t = __FractionInstPtr(aNumber)->f_denominator;
+                if (__isSmallInteger(t)) {
+                    den = __intVal(t);
+                    RETURN ( __mkSmallInteger(__intVal(self) * den / num ));
+                }
+            }
+        }
     }
 %}.
     (aNumber = 0) ifTrue:[
-	^ ZeroDivide raiseRequestWith:thisContext.
+        ^ ZeroDivide raiseRequestWith:thisContext.
     ].
-    ^ self retry:#// coercing:aNumber
+    ^ aNumber integerQuotientFromInteger:self
 
     "
      9 // 4     ~~ 2 ifTrue:[self halt].
@@ -635,6 +635,8 @@
      9 quo:-4  => -2
      -9 quo:-4 => 2
     "
+
+    "Modified: / 09-08-2010 / 19:50:23 / cg"
 !
 
 \\ aNumber
@@ -642,7 +644,7 @@
      negative infinity. The remainder has the same sign as aNumber.
      m < |aNumber| AND there is an integer k with (k * aNumber + m) = self
      The following is always true:
-	(receiver // aNumber) * aNumber + (receiver \\ aNumber) = receiver
+        (receiver // aNumber) * aNumber + (receiver \\ aNumber) = receiver
      Compare with #rem:
 
      Redefined for speed."
@@ -662,34 +664,34 @@
     INT dividend, divisor, rem;
 
     if (__isSmallInteger(aNumber)
-	&& (divisor = __intVal(aNumber)) != 0) {
-	/*
-	 * Note that the sign of something modulo a negative number is undefined
-	 * in C!
-	 */
-	dividend = __intVal(self);
-	rem = dividend % divisor;
-	if (rem) {
-	    if ((rem ^ divisor) < 0) {
-		/* sign of remainder is different from sign of divisor */
-		rem = -rem;
-	    }
-	    if ((dividend ^ divisor) < 0) {
-		/* different signs, so division would have returned a
-		 * negative number.
-		 * C rounds toward zero, this code will simulate
-		 * rounding towards negative infinity.
-		 */
-		rem = divisor - rem;
-	    }
-	}
-	RETURN ( __mkSmallInteger(rem) );
+        && (divisor = __intVal(aNumber)) != 0) {
+        /*
+         * Note that the sign of something modulo a negative number is undefined
+         * in C!
+         */
+        dividend = __intVal(self);
+        rem = dividend % divisor;
+        if (rem) {
+            if ((rem ^ divisor) < 0) {
+                /* sign of remainder is different from sign of divisor */
+                rem = -rem;
+            }
+            if ((dividend ^ divisor) < 0) {
+                /* different signs, so division would have returned a
+                 * negative number.
+                 * C rounds toward zero, this code will simulate
+                 * rounding towards negative infinity.
+                 */
+                rem = divisor - rem;
+            }
+        }
+        RETURN ( __mkSmallInteger(rem) );
     }
 %}.
     (aNumber = 0) ifTrue:[
-	^ ZeroDivide raiseRequestWith:thisContext.
+        ^ ZeroDivide raiseRequestWith:thisContext.
     ].
-    ^ self retry:#\\ coercing:aNumber
+    ^ aNumber moduluFromInteger:self
 
     "
      9 \\ 4  == 1 ifFalse:[self halt].
@@ -700,6 +702,8 @@
      (-9 rem:4) == -1 ifFalse:[self halt].
      1000 \\ 3600000 == 1000 ifFalse:[self halt]
     "
+
+    "Modified: / 09-08-2010 / 19:52:02 / cg"
 !
 
 abs
@@ -3918,18 +3922,19 @@
 !SmallInteger class methodsFor:'documentation'!
 
 version
-    ^ '$Id: SmallInteger.st 10564 2010-08-10 08:55:15Z vranyj1 $'
+    ^ '$Id: SmallInteger.st 10570 2010-08-26 10:12:57Z vranyj1 $'
 !
 
 version_CVS
-    ^ 'Header: /cvs/stx/stx/libbasic/SmallInteger.st,v 1.186 2010/08/02 10:33:35 cg Exp '
+    ^ 'Header: /cvs/stx/stx/libbasic/SmallInteger.st,v 1.187 2010/08/09 17:52:27 cg Exp '
 !
 
 version_SVN
-    ^ '$Id: SmallInteger.st 10564 2010-08-10 08:55:15Z vranyj1 $'
+    ^ '$Id: SmallInteger.st 10570 2010-08-26 10:12:57Z vranyj1 $'
 ! !
 
 
 
 
 
+