Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 35a96a2

Browse files
committed
Issue #29383: reduce temporary interned unicode
add_methods(), add_members(), and add_getset() used PyDict_SetItemString() to register descriptor to the type's dict. So descr_new() and PyDict_SetItemString() creates interned unicode from same C string. This patch takes interned unicode from descriptor, and use PyDict_SetItem() instead of PyDict_SetItemString(). python_startup_no_site: default: Median +- std dev: 12.7 ms +- 0.1 ms patched: Median +- std dev: 12.5 ms +- 0.1 ms
1 parent 49688cd commit 35a96a2

1 file changed

Lines changed: 10 additions & 3 deletions

File tree

Objects/typeobject.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4539,6 +4539,7 @@ add_methods(PyTypeObject *type, PyMethodDef *meth)
45394539
for (; meth->ml_name != NULL; meth++) {
45404540
PyObject *descr;
45414541
int err;
4542+
int isdescr = 1;
45424543
if (PyDict_GetItemString(dict, meth->ml_name) &&
45434544
!(meth->ml_flags & METH_COEXIST))
45444545
continue;
@@ -4555,14 +4556,20 @@ add_methods(PyTypeObject *type, PyMethodDef *meth)
45554556
if (cfunc == NULL)
45564557
return -1;
45574558
descr = PyStaticMethod_New(cfunc);
4559+
isdescr = 0; // PyStaticMethod is not PyDescrObject
45584560
Py_DECREF(cfunc);
45594561
}
45604562
else {
45614563
descr = PyDescr_NewMethod(type, meth);
45624564
}
45634565
if (descr == NULL)
45644566
return -1;
4565-
err = PyDict_SetItemString(dict, meth->ml_name, descr);
4567+
if (isdescr) {
4568+
err = PyDict_SetItem(dict, PyDescr_NAME(descr), descr);
4569+
}
4570+
else {
4571+
err = PyDict_SetItemString(dict, meth->ml_name, descr);
4572+
}
45664573
Py_DECREF(descr);
45674574
if (err < 0)
45684575
return -1;
@@ -4582,7 +4589,7 @@ add_members(PyTypeObject *type, PyMemberDef *memb)
45824589
descr = PyDescr_NewMember(type, memb);
45834590
if (descr == NULL)
45844591
return -1;
4585-
if (PyDict_SetItemString(dict, memb->name, descr) < 0) {
4592+
if (PyDict_SetItem(dict, PyDescr_NAME(descr), descr) < 0) {
45864593
Py_DECREF(descr);
45874594
return -1;
45884595
}
@@ -4604,7 +4611,7 @@ add_getset(PyTypeObject *type, PyGetSetDef *gsp)
46044611

46054612
if (descr == NULL)
46064613
return -1;
4607-
if (PyDict_SetItemString(dict, gsp->name, descr) < 0) {
4614+
if (PyDict_SetItem(dict, PyDescr_NAME(descr), descr) < 0) {
46084615
Py_DECREF(descr);
46094616
return -1;
46104617
}

0 commit comments

Comments
 (0)