Author: Armin Rigo <ar...@tunes.org>
Branch: gmp
Changeset: r48269:5308f097341b
Date: 2011-10-20 16:44 +0200
http://bitbucket.org/pypy/pypy/changeset/5308f097341b/

Log:    Some more operations.

diff --git a/pypy/rlib/_rbigint_gmp.py b/pypy/rlib/_rbigint_gmp.py
--- a/pypy/rlib/_rbigint_gmp.py
+++ b/pypy/rlib/_rbigint_gmp.py
@@ -23,10 +23,13 @@
 mpz_add         = external("mpz_add", [mpz_ptr, mpz_ptr, mpz_ptr])
 mpz_sub         = external("mpz_sub", [mpz_ptr, mpz_ptr, mpz_ptr])
 mpz_mul         = external("mpz_mul", [mpz_ptr, mpz_ptr, mpz_ptr])
+mpz_fdiv_q      = external("mpz_fdiv_q", [mpz_ptr, mpz_ptr, mpz_ptr])
+mpz_fdiv_r      = external("mpz_fdiv_r", [mpz_ptr, mpz_ptr, mpz_ptr])
 _free           = external("free", [rffi.CCHARP])
 
 # ____________________________________________________________
 
+
 def _fromint(value):
     r = lltype.malloc(RBIGINT)
     mpz_init_set_si(r.mpz, value)
@@ -51,33 +54,35 @@
         mpz_init_set_str(r.mpz, str(l), 10)
         return r
 
-    def tolong(r):
-        return mpz_get_si(r.mpz)
-
-    def add(r1, r2):
-        r = lltype.malloc(RBIGINT)
-        mpz_init(r.mpz)
-        mpz_add(r.mpz, r1.mpz, r2.mpz)
-        return r
-
-    def sub(r1, r2):
-        r = lltype.malloc(RBIGINT)
-        mpz_init(r.mpz)
-        mpz_sub(r.mpz, r1.mpz, r2.mpz)
-        return r
-
-    def mul(r1, r2):
-        r = lltype.malloc(RBIGINT)
-        mpz_init(r.mpz)
-        mpz_mul(r.mpz, r1.mpz, r2.mpz)
-        return r
-
     def str(r):
         p = mpz_get_str(lltype.nullptr(rffi.CCHARP.TO), 10, r.mpz)
         result = rffi.charp2str(p)
         _free(p)
         return result
 
+    def tolong(r):
+        return mpz_get_si(r.mpz)
+
+    def _binary(opname):
+        mpz_op = globals()['mpz_' + opname]
+        def operation(r1, r2):
+            r = lltype.malloc(RBIGINT)
+            mpz_init(r.mpz)
+            mpz_op(r.mpz, r1.mpz, r2.mpz)
+            return r
+        operation.__name__ = opname
+        return operation
+
+    add = _binary('add')
+    sub = _binary('sub')
+    mul = _binary('mul')
+    div = _binary('fdiv_q')
+    floordiv = div
+    mod = _binary('fdiv_r')
+
+    def truediv(r1, r2):
+        import py; py.test.skip("XXX")
+
 _adtmeths = dict([(key, value) for (key, value) in _adtmeths.__dict__.items()
                                if not key.startswith('_')])
 
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to