diff options
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/abstract.c | 11 | ||||
-rw-r--r-- | Objects/longobject.c | 21 |
2 files changed, 29 insertions, 3 deletions
diff --git a/Objects/abstract.c b/Objects/abstract.c index 5361b1d..2bd0fcc 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -4,6 +4,7 @@ #include "Python.h" #include <ctype.h> #include "structmember.h" /* we need the offsetof() macro from there */ +#include "longintrepr.h" #define NEW_STYLE_NUMBER(o) PyType_HasFeature((o)->ob_type, \ Py_TPFLAGS_CHECKTYPES) @@ -818,10 +819,14 @@ PyNumber_Int(PyObject *o) if (o == NULL) return null_error(); - if (PyInt_Check(o)) { + if (PyInt_CheckExact(o)) { Py_INCREF(o); return o; } + if (PyInt_Check(o)) { + PyIntObject *io = (PyIntObject*)o; + return PyInt_FromLong(io->ob_ival); + } if (PyString_Check(o)) return int_from_string(PyString_AS_STRING(o), PyString_GET_SIZE(o)); @@ -868,10 +873,12 @@ PyNumber_Long(PyObject *o) if (o == NULL) return null_error(); - if (PyLong_Check(o)) { + if (PyLong_CheckExact(o)) { Py_INCREF(o); return o; } + if (PyLong_Check(o)) + return _PyLong_Copy((PyLongObject *)o); if (PyString_Check(o)) /* need to do extra error checking that PyLong_FromString() * doesn't do. In particular long('9.5') must raise an diff --git a/Objects/longobject.c b/Objects/longobject.c index c7608aa..b9271e6 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -51,6 +51,25 @@ _PyLong_New(int size) return PyObject_NEW_VAR(PyLongObject, &PyLong_Type, size); } +PyObject * +_PyLong_Copy(PyLongObject *src) +{ + PyLongObject *result; + int i; + + assert(src != NULL); + i = src->ob_size; + if (i < 0) + i = -(i); + result = _PyLong_New(i); + if (result != NULL) { + result->ob_size = i; + while (--i >= 0) + result->ob_digit[i] = src->ob_digit[i]; + } + return (PyObject *)result; +} + /* Create a new long int object from a C long int */ PyObject * @@ -2205,7 +2224,7 @@ long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds) tmp = (PyLongObject *)long_new(&PyLong_Type, args, kwds); if (tmp == NULL) return NULL; - assert(PyLong_Check(tmp)); + assert(PyLong_CheckExact(tmp)); n = tmp->ob_size; if (n < 0) n = -n; |