[pypy-commit] pypy gmp: First test passes.

arigo noreply at buildbot.pypy.org
Thu Oct 20 16:37:33 CEST 2011


Author: Armin Rigo <arigo at 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():


More information about the pypy-commit mailing list