]> granicus.if.org Git - python/commitdiff
Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
authorGuido van Rossum <guido@python.org>
Wed, 11 Feb 1998 05:53:02 +0000 (05:53 +0000)
committerGuido van Rossum <guido@python.org>
Wed, 11 Feb 1998 05:53:02 +0000 (05:53 +0000)
pass it the true file.  This is used to set __file__ properly, instead
of believing what the code object carries with it.  (If the pointer
is NULL, the code object's co_filename is still used.)

Python/import.c

index 9dbbd255b6a682dc9419f1b16f6a46cc821e4fc8..a8076894d905989fd9c9c52e378eae72922df085 100644 (file)
@@ -424,6 +424,15 @@ PyObject *
 PyImport_ExecCodeModule(name, co)
        char *name;
        PyObject *co;
+{
+       return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
+}
+
+PyObject *
+PyImport_ExecCodeModuleEx(name, co, pathname)
+       char *name;
+       PyObject *co;
+       char *pathname;
 {
        PyObject *modules = PyImport_GetModuleDict();
        PyObject *m, *d, *v;
@@ -438,9 +447,20 @@ PyImport_ExecCodeModule(name, co)
                        return NULL;
        }
        /* Remember the filename as the __file__ attribute */
-       if (PyDict_SetItemString(d, "__file__",
-                                ((PyCodeObject *)co)->co_filename) != 0)
+       v = NULL;
+       if (pathname != NULL) {
+               v = PyString_FromString(pathname);
+               if (v == NULL)
+                       PyErr_Clear();
+       }
+       if (v == NULL) {
+               v = ((PyCodeObject *)co)->co_filename;
+               Py_INCREF(v);
+       }
+       if (PyDict_SetItemString(d, "__file__", v) != 0)
                PyErr_Clear(); /* Not important enough to report */
+       Py_DECREF(v);
+
        v = PyEval_EvalCode((PyCodeObject *)co, d, d);
        if (v == NULL)
                return NULL;
@@ -570,7 +590,7 @@ load_compiled_module(name, cpathname, fp)
        if (Py_VerboseFlag)
                fprintf(stderr, "import %s # precompiled from %s\n",
                        name, cpathname);
-       m = PyImport_ExecCodeModule(name, (PyObject *)co);
+       m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
        Py_DECREF(co);
 
        return m;
@@ -679,7 +699,7 @@ load_source_module(name, pathname, fp)
                                name, pathname);
                write_compiled_module(co, cpathname, mtime);
        }
-       m = PyImport_ExecCodeModule(name, (PyObject *)co);
+       m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
        Py_DECREF(co);
 
        return m;
@@ -1132,7 +1152,7 @@ PyImport_ImportFrozenModule(name)
                             name);
                return -1;
        }
-       m = PyImport_ExecCodeModule(name, co);
+       m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
        Py_DECREF(co);
        if (m == NULL)
                return -1;