]> granicus.if.org Git - python/commitdiff
Nudge getting __module__ and __name__ for new-style classes so that
authorMichael W. Hudson <mwh@python.net>
Wed, 27 Nov 2002 16:29:26 +0000 (16:29 +0000)
committerMichael W. Hudson <mwh@python.net>
Wed, 27 Nov 2002 16:29:26 +0000 (16:29 +0000)
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?

Lib/test/test_descr.py
Objects/typeobject.c

index 99eecd3f9e015ea84a567bebfa51d7ee0d22cebc..76636a9ec1ab10dc711f9b35277b625bc3f9d56e 100644 (file)
@@ -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()
index d83ff8cab58ba8a2776a3a28870806f25434f103..4cfbd49fc4d07b7dc9911d6de9718350c4e3af16 100644 (file)
@@ -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