[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