Commit 24c13743 authored by Guido van Rossum's avatar Guido van Rossum

call __import__() with 4 args instead of 1

parent becdbec8
......@@ -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);
}
......
......@@ -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;
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment