diff options
author | Guido van Rossum <guido@python.org> | 1995-02-14 09:42:43 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1995-02-14 09:42:43 (GMT) |
commit | 24c137432c0f0d26f13d2f645688e904f8ca0ee1 (patch) | |
tree | 98fbb3b71454704b2d0af2cf77562eb8b779e6e4 | |
parent | becdbec8067c0e4cd9c0d9aad682c547d8a2bba3 (diff) | |
download | cpython-24c137432c0f0d26f13d2f645688e904f8ca0ee1.zip cpython-24c137432c0f0d26f13d2f645688e904f8ca0ee1.tar.gz cpython-24c137432c0f0d26f13d2f645688e904f8ca0ee1.tar.bz2 |
call __import__() with 4 args instead of 1
-rw-r--r-- | Python/bltinmodule.c | 6 | ||||
-rw-r--r-- | Python/ceval.c | 52 |
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; +} |