diff options
author | Lysandros Nikolaou <lisandrosnik@gmail.com> | 2020-06-16 00:27:33 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-16 00:27:33 (GMT) |
commit | 113e2b0a07c72c0d5e3489076afb14f6b3ad1049 (patch) | |
tree | 286d9d282f1e5290706475f2409bc4e332bd2738 /Python/errors.c | |
parent | 8666356280084f0426c28a981341f72eaaacd006 (diff) | |
download | cpython-113e2b0a07c72c0d5e3489076afb14f6b3ad1049.zip cpython-113e2b0a07c72c0d5e3489076afb14f6b3ad1049.tar.gz cpython-113e2b0a07c72c0d5e3489076afb14f6b3ad1049.tar.bz2 |
bpo-40985: Show correct SyntaxError text when last line has a LINECONT (GH-20888)
When a file ends with a line that contains a line continuation character
the text of the emitted SyntaxError is empty, contrary to the old
parser, where the error text contained the text of the last line.
Diffstat (limited to 'Python/errors.c')
-rw-r--r-- | Python/errors.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/Python/errors.c b/Python/errors.c index cc00ae4..720f18b 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -1646,16 +1646,18 @@ err_programtext(PyThreadState *tstate, FILE *fp, int lineno) { int i; char linebuf[1000]; - - if (fp == NULL) + if (fp == NULL) { return NULL; + } + for (i = 0; i < lineno; i++) { char *pLastChar = &linebuf[sizeof(linebuf) - 2]; do { *pLastChar = '\0'; if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf, - fp, NULL) == NULL) - break; + fp, NULL) == NULL) { + goto after_loop; + } /* fgets read *something*; if it didn't get as far as pLastChar, it must have found a newline or hit the end of the file; if pLastChar is \n, @@ -1663,6 +1665,8 @@ err_programtext(PyThreadState *tstate, FILE *fp, int lineno) yet seen a newline, so must continue */ } while (*pLastChar != '\0' && *pLastChar != '\n'); } + +after_loop: fclose(fp); if (i == lineno) { PyObject *res; |