Author: Amaury Forgeot d'Arc <amaur...@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); """) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit