From dd13e4f91ff2d8824e852afaec59d95d7dd409b3 Mon Sep 17 00:00:00 2001 From: Thomas Wouters Date: Sun, 27 Aug 2000 20:31:27 +0000 Subject: Replace the run-time 'future-bytecode-stream-inspection' hack to find out how 'import' was called with a compiletime mechanism: create either a tuple of the import arguments, or None (in the case of a normal import), add it to the code-block constants, and load it onto the stack before calling IMPORT_NAME. --- Python/ceval.c | 56 +------------------------------------------------------- Python/compile.c | 18 ++++++++++++++++-- Python/import.c | 4 ++-- 3 files changed, 19 insertions(+), 59 deletions(-) diff --git a/Python/ceval.c b/Python/ceval.c index 2648add..53a5177 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -71,7 +71,6 @@ static int import_all_from(PyObject *, PyObject *); static PyObject *build_class(PyObject *, PyObject *, PyObject *); static int exec_statement(PyFrameObject *, PyObject *, PyObject *, PyObject *); -static PyObject *find_from_args(PyFrameObject *, int); static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *); static void reset_exc_info(PyThreadState *); @@ -1627,11 +1626,7 @@ eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals, "__import__ not found"); break; } - u = find_from_args(f, INSTR_OFFSET()); - if (u == NULL) { - x = u; - break; - } + u = POP(); w = Py_BuildValue("(OOOO)", w, f->f_globals, @@ -3068,55 +3063,6 @@ exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals, return 0; } -/* Hack for ni.py */ -static PyObject * -find_from_args(PyFrameObject *f, int nexti) -{ - int opcode; - int oparg; - PyObject *list, *name; - unsigned char *next_instr; - - _PyCode_GETCODEPTR(f->f_code, &next_instr); - next_instr += nexti; - - opcode = (*next_instr++); - if (opcode != IMPORT_FROM && opcode != IMPORT_STAR) { - Py_INCREF(Py_None); - return Py_None; - } - - list = PyList_New(0); - if (list == NULL) - return NULL; - - if (opcode == IMPORT_STAR) { - name = PyString_FromString("*"); - if (!name) - Py_DECREF(list); - else { - if (PyList_Append(list, name) < 0) { - Py_DECREF(list); - } - Py_DECREF(name); - } - } else { - do { - oparg = (next_instr[1]<<8) + next_instr[0]; - /* Jump over our own argument, the next instruction - (which is a STORE), and its argument.*/ - next_instr += 5; - name = Getnamev(f, oparg); - if (PyList_Append(list, name) < 0) { - Py_DECREF(list); - break; - } - opcode = (*next_instr++); - } while (opcode == IMPORT_FROM); - } - return list; -} - #ifdef DYNAMIC_EXECUTION_PROFILE diff --git a/Python/compile.c b/Python/compile.c index dc6e2fb..ba910c4 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -2329,14 +2329,27 @@ static void com_import_stmt(struct compiling *c, node *n) { int i; + PyObject *tup; REQ(n, import_stmt); /* 'import' dotted_name (',' dotted_name)* | 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */ if (STR(CHILD(n, 0))[0] == 'f') { /* 'from' dotted_name 'import' ... */ REQ(CHILD(n, 1), dotted_name); - com_addopname(c, IMPORT_NAME, CHILD(n, 1)); + + if (TYPE(CHILD(n, 3)) == STAR) { + tup = Py_BuildValue("(s)", "*"); + } else { + tup = PyTuple_New((NCH(n) - 2)/2); + for (i = 3; i < NCH(n); i += 2) { + PyTuple_SET_ITEM(tup, (i-3)/2, + PyString_FromString(STR( + CHILD(CHILD(n, i), 0)))); + } + } + com_addoparg(c, LOAD_CONST, com_addconst(c, tup)); com_push(c, 1); + com_addopname(c, IMPORT_NAME, CHILD(n, 1)); if (TYPE(CHILD(n, 3)) == STAR) com_addbyte(c, IMPORT_STAR); else { @@ -2351,8 +2364,9 @@ com_import_stmt(struct compiling *c, node *n) for (i = 1; i < NCH(n); i += 2) { node *subn = CHILD(n, i); REQ(subn, dotted_as_name); - com_addopname(c, IMPORT_NAME, CHILD(subn, 0)); + com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None)); com_push(c, 1); + com_addopname(c, IMPORT_NAME, CHILD(subn, 0)); if (NCH(subn) > 1) { int j; if (strcmp(STR(CHILD(subn, 1)), "as") != 0) { diff --git a/Python/import.c b/Python/import.c index f38ee41..2e058bd 100644 --- a/Python/import.c +++ b/Python/import.c @@ -66,7 +66,7 @@ extern time_t PyOS_GetLastModificationTime(char *, FILE *); /* XXX Perhaps the magic number should be frozen and a version field added to the .pyc file header? */ /* New way to come up with the magic number: (YEAR-1995), MONTH, DAY */ -#define MAGIC (50822 | ((long)'\r'<<16) | ((long)'\n'<<24)) +#define MAGIC (50823 | ((long)'\r'<<16) | ((long)'\n'<<24)) /* Magic word as global; note that _PyImport_Init() can change the value of this global to accommodate for alterations of how the @@ -1401,7 +1401,7 @@ PyImport_ImportModule(char *name) { static PyObject *fromlist = NULL; if (fromlist == NULL && strchr(name, '.') != NULL) { - fromlist = Py_BuildValue("[s]", "*"); + fromlist = Py_BuildValue("(s)", "*"); if (fromlist == NULL) return NULL; } -- cgit v0.12