[pypy-commit] pypy default: tcl: Conversion from long to Bignum.

amauryfa noreply at buildbot.pypy.org
Mon Jun 15 09:33:22 CEST 2015


Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch: 
Changeset: r78105:83e70cd0540a
Date: 2015-06-15 09:32 +0200
http://bitbucket.org/pypy/pypy/changeset/83e70cd0540a/

Log:	tcl: Conversion from long to Bignum.

diff --git a/lib_pypy/_tkinter/tclobj.py b/lib_pypy/_tkinter/tclobj.py
--- a/lib_pypy/_tkinter/tclobj.py
+++ b/lib_pypy/_tkinter/tclobj.py
@@ -73,6 +73,20 @@
     finally:
         tklib.mp_clear(bigValue)
 
+def AsBignumObj(value):
+    sign = -1 if value < 0 else 1
+    hexstr = '%x' % abs(value)
+    bigValue = tkffi.new("mp_int*")
+    tklib.mp_init(bigValue)
+    try:
+        if tklib.mp_read_radix(bigValue, hexstr, 16) != tklib.MP_OKAY:
+            raise MemoryError
+        bigValue.sign = tklib.MP_NEG if value < 0 else tklib.MP_ZPOS
+        return tklib.Tcl_NewBignumObj(bigValue)
+    finally:
+        tklib.mp_clear(bigValue)
+
+
 def FromObj(app, value):
     """Convert a TclObj pointer into a Python object."""
     typeCache = app._typeCache
@@ -131,15 +145,19 @@
         try:
             tkffi.new("long[]", [value])
         except OverflowError:
+            pass 
+        else:
+            return tklib.Tcl_NewLongObj(value)
+        if tklib.HAVE_WIDE_INT_TYPE:
             try:
                 tkffi.new("Tcl_WideInt[]", [value])
             except OverflowError:
                 pass
-                # Too wide, fall through defaut object handling.
             else:
                 return tklib.Tcl_NewWideIntObj(value)
-        else:
-            return tklib.Tcl_NewLongObj(value)
+        if tklib.HAVE_LIBTOMMATH:
+            return AsBignumObj(value)
+            
     if isinstance(value, float):
         return tklib.Tcl_NewDoubleObj(value)
     if isinstance(value, tuple):
diff --git a/lib_pypy/_tkinter/tklib_build.py b/lib_pypy/_tkinter/tklib_build.py
--- a/lib_pypy/_tkinter/tklib_build.py
+++ b/lib_pypy/_tkinter/tklib_build.py
@@ -184,6 +184,7 @@
 if HAVE_LIBTOMMATH:
     tkffi.cdef("""
 #define MP_OKAY ...
+#define MP_ZPOS ...
 #define MP_NEG ...
 typedef struct {
     int sign;
@@ -191,9 +192,12 @@
 } mp_int;
 
 int Tcl_GetBignumFromObj(Tcl_Interp *interp, Tcl_Obj *obj, mp_int *value);
+Tcl_Obj *Tcl_NewBignumObj(mp_int *value);
 
 int mp_unsigned_bin_size(mp_int *a);
 int mp_to_unsigned_bin_n(mp_int * a, unsigned char *b, unsigned long *outlen);
+int mp_read_radix(mp_int *a, const char *str, int radix);
+int mp_init(mp_int *a);
 void mp_clear(mp_int *a);
 """)
 


More information about the pypy-commit mailing list