mirror of
https://github.com/python/cpython.git
synced 2025-07-08 03:45:36 +00:00
gh-121272: move __future__ import validation from compiler to symtable (#121273)
This commit is contained in:
parent
6343486eb6
commit
1ac273224a
2 changed files with 24 additions and 16 deletions
|
@ -1660,6 +1660,27 @@ has_kwonlydefaults(asdl_arg_seq *kwonlyargs, asdl_expr_seq *kw_defaults)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
check_import_from(struct symtable *st, stmt_ty s)
|
||||
{
|
||||
assert(s->kind == ImportFrom_kind);
|
||||
_Py_SourceLocation fut = st->st_future->ff_location;
|
||||
if (s->v.ImportFrom.module && s->v.ImportFrom.level == 0 &&
|
||||
_PyUnicode_EqualToASCIIString(s->v.ImportFrom.module, "__future__") &&
|
||||
((s->lineno > fut.lineno) ||
|
||||
((s->lineno == fut.end_lineno) && (s->col_offset > fut.end_col_offset))))
|
||||
{
|
||||
PyErr_SetString(PyExc_SyntaxError,
|
||||
"from __future__ imports must occur "
|
||||
"at the beginning of the file");
|
||||
PyErr_RangedSyntaxLocationObject(st->st_filename,
|
||||
s->lineno, s->col_offset + 1,
|
||||
s->end_lineno, s->end_col_offset + 1);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
symtable_visit_stmt(struct symtable *st, stmt_ty s)
|
||||
{
|
||||
|
@ -1914,6 +1935,9 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s)
|
|||
break;
|
||||
case ImportFrom_kind:
|
||||
VISIT_SEQ(st, alias, s->v.ImportFrom.names);
|
||||
if (!check_import_from(st, s)) {
|
||||
VISIT_QUIT(st, 0);
|
||||
}
|
||||
break;
|
||||
case Global_kind: {
|
||||
Py_ssize_t i;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue