[Python-checkins] bpo-44335: Ensure the tokenizer doesn't go into Python with the error set (GH-26608)

pablogsal webhook-mailer at python.org
Tue Jun 8 15:02:13 EDT 2021


https://github.com/python/cpython/commit/bafe0aade5741ab0d13143ee261711fdd65e8a1f
commit: bafe0aade5741ab0d13143ee261711fdd65e8a1f
branch: main
author: Pablo Galindo <Pablogsal at gmail.com>
committer: pablogsal <Pablogsal at gmail.com>
date: 2021-06-08T20:02:03+01:00
summary:

bpo-44335: Ensure the tokenizer doesn't go into Python with the error set (GH-26608)

files:
M Parser/pegen.c

diff --git a/Parser/pegen.c b/Parser/pegen.c
index c69a042f8de12..42a992251da97 100644
--- a/Parser/pegen.c
+++ b/Parser/pegen.c
@@ -1251,9 +1251,14 @@ _PyPegen_check_tokenizer_errors(Parser *p) {
         return 0;
     }
 
+    PyObject *type, *value, *traceback;
+    PyErr_Fetch(&type, &value, &traceback);
+
     Token *current_token = p->known_err_token != NULL ? p->known_err_token : p->tokens[p->fill - 1];
     Py_ssize_t current_err_line = current_token->lineno;
 
+    int ret = 0;
+
     for (;;) {
         const char *start;
         const char *end;
@@ -1262,9 +1267,9 @@ _PyPegen_check_tokenizer_errors(Parser *p) {
                 if (p->tok->level != 0) {
                     int error_lineno = p->tok->parenlinenostack[p->tok->level-1];
                     if (current_err_line > error_lineno) {
-                        PyErr_Clear();
                         raise_unclosed_parentheses_error(p);
-                        return -1;
+                        ret = -1;
+                        goto exit;
                     }
                 }
                 break;
@@ -1276,7 +1281,16 @@ _PyPegen_check_tokenizer_errors(Parser *p) {
         break;
     }
 
-    return 0;
+
+exit:
+    if (PyErr_Occurred()) {
+        Py_XDECREF(value);
+        Py_XDECREF(type);
+        Py_XDECREF(traceback);
+    } else {
+        PyErr_Restore(type, value, traceback);
+    }
+    return ret;
 }
 
 void *



More information about the Python-checkins mailing list