mirror of https://github.com/python/cpython
bpo-42918: Improve build-in function compile() in mode 'single' (GH-29934)
Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
This commit is contained in:
parent
98e506ae8a
commit
28179aac79
|
@ -504,6 +504,7 @@ if 1:
|
|||
self.compile_single("if x:\n f(x)")
|
||||
self.compile_single("if x:\n f(x)\nelse:\n g(x)")
|
||||
self.compile_single("class T:\n pass")
|
||||
self.compile_single("c = '''\na=1\nb=2\nc=3\n'''")
|
||||
|
||||
def test_bad_single_statement(self):
|
||||
self.assertInvalidSingle('1\n2')
|
||||
|
@ -514,6 +515,7 @@ if 1:
|
|||
self.assertInvalidSingle('f()\n# blah\nblah()')
|
||||
self.assertInvalidSingle('f()\nxy # blah\nblah()')
|
||||
self.assertInvalidSingle('x = 5 # comment\nx = 6\n')
|
||||
self.assertInvalidSingle("c = '''\nd=1\n'''\na = 1\n\nb = 2\n")
|
||||
|
||||
def test_particularly_evil_undecodable(self):
|
||||
# Issue 24022
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
Fix bug where the built-in :func:`compile` function did not always raise a
|
||||
:exc:`SyntaxError` when passed multiple statements in 'single' mode. Patch by
|
||||
Weipeng Hong.
|
|
@ -675,31 +675,13 @@ _PyPegen_number_token(Parser *p)
|
|||
t->end_col_offset, p->arena);
|
||||
}
|
||||
|
||||
static int // bool
|
||||
newline_in_string(Parser *p, const char *cur)
|
||||
{
|
||||
for (const char *c = cur; c >= p->tok->buf; c--) {
|
||||
if (*c == '\'' || *c == '"') {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Check that the source for a single input statement really is a single
|
||||
statement by looking at what is left in the buffer after parsing.
|
||||
Trailing whitespace and comments are OK. */
|
||||
static int // bool
|
||||
bad_single_statement(Parser *p)
|
||||
{
|
||||
const char *cur = strchr(p->tok->buf, '\n');
|
||||
|
||||
/* Newlines are allowed if preceded by a line continuation character
|
||||
or if they appear inside a string. */
|
||||
if (!cur || (cur != p->tok->buf && *(cur - 1) == '\\')
|
||||
|| newline_in_string(p, cur)) {
|
||||
return 0;
|
||||
}
|
||||
char *cur = p->tok->cur;
|
||||
char c = *cur;
|
||||
|
||||
for (;;) {
|
||||
|
|
Loading…
Reference in New Issue