Author: Armin Rigo <ar...@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('_')]) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit