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

This commit is contained in:
Benjamin Peterson 2009-10-15 15:44:46 +00:00
parent 96e319e5ac
commit 196b0925ca
3 changed files with 15 additions and 1 deletions

View File

@ -55,6 +55,14 @@ class ModuleTests(unittest.TestCase):
{"__name__": "foo", "__doc__": "foodoc", "bar": 42}) {"__name__": "foo", "__doc__": "foodoc", "bar": 42})
self.assertTrue(foo.__dict__ is d) 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(): def test_main():
run_unittest(ModuleTests) run_unittest(ModuleTests)

View File

@ -12,6 +12,9 @@ What's New in Python 2.7 alpha 1
Core and Builtins 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. - Issue #1754094: Improve the stack depth calculation in the compiler.
There should be no other effect than a small decrease in memory use. There should be no other effect than a small decrease in memory use.
Patch by Christopher Tur Lesniewski-Laas. Patch by Christopher Tur Lesniewski-Laas.

View File

@ -175,7 +175,10 @@ module_dealloc(PyModuleObject *m)
{ {
PyObject_GC_UnTrack(m); PyObject_GC_UnTrack(m);
if (m->md_dict != NULL) { 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_DECREF(m->md_dict);
} }
Py_TYPE(m)->tp_free((PyObject *)m); Py_TYPE(m)->tp_free((PyObject *)m);