https://github.com/python/cpython/commit/5fb9fe0e3e3f71b9a5197b19e8f6068c059d341c commit: 5fb9fe0e3e3f71b9a5197b19e8f6068c059d341c branch: 3.13 author: sobolevn <m...@sobolevn.me> committer: sobolevn <m...@sobolevn.me> date: 2025-04-06T17:08:48Z summary:
[3.13] gh-132011: Fix crash on invalid `CALL_LIST_APPEND` deoptimization (GH-132018) (#132161) * [3.13] gh-132011: Fix crash on invalid `CALL_LIST_APPEND` deoptimization (GH-132018) (cherry picked from commit c0661df42ad20e488dbfa3e0fec22462833fc3d6) Co-authored-by: sobolevn <m...@sobolevn.me> Co-authored-by: Victor Stinner <vstin...@python.org> Co-authored-by: Peter Bierma <zintensity...@gmail.com> files: A Misc/NEWS.d/next/Core_and_Builtins/2025-04-02-17-47-14.gh-issue-132011.dNh64H.rst M Lib/test/test_list.py M Python/bytecodes.c M Python/generated_cases.c.h diff --git a/Lib/test/test_list.py b/Lib/test/test_list.py index ad7accf2099f43..005374f429399f 100644 --- a/Lib/test/test_list.py +++ b/Lib/test/test_list.py @@ -1,6 +1,8 @@ import sys +import textwrap from test import list_tests from test.support import cpython_only +from test.support.script_helper import assert_python_ok import pickle import unittest @@ -309,5 +311,25 @@ def test_tier2_invalidates_iterator(self): a.append(4) self.assertEqual(list(it), []) + def test_deopt_from_append_list(self): + # gh-132011: it used to crash, because + # of `CALL_LIST_APPEND` specialization failure. + code = textwrap.dedent(""" + l = [] + def lappend(l, x, y): + l.append((x, y)) + for x in range(3): + lappend(l, None, None) + try: + lappend(list, None, None) + except TypeError: + pass + else: + raise AssertionError + """) + + rc, _, _ = assert_python_ok("-c", code) + self.assertEqual(rc, 0) + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-04-02-17-47-14.gh-issue-132011.dNh64H.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-04-02-17-47-14.gh-issue-132011.dNh64H.rst new file mode 100644 index 00000000000000..b2484bf7c01a72 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-04-02-17-47-14.gh-issue-132011.dNh64H.rst @@ -0,0 +1 @@ +Fix crash when calling :meth:`!list.append` as an unbound method. diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 1e6185d3c9e489..ba8ecc7faf2dbc 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -3631,7 +3631,7 @@ dummy_func( assert(oparg == 1); PyInterpreterState *interp = tstate->interp; DEOPT_IF(callable != interp->callable_cache.list_append); - assert(self != NULL); + DEOPT_IF(self == NULL); DEOPT_IF(!PyList_Check(self)); STAT_INC(CALL, hit); if (_PyList_AppendTakeRef((PyListObject *)self, arg) < 0) { diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 1488e4215cf579..93d5a782b469d4 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -1590,7 +1590,7 @@ assert(oparg == 1); PyInterpreterState *interp = tstate->interp; DEOPT_IF(callable != interp->callable_cache.list_append, CALL); - assert(self != NULL); + DEOPT_IF(self == NULL, CALL); DEOPT_IF(!PyList_Check(self), CALL); STAT_INC(CALL, hit); if (_PyList_AppendTakeRef((PyListObject *)self, arg) < 0) { _______________________________________________ Python-checkins mailing list -- python-checkins@python.org To unsubscribe send an email to python-checkins-le...@python.org https://mail.python.org/mailman3/lists/python-checkins.python.org/ Member address: arch...@mail-archive.com