mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	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
					
				
					 3 changed files with 15 additions and 1 deletions
				
			
		|  | @ -55,6 +55,14 @@ def test_reinit(self): | |||
|               {"__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) | ||||
| 
 | ||||
|  |  | |||
|  | @ -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. | ||||
|  |  | |||
|  | @ -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); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Benjamin Peterson
						Benjamin Peterson