summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Wouters <thomas@python.org>2006-02-27 17:05:19 (GMT)
committerThomas Wouters <thomas@python.org>2006-02-27 17:05:19 (GMT)
commit106203c6e0a70e26e85edb6460327d815f49511a (patch)
treeebebf6612828bb6d217185f257329b55813ddc83
parentb79afb6e3aaa789ac971c59ac35cc5ad34cd75ff (diff)
downloadcpython-106203c6e0a70e26e85edb6460327d815f49511a.zip
cpython-106203c6e0a70e26e85edb6460327d815f49511a.tar.gz
cpython-106203c6e0a70e26e85edb6460327d815f49511a.tar.bz2
Clean up from-import handling.
-rw-r--r--Python/ast.c43
1 files changed, 21 insertions, 22 deletions
diff --git a/Python/ast.c b/Python/ast.c
index 25775a4..54bdacc 100644
--- a/Python/ast.c
+++ b/Python/ast.c
@@ -2170,44 +2170,43 @@ ast_for_import_stmt(struct compiling *c, const node *n)
}
else if (STR(CHILD(n, 0))[0] == 'f') { /* from */
int n_children;
- const char *from_modules;
int lineno = LINENO(n);
alias_ty mod = alias_for_import_name(c, CHILD(n, 1));
if (!mod)
return NULL;
- /* XXX this needs to be cleaned up */
-
- from_modules = STR(CHILD(n, 3));
- if (!from_modules) {
- n = CHILD(n, 3); /* from ... import x, y, z */
- if (NCH(n) % 2 == 0) {
- /* it ends with a comma, not valid but the parser allows it */
+ switch (TYPE(CHILD(n, 3))) {
+ case STAR:
+ /* from ... import * */
+ n = CHILD(n, 3);
+ n_children = 1;
+ break;
+ case LPAR:
+ /* from ... import (x, y, z) */
+ n = CHILD(n, 4);
+ n_children = NCH(n);
+ break;
+ case import_as_names:
+ /* from ... import x, y, z */
+ n = CHILD(n, 3);
+ n_children = NCH(n);
+ if (n_children % 2 == 0) {
ast_error(n, "trailing comma not allowed without"
" surrounding parentheses");
return NULL;
}
- }
- else if (from_modules[0] == '*') {
- n = CHILD(n, 3); /* from ... import * */
- }
- else if (from_modules[0] == '(')
- n = CHILD(n, 4); /* from ... import (x, y, z) */
- else {
- /* XXX: don't we need to call ast_error(n, "..."); */
- return NULL;
+ break;
+ default:
+ ast_error(n, "Unexpected node-type in from-import");
+ return NULL;
}
- n_children = NCH(n);
- if (from_modules && from_modules[0] == '*')
- n_children = 1;
-
aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
if (!aliases)
return NULL;
/* handle "from ... import *" special b/c there's no children */
- if (from_modules && from_modules[0] == '*') {
+ if (TYPE(n) == STAR) {
alias_ty import_alias = alias_for_import_name(c, n);
if (!import_alias)
return NULL;