[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