Merged revisions 69498 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r69498 | mark.dickinson | 2009-02-10 15:46:50 +0000 (Tue, 10 Feb 2009) | 6 lines
Issue #5175: PyLong_AsUnsignedLongLong now raises OverflowError for
negative arguments. Previously, it raised TypeError.
Thanks Lisandro Dalcin.
........
diff --git a/Doc/c-api/long.rst b/Doc/c-api/long.rst
index a7fe4b5..a8dc3ec 100644
--- a/Doc/c-api/long.rst
+++ b/Doc/c-api/long.rst
@@ -168,17 +168,26 @@
.. cfunction:: PY_LONG_LONG PyLong_AsLongLong(PyObject *pylong)
- Return a C :ctype:`long long` from a Python integer. If *pylong* cannot be
- represented as a :ctype:`long long`, an :exc:`OverflowError` will be raised.
+ .. index::
+ single: OverflowError (built-in exception)
+ Return a C :ctype:`long long` from a Python integer. If *pylong*
+ cannot be represented as a :ctype:`long long`, an
+ :exc:`OverflowError` is raised and ``-1`` is returned.
.. cfunction:: unsigned PY_LONG_LONG PyLong_AsUnsignedLongLong(PyObject *pylong)
- Return a C :ctype:`unsigned long long` from a Python integer. If *pylong*
- cannot be represented as an :ctype:`unsigned long long`, an :exc:`OverflowError`
- will be raised if the value is positive, or a :exc:`TypeError` will be raised if
- the value is negative.
+ .. index::
+ single: OverflowError (built-in exception)
+ Return a C :ctype:`unsigned long long` from a Python integer. If
+ *pylong* cannot be represented as an :ctype:`unsigned long long`,
+ an :exc:`OverflowError` is raised and ``(unsigned long long)-1`` is
+ returned.
+
+ .. versionchanged:: 3.1
+ A negative *pylong* now raises :exc:`OverflowError`, not
+ :exc:`TypeError`.
.. cfunction:: unsigned long PyLong_AsUnsignedLongMask(PyObject *io)
diff --git a/Lib/test/test_struct.py b/Lib/test/test_struct.py
index bdbc397..2bc92f3 100644
--- a/Lib/test/test_struct.py
+++ b/Lib/test/test_struct.py
@@ -48,7 +48,7 @@
def deprecated_err(func, *args):
try:
func(*args)
- except (struct.error, TypeError):
+ except (struct.error, OverflowError):
pass
except DeprecationWarning:
if not PY_STRUCT_OVERFLOW_MASKING:
@@ -191,7 +191,7 @@
def test_native_qQ(self):
# can't pack -1 as unsigned regardless
- self.assertRaises((struct.error, TypeError), struct.pack, "Q", -1)
+ self.assertRaises((struct.error, OverflowError), struct.pack, "Q", -1)
# can't pack string as 'q' regardless
self.assertRaises(struct.error, struct.pack, "q", "a")
# ditto, but 'Q'
diff --git a/Misc/ACKS b/Misc/ACKS
index 31f920e..669c4e0 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -152,6 +152,7 @@
Drew Csillag
John Cugini
Tom Culliton
+Lisandro Dalcin
Andrew Dalke
Lars Damerow
Eric Daniel
diff --git a/Misc/NEWS b/Misc/NEWS
index 5970332..44a893f 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -467,6 +467,9 @@
C-API
-----
+- Issue #5175: PyLong_AsUnsignedLongLong now raises OverflowError
+ for negative arguments. Previously, it raised TypeError.
+
- Issue #4720: The format for PyArg_ParseTupleAndKeywords can begin with '|'.
- Issue #3632: from the gdb debugger, the 'pyo' macro can now be called when
diff --git a/Modules/testcapi_long.h b/Modules/testcapi_long.h
index 8ed6b02..60ca326 100644
--- a/Modules/testcapi_long.h
+++ b/Modules/testcapi_long.h
@@ -97,6 +97,10 @@
if (uout != (unsigned TYPENAME)-1 || !PyErr_Occurred())
return error(
"PyLong_AsUnsignedXXX(-1) didn't complain");
+ if (!PyErr_ExceptionMatches(PyExc_OverflowError))
+ return error(
+ "PyLong_AsUnsignedXXX(-1) raised "
+ "something other than OverflowError");
PyErr_Clear();
UNBIND(x);
@@ -112,11 +116,15 @@
return error(
"unexpected NULL from PyNumber_Lshift");
- uout = F_PY_TO_U(x);
+ uout = F_PY_TO_U(x);
if (uout != (unsigned TYPENAME)-1 || !PyErr_Occurred())
return error(
"PyLong_AsUnsignedXXX(2**NBITS) didn't "
"complain");
+ if (!PyErr_ExceptionMatches(PyExc_OverflowError))
+ return error(
+ "PyLong_AsUnsignedXXX(2**NBITS) raised "
+ "something other than OverflowError");
PyErr_Clear();
/* Signed complains about 2**(NBITS-1)?
@@ -132,6 +140,10 @@
return error(
"PyLong_AsXXX(2**(NBITS-1)) didn't "
"complain");
+ if (!PyErr_ExceptionMatches(PyExc_OverflowError))
+ return error(
+ "PyLong_AsXXX(2**(NBITS-1)) raised "
+ "something other than OverflowError");
PyErr_Clear();
/* Signed complains about -2**(NBITS-1)-1?;
@@ -153,6 +165,10 @@
return error(
"PyLong_AsXXX(-2**(NBITS-1)-1) didn't "
"complain");
+ if (!PyErr_ExceptionMatches(PyExc_OverflowError))
+ return error(
+ "PyLong_AsXXX(-2**(NBITS-1)-1) raised "
+ "something other than OverflowError");
PyErr_Clear();
UNBIND(y);
diff --git a/Objects/longobject.c b/Objects/longobject.c
index e8d315d..e2ab078 100644
--- a/Objects/longobject.c
+++ b/Objects/longobject.c
@@ -786,7 +786,7 @@
if (Py_SIZE(v) < 0) {
ndigits = -(Py_SIZE(v));
if (!is_signed) {
- PyErr_SetString(PyExc_TypeError,
+ PyErr_SetString(PyExc_OverflowError,
"can't convert negative int to unsigned");
return -1;
}