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

This commit is contained in:
Pablo Galindo 2021-06-08 20:02:03 +01:00 committed by GitHub
parent 8004c4570b
commit bafe0aade5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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 *