diff options
author | Michael W. Hudson <mwh@python.net> | 2002-11-27 16:29:26 (GMT) |
---|---|---|
committer | Michael W. Hudson <mwh@python.net> | 2002-11-27 16:29:26 (GMT) |
commit | ade8c8b2c3a158013564a6adbd92686b5f3340c9 (patch) | |
tree | e991ed37bd078f9730bcebca7f80037be077ae01 | |
parent | deaba570097c73145a46707efd94134eb2c6cda3 (diff) | |
download | cpython-ade8c8b2c3a158013564a6adbd92686b5f3340c9.zip cpython-ade8c8b2c3a158013564a6adbd92686b5f3340c9.tar.gz cpython-ade8c8b2c3a158013564a6adbd92686b5f3340c9.tar.bz2 |
Nudge getting __module__ and __name__ for new-style classes so that
the results of *setting* __name__ are not so surprising.
If people can suggest more tests, that'd be grand, or is what's there
sufficient?
-rw-r--r-- | Lib/test/test_descr.py | 10 | ||||
-rw-r--r-- | Objects/typeobject.c | 41 |
2 files changed, 33 insertions, 18 deletions
diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 99eecd3..76636a9 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -3603,7 +3603,15 @@ def mutable_names(): class C(object): pass - C.__name__ = 'C' + # C.__module__ could be 'test_descr' or '__main__' + mod = C.__module__ + + C.__name__ = 'D' + vereq((C.__module__, C.__name__), (mod, 'D')) + + C.__name__ = 'D.E' + vereq((C.__module__, C.__name__), (mod, 'D.E')) + def test_main(): do_this_first() diff --git a/Objects/typeobject.c b/Objects/typeobject.c index d83ff8c..4cfbd49 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -41,12 +41,20 @@ type_name(PyTypeObject *type, void *context) { char *s; - s = strrchr(type->tp_name, '.'); - if (s == NULL) - s = type->tp_name; - else - s++; - return PyString_FromString(s); + if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) { + etype* et = (etype*)type; + + Py_INCREF(et->name); + return et->name; + } + else { + s = strrchr(type->tp_name, '.'); + if (s == NULL) + s = type->tp_name; + else + s++; + return PyString_FromString(s); + } } static int @@ -95,19 +103,18 @@ type_module(PyTypeObject *type, void *context) PyObject *mod; char *s; - s = strrchr(type->tp_name, '.'); - if (s != NULL) - return PyString_FromStringAndSize(type->tp_name, - (int)(s - type->tp_name)); - if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) - return PyString_FromString("__builtin__"); - mod = PyDict_GetItemString(type->tp_dict, "__module__"); - if (mod != NULL) { - Py_INCREF(mod); + if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) { + mod = PyDict_GetItemString(type->tp_dict, "__module__"); + Py_XINCREF(mod); return mod; } - PyErr_SetString(PyExc_AttributeError, "__module__"); - return NULL; + else { + s = strrchr(type->tp_name, '.'); + if (s != NULL) + return PyString_FromStringAndSize( + type->tp_name, (int)(s - type->tp_name)); + return PyString_FromString("__builtin__"); + } } static int |