mirror of https://github.com/python/cpython
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():
|
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)
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue