mirror of
https://github.com/python/cpython.git
synced 2025-08-29 13:15:11 +00:00
call __import__() with 4 args instead of 1
This commit is contained in:
parent
becdbec806
commit
24c137432c
2 changed files with 56 additions and 2 deletions
|
@ -47,8 +47,12 @@ builtin___import__(self, args)
|
||||||
object *args;
|
object *args;
|
||||||
{
|
{
|
||||||
char *name;
|
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 NULL;
|
||||||
return import_module(name);
|
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 object *build_class PROTO((object *, object *, object *));
|
||||||
static int access_statement PROTO((object *, object *, frameobject *));
|
static int access_statement PROTO((object *, object *, frameobject *));
|
||||||
static int exec_statement PROTO((object *, object *, object *));
|
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 */
|
/* Pointer to current frame, used to link new frames to */
|
||||||
|
@ -1338,7 +1339,19 @@ eval_code(co, globals, locals, owner, arg)
|
||||||
"__import__ not found");
|
"__import__ not found");
|
||||||
break;
|
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) {
|
if (w == NULL) {
|
||||||
x = NULL;
|
x = NULL;
|
||||||
break;
|
break;
|
||||||
|
@ -1352,6 +1365,7 @@ eval_code(co, globals, locals, owner, arg)
|
||||||
case IMPORT_FROM:
|
case IMPORT_FROM:
|
||||||
w = GETNAMEV(oparg);
|
w = GETNAMEV(oparg);
|
||||||
v = TOP();
|
v = TOP();
|
||||||
|
fast_2_locals(f);
|
||||||
err = import_from(f->f_locals, v, w);
|
err = import_from(f->f_locals, v, w);
|
||||||
locals_2_fast(f, 0);
|
locals_2_fast(f, 0);
|
||||||
break;
|
break;
|
||||||
|
@ -2711,3 +2725,39 @@ exec_statement(prog, globals, locals)
|
||||||
DECREF(v);
|
DECREF(v);
|
||||||
return 0;
|
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;
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue