From f9bd6b09e1dabdf85df9a858defaba3a99ad3d66 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Martin=20v=2E=20L=C3=B6wis?= Date: Mon, 18 Feb 2002 17:46:48 +0000 Subject: [PATCH] Allow __doc__ to be of arbitrary type. Patch by James Henstridge, fixes #504343. 2.2.1 candidate. --- Objects/typeobject.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) 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) { -- 2.40.0