gh-99891: Fix infinite recursion in the tokenizer when showing warnings (GH-99893)
Automerge-Triggered-By: GH:pablogsal
This commit is contained in:
parent
19c38801ba
commit
417206a05c
@ -160,6 +160,18 @@ class MiscSourceEncodingTest(unittest.TestCase):
|
|||||||
finally:
|
finally:
|
||||||
os.unlink(TESTFN)
|
os.unlink(TESTFN)
|
||||||
|
|
||||||
|
def test_tokenizer_fstring_warning_in_first_line(self):
|
||||||
|
source = "0b1and 2"
|
||||||
|
with open(TESTFN, "w") as fd:
|
||||||
|
fd.write("{}".format(source))
|
||||||
|
try:
|
||||||
|
retcode, stdout, stderr = script_helper.assert_python_ok(TESTFN)
|
||||||
|
self.assertIn(b"SyntaxWarning: invalid binary litera", stderr)
|
||||||
|
self.assertEqual(stderr.count(source.encode()), 1)
|
||||||
|
finally:
|
||||||
|
os.unlink(TESTFN)
|
||||||
|
|
||||||
|
|
||||||
class AbstractSourceEncodingTest:
|
class AbstractSourceEncodingTest:
|
||||||
|
|
||||||
def test_default_coding(self):
|
def test_default_coding(self):
|
||||||
|
@ -0,0 +1,3 @@
|
|||||||
|
Fix a bug in the tokenizer that could cause infinite recursion when showing
|
||||||
|
syntax warnings that happen in the first line of the source. Patch by Pablo
|
||||||
|
Galindo
|
@ -97,6 +97,7 @@ tok_new(void)
|
|||||||
tok->async_def_nl = 0;
|
tok->async_def_nl = 0;
|
||||||
tok->interactive_underflow = IUNDERFLOW_NORMAL;
|
tok->interactive_underflow = IUNDERFLOW_NORMAL;
|
||||||
tok->str = NULL;
|
tok->str = NULL;
|
||||||
|
tok->report_warnings = 1;
|
||||||
#ifdef Py_DEBUG
|
#ifdef Py_DEBUG
|
||||||
tok->debug = _Py_GetConfig()->parser_debug;
|
tok->debug = _Py_GetConfig()->parser_debug;
|
||||||
#endif
|
#endif
|
||||||
@ -1201,6 +1202,10 @@ indenterror(struct tok_state *tok)
|
|||||||
static int
|
static int
|
||||||
parser_warn(struct tok_state *tok, PyObject *category, const char *format, ...)
|
parser_warn(struct tok_state *tok, PyObject *category, const char *format, ...)
|
||||||
{
|
{
|
||||||
|
if (!tok->report_warnings) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
PyObject *errmsg;
|
PyObject *errmsg;
|
||||||
va_list vargs;
|
va_list vargs;
|
||||||
va_start(vargs, format);
|
va_start(vargs, format);
|
||||||
@ -2239,6 +2244,9 @@ _PyTokenizer_FindEncodingFilename(int fd, PyObject *filename)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
struct token token;
|
struct token token;
|
||||||
|
// We don't want to report warnings here because it could cause infinite recursion
|
||||||
|
// if fetching the encoding shows a warning.
|
||||||
|
tok->report_warnings = 0;
|
||||||
while (tok->lineno < 2 && tok->done == E_OK) {
|
while (tok->lineno < 2 && tok->done == E_OK) {
|
||||||
_PyTokenizer_Get(tok, &token);
|
_PyTokenizer_Get(tok, &token);
|
||||||
}
|
}
|
||||||
|
@ -92,6 +92,7 @@ struct tok_state {
|
|||||||
NEWLINE token after it. */
|
NEWLINE token after it. */
|
||||||
/* How to proceed when asked for a new token in interactive mode */
|
/* How to proceed when asked for a new token in interactive mode */
|
||||||
enum interactive_underflow_t interactive_underflow;
|
enum interactive_underflow_t interactive_underflow;
|
||||||
|
int report_warnings;
|
||||||
#ifdef Py_DEBUG
|
#ifdef Py_DEBUG
|
||||||
int debug;
|
int debug;
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user