Author: Armin Rigo <ar...@tunes.org> Branch: gmp Changeset: r48267:b7758f1003d0 Date: 2011-10-20 16:13 +0200 http://bitbucket.org/pypy/pypy/changeset/b7758f1003d0/
Log: First test passes. diff --git a/pypy/rlib/_rbigint_gmp.py b/pypy/rlib/_rbigint_gmp.py new file mode 100644 --- /dev/null +++ b/pypy/rlib/_rbigint_gmp.py @@ -0,0 +1,58 @@ +from pypy.rpython.lltypesystem import lltype, rffi +from pypy.translator.tool.cbuild import ExternalCompilationInfo + +eci = ExternalCompilationInfo(includes=["gmp.h"], + libraries=["gmp"]) + +mpz_t = rffi.COpaque("mpz_t", ptr_typedef="mpz_ptr", compilation_info=eci) +mpz_ptr = lltype.Ptr(mpz_t) + +def external(name, args, result=lltype.Void): + name = "__g" + name # temporary hack? + return rffi.llexternal(name, args, result, compilation_info=eci) + +mpz_init = external("mpz_init", [mpz_ptr]) +mpz_init_set_si = external("mpz_init_set_si", [mpz_ptr, rffi.LONG]) +mpz_get_si = external("mpz_get_si", [mpz_ptr], rffi.LONG) +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]) + +# ____________________________________________________________ + +class _adtmeths: + + @lltype.typeMethod + def fromint(RBIGINT, value): + r = lltype.malloc(RBIGINT) + mpz_init_set_si(r.mpz, value) + 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 + +_adtmeths = dict([(key, value) for (key, value) in _adtmeths.__dict__.items() + if not key.startswith('_')]) + +RBIGINT = lltype.GcStruct("RBIGINT_GMP", + ('mpz', mpz_t), + adtmeths = _adtmeths) +# XXX call mpz_clear() in a lightweight finalizer diff --git a/pypy/rlib/test/test_rbigint_native.py b/pypy/rlib/test/test_rbigint_gmp.py copy from pypy/rlib/test/test_rbigint_native.py copy to pypy/rlib/test/test_rbigint_gmp.py --- a/pypy/rlib/test/test_rbigint_native.py +++ b/pypy/rlib/test/test_rbigint_gmp.py @@ -2,9 +2,8 @@ import py import operator, sys from random import random, randint, sample -from pypy.rlib._rbigint_native import rbigint, SHIFT, MASK, KARATSUBA_CUTOFF -from pypy.rlib._rbigint_native import _store_digit, parse_digit_string -from pypy.rlib import _rbigint_native as lobj +from pypy.rlib._rbigint_gmp import RBIGINT as rbigint +from pypy.rlib import _rbigint_gmp as lobj from pypy.rlib.rarithmetic import r_uint, r_longlong, r_ulonglong, intmask from pypy.rpython.test.test_llinterp import interpret @@ -118,6 +117,7 @@ yield -s def bigint(lst, sign): + XXX for digit in lst: assert digit & MASK == digit # wrongly written test! return rbigint(map(_store_digit, lst), sign) @@ -626,8 +626,6 @@ assert x.tobool() is False -BASE = 2 ** SHIFT - class TestTranslatable(object): def test_square(self): def test(): diff --git a/pypy/rlib/test/test_rbigint_native.py b/pypy/rlib/test/test_rbigint_native.py --- a/pypy/rlib/test/test_rbigint_native.py +++ b/pypy/rlib/test/test_rbigint_native.py @@ -626,8 +626,6 @@ assert x.tobool() is False -BASE = 2 ** SHIFT - class TestTranslatable(object): def test_square(self): def test(): _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit