Author: stian
Branch: math-improvements
Changeset: r92988:c961b6f6e3c6
Date: 2017-11-09 21:20 +0100
http://bitbucket.org/pypy/pypy/changeset/c961b6f6e3c6/

Log:    Fix translation

diff --git a/rpython/rlib/rbigint.py b/rpython/rlib/rbigint.py
--- a/rpython/rlib/rbigint.py
+++ b/rpython/rlib/rbigint.py
@@ -167,6 +167,7 @@
     def __ne__(self, other):
         return not (self == other)
 
+    @specialize.argtype(1)
     def digit(self, x):
         """Return the x'th digit, as an int."""
         return self._digits[x]
@@ -212,13 +213,15 @@
         if intval < 0:
             sign = -1
             ival = -r_uint(intval)
+            carry = ival >> SHIFT
         elif intval > 0:
             sign = 1
             ival = r_uint(intval)
+            carry = 0
         else:
             return NULLRBIGINT
 
-        carry = ival >> SHIFT
+        
         if carry:
             return rbigint([_store_digit(ival & MASK),
                 _store_digit(carry)], sign, 2)
@@ -851,17 +854,17 @@
                 size = UDIGIT_TYPE(self.numdigits() - 1)
                 
                 if size > 0:
-                    rem = self.widedigit(size)
+                    wrem = self.widedigit(size)
                     while size > 0:
                         size -= 1
-                        rem = ((rem << SHIFT) | self.digit(size)) % digit
-                        
+                        wrem = ((wrem << SHIFT) | self.digit(size)) % digit
+                    rem = _store_digit(wrem)
                 else:
-                    rem = self.widedigit(0) % digit
+                    rem = _store_digit(self.digit(0) % digit)
 
                 if rem == 0:
                     return NULLRBIGINT
-                mod = rbigint([_store_digit(rem)], -1 if self.sign < 0 else 1, 
1)
+                mod = rbigint([rem], -1 if self.sign < 0 else 1, 1)
         else:
             div, mod = _divrem(self, other)
         if mod.sign * other.sign == -1:
@@ -893,16 +896,17 @@
                 size = UDIGIT_TYPE(self.numdigits() - 1)
                 
                 if size > 0:
-                    rem = self.widedigit(size)
+                    wrem = self.widedigit(size)
                     while size > 0:
                         size -= 1
-                        rem = ((rem << SHIFT) | self.digit(size)) % digit
+                        wrem = ((wrem << SHIFT) | self.digit(size)) % digit
+                    rem = _store_digit(wrem)
                 else:
-                    rem = self.digit(0) % digit
+                    rem = _store_digit(self.digit(0) % digit)
 
                 if rem == 0:
                     return NULLRBIGINT
-                mod = rbigint([_store_digit(rem)], -1 if self.sign < 0 else 1, 
1)
+                mod = rbigint([rem], -1 if self.sign < 0 else 1, 1)
         else:
             raise ZeroDivisionError("long division or modulo by zero")
 
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to