only clear a module's __dict__ if the module is the only one with a reference to it #7140
This commit is contained in:
parent
96e319e5ac
commit
196b0925ca
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue