diff options
-rw-r--r-- | Lib/test/test_compile.py | 4 | ||||
-rw-r--r-- | Misc/NEWS | 2 | ||||
-rw-r--r-- | Python/ast.c | 13 |
3 files changed, 18 insertions, 1 deletions
diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index 72c4f7e..814bc19 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -238,6 +238,8 @@ if 1: succeed = [ 'import sys', 'import os, sys', + 'import os as bar', + 'import os.path as bar', 'from __future__ import nested_scopes, generators', 'from __future__ import (nested_scopes,\ngenerators)', 'from __future__ import (nested_scopes,\ngenerators,)', @@ -257,6 +259,8 @@ if 1: 'import (sys', 'import sys)', 'import (os,)', + 'import os As bar', + 'import os.path a bar', 'from (sys) import stdin', 'from __future__ import (nested_scopes', 'from __future__ import nested_scopes)', @@ -22,6 +22,8 @@ Core and builtins omit a default "error" argument for NULL pointer. This allows the parser to take a codec from cjkcodecs again. +- Bug #1519018: 'as' is now validated properly in import statements. + Library ------- diff --git a/Python/ast.c b/Python/ast.c index f3e611b..4c78b00 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -2142,7 +2142,14 @@ alias_for_import_name(struct compiling *c, const node *n) loop: switch (TYPE(n)) { case import_as_name: - str = (NCH(n) == 3) ? NEW_IDENTIFIER(CHILD(n, 2)) : NULL; + str = NULL; + if (NCH(n) == 3) { + if (strcmp(STR(CHILD(n, 1)), "as") != 0) { + ast_error(n, "must use 'as' in import"); + return NULL; + } + str = NEW_IDENTIFIER(CHILD(n, 2)); + } return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena); case dotted_as_name: if (NCH(n) == 1) { @@ -2151,6 +2158,10 @@ alias_for_import_name(struct compiling *c, const node *n) } else { alias_ty a = alias_for_import_name(c, CHILD(n, 0)); + if (strcmp(STR(CHILD(n, 1)), "as") != 0) { + ast_error(n, "must use 'as' in import"); + return NULL; + } assert(!a->asname); a->asname = NEW_IDENTIFIER(CHILD(n, 2)); return a; |