[Python-checkins] r75437 - in python/trunk: Lib/test/test_module.py Misc/NEWS Objects/moduleobject.c

benjamin.peterson python-checkins at python.org
Thu Oct 15 17:44:46 CEST 2009


Author: benjamin.peterson
Date: Thu Oct 15 17:44:46 2009
New Revision: 75437

Log:
only clear a module's __dict__ if the module is the only one with a reference to it #7140

Modified:
   python/trunk/Lib/test/test_module.py
   python/trunk/Misc/NEWS
   python/trunk/Objects/moduleobject.c

Modified: python/trunk/Lib/test/test_module.py
==============================================================================
--- python/trunk/Lib/test/test_module.py	(original)
+++ python/trunk/Lib/test/test_module.py	Thu Oct 15 17:44:46 2009
@@ -55,6 +55,14 @@
               {"__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)
 

Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Thu Oct 15 17:44:46 2009
@@ -12,6 +12,9 @@
 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.

Modified: python/trunk/Objects/moduleobject.c
==============================================================================
--- python/trunk/Objects/moduleobject.c	(original)
+++ python/trunk/Objects/moduleobject.c	Thu Oct 15 17:44:46 2009
@@ -175,7 +175,10 @@
 {
 	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);


More information about the Python-checkins mailing list