bpo-40619: Correctly handle error lines in programs without file mode (GH-20090)
This commit is contained in:
parent
a482dc500b
commit
bcc3036095
|
@ -228,6 +228,8 @@ class ExceptionTests(unittest.TestCase):
|
|||
def baz():
|
||||
'''quux'''
|
||||
""", 9, 20)
|
||||
check("pass\npass\npass\n(1+)\npass\npass\npass", 4, 4)
|
||||
check("(1+)", 1, 4)
|
||||
|
||||
# Errors thrown by symtable.c
|
||||
check('x = [(yield i) for i in range(3)]', 1, 5)
|
||||
|
|
|
@ -300,30 +300,6 @@ error:
|
|||
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
|
||||
tokenizer_error(Parser *p)
|
||||
{
|
||||
|
@ -422,7 +398,11 @@ _PyPegen_raise_error_known_location(Parser *p, PyObject *errtype,
|
|||
}
|
||||
|
||||
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) {
|
||||
goto error;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue