diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 8a6a538b4f3..8ef79792419 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 b0683ee8772..24f318c8853 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 915ef21cecd..544e663dac4 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; }