Commit f9bd6b09 authored by Martin v. Löwis's avatar Martin v. Löwis

Allow __doc__ to be of arbitrary type. Patch by James Henstridge,

fixes #504343. 2.2.1 candidate.
parent 82c6682b
...@@ -8,7 +8,6 @@ static PyMemberDef type_members[] = { ...@@ -8,7 +8,6 @@ static PyMemberDef type_members[] = {
{"__basicsize__", T_INT, offsetof(PyTypeObject,tp_basicsize),READONLY}, {"__basicsize__", T_INT, offsetof(PyTypeObject,tp_basicsize),READONLY},
{"__itemsize__", T_INT, offsetof(PyTypeObject, tp_itemsize), READONLY}, {"__itemsize__", T_INT, offsetof(PyTypeObject, tp_itemsize), READONLY},
{"__flags__", T_LONG, offsetof(PyTypeObject, tp_flags), READONLY}, {"__flags__", T_LONG, offsetof(PyTypeObject, tp_flags), READONLY},
{"__doc__", T_STRING, offsetof(PyTypeObject, tp_doc), READONLY},
{"__weakrefoffset__", T_LONG, {"__weakrefoffset__", T_LONG,
offsetof(PyTypeObject, tp_weaklistoffset), READONLY}, offsetof(PyTypeObject, tp_weaklistoffset), READONLY},
{"__base__", T_OBJECT, offsetof(PyTypeObject, tp_base), READONLY}, {"__base__", T_OBJECT, offsetof(PyTypeObject, tp_base), READONLY},
...@@ -1044,9 +1043,9 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds) ...@@ -1044,9 +1043,9 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
} }
/* Set tp_doc to a copy of dict['__doc__'], if the latter is there /* Set tp_doc to a copy of dict['__doc__'], if the latter is there
and is a string (tp_doc is a char* -- can't copy a general object and is a string. Note that the tp_doc slot will only be used
into it). by C code -- python code will use the version in tp_dict, so
XXX What if it's a Unicode string? Don't know -- this ignores it. it isn't that important that non string __doc__'s are ignored.
*/ */
{ {
PyObject *doc = PyDict_GetItemString(dict, "__doc__"); PyObject *doc = PyDict_GetItemString(dict, "__doc__");
...@@ -2024,6 +2023,19 @@ PyType_Ready(PyTypeObject *type) ...@@ -2024,6 +2023,19 @@ PyType_Ready(PyTypeObject *type)
inherit_slots(type, (PyTypeObject *)b); inherit_slots(type, (PyTypeObject *)b);
} }
/* if the type dictionary doesn't contain a __doc__, set it from
the tp_doc slot.
*/
if (PyDict_GetItemString(type->tp_dict, "__doc__") == NULL) {
if (type->tp_doc != NULL) {
PyObject *doc = PyString_FromString(type->tp_doc);
PyDict_SetItemString(type->tp_dict, "__doc__", doc);
Py_DECREF(doc);
} else {
PyDict_SetItemString(type->tp_dict, "__doc__", Py_None);
}
}
/* Some more special stuff */ /* Some more special stuff */
base = type->tp_base; base = type->tp_base;
if (base != NULL) { if (base != NULL) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment