Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
1202ec6
fix: exec('_testcapi.set_nomemory(0)') hang in new repl 3.13
yihong0618 Sep 4, 2025
4cd38e8
chore: add news for it
yihong0618 Sep 4, 2025
e557017
Update Python/ceval.c
yihong0618 Sep 4, 2025
53f713c
fix: add unittest for it
yihong0618 Sep 4, 2025
9cc89f1
fix: make test info better
yihong0618 Sep 4, 2025
a9b6f96
fix: better test without print
yihong0618 Sep 5, 2025
66ec42e
Update Misc/NEWS.d/next/Core_and_Builtins/2025-09-04-11-52-23.gh-issu…
yihong0618 Sep 5, 2025
a9e6b64
Update Lib/test/test_repl.py
yihong0618 Sep 5, 2025
791ca86
fix: address comments
yihong0618 Sep 5, 2025
4827680
Update Lib/test/test_repl.py
yihong0618 Sep 5, 2025
8ec5769
fix: follow up another comments
yihong0618 Sep 5, 2025
edcfff7
fix: should set the error when no memory
yihong0618 Sep 7, 2025
81c6244
fix: exec('_testcapi.set_nomemory(0)') hang in new repl 3.13
yihong0618 Sep 4, 2025
847bd7b
chore: add news for it
yihong0618 Sep 4, 2025
ff3c7f4
Update Python/ceval.c
yihong0618 Sep 4, 2025
175a13e
fix: add unittest for it
yihong0618 Sep 4, 2025
d952d53
fix: make test info better
yihong0618 Sep 4, 2025
5fa3a1b
fix: better test without print
yihong0618 Sep 5, 2025
d3274fb
Update Misc/NEWS.d/next/Core_and_Builtins/2025-09-04-11-52-23.gh-issu…
yihong0618 Sep 5, 2025
c89c5b5
Update Lib/test/test_repl.py
yihong0618 Sep 5, 2025
63a6b7d
fix: address comments
yihong0618 Sep 5, 2025
977703f
Update Lib/test/test_repl.py
yihong0618 Sep 5, 2025
095f865
fix: follow up another comments
yihong0618 Sep 5, 2025
932c15e
fix: should set the error when no memory
yihong0618 Sep 7, 2025
52310f0
Merge branch '3.13' into hy/fix_issue_134163
ZeroIntensity Sep 7, 2025
bb790af
fix: in TraceRefs it will return fatal error
yihong0618 Sep 9, 2025
06b779a
fix: use support.Py_TRACE_REFS
yihong0618 Sep 9, 2025
30cd34d
Merge branch 'hy/fix_issue_134163' of https://github.com/yihong0618/c…
yihong0618 Sep 9, 2025
26ce31b
fix: use spawn_python
yihong0618 Sep 10, 2025
5ab08c7
fix: address comments
yihong0618 Sep 10, 2025
789040c
Apply suggestions from code review
yihong0618 Sep 10, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions Lib/test/test_exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -1843,6 +1843,38 @@ def test_memory_error_in_subinterp(self):
rc, _, err = script_helper.assert_python_ok("-c", code)
self.assertIn(b'MemoryError', err)

@cpython_only
# Python built with Py_TRACE_REFS fail with a fatal error in
# _PyRefchain_Trace() on memory allocation error.
@unittest.skipIf(support.Py_TRACE_REFS, 'cannot test Py_TRACE_REFS build')
def test_exec_set_nomemory_hang(self):
import_module("_testcapi")
# gh-134163: A MemoryError inside code that was wrapped by a try/except
# block would lead to an infinite loop.

# The frame_lasti needs to be greater than 257 to prevent
# PyLong_FromLong() from returning cached integers, which
# don't require a memory allocation. Prepend some dummy code
# to artificially increase the instruction index.
warmup_code = "a = list(range(0, 1))\n" * 20
user_input = warmup_code + dedent("""
try:
import _testcapi
_testcapi.set_nomemory(0)
b = list(range(1000, 2000))
except Exception as e:
import traceback
traceback.print_exc()
""")
with SuppressCrashReport():
with script_helper.spawn_python('-c', user_input) as p:
p.wait()
output = p.stdout.read()

self.assertIn(p.returncode, (0, 1))
self.assertGreater(len(output), 0) # At minimum, should not hang
self.assertIn(b"MemoryError", output)


class NameErrorTests(unittest.TestCase):
def test_name_error_has_name(self):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix a hang when the process is out of memory inside an exception handler.
6 changes: 5 additions & 1 deletion Python/ceval.c
Original file line number Diff line number Diff line change
Expand Up @@ -912,7 +912,11 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int
int frame_lasti = _PyInterpreterFrame_LASTI(frame);
PyObject *lasti = PyLong_FromLong(frame_lasti);
if (lasti == NULL) {
goto exception_unwind;
// Instead of going back to exception_unwind (which would cause
// infinite recursion), directly exit to let the original exception
// propagate up and hopefully be handled at a higher level.
_PyFrame_SetStackPointer(frame, stack_pointer);
goto exit_unwind;
}
PUSH(lasti);
}
Expand Down
Loading