From: Tian Gao Date: Sun, 5 May 2024 03:06:42 +0000 (-0700) Subject: gh-74929: Remove undesirable DECREF in PEP 667 implementation (#118583) X-Git-Tag: v3.13.0b1~104 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5dd36732c850084ce262b7869ed90d73a281296a;p=thirdparty%2FPython%2Fcpython.git gh-74929: Remove undesirable DECREF in PEP 667 implementation (#118583) With tests. --- diff --git a/Lib/test/test_frame.py b/Lib/test/test_frame.py index 93d0ea839d16..212255374bdd 100644 --- a/Lib/test/test_frame.py +++ b/Lib/test/test_frame.py @@ -364,6 +364,21 @@ class TestFrameLocals(unittest.TestCase): c = 0 f() + def test_local_objects(self): + o = object() + k = '.'.join(['a', 'b', 'c']) + f_locals = sys._getframe().f_locals + f_locals['o'] = f_locals['k'] + self.assertEqual(o, 'a.b.c') + + def test_update_with_self(self): + def f(): + f_locals = sys._getframe().f_locals + f_locals.update(f_locals) + f_locals.update(f_locals) + f_locals.update(f_locals) + f() + def test_repr(self): x = 1 # Introduce a reference cycle diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 8030ecb68536..1cb00e318d91 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -171,7 +171,6 @@ framelocalsproxy_setitem(PyObject *self, PyObject *key, PyObject *value) } else if (value != oldvalue) { Py_XSETREF(fast[i], Py_NewRef(value)); } - Py_XDECREF(value); return 0; } }