summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2018-06-15 08:09:43 (GMT)
committerGitHub <noreply@github.com>2018-06-15 08:09:43 (GMT)
commitceeef10cdbc08561f9954e13bbed1cb2299a8c72 (patch)
tree8b4678e015343dc2f052c672d3a4be00ef313e0f
parent08f127a3cad8ce4eb281d30d9488c91b0fd7cfed (diff)
downloadcpython-ceeef10cdbc08561f9954e13bbed1cb2299a8c72.zip
cpython-ceeef10cdbc08561f9954e13bbed1cb2299a8c72.tar.gz
cpython-ceeef10cdbc08561f9954e13bbed1cb2299a8c72.tar.bz2
bpo-33818: PyExceptionClass_Name() will now return "const char *". (GH-7581)
-rw-r--r--Doc/whatsnew/3.8.rst4
-rw-r--r--Include/pyerrors.h5
-rw-r--r--Misc/NEWS.d/next/C API/2018-06-10-09-42-31.bpo-33818.50nlf3.rst2
-rw-r--r--Objects/exceptions.c4
-rw-r--r--Python/errors.c4
-rw-r--r--Python/pythonrun.c4
6 files changed, 14 insertions, 9 deletions
diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst
index 9ae52c2..10fa182 100644
--- a/Doc/whatsnew/3.8.rst
+++ b/Doc/whatsnew/3.8.rst
@@ -115,9 +115,13 @@ Optimizations
first introduced in Python 3.4. It offers better performance and smaller
size compared to Protocol 3 available since Python 3.0.
+
Build and C API Changes
=======================
+* The result of :c:func:`PyExceptionClass_Name` is now of type
+ ``const char *`` rather of ``char *``.
+ (Contributed by Serhiy Storchaka in :issue:`33818`.)
Deprecated
diff --git a/Include/pyerrors.h b/Include/pyerrors.h
index 5b62658..416d750 100644
--- a/Include/pyerrors.h
+++ b/Include/pyerrors.h
@@ -140,10 +140,9 @@ PyAPI_FUNC(void) _PyErr_ChainExceptions(PyObject *, PyObject *, PyObject *);
#define PyExceptionInstance_Check(x) \
PyType_FastSubclass((x)->ob_type, Py_TPFLAGS_BASE_EXC_SUBCLASS)
-PyAPI_FUNC(char *) PyExceptionClass_Name(PyObject *);
+PyAPI_FUNC(const char *) PyExceptionClass_Name(PyObject *);
#ifndef Py_LIMITED_API
-#define PyExceptionClass_Name(x) \
- ((char *)(((PyTypeObject *)(x))->tp_name))
+#define PyExceptionClass_Name(x) (((PyTypeObject*)(x))->tp_name)
#endif
#define PyExceptionInstance_Class(x) ((PyObject*)((x)->ob_type))
diff --git a/Misc/NEWS.d/next/C API/2018-06-10-09-42-31.bpo-33818.50nlf3.rst b/Misc/NEWS.d/next/C API/2018-06-10-09-42-31.bpo-33818.50nlf3.rst
new file mode 100644
index 0000000..0f30a6e
--- /dev/null
+++ b/Misc/NEWS.d/next/C API/2018-06-10-09-42-31.bpo-33818.50nlf3.rst
@@ -0,0 +1,2 @@
+:c:func:`PyExceptionClass_Name` will now return ``const char *`` instead of
+``char *``.
diff --git a/Objects/exceptions.c b/Objects/exceptions.c
index e1615b2..bb50c1c 100644
--- a/Objects/exceptions.c
+++ b/Objects/exceptions.c
@@ -344,10 +344,10 @@ PyException_SetContext(PyObject *self, PyObject *context)
#undef PyExceptionClass_Name
-char *
+const char *
PyExceptionClass_Name(PyObject *ob)
{
- return (char *)((PyTypeObject*)ob)->tp_name;
+ return ((PyTypeObject*)ob)->tp_name;
}
static struct PyMemberDef BaseException_members[] = {
diff --git a/Python/errors.c b/Python/errors.c
index 15e6ba0..98910b4 100644
--- a/Python/errors.c
+++ b/Python/errors.c
@@ -947,7 +947,7 @@ PyErr_WriteUnraisable(PyObject *obj)
_Py_IDENTIFIER(__module__);
PyObject *f, *t, *v, *tb;
PyObject *moduleName = NULL;
- char* className;
+ const char *className;
PyErr_Fetch(&t, &v, &tb);
@@ -977,7 +977,7 @@ PyErr_WriteUnraisable(PyObject *obj)
assert(PyExceptionClass_Check(t));
className = PyExceptionClass_Name(t);
if (className != NULL) {
- char *dot = strrchr(className, '.');
+ const char *dot = strrchr(className, '.');
if (dot != NULL)
className = dot+1;
}
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index 26f74c8..3d40c79 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -774,12 +774,12 @@ print_exception(PyObject *f, PyObject *value)
}
else {
PyObject* moduleName;
- char* className;
+ const char *className;
_Py_IDENTIFIER(__module__);
assert(PyExceptionClass_Check(type));
className = PyExceptionClass_Name(type);
if (className != NULL) {
- char *dot = strrchr(className, '.');
+ const char *dot = strrchr(className, '.');
if (dot != NULL)
className = dot+1;
}