Return `long' objects when `int' is requested but the value won't fit.
authorMark Wooding <mdw@distorted.org.uk>
Wed, 3 May 2017 11:48:27 +0000 (12:48 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Sat, 13 May 2017 14:40:07 +0000 (15:40 +0100)
Mostly, Python handles the error from the `int' conversion and falls
back to long, but there's something weird in iteration, where if you say

for i in ...:
  print '%d' % x

then the loop finishes and /then/ you get an exception for the overflow
from the failed conversion of x to an `int'.

Follow Python's actual behaviour: have `mp_tolong_checked' take an extra
argument indicating whether to throw an exception, and modify most of
the call sites to fall back to a conversion based on `mp_topylong'.

catacomb-python.h

index a379e1d..bed97d5 100644 (file)
@@ -317,7 +317,7 @@ extern PyObject *gf_pywrap(mp *);
 extern mp *mp_frompyobject(PyObject *, int);
 extern PyObject *mp_topystring(mp *, int,
                               const char *, const char *, const char *);
 extern mp *mp_frompyobject(PyObject *, int);
 extern PyObject *mp_topystring(mp *, int,
                               const char *, const char *, const char *);
-extern int mp_tolong_checked(mp *, long *);
+extern int mp_tolong_checked(mp *, long *, int);
 
 /*----- Abstract fields ---------------------------------------------------*/
 
 
 /*----- Abstract fields ---------------------------------------------------*/