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
#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))
--- /dev/null
+:c:func:`PyExceptionClass_Name` will now return ``const char *`` instead of
+``char *``.
#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[] = {
_Py_IDENTIFIER(__module__);
PyObject *f, *t, *v, *tb;
PyObject *moduleName = NULL;
- char* className;
+ const char *className;
PyErr_Fetch(&t, &v, &tb);
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;
}
}
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;
}