From: Martin v. Löwis Date: Mon, 18 Feb 2002 17:46:48 +0000 (+0000) Subject: Allow __doc__ to be of arbitrary type. Patch by James Henstridge, X-Git-Tag: v2.3c1~6648 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f9bd6b09e1dabdf85df9a858defaba3a99ad3d66;p=python Allow __doc__ to be of arbitrary type. Patch by James Henstridge, fixes #504343. 2.2.1 candidate. --- diff --git a/Objects/typeobject.c b/Objects/typeobject.c index b8a33c8907..df6d6f291d 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -8,7 +8,6 @@ static PyMemberDef type_members[] = { {"__basicsize__", T_INT, offsetof(PyTypeObject,tp_basicsize),READONLY}, {"__itemsize__", T_INT, offsetof(PyTypeObject, tp_itemsize), READONLY}, {"__flags__", T_LONG, offsetof(PyTypeObject, tp_flags), READONLY}, - {"__doc__", T_STRING, offsetof(PyTypeObject, tp_doc), READONLY}, {"__weakrefoffset__", T_LONG, offsetof(PyTypeObject, tp_weaklistoffset), READONLY}, {"__base__", T_OBJECT, offsetof(PyTypeObject, tp_base), READONLY}, @@ -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 - and is a string (tp_doc is a char* -- can't copy a general object - into it). - XXX What if it's a Unicode string? Don't know -- this ignores it. + and is a string. Note that the tp_doc slot will only be used + by C code -- python code will use the version in tp_dict, so + it isn't that important that non string __doc__'s are ignored. */ { PyObject *doc = PyDict_GetItemString(dict, "__doc__"); @@ -2024,6 +2023,19 @@ PyType_Ready(PyTypeObject *type) 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 */ base = type->tp_base; if (base != NULL) {