summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorMartin v. Löwis <martin@v.loewis.de>2002-02-18 17:46:48 (GMT)
committerMartin v. Löwis <martin@v.loewis.de>2002-02-18 17:46:48 (GMT)
commitf9bd6b09e1dabdf85df9a858defaba3a99ad3d66 (patch)
treecf85f05a9b046a6223ad83ebc56e5f134a5f2868 /Objects
parent82c6682bb776bb59e10a522897534af69938194f (diff)
downloadcpython-f9bd6b09e1dabdf85df9a858defaba3a99ad3d66.zip
cpython-f9bd6b09e1dabdf85df9a858defaba3a99ad3d66.tar.gz
cpython-f9bd6b09e1dabdf85df9a858defaba3a99ad3d66.tar.bz2
Allow __doc__ to be of arbitrary type. Patch by James Henstridge,
fixes #504343. 2.2.1 candidate.
Diffstat (limited to 'Objects')
-rw-r--r--Objects/typeobject.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index b8a33c8..df6d6f2 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) {