mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
bpo-30817: Fix PyErr_PrintEx() when no memory (#2526)
This commit is contained in:
parent
4ffd4653a7
commit
66caacf2f0
3 changed files with 29 additions and 4 deletions
|
@ -10,7 +10,7 @@ import errno
|
||||||
|
|
||||||
from test.support import (TESTFN, captured_stderr, check_impl_detail,
|
from test.support import (TESTFN, captured_stderr, check_impl_detail,
|
||||||
check_warnings, cpython_only, gc_collect, run_unittest,
|
check_warnings, cpython_only, gc_collect, run_unittest,
|
||||||
no_tracing, unlink, import_module)
|
no_tracing, unlink, import_module, script_helper)
|
||||||
|
|
||||||
class NaiveException(Exception):
|
class NaiveException(Exception):
|
||||||
def __init__(self, x):
|
def __init__(self, x):
|
||||||
|
@ -1097,6 +1097,23 @@ class ExceptionTests(unittest.TestCase):
|
||||||
self.assertIn("test message", report)
|
self.assertIn("test message", report)
|
||||||
self.assertTrue(report.endswith("\n"))
|
self.assertTrue(report.endswith("\n"))
|
||||||
|
|
||||||
|
@cpython_only
|
||||||
|
def test_memory_error_in_PyErr_PrintEx(self):
|
||||||
|
code = """if 1:
|
||||||
|
import _testcapi
|
||||||
|
class C(): pass
|
||||||
|
_testcapi.set_nomemory(0, %d)
|
||||||
|
C()
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Issue #30817: Abort in PyErr_PrintEx() when no memory.
|
||||||
|
# Span a large range of tests as the CPython code always evolves with
|
||||||
|
# changes that add or remove memory allocations.
|
||||||
|
for i in range(1, 20):
|
||||||
|
rc, out, err = script_helper.assert_python_failure("-c", code % i)
|
||||||
|
self.assertIn(rc, (1, 120))
|
||||||
|
self.assertIn(b'MemoryError', err)
|
||||||
|
|
||||||
def test_yield_in_nested_try_excepts(self):
|
def test_yield_in_nested_try_excepts(self):
|
||||||
#Issue #25612
|
#Issue #25612
|
||||||
class MainError(Exception):
|
class MainError(Exception):
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
`PyErr_PrintEx()` clears now the ignored exception that may be raised by
|
||||||
|
`_PySys_SetObjectId()`, for example when no memory.
|
|
@ -630,9 +630,15 @@ PyErr_PrintEx(int set_sys_last_vars)
|
||||||
return;
|
return;
|
||||||
/* Now we know v != NULL too */
|
/* Now we know v != NULL too */
|
||||||
if (set_sys_last_vars) {
|
if (set_sys_last_vars) {
|
||||||
_PySys_SetObjectId(&PyId_last_type, exception);
|
if (_PySys_SetObjectId(&PyId_last_type, exception) < 0) {
|
||||||
_PySys_SetObjectId(&PyId_last_value, v);
|
PyErr_Clear();
|
||||||
_PySys_SetObjectId(&PyId_last_traceback, tb);
|
}
|
||||||
|
if (_PySys_SetObjectId(&PyId_last_value, v) < 0) {
|
||||||
|
PyErr_Clear();
|
||||||
|
}
|
||||||
|
if (_PySys_SetObjectId(&PyId_last_traceback, tb) < 0) {
|
||||||
|
PyErr_Clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
hook = _PySys_GetObjectId(&PyId_excepthook);
|
hook = _PySys_GetObjectId(&PyId_excepthook);
|
||||||
if (hook) {
|
if (hook) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue