gh-121272: move __future__ import validation from compiler to symtable (#121273)
This commit is contained in:
parent
6343486eb6
commit
1ac273224a
@ -77,14 +77,6 @@ typedef struct _PyCfgBuilder cfg_builder;
|
|||||||
#define LOCATION(LNO, END_LNO, COL, END_COL) \
|
#define LOCATION(LNO, END_LNO, COL, END_COL) \
|
||||||
((const _Py_SourceLocation){(LNO), (END_LNO), (COL), (END_COL)})
|
((const _Py_SourceLocation){(LNO), (END_LNO), (COL), (END_COL)})
|
||||||
|
|
||||||
/* Return true if loc1 starts after loc2 ends. */
|
|
||||||
static inline bool
|
|
||||||
location_is_after(location loc1, location loc2) {
|
|
||||||
return (loc1.lineno > loc2.end_lineno) ||
|
|
||||||
((loc1.lineno == loc2.end_lineno) &&
|
|
||||||
(loc1.col_offset > loc2.end_col_offset));
|
|
||||||
}
|
|
||||||
|
|
||||||
#define LOC(x) SRC_LOCATION_FROM_AST(x)
|
#define LOC(x) SRC_LOCATION_FROM_AST(x)
|
||||||
|
|
||||||
typedef _PyJumpTargetLabel jump_target_label;
|
typedef _PyJumpTargetLabel jump_target_label;
|
||||||
@ -3847,14 +3839,6 @@ compiler_from_import(struct compiler *c, stmt_ty s)
|
|||||||
PyTuple_SET_ITEM(names, i, Py_NewRef(alias->name));
|
PyTuple_SET_ITEM(names, i, Py_NewRef(alias->name));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (location_is_after(LOC(s), c->c_future.ff_location) &&
|
|
||||||
s->v.ImportFrom.module && s->v.ImportFrom.level == 0 &&
|
|
||||||
_PyUnicode_EqualToASCIIString(s->v.ImportFrom.module, "__future__"))
|
|
||||||
{
|
|
||||||
Py_DECREF(names);
|
|
||||||
return compiler_error(c, LOC(s), "from __future__ imports must occur "
|
|
||||||
"at the beginning of the file");
|
|
||||||
}
|
|
||||||
ADDOP_LOAD_CONST_NEW(c, LOC(s), names);
|
ADDOP_LOAD_CONST_NEW(c, LOC(s), names);
|
||||||
|
|
||||||
if (s->v.ImportFrom.module) {
|
if (s->v.ImportFrom.module) {
|
||||||
|
@ -1660,6 +1660,27 @@ has_kwonlydefaults(asdl_arg_seq *kwonlyargs, asdl_expr_seq *kw_defaults)
|
|||||||
return 0;
|
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
|
static int
|
||||||
symtable_visit_stmt(struct symtable *st, stmt_ty s)
|
symtable_visit_stmt(struct symtable *st, stmt_ty s)
|
||||||
{
|
{
|
||||||
@ -1914,6 +1935,9 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s)
|
|||||||
break;
|
break;
|
||||||
case ImportFrom_kind:
|
case ImportFrom_kind:
|
||||||
VISIT_SEQ(st, alias, s->v.ImportFrom.names);
|
VISIT_SEQ(st, alias, s->v.ImportFrom.names);
|
||||||
|
if (!check_import_from(st, s)) {
|
||||||
|
VISIT_QUIT(st, 0);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case Global_kind: {
|
case Global_kind: {
|
||||||
Py_ssize_t i;
|
Py_ssize_t i;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user