finally:
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:
def test_default_coding(self):
--- /dev/null
+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
tok->async_def_nl = 0;
tok->interactive_underflow = IUNDERFLOW_NORMAL;
tok->str = NULL;
+ tok->report_warnings = 1;
#ifdef Py_DEBUG
tok->debug = _Py_GetConfig()->parser_debug;
#endif
static int
parser_warn(struct tok_state *tok, PyObject *category, const char *format, ...)
{
+ if (!tok->report_warnings) {
+ return 0;
+ }
+
PyObject *errmsg;
va_list vargs;
va_start(vargs, format);
}
}
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) {
_PyTokenizer_Get(tok, &token);
}
NEWLINE token after it. */
/* How to proceed when asked for a new token in interactive mode */
enum interactive_underflow_t interactive_underflow;
+ int report_warnings;
#ifdef Py_DEBUG
int debug;
#endif