Skip to content

Commit 4ab46d7

Browse files
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.
1 parent 132a7d7 commit 4ab46d7

6 files changed

Lines changed: 26 additions & 33 deletions

File tree

Include/object.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,7 @@ PyAPI_FUNC(PyObject *) PyType_GenericAlloc(PyTypeObject *, Py_ssize_t);
501501
PyAPI_FUNC(PyObject *) PyType_GenericNew(PyTypeObject *,
502502
PyObject *, PyObject *);
503503
#ifndef Py_LIMITED_API
504+
PyAPI_FUNC(const char *) _PyType_Name(PyTypeObject *);
504505
PyAPI_FUNC(PyObject *) _PyType_Lookup(PyTypeObject *, PyObject *);
505506
PyAPI_FUNC(PyObject *) _PyType_LookupId(PyTypeObject *, _Py_Identifier *);
506507
PyAPI_FUNC(PyObject *) _PyObject_LookupSpecial(PyObject *, _Py_Identifier *);

Modules/_functoolsmodule.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1284,7 +1284,7 @@ PyInit__functools(void)
12841284
{
12851285
int i;
12861286
PyObject *m;
1287-
char *name;
1287+
const char *name;
12881288
PyTypeObject *typelist[] = {
12891289
&partial_type,
12901290
&lru_cache_type,
@@ -1306,10 +1306,9 @@ PyInit__functools(void)
13061306
Py_DECREF(m);
13071307
return NULL;
13081308
}
1309-
name = strchr(typelist[i]->tp_name, '.');
1310-
assert (name != NULL);
1309+
name = _PyType_Name(typelist[i]);
13111310
Py_INCREF(typelist[i]);
1312-
PyModule_AddObject(m, name+1, (PyObject *)typelist[i]);
1311+
PyModule_AddObject(m, name, (PyObject *)typelist[i]);
13131312
}
13141313
return m;
13151314
}

Modules/itertoolsmodule.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4630,7 +4630,7 @@ PyInit_itertools(void)
46304630
{
46314631
int i;
46324632
PyObject *m;
4633-
char *name;
4633+
const char *name;
46344634
PyTypeObject *typelist[] = {
46354635
&accumulate_type,
46364636
&combinations_type,
@@ -4663,10 +4663,9 @@ PyInit_itertools(void)
46634663
for (i=0 ; typelist[i] != NULL ; i++) {
46644664
if (PyType_Ready(typelist[i]) < 0)
46654665
return NULL;
4666-
name = strchr(typelist[i]->tp_name, '.');
4667-
assert (name != NULL);
4666+
name = _PyType_Name(typelist[i]);
46684667
Py_INCREF(typelist[i]);
4669-
PyModule_AddObject(m, name+1, (PyObject *)typelist[i]);
4668+
PyModule_AddObject(m, name, (PyObject *)typelist[i]);
46704669
}
46714670

46724671
return m;

Objects/exceptions.c

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -116,13 +116,7 @@ BaseException_str(PyBaseExceptionObject *self)
116116
static PyObject *
117117
BaseException_repr(PyBaseExceptionObject *self)
118118
{
119-
const char *name;
120-
const char *dot;
121-
122-
name = Py_TYPE(self)->tp_name;
123-
dot = (const char *) strrchr(name, '.');
124-
if (dot != NULL) name = dot+1;
125-
119+
const char *name = _PyType_Name(Py_TYPE(self));
126120
return PyUnicode_FromFormat("%s%R", name, self->args);
127121
}
128122

Objects/odictobject.c

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1471,16 +1471,9 @@ odict_repr(PyODictObject *self)
14711471
int i;
14721472
_Py_IDENTIFIER(items);
14731473
PyObject *pieces = NULL, *result = NULL;
1474-
const char *classname;
1475-
1476-
classname = strrchr(Py_TYPE(self)->tp_name, '.');
1477-
if (classname == NULL)
1478-
classname = Py_TYPE(self)->tp_name;
1479-
else
1480-
classname++;
14811474

14821475
if (PyODict_SIZE(self) == 0)
1483-
return PyUnicode_FromFormat("%s()", classname);
1476+
return PyUnicode_FromFormat("%s()", _PyType_Name(Py_TYPE(self)));
14841477

14851478
i = Py_ReprEnter((PyObject *)self);
14861479
if (i != 0) {
@@ -1532,7 +1525,8 @@ odict_repr(PyODictObject *self)
15321525
goto Done;
15331526
}
15341527

1535-
result = PyUnicode_FromFormat("%s(%R)", classname, pieces);
1528+
result = PyUnicode_FromFormat("%s(%R)",
1529+
_PyType_Name(Py_TYPE(self)), pieces);
15361530

15371531
Done:
15381532
Py_XDECREF(pieces);

Objects/typeobject.c

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -388,24 +388,30 @@ check_set_special_type_attr(PyTypeObject *type, PyObject *value, const char *nam
388388
return 1;
389389
}
390390

391+
const char *
392+
_PyType_Name(PyTypeObject *type)
393+
{
394+
const char *s = strrchr(type->tp_name, '.');
395+
if (s == NULL) {
396+
s = type->tp_name;
397+
}
398+
else {
399+
s++;
400+
}
401+
return s;
402+
}
403+
391404
static PyObject *
392405
type_name(PyTypeObject *type, void *context)
393406
{
394-
const char *s;
395-
396407
if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) {
397408
PyHeapTypeObject* et = (PyHeapTypeObject*)type;
398409

399410
Py_INCREF(et->ht_name);
400411
return et->ht_name;
401412
}
402413
else {
403-
s = strrchr(type->tp_name, '.');
404-
if (s == NULL)
405-
s = type->tp_name;
406-
else
407-
s++;
408-
return PyUnicode_FromString(s);
414+
return PyUnicode_FromString(_PyType_Name(type));
409415
}
410416
}
411417

@@ -418,7 +424,7 @@ type_qualname(PyTypeObject *type, void *context)
418424
return et->ht_qualname;
419425
}
420426
else {
421-
return type_name(type, context);
427+
return PyUnicode_FromString(_PyType_Name(type));
422428
}
423429
}
424430

0 commit comments

Comments
 (0)