diff options
author | Neal Norwitz <nnorwitz@gmail.com> | 2003-02-10 02:12:43 (GMT) |
---|---|---|
committer | Neal Norwitz <nnorwitz@gmail.com> | 2003-02-10 02:12:43 (GMT) |
commit | de8b94c3e1154eb7778a6d5729129b6a57c365fb (patch) | |
tree | 2effb80775d5abf238626f99d062acae6ceb5438 | |
parent | 9caf9c040e4cf176eb926a077ae7bcdb6550160b (diff) | |
download | cpython-de8b94c3e1154eb7778a6d5729129b6a57c365fb.zip cpython-de8b94c3e1154eb7778a6d5729129b6a57c365fb.tar.gz cpython-de8b94c3e1154eb7778a6d5729129b6a57c365fb.tar.bz2 |
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.
-rw-r--r-- | Lib/test/test_descr.py | 8 | ||||
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | 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 8a6a538..8ef7979 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..." @@ -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 915ef21..544e663 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; } |