Skip to content

Commit

Permalink
pythongh-105820: Fix tok_mode expression buffer in file & readline to…
Browse files Browse the repository at this point in the history
…kenizer (python#105828)
  • Loading branch information
lysnikolaou authored and gvanrossum committed Jun 18, 2023
1 parent 019a233 commit 5862c96
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 4 deletions.
15 changes: 14 additions & 1 deletion Lib/test/test_fstring.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
import unittest
from test import support
from test.support.os_helper import temp_cwd
from test.support.script_helper import assert_python_failure
from test.support.script_helper import assert_python_failure, assert_python_ok

a_global = 'global variable'

Expand Down Expand Up @@ -1635,5 +1635,18 @@ def test_syntax_error_after_debug(self):
"f'{1=}{1;}'",
])

def test_debug_in_file(self):
with temp_cwd():
script = 'script.py'
with open('script.py', 'w') as f:
f.write(f"""\
print(f'''{{
3
=}}''')""")

_, stdout, _ = assert_python_ok(script)
self.assertEqual(stdout.decode('utf-8').strip().replace('\r\n', '\n').replace('\r', '\n'),
"3\n=3")

if __name__ == '__main__':
unittest.main()
13 changes: 13 additions & 0 deletions Lib/test/test_tokenize.py
Original file line number Diff line number Diff line change
Expand Up @@ -558,6 +558,19 @@ def test_string(self):
OP '}' (1, 39) (1, 40)
FSTRING_MIDDLE ' final words' (1, 40) (1, 52)
FSTRING_END "'" (1, 52) (1, 53)
""")
self.check_tokenize("""\
f'''{
3
=}'''""", """\
FSTRING_START "f'''" (1, 0) (1, 4)
OP '{' (1, 4) (1, 5)
NL '\\n' (1, 5) (1, 6)
NUMBER '3' (2, 0) (2, 1)
NL '\\n' (2, 1) (2, 2)
OP '=' (3, 0) (3, 1)
OP '}' (3, 1) (3, 2)
FSTRING_END "'''" (3, 2) (3, 5)
""")

def test_function(self):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix an f-string bug, where using a debug expression (the `=` sign) that appears in the last line of a file results to the debug buffer that holds the expression text being one character too small.
11 changes: 8 additions & 3 deletions Parser/tokenizer.c
Original file line number Diff line number Diff line change
Expand Up @@ -1039,9 +1039,6 @@ tok_readline_raw(struct tok_state *tok)
if (line == NULL) {
return 1;
}
if (tok->tok_mode_stack_index && !update_fstring_expr(tok, 0)) {
return 0;
}
if (tok->fp_interactive &&
tok_concatenate_interactive_new_line(tok, line) == -1) {
return 0;
Expand Down Expand Up @@ -1270,6 +1267,10 @@ tok_underflow_file(struct tok_state *tok) {
tok->implicit_newline = 1;
}

if (tok->tok_mode_stack_index && !update_fstring_expr(tok, 0)) {
return 0;
}

ADVANCE_LINENO();
if (tok->decoding_state != STATE_NORMAL) {
if (tok->lineno > 2) {
Expand Down Expand Up @@ -1314,6 +1315,10 @@ tok_underflow_readline(struct tok_state* tok) {
tok->implicit_newline = 1;
}

if (tok->tok_mode_stack_index && !update_fstring_expr(tok, 0)) {
return 0;
}

ADVANCE_LINENO();
/* The default encoding is UTF-8, so make sure we don't have any
non-UTF-8 sequences in it. */
Expand Down

0 comments on commit 5862c96

Please sign in to comment.