bpo-40619: Correctly handle error lines in programs without file mode (GH-20090)

This commit is contained in:
Pablo Galindo 2020-05-14 21:11:48 +01:00 committed by GitHub
parent a482dc500b
commit bcc3036095
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 7 additions and 25 deletions

View File

@ -228,6 +228,8 @@ class ExceptionTests(unittest.TestCase):
def baz(): def baz():
'''quux''' '''quux'''
""", 9, 20) """, 9, 20)
check("pass\npass\npass\n(1+)\npass\npass\npass", 4, 4)
check("(1+)", 1, 4)
# Errors thrown by symtable.c # Errors thrown by symtable.c
check('x = [(yield i) for i in range(3)]', 1, 5) check('x = [(yield i) for i in range(3)]', 1, 5)

View File

@ -300,30 +300,6 @@ error:
Py_XDECREF(tuple); Py_XDECREF(tuple);
} }
static inline PyObject *
get_error_line(char *buffer, int is_file)
{
const char *newline;
if (is_file) {
newline = strrchr(buffer, '\n');
} else {
newline = strchr(buffer, '\n');
}
if (is_file) {
while (newline > buffer && newline[-1] == '\n') {
--newline;
}
}
if (newline) {
return PyUnicode_DecodeUTF8(buffer, newline - buffer, "replace");
}
else {
return PyUnicode_DecodeUTF8(buffer, strlen(buffer), "replace");
}
}
static int static int
tokenizer_error(Parser *p) tokenizer_error(Parser *p)
{ {
@ -422,7 +398,11 @@ _PyPegen_raise_error_known_location(Parser *p, PyObject *errtype,
} }
if (!error_line) { if (!error_line) {
error_line = get_error_line(p->tok->buf, p->start_rule == Py_file_input); Py_ssize_t size = p->tok->inp - p->tok->buf;
if (size && p->tok->buf[size-1] == '\n') {
size--;
}
error_line = PyUnicode_DecodeUTF8(p->tok->buf, size, "replace");
if (!error_line) { if (!error_line) {
goto error; goto error;
} }