mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	bpo-24596: Decref module in PyRun_SimpleFileExFlags() on SystemExit (GH-7918)
PyErr_Print() will not return when the exception is a SystemExit, so decref the __main__ module object in that case.
This commit is contained in:
		
							parent
							
								
									831c29721d
								
							
						
					
					
						commit
						d8cba5d16f
					
				
					 3 changed files with 20 additions and 2 deletions
				
			
		|  | @ -1,7 +1,7 @@ | ||||||
| import unittest | import unittest | ||||||
| from test.support import (verbose, refcount_test, run_unittest, | from test.support import (verbose, refcount_test, run_unittest, | ||||||
|                           strip_python_stderr, cpython_only, start_threads, |                           strip_python_stderr, cpython_only, start_threads, | ||||||
|                           temp_dir, requires_type_collecting) |                           temp_dir, requires_type_collecting, TESTFN, unlink) | ||||||
| from test.support.script_helper import assert_python_ok, make_script | from test.support.script_helper import assert_python_ok, make_script | ||||||
| 
 | 
 | ||||||
| import sys | import sys | ||||||
|  | @ -708,6 +708,21 @@ def __del__(self): | ||||||
|             rc, out, err = assert_python_ok('-c', code) |             rc, out, err = assert_python_ok('-c', code) | ||||||
|             self.assertEqual(out.strip(), b'__del__ called') |             self.assertEqual(out.strip(), b'__del__ called') | ||||||
| 
 | 
 | ||||||
|  |     @requires_type_collecting | ||||||
|  |     def test_global_del_SystemExit(self): | ||||||
|  |         code = """if 1: | ||||||
|  |             class ClassWithDel: | ||||||
|  |                 def __del__(self): | ||||||
|  |                     print('__del__ called') | ||||||
|  |             a = ClassWithDel() | ||||||
|  |             a.link = a | ||||||
|  |             raise SystemExit(0)""" | ||||||
|  |         self.addCleanup(unlink, TESTFN) | ||||||
|  |         with open(TESTFN, 'w') as script: | ||||||
|  |             script.write(code) | ||||||
|  |         rc, out, err = assert_python_ok(TESTFN) | ||||||
|  |         self.assertEqual(out.strip(), b'__del__ called') | ||||||
|  | 
 | ||||||
|     def test_get_stats(self): |     def test_get_stats(self): | ||||||
|         stats = gc.get_stats() |         stats = gc.get_stats() | ||||||
|         self.assertEqual(len(stats), 3) |         self.assertEqual(len(stats), 3) | ||||||
|  |  | ||||||
|  | @ -0,0 +1,2 @@ | ||||||
|  | Decref the module object in :c:func:`PyRun_SimpleFileExFlags` before calling | ||||||
|  | :c:func:`PyErr_Print()`.  Patch by Zackery Spytz. | ||||||
|  | @ -431,6 +431,7 @@ PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit, | ||||||
|     } |     } | ||||||
|     flush_io(); |     flush_io(); | ||||||
|     if (v == NULL) { |     if (v == NULL) { | ||||||
|  |         Py_CLEAR(m); | ||||||
|         PyErr_Print(); |         PyErr_Print(); | ||||||
|         goto done; |         goto done; | ||||||
|     } |     } | ||||||
|  | @ -439,7 +440,7 @@ PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit, | ||||||
|   done: |   done: | ||||||
|     if (set_file_name && PyDict_DelItemString(d, "__file__")) |     if (set_file_name && PyDict_DelItemString(d, "__file__")) | ||||||
|         PyErr_Clear(); |         PyErr_Clear(); | ||||||
|     Py_DECREF(m); |     Py_XDECREF(m); | ||||||
|     return ret; |     return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Zackery Spytz
						Zackery Spytz