summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1995-02-14 09:42:43 (GMT)
committerGuido van Rossum <guido@python.org>1995-02-14 09:42:43 (GMT)
commit24c137432c0f0d26f13d2f645688e904f8ca0ee1 (patch)
tree98fbb3b71454704b2d0af2cf77562eb8b779e6e4
parentbecdbec8067c0e4cd9c0d9aad682c547d8a2bba3 (diff)
downloadcpython-24c137432c0f0d26f13d2f645688e904f8ca0ee1.zip
cpython-24c137432c0f0d26f13d2f645688e904f8ca0ee1.tar.gz
cpython-24c137432c0f0d26f13d2f645688e904f8ca0ee1.tar.bz2
call __import__() with 4 args instead of 1
-rw-r--r--Python/bltinmodule.c6
-rw-r--r--Python/ceval.c52
2 files changed, 56 insertions, 2 deletions
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 83eeecb..0500060 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -47,8 +47,12 @@ builtin___import__(self, args)
object *args;
{
char *name;
+ object *globals = NULL;
+ object *locals = NULL;
+ object *fromlist = NULL;
- if (!newgetargs(args, "s:__import__", &name))
+ if (!newgetargs(args, "s|OOO:__import__",
+ &name, &globals, &locals, &fromlist))
return NULL;
return import_module(name);
}
diff --git a/Python/ceval.c b/Python/ceval.c
index 411e7f3..cb9bb8a 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -93,6 +93,7 @@ static int import_from PROTO((object *, object *, object *));
static object *build_class PROTO((object *, object *, object *));
static int access_statement PROTO((object *, object *, frameobject *));
static int exec_statement PROTO((object *, object *, object *));
+static object *find_from_args PROTO((frameobject *, int));
/* Pointer to current frame, used to link new frames to */
@@ -1338,7 +1339,19 @@ eval_code(co, globals, locals, owner, arg)
"__import__ not found");
break;
}
- w = mkvalue("(O)", w);
+ if (is_methodobject(x)) {
+ u = None;
+ INCREF(u);
+ }
+ else {
+ u = find_from_args(f, INSTR_OFFSET());
+ if (u == NULL) {
+ x = u;
+ break;
+ }
+ }
+ w = mkvalue("(OOOO)", w, f->f_globals, f->f_locals, u);
+ DECREF(u);
if (w == NULL) {
x = NULL;
break;
@@ -1352,6 +1365,7 @@ eval_code(co, globals, locals, owner, arg)
case IMPORT_FROM:
w = GETNAMEV(oparg);
v = TOP();
+ fast_2_locals(f);
err = import_from(f->f_locals, v, w);
locals_2_fast(f, 0);
break;
@@ -2711,3 +2725,39 @@ exec_statement(prog, globals, locals)
DECREF(v);
return 0;
}
+
+/* Hack for Ken Manheimer */
+static object *
+find_from_args(f, nexti)
+ frameobject *f;
+ int nexti;
+{
+ int opcode;
+ int oparg;
+ object *list, *name;
+ unsigned char *next_instr;
+
+ next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
+ opcode = (*next_instr++);
+ if (opcode != IMPORT_FROM) {
+ printf("next opcode: %d\n", opcode);
+ INCREF(None);
+ return None;
+ }
+
+ list = newlistobject(0);
+ if (list == NULL)
+ return NULL;
+
+ do {
+ oparg = (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2]);
+ name = Getnamev(f, oparg);
+ if (addlistitem(list, name) < 0) {
+ DECREF(list);
+ break;
+ }
+ opcode = (*next_instr++);
+ } while (opcode == IMPORT_FROM);
+
+ return list;
+}