bpo-31497: Add private helper _PyType_Name(). (#3630)

This function returns the last component of tp_name after a dot.
Returns tp_name itself if it doesn't contain a dot.
This commit is contained in:
Serhiy Storchaka 2017-09-17 21:11:04 +03:00 committed by GitHub
parent 132a7d7cdb
commit 4ab46d7949
6 changed files with 26 additions and 33 deletions

View File

@ -501,6 +501,7 @@ PyAPI_FUNC(PyObject *) PyType_GenericAlloc(PyTypeObject *, Py_ssize_t);
PyAPI_FUNC(PyObject *) PyType_GenericNew(PyTypeObject *, PyAPI_FUNC(PyObject *) PyType_GenericNew(PyTypeObject *,
PyObject *, PyObject *); PyObject *, PyObject *);
#ifndef Py_LIMITED_API #ifndef Py_LIMITED_API
PyAPI_FUNC(const char *) _PyType_Name(PyTypeObject *);
PyAPI_FUNC(PyObject *) _PyType_Lookup(PyTypeObject *, PyObject *); PyAPI_FUNC(PyObject *) _PyType_Lookup(PyTypeObject *, PyObject *);
PyAPI_FUNC(PyObject *) _PyType_LookupId(PyTypeObject *, _Py_Identifier *); PyAPI_FUNC(PyObject *) _PyType_LookupId(PyTypeObject *, _Py_Identifier *);
PyAPI_FUNC(PyObject *) _PyObject_LookupSpecial(PyObject *, _Py_Identifier *); PyAPI_FUNC(PyObject *) _PyObject_LookupSpecial(PyObject *, _Py_Identifier *);

View File

@ -1284,7 +1284,7 @@ PyInit__functools(void)
{ {
int i; int i;
PyObject *m; PyObject *m;
char *name; const char *name;
PyTypeObject *typelist[] = { PyTypeObject *typelist[] = {
&partial_type, &partial_type,
&lru_cache_type, &lru_cache_type,
@ -1306,10 +1306,9 @@ PyInit__functools(void)
Py_DECREF(m); Py_DECREF(m);
return NULL; return NULL;
} }
name = strchr(typelist[i]->tp_name, '.'); name = _PyType_Name(typelist[i]);
assert (name != NULL);
Py_INCREF(typelist[i]); Py_INCREF(typelist[i]);
PyModule_AddObject(m, name+1, (PyObject *)typelist[i]); PyModule_AddObject(m, name, (PyObject *)typelist[i]);
} }
return m; return m;
} }

View File

@ -4630,7 +4630,7 @@ PyInit_itertools(void)
{ {
int i; int i;
PyObject *m; PyObject *m;
char *name; const char *name;
PyTypeObject *typelist[] = { PyTypeObject *typelist[] = {
&accumulate_type, &accumulate_type,
&combinations_type, &combinations_type,
@ -4663,10 +4663,9 @@ PyInit_itertools(void)
for (i=0 ; typelist[i] != NULL ; i++) { for (i=0 ; typelist[i] != NULL ; i++) {
if (PyType_Ready(typelist[i]) < 0) if (PyType_Ready(typelist[i]) < 0)
return NULL; return NULL;
name = strchr(typelist[i]->tp_name, '.'); name = _PyType_Name(typelist[i]);
assert (name != NULL);
Py_INCREF(typelist[i]); Py_INCREF(typelist[i]);
PyModule_AddObject(m, name+1, (PyObject *)typelist[i]); PyModule_AddObject(m, name, (PyObject *)typelist[i]);
} }
return m; return m;

View File

@ -116,13 +116,7 @@ BaseException_str(PyBaseExceptionObject *self)
static PyObject * static PyObject *
BaseException_repr(PyBaseExceptionObject *self) BaseException_repr(PyBaseExceptionObject *self)
{ {
const char *name; const char *name = _PyType_Name(Py_TYPE(self));
const char *dot;
name = Py_TYPE(self)->tp_name;
dot = (const char *) strrchr(name, '.');
if (dot != NULL) name = dot+1;
return PyUnicode_FromFormat("%s%R", name, self->args); return PyUnicode_FromFormat("%s%R", name, self->args);
} }

View File

@ -1471,16 +1471,9 @@ odict_repr(PyODictObject *self)
int i; int i;
_Py_IDENTIFIER(items); _Py_IDENTIFIER(items);
PyObject *pieces = NULL, *result = NULL; PyObject *pieces = NULL, *result = NULL;
const char *classname;
classname = strrchr(Py_TYPE(self)->tp_name, '.');
if (classname == NULL)
classname = Py_TYPE(self)->tp_name;
else
classname++;
if (PyODict_SIZE(self) == 0) if (PyODict_SIZE(self) == 0)
return PyUnicode_FromFormat("%s()", classname); return PyUnicode_FromFormat("%s()", _PyType_Name(Py_TYPE(self)));
i = Py_ReprEnter((PyObject *)self); i = Py_ReprEnter((PyObject *)self);
if (i != 0) { if (i != 0) {
@ -1532,7 +1525,8 @@ odict_repr(PyODictObject *self)
goto Done; goto Done;
} }
result = PyUnicode_FromFormat("%s(%R)", classname, pieces); result = PyUnicode_FromFormat("%s(%R)",
_PyType_Name(Py_TYPE(self)), pieces);
Done: Done:
Py_XDECREF(pieces); Py_XDECREF(pieces);

View File

@ -388,11 +388,22 @@ check_set_special_type_attr(PyTypeObject *type, PyObject *value, const char *nam
return 1; return 1;
} }
const char *
_PyType_Name(PyTypeObject *type)
{
const char *s = strrchr(type->tp_name, '.');
if (s == NULL) {
s = type->tp_name;
}
else {
s++;
}
return s;
}
static PyObject * static PyObject *
type_name(PyTypeObject *type, void *context) type_name(PyTypeObject *type, void *context)
{ {
const char *s;
if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) { if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) {
PyHeapTypeObject* et = (PyHeapTypeObject*)type; PyHeapTypeObject* et = (PyHeapTypeObject*)type;
@ -400,12 +411,7 @@ type_name(PyTypeObject *type, void *context)
return et->ht_name; return et->ht_name;
} }
else { else {
s = strrchr(type->tp_name, '.'); return PyUnicode_FromString(_PyType_Name(type));
if (s == NULL)
s = type->tp_name;
else
s++;
return PyUnicode_FromString(s);
} }
} }
@ -418,7 +424,7 @@ type_qualname(PyTypeObject *type, void *context)
return et->ht_qualname; return et->ht_qualname;
} }
else { else {
return type_name(type, context); return PyUnicode_FromString(_PyType_Name(type));
} }
} }