[Python-checkins] bpo-34066: Disabled interruption before SETUP_WITH and BEFORE_ASYNC_WITH. (GH-8159)

Miss Islington (bot) webhook-mailer at python.org
Mon Jul 9 09:31:07 EDT 2018


https://github.com/python/cpython/commit/f5197ddfd0f2c5da848af57196448810bd18bb82
commit: f5197ddfd0f2c5da848af57196448810bd18bb82
branch: 3.7
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: GitHub <noreply at github.com>
date: 2018-07-09T06:31:03-07:00
summary:

bpo-34066: Disabled interruption before SETUP_WITH and BEFORE_ASYNC_WITH. (GH-8159)


This will prevent emitting a resource warning when the execution was
interrupted by Ctrl-C between calling open() and entering a 'with' block
in "with open()".
(cherry picked from commit 3f4d90d4d72921f16babd3f52d7df804916af224)

Co-authored-by: Serhiy Storchaka <storchaka at gmail.com>

files:
A Misc/NEWS.d/next/Core and Builtins/2018-07-07-20-15-34.bpo-34066.y9vs6s.rst
M Python/ceval.c

diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-07-07-20-15-34.bpo-34066.y9vs6s.rst b/Misc/NEWS.d/next/Core and Builtins/2018-07-07-20-15-34.bpo-34066.y9vs6s.rst
new file mode 100644
index 000000000000..b12afad8da87
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2018-07-07-20-15-34.bpo-34066.y9vs6s.rst	
@@ -0,0 +1,2 @@
+Disabled interruption by Ctrl-C between calling ``open()`` and entering a
+**with** block in ``with open()``.
diff --git a/Python/ceval.c b/Python/ceval.c
index df5c0932f417..86cb4cd82474 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -941,11 +941,18 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag)
            Py_MakePendingCalls() above. */
 
         if (_Py_atomic_load_relaxed(&_PyRuntime.ceval.eval_breaker)) {
-            if (_Py_OPCODE(*next_instr) == SETUP_FINALLY ||
-                _Py_OPCODE(*next_instr) == YIELD_FROM) {
-                /* Two cases where we skip running signal handlers and other
+            opcode = _Py_OPCODE(*next_instr);
+            if (opcode == SETUP_FINALLY ||
+                opcode == SETUP_WITH ||
+                opcode == BEFORE_ASYNC_WITH ||
+                opcode == YIELD_FROM) {
+                /* Few cases where we skip running signal handlers and other
                    pending calls:
-                   - If we're about to enter the try: of a try/finally (not
+                   - If we're about to enter the 'with:'. It will prevent
+                     emitting a resource warning in the common idiom
+                     'with open(path) as file:'.
+                   - If we're about to enter the 'async with:'.
+                   - If we're about to enter the 'try:' of a try/finally (not
                      *very* useful, but might help in some cases and it's
                      traditional)
                    - If we're resuming a chain of nested 'yield from' or



More information about the Python-checkins mailing list