]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Replace the run-time 'future-bytecode-stream-inspection' hack to find out
authorThomas Wouters <thomas@python.org>
Sun, 27 Aug 2000 20:31:27 +0000 (20:31 +0000)
committerThomas Wouters <thomas@python.org>
Sun, 27 Aug 2000 20:31:27 +0000 (20:31 +0000)
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
Python/compile.c
Python/import.c

index 2648add5584e2a30b9cfcf67b522092539d3e0ed..53a5177520cdc009dac58babd6b3337af68405fc 100644 (file)
@@ -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
 
index dc6e2fb5feee05276e6bddc2253ee291a8a512ff..ba910c41346bf37d3bbb363543867bdd9899696d 100644 (file)
@@ -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) {
index f38ee4198c024fde5d2f9fe0558c67c8ffcba9b1..2e058bd0b54595989732fa48f0e6ed20402db5cb 100644 (file)
@@ -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;
        }