]> granicus.if.org Git - python/commitdiff
only clear a module's __dict__ if the module is the only one with a reference to...
authorBenjamin Peterson <benjamin@python.org>
Thu, 15 Oct 2009 15:44:46 +0000 (15:44 +0000)
committerBenjamin Peterson <benjamin@python.org>
Thu, 15 Oct 2009 15:44:46 +0000 (15:44 +0000)
Lib/test/test_module.py
Misc/NEWS
Objects/moduleobject.c

index 80d440d215f61f65c0507f7f6ed9f770bc1b339a..638f55bcfd8cd52b382c0285a03727cf7225437f 100644 (file)
@@ -55,6 +55,14 @@ class ModuleTests(unittest.TestCase):
               {"__name__": "foo", "__doc__": "foodoc", "bar": 42})
         self.assertTrue(foo.__dict__ is d)
 
+    def test_dont_clear_dict(self):
+        # See issue 7140.
+        def f():
+            foo = ModuleType("foo")
+            foo.bar = 4
+            return foo
+        self.assertEqual(f().__dict__["bar"], 4)
+
 def test_main():
     run_unittest(ModuleTests)
 
index 276fc561f9ff547c3827ec60f06f1a19b4c5179a..0e85ba08a7547331d25a90f0fd3118715b62c5bf 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,9 @@ What's New in Python 2.7 alpha 1
 Core and Builtins
 -----------------
 
+- Issue #7140: The __dict__ of a module should not be cleared unless the module
+  is the only object holding a reference to it.
+
 - Issue #1754094: Improve the stack depth calculation in the compiler.
   There should be no other effect than a small decrease in memory use.
   Patch by Christopher Tur Lesniewski-Laas.
index d1aa771935768b2c6b1f56e1f406379211395ecc..c9f00e9934cc7f36f6d29150e7202698cb662e82 100644 (file)
@@ -175,7 +175,10 @@ module_dealloc(PyModuleObject *m)
 {
        PyObject_GC_UnTrack(m);
        if (m->md_dict != NULL) {
-               _PyModule_Clear((PyObject *)m);
+               /* If we are the only ones holding a reference, we can clear
+                  the dictionary. */
+               if (Py_REFCNT(m->md_dict) == 1)
+                       _PyModule_Clear((PyObject *)m);
                Py_DECREF(m->md_dict);
        }
        Py_TYPE(m)->tp_free((PyObject *)m);