From de04c2fb520de7b63acfdda6829b4e628835a706 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 17 Jan 2018 15:41:42 +0100 Subject: [PATCH 1/3] bpo-32582: chr() doesn't raise OverflowError anymore chr() now catchs OverflowError and raises a ValueError exception instead. --- Lib/test/test_builtin.py | 3 ++- Python/bltinmodule.c | 16 ++++++++++++---- Python/clinic/bltinmodule.c.h | 20 +------------------- 3 files changed, 15 insertions(+), 24 deletions(-) diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index 8f91bc9bf919b7..bdeeba58941461 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -304,7 +304,8 @@ def test_chr(self): self.assertEqual(chr(0x0010FFFF), "\U0010FFFF") self.assertRaises(ValueError, chr, -1) self.assertRaises(ValueError, chr, 0x00110000) - self.assertRaises((OverflowError, ValueError), chr, 2**32) + self.assertRaises(ValueError, chr, -2**100) + self.assertRaises(ValueError, chr, 2**100) def test_cmp(self): self.assertTrue(not hasattr(builtins, "cmp")) diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 844548f75fd528..0e279f66372b96 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -715,17 +715,25 @@ builtin_format_impl(PyObject *module, PyObject *value, PyObject *format_spec) /*[clinic input] chr as builtin_chr - i: int + i: object / Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff. [clinic start generated code]*/ static PyObject * -builtin_chr_impl(PyObject *module, int i) -/*[clinic end generated code: output=c733afcd200afcb7 input=3f604ef45a70750d]*/ +builtin_chr(PyObject *module, PyObject *i) +/*[clinic end generated code: output=d34f25b8035a9b10 input=f919867f0ba2f496]*/ { - return PyUnicode_FromOrdinal(i); + int ch = _PyLong_AsInt(i); + if (ch == -1 && PyErr_Occurred()) { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) { + return NULL; + } + PyErr_Clear(); + ch = -1; + } + return PyUnicode_FromOrdinal(ch); } diff --git a/Python/clinic/bltinmodule.c.h b/Python/clinic/bltinmodule.c.h index 285caf94b77d26..62c3b20ac4e7e0 100644 --- a/Python/clinic/bltinmodule.c.h +++ b/Python/clinic/bltinmodule.c.h @@ -113,24 +113,6 @@ PyDoc_STRVAR(builtin_chr__doc__, #define BUILTIN_CHR_METHODDEF \ {"chr", (PyCFunction)builtin_chr, METH_O, builtin_chr__doc__}, -static PyObject * -builtin_chr_impl(PyObject *module, int i); - -static PyObject * -builtin_chr(PyObject *module, PyObject *arg) -{ - PyObject *return_value = NULL; - int i; - - if (!PyArg_Parse(arg, "i:chr", &i)) { - goto exit; - } - return_value = builtin_chr_impl(module, i); - -exit: - return return_value; -} - PyDoc_STRVAR(builtin_compile__doc__, "compile($module, /, source, filename, mode, flags=0,\n" " dont_inherit=False, optimize=-1)\n" @@ -710,4 +692,4 @@ builtin_issubclass(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=9f17c7a87d740374 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=2ff748273b78b0ac input=a9049054013a1b77]*/ From 6e97932a525b088bd3e59b37c1fa6a5acd5022f4 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 17 Jan 2018 15:43:21 +0100 Subject: [PATCH 2/3] Add NEWS entry --- .../Core and Builtins/2018-01-17-15-42-56.bpo-32582.kSu6Yj.rst | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2018-01-17-15-42-56.bpo-32582.kSu6Yj.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-01-17-15-42-56.bpo-32582.kSu6Yj.rst b/Misc/NEWS.d/next/Core and Builtins/2018-01-17-15-42-56.bpo-32582.kSu6Yj.rst new file mode 100644 index 00000000000000..ae22900f13b18c --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2018-01-17-15-42-56.bpo-32582.kSu6Yj.rst @@ -0,0 +1,2 @@ +The :func:`chr` builtin function now catchs :exc:`OverflowError` and raises +a :exc:`ValueError` exception instead. From f3ef3cb1faa320f57c433521b0fa63e67e6ccfe9 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 18 Jan 2018 09:09:53 +0100 Subject: [PATCH 3/3] Remove useless ch=-1; --- Python/bltinmodule.c | 1 - 1 file changed, 1 deletion(-) diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 0e279f66372b96..11af0549fb2a17 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -731,7 +731,6 @@ builtin_chr(PyObject *module, PyObject *i) return NULL; } PyErr_Clear(); - ch = -1; } return PyUnicode_FromOrdinal(ch); }