Skip to content

Commit

Permalink
bpo-46237: Fix the line number of tokenizer errors inside f-strings (G…
Browse files Browse the repository at this point in the history
…H-30463)

(cherry picked from commit 6fa8b2c)

Co-authored-by: Pablo Galindo Salgado <Pablogsal@gmail.com>
  • Loading branch information
miss-islington and pablogsal committed Jan 11, 2022
1 parent 4cfb109 commit 19a8550
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 5 deletions.
12 changes: 12 additions & 0 deletions Lib/test/test_exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,18 @@ def baz():
check("(1+)", 1, 4)
check("[interesting\nfoo()\n", 1, 1)
check(b"\xef\xbb\xbf#coding: utf8\nprint('\xe6\x88\x91')\n", 0, -1)
check("""f'''
{
(123_a)
}'''""", 3, 17)
check("""f'''
{
f\"\"\"
{
(123_a)
}
\"\"\"
}'''""", 5, 17)

# Errors thrown by symtable.c
check('x = [(yield i) for i in range(3)]', 1, 7)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Fix the line number of tokenizer errors inside f-strings. Patch by Pablo
Galindo.
8 changes: 4 additions & 4 deletions Parser/pegen.c
Original file line number Diff line number Diff line change
Expand Up @@ -701,10 +701,10 @@ initialize_token(Parser *p, Token *token, const char *start, const char *end, in
int col_offset = (start != NULL && start >= line_start) ? (int)(start - line_start) : -1;
int end_col_offset = (end != NULL && end >= p->tok->line_start) ? (int)(end - p->tok->line_start) : -1;

token->lineno = p->starting_lineno + lineno;
token->col_offset = p->tok->lineno == 1 ? p->starting_col_offset + col_offset : col_offset;
token->end_lineno = p->starting_lineno + end_lineno;
token->end_col_offset = p->tok->lineno == 1 ? p->starting_col_offset + end_col_offset : end_col_offset;
token->lineno = lineno;
token->col_offset = p->tok->lineno == p->starting_lineno ? p->starting_col_offset + col_offset : col_offset;
token->end_lineno = end_lineno;
token->end_col_offset = p->tok->lineno == p->starting_lineno ? p->starting_col_offset + end_col_offset : end_col_offset;

p->fill += 1;

Expand Down
5 changes: 4 additions & 1 deletion Parser/string_parser.c
Original file line number Diff line number Diff line change
Expand Up @@ -392,11 +392,14 @@ fstring_compile_expr(Parser *p, const char *expr_start, const char *expr_end,
return NULL;
}
Py_INCREF(p->tok->filename);

tok->filename = p->tok->filename;
tok->lineno = t->lineno + lines - 1;

Parser *p2 = _PyPegen_Parser_New(tok, Py_fstring_input, p->flags, p->feature_version,
NULL, p->arena);
p2->starting_lineno = t->lineno + lines - 1;

p2->starting_lineno = t->lineno + lines;
p2->starting_col_offset = t->col_offset + cols;

expr = _PyPegen_run_parser(p2);
Expand Down

0 comments on commit 19a8550

Please sign in to comment.