[pypy-commit] pypy gmp: In-progress.

arigo noreply at buildbot.pypy.org
Thu Oct 20 17:59:15 CEST 2011


Author: Armin Rigo <arigo at tunes.org>
Branch: gmp
Changeset: r48270:118e6ccfb4c1
Date: 2011-10-20 17:26 +0200
http://bitbucket.org/pypy/pypy/changeset/118e6ccfb4c1/

Log:	In-progress.

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
@@ -2,6 +2,7 @@
 from pypy.rpython.lltypesystem.lltype import typeMethod
 from pypy.translator.tool.cbuild import ExternalCompilationInfo
 from pypy.rlib import jit
+from pypy.rlib.objectmodel import specialize
 
 eci = ExternalCompilationInfo(includes=["gmp.h"],
                               libraries=["gmp"])
@@ -18,6 +19,7 @@
 mpz_init_set_si = external("mpz_init_set_si", [mpz_ptr, rffi.LONG])
 mpz_init_set_str= external("mpz_init_set_str", [mpz_ptr, rffi.CCHARP,rffi.INT])
 mpz_get_si      = external("mpz_get_si", [mpz_ptr], rffi.LONG)
+mpz_get_ui      = external("mpz_get_ui", [mpz_ptr], rffi.ULONG)
 mpz_get_str     = external("mpz_get_str", [rffi.CCHARP, rffi.INT, mpz_ptr],
                            rffi.CCHARP)
 mpz_add         = external("mpz_add", [mpz_ptr, mpz_ptr, mpz_ptr])
@@ -25,6 +27,10 @@
 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])
+mpz_pow_ui      = external("mpz_pow_ui", [mpz_ptr, mpz_ptr, rffi.ULONG])
+
+mpz_fits_ulong_p = external("mpz_fits_ulong_p", [mpz_ptr], rffi.INT)
+
 _free           = external("free", [rffi.CCHARP])
 
 # ____________________________________________________________
@@ -35,6 +41,12 @@
     mpz_init_set_si(r.mpz, value)
     return r
 
+def _str_base_10(r):
+    p = mpz_get_str(lltype.nullptr(rffi.CCHARP.TO), 10, r.mpz)
+    result = rffi.charp2str(p)
+    _free(p)
+    return result
+
 
 class _adtmeths:
 
@@ -54,14 +66,11 @@
         mpz_init_set_str(r.mpz, str(l), 10)
         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
+    str = _str_base_10
 
     def tolong(r):
-        return mpz_get_si(r.mpz)
+        "NOT_RPYTHON"
+        return int(_str_base_10(r))
 
     def _binary(opname):
         mpz_op = globals()['mpz_' + opname]
@@ -83,6 +92,19 @@
     def truediv(r1, r2):
         import py; py.test.skip("XXX")
 
+    @specialize.argtype(2)
+    def pow(a, b, c=None):
+        if c is None:
+            fits = rffi.cast(lltype.Signed, mpz_fits_ulong_p(b.mpz))
+            assert fits, "XXX"
+            b_ulong = mpz_get_ui(b.mpz)
+            r = lltype.malloc(RBIGINT)
+            mpz_init(r.mpz)
+            mpz_pow_ui(r.mpz, a.mpz, b_ulong)
+            return r
+        else:
+            yyy
+
 _adtmeths = dict([(key, value) for (key, value) in _adtmeths.__dict__.items()
                                if not key.startswith('_')])
 


More information about the pypy-commit mailing list