mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
closes bpo-41689: Preserve text signature from tp_doc in C heap type creation. (GH-22058)
This commit is contained in:
parent
5a4a963a6c
commit
3940333637
4 changed files with 48 additions and 3 deletions
|
@ -3018,15 +3018,14 @@ PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases)
|
|||
else if (slot->slot == Py_tp_doc) {
|
||||
/* For the docstring slot, which usually points to a static string
|
||||
literal, we need to make a copy */
|
||||
const char *old_doc = _PyType_DocWithoutSignature(type->tp_name, slot->pfunc);
|
||||
size_t len = strlen(old_doc)+1;
|
||||
size_t len = strlen(slot->pfunc)+1;
|
||||
char *tp_doc = PyObject_MALLOC(len);
|
||||
if (tp_doc == NULL) {
|
||||
type->tp_doc = NULL;
|
||||
PyErr_NoMemory();
|
||||
goto fail;
|
||||
}
|
||||
memcpy(tp_doc, old_doc, len);
|
||||
memcpy(tp_doc, slot->pfunc, len);
|
||||
type->tp_doc = tp_doc;
|
||||
}
|
||||
else if (slot->slot == Py_tp_members) {
|
||||
|
@ -3058,6 +3057,16 @@ PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases)
|
|||
res->ht_cached_keys = _PyDict_NewKeysForClass();
|
||||
}
|
||||
|
||||
if (type->tp_doc) {
|
||||
PyObject *__doc__ = PyUnicode_FromString(_PyType_DocWithoutSignature(type->tp_name, type->tp_doc));
|
||||
if (!__doc__)
|
||||
goto fail;
|
||||
int ret = _PyDict_SetItemId(type->tp_dict, &PyId___doc__, __doc__);
|
||||
Py_DECREF(__doc__);
|
||||
if (ret < 0)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (weaklistoffset) {
|
||||
type->tp_weaklistoffset = weaklistoffset;
|
||||
if (PyDict_DelItemString((PyObject *)type->tp_dict, "__weaklistoffset__") < 0)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue