summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael W. Hudson <mwh@python.net>2002-11-27 16:29:26 (GMT)
committerMichael W. Hudson <mwh@python.net>2002-11-27 16:29:26 (GMT)
commitade8c8b2c3a158013564a6adbd92686b5f3340c9 (patch)
treee991ed37bd078f9730bcebca7f80037be077ae01
parentdeaba570097c73145a46707efd94134eb2c6cda3 (diff)
downloadcpython-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.py10
-rw-r--r--Objects/typeobject.c41
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