Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
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.)
diff --git a/Python/import.c b/Python/import.c
index 9dbbd25..a807689 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -425,6 +425,15 @@
 	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 @@
 			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 @@
 	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 @@
 				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 @@
 			     name);
 		return -1;
 	}
-	m = PyImport_ExecCodeModule(name, co);
+	m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
 	Py_DECREF(co);
 	if (m == NULL)
 		return -1;