https://github.com/python/cpython/commit/eb4774d2b7f5d50cd3cb8dc5abce9f94ce54197e
commit: eb4774d2b7f5d50cd3cb8dc5abce9f94ce54197e
branch: 3.12
author: Miss Islington (bot) <[email protected]>
committer: iritkatriel <[email protected]>
date: 2024-02-22T14:05:59Z
summary:

[3.12] gh-100762: Fix optimization in gen_close  (GH-111069) (#115818)

gh-100762: Fix optimization in gen_close  (GH-111069)
(cherry picked from commit 0db2517687efcf5ec0174a32398ec1564b3204f1)

Co-authored-by: Irit Katriel <[email protected]>

files:
M Lib/test/test_cprofile.py
M Lib/test/test_sys_setprofile.py
M Objects/genobject.c

diff --git a/Lib/test/test_cprofile.py b/Lib/test/test_cprofile.py
index 3056fe84dac5dd..27e8a767903777 100644
--- a/Lib/test/test_cprofile.py
+++ b/Lib/test/test_cprofile.py
@@ -83,8 +83,8 @@ def test_throw(self):
 
         for func, (cc, nc, _, _, _) in pr.stats.items():
             if func[2] == "<genexpr>":
-                self.assertEqual(cc, 2)
-                self.assertEqual(nc, 2)
+                self.assertEqual(cc, 1)
+                self.assertEqual(nc, 1)
 
 
 class TestCommandLine(unittest.TestCase):
diff --git a/Lib/test/test_sys_setprofile.py b/Lib/test/test_sys_setprofile.py
index 9e8936630de920..bb8adc8b555cb4 100644
--- a/Lib/test/test_sys_setprofile.py
+++ b/Lib/test/test_sys_setprofile.py
@@ -265,10 +265,6 @@ def g(p):
         f_ident = ident(f)
         g_ident = ident(g)
         self.check_events(g, [(1, 'call', g_ident),
-                              (2, 'call', f_ident),
-                              (2, 'return', f_ident),
-                              # once more; the generator is being garbage 
collected
-                              # and it will do a PY_THROW
                               (2, 'call', f_ident),
                               (2, 'return', f_ident),
                               (1, 'return', g_ident),
diff --git a/Objects/genobject.c b/Objects/genobject.c
index 3b9e4a60367420..bc58409c181360 100644
--- a/Objects/genobject.c
+++ b/Objects/genobject.c
@@ -374,7 +374,6 @@ static PyObject *
 gen_close(PyGenObject *gen, PyObject *args)
 {
     PyObject *retval;
-    PyObject *yf = _PyGen_yf(gen);
     int err = 0;
 
     if (gen->gi_frame_state == FRAME_CREATED) {
@@ -384,6 +383,7 @@ gen_close(PyGenObject *gen, PyObject *args)
     if (gen->gi_frame_state >= FRAME_COMPLETED) {
         Py_RETURN_NONE;
     }
+    PyObject *yf = _PyGen_yf(gen);
     if (yf) {
         PyFrameState state = gen->gi_frame_state;
         gen->gi_frame_state = FRAME_EXECUTING;
@@ -396,12 +396,13 @@ gen_close(PyGenObject *gen, PyObject *args)
      * YIELD_VALUE if the debugger has changed the lineno. */
     if (err == 0 && is_yield(frame->prev_instr)) {
         assert(is_resume(frame->prev_instr + 1));
-        int exception_handler_depth = frame->prev_instr[0].op.code;
+        int exception_handler_depth = frame->prev_instr[0].op.arg;
         assert(exception_handler_depth > 0);
         /* We can safely ignore the outermost try block
          * as it automatically generated to handle
          * StopIteration. */
         if (exception_handler_depth == 1) {
+            gen->gi_frame_state = FRAME_COMPLETED;
             Py_RETURN_NONE;
         }
     }

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]

Reply via email to