summaryrefslogtreecommitdiffstats
path: root/Python/compile.c
diff options
context:
space:
mode:
authorThomas Wouters <thomas@python.org>2006-02-28 16:09:29 (GMT)
committerThomas Wouters <thomas@python.org>2006-02-28 16:09:29 (GMT)
commitf7f438ba3b05eb4356e7511401686b07d9dfb6d8 (patch)
tree94010633418aaf2ea19c609139f9499bf57a1058 /Python/compile.c
parentd3188639c32a086e9149b92d875c45408bd8b81c (diff)
downloadcpython-f7f438ba3b05eb4356e7511401686b07d9dfb6d8.zip
cpython-f7f438ba3b05eb4356e7511401686b07d9dfb6d8.tar.gz
cpython-f7f438ba3b05eb4356e7511401686b07d9dfb6d8.tar.bz2
SF patch #1438387, PEP 328: relative and absolute imports.
- IMPORT_NAME takes an extra argument from the stack: the relativeness of the import. Only passed to __import__ when it's not -1. - __import__() takes an optional 5th argument for the same thing; it __defaults to -1 (old semantics: try relative, then absolute) - 'from . import name' imports name (be it module or regular attribute) from the current module's *package*. Likewise, 'from .module import name' will import name from a sibling to the current module. - Importing from outside a package is not allowed; 'from . import sys' in a toplevel module will not work, nor will 'from .. import sys' in a (single-level) package. - 'from __future__ import absolute_import' will turn on the new semantics for import and from-import: imports will be absolute, except for from-import with dots. Includes tests for regular imports and importhooks, parser changes and a NEWS item, but no compiler-package changes or documentation changes.
Diffstat (limited to 'Python/compile.c')
-rw-r--r--Python/compile.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/Python/compile.c b/Python/compile.c
index 9705ce4..78ae6a7 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -2452,10 +2452,22 @@ compiler_import(struct compiler *c, stmt_ty s)
XXX Perhaps change the representation to make this case simpler?
*/
int i, n = asdl_seq_LEN(s->v.Import.names);
+
for (i = 0; i < n; i++) {
alias_ty alias = asdl_seq_GET(s->v.Import.names, i);
int r;
+ PyObject *level;
+
+ if (c->c_flags && (c->c_flags->cf_flags & CO_FUTURE_ABSIMPORT))
+ level = PyInt_FromLong(0);
+ else
+ level = PyInt_FromLong(-1);
+ if (level == NULL)
+ return 0;
+
+ ADDOP_O(c, LOAD_CONST, level, consts);
+ Py_DECREF(level);
ADDOP_O(c, LOAD_CONST, Py_None, consts);
ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
@@ -2488,9 +2500,22 @@ compiler_from_import(struct compiler *c, stmt_ty s)
int i, n = asdl_seq_LEN(s->v.ImportFrom.names);
PyObject *names = PyTuple_New(n);
+ PyObject *level;
+
if (!names)
return 0;
+ if (s->v.ImportFrom.level == 0 && c->c_flags &&
+ !(c->c_flags->cf_flags & CO_FUTURE_ABSIMPORT))
+ level = PyInt_FromLong(-1);
+ else
+ level = PyInt_FromLong(s->v.ImportFrom.level);
+
+ if (!level) {
+ Py_DECREF(names);
+ return 0;
+ }
+
/* build up the names */
for (i = 0; i < n; i++) {
alias_ty alias = asdl_seq_GET(s->v.ImportFrom.names, i);
@@ -2509,6 +2534,8 @@ compiler_from_import(struct compiler *c, stmt_ty s)
}
}
+ ADDOP_O(c, LOAD_CONST, level, consts);
+ Py_DECREF(level);
ADDOP_O(c, LOAD_CONST, names, consts);
Py_DECREF(names);
ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);