From de8b94c3e1154eb7778a6d5729129b6a57c365fb Mon Sep 17 00:00:00 2001 From: Neal Norwitz Date: Mon, 10 Feb 2003 02:12:43 +0000 Subject: [PATCH] Fix SF bug #683467, 'int' ability to generate longs not inherited When subclassing from an int but not overriding __new__, long values were not converted properly. Try to convert longs into an int. --- Lib/test/test_descr.py | 8 ++++++++ Misc/NEWS | 3 +++ Objects/intobject.c | 18 ++++++++++++++++-- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 8a6a538b4f..8ef7979241 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -458,12 +458,20 @@ def ints(): class C(int): def __add__(self, other): return NotImplemented + vereq(C(5L), 5) try: C() + "" except TypeError: pass else: raise TestFailed, "NotImplemented should have caused TypeError" + import sys + try: + C(sys.maxint+1) + except OverflowError: + pass + else: + raise TestFailed, "should have raised OverflowError" def longs(): if verbose: print "Testing long operations..." diff --git a/Misc/NEWS b/Misc/NEWS index b0683ee877..24f318c885 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,9 @@ What's New in Python 2.3 alpha 2? Core and builtins ----------------- +- int subclasses can be initialized with longs if the value fits in an int. + See SF bug #683467. + - long(string, base) takes time linear in len(string) when base is a power of 2 now. It used to take time quadratic in len(string). diff --git a/Objects/intobject.c b/Objects/intobject.c index 915ef21cec..544e663dac 100644 --- a/Objects/intobject.c +++ b/Objects/intobject.c @@ -836,16 +836,30 @@ static PyObject * int_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { PyObject *tmp, *new; + long ival; assert(PyType_IsSubtype(type, &PyInt_Type)); tmp = int_new(&PyInt_Type, args, kwds); if (tmp == NULL) return NULL; - assert(PyInt_Check(tmp)); + if (!PyInt_Check(tmp)) { + if (!PyLong_Check(tmp)) { + PyErr_SetString(PyExc_ValueError, + "value must convertable to an int"); + return NULL; + } + ival = PyLong_AsLong(tmp); + if (ival == -1 && PyErr_Occurred()) + return NULL; + + } else { + ival = ((PyIntObject *)tmp)->ob_ival; + } + new = type->tp_alloc(type, 0); if (new == NULL) return NULL; - ((PyIntObject *)new)->ob_ival = ((PyIntObject *)tmp)->ob_ival; + ((PyIntObject *)new)->ob_ival = ival; Py_DECREF(tmp); return new; } -- 2.49.0