mirror of
https://github.com/python/cpython.git
synced 2025-10-06 15:11:58 +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 @@ class GCTests(unittest.TestCase):
|
||||||
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