From 58d3f9bdf0d866cc3b420646ed4605fc32c94da8 Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Wed, 17 Jul 2024 11:31:28 +0200 Subject: [PATCH] gh-121863: Immortalize names in code objects to avoid crash (GH-121903) (cherry picked from commit cffad5c6ef9371b26e32556296cea2bfe8358b1a) Co-authored-by: Petr Viktorin --- Lib/test/test_scope.py | 24 ++++++++++++++++++++++++ Objects/codeobject.c | 2 +- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_scope.py b/Lib/test/test_scope.py index 6e46dfa96a664f..24a366efc6ca05 100644 --- a/Lib/test/test_scope.py +++ b/Lib/test/test_scope.py @@ -810,6 +810,30 @@ def dig(self): gc_collect() # For PyPy or other GCs. self.assertIsNone(ref()) + def test_multiple_nesting(self): + # Regression test for https://github.com/python/cpython/issues/121863 + class MultiplyNested: + def f1(self): + __arg = 1 + class D: + def g(self, __arg): + return __arg + return D().g(_MultiplyNested__arg=2) + + def f2(self): + __arg = 1 + class D: + def g(self, __arg): + return __arg + return D().g + + inst = MultiplyNested() + with self.assertRaises(TypeError): + inst.f1() + + closure = inst.f2() + with self.assertRaises(TypeError): + closure(_MultiplyNested__arg=2) if __name__ == '__main__': unittest.main() diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 7b1244a8d5fd21..fbc1439d30c27a 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -147,7 +147,7 @@ intern_strings(PyObject *tuple) "non-string found in code slot"); return -1; } - _PyUnicode_InternMortal(interp, &_PyTuple_ITEMS(tuple)[i]); + _PyUnicode_InternImmortal(interp, &_PyTuple_ITEMS(tuple)[i]); } return 0; }