blob: 9f668bfcdef3c7441976abfd90183a9ef0037683 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Module definition and import implementation */
3
Guido van Rossum79f25d91997-04-29 20:08:16 +00004#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00005
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00006#include "node.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00007#include "token.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00008#include "errcode.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +00009#include "marshal.h"
10#include "compile.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000011#include "eval.h"
Guido van Rossumd8bac6d1992-02-26 15:19:13 +000012#include "osdefs.h"
Guido van Rossum1ae940a1995-01-02 19:04:15 +000013#include "importdl.h"
Jack Jansen9c96a921995-02-15 22:57:06 +000014#ifdef macintosh
15#include "macglue.h"
16#endif
Guido van Rossumc405b7b1991-06-04 19:39:42 +000017
Guido van Rossum80bb9651996-12-05 23:27:02 +000018#ifdef HAVE_UNISTD_H
19#include <unistd.h>
20#endif
21
Guido van Rossum55a83382000-09-20 20:31:38 +000022#ifdef HAVE_FCNTL_H
23#include <fcntl.h>
24#endif
25
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000026extern time_t PyOS_GetLastModificationTime(char *, FILE *);
27 /* In getmtime.c */
Guido van Rossum21d335e1993-10-15 13:01:11 +000028
Guido van Rossum6c849691994-09-26 15:47:17 +000029/* Magic word to reject .pyc files generated by other Python versions */
Guido van Rossum7faeab31995-07-07 22:50:36 +000030/* Change for each incompatible change */
31/* The value of CR and LF is incorporated so if you ever read or write
32 a .pyc file in text mode the magic number will be wrong; also, the
33 Apple MPW compiler swaps their values, botching string constants */
34/* XXX Perhaps the magic number should be frozen and a version field
35 added to the .pyc file header? */
Guido van Rossumdd5db431997-01-17 21:06:11 +000036/* New way to come up with the magic number: (YEAR-1995), MONTH, DAY */
Tim Peters6d6c1a32001-08-02 04:15:00 +000037#define MAGIC (60717 | ((long)'\r'<<16) | ((long)'\n'<<24))
Guido van Rossum3ddee711991-12-16 13:06:34 +000038
Guido van Rossum96774c12000-05-01 20:19:08 +000039/* Magic word as global; note that _PyImport_Init() can change the
Jeremy Hylton9262b8a2000-06-30 04:59:17 +000040 value of this global to accommodate for alterations of how the
Guido van Rossum96774c12000-05-01 20:19:08 +000041 compiler works which are enabled by command line switches. */
42static long pyc_magic = MAGIC;
43
Guido van Rossum25ce5661997-08-02 03:10:38 +000044/* See _PyImport_FixupExtension() below */
45static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000046
Guido van Rossum771c6c81997-10-31 18:37:24 +000047/* This table is defined in config.c: */
48extern struct _inittab _PyImport_Inittab[];
49
50struct _inittab *PyImport_Inittab = _PyImport_Inittab;
Guido van Rossum66f1fa81991-04-03 19:03:52 +000051
Guido van Rossumed1170e1999-12-20 21:23:41 +000052/* these tables define the module suffixes that Python recognizes */
53struct filedescr * _PyImport_Filetab = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +000054
55#ifdef RISCOS
56static const struct filedescr _PyImport_StandardFiletab[] = {
57 {"/py", "r", PY_SOURCE},
58 {"/pyc", "rb", PY_COMPILED},
59 {0, 0}
60};
61#else
Guido van Rossumed1170e1999-12-20 21:23:41 +000062static const struct filedescr _PyImport_StandardFiletab[] = {
63 {".py", "r", PY_SOURCE},
Tim Petersc1731372001-08-04 08:12:36 +000064#ifdef MS_WIN32
65 {".pyw", "r", PY_SOURCE},
66#endif
Guido van Rossumed1170e1999-12-20 21:23:41 +000067 {".pyc", "rb", PY_COMPILED},
68 {0, 0}
69};
Guido van Rossum48a680c2001-03-02 06:34:14 +000070#endif
Guido van Rossumed1170e1999-12-20 21:23:41 +000071
Guido van Rossum1ae940a1995-01-02 19:04:15 +000072/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000073
74void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000075_PyImport_Init(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000076{
Guido van Rossumed1170e1999-12-20 21:23:41 +000077 const struct filedescr *scan;
78 struct filedescr *filetab;
79 int countD = 0;
80 int countS = 0;
81
82 /* prepare _PyImport_Filetab: copy entries from
83 _PyImport_DynLoadFiletab and _PyImport_StandardFiletab.
84 */
85 for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan)
86 ++countD;
87 for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan)
88 ++countS;
Guido van Rossumb18618d2000-05-03 23:44:39 +000089 filetab = PyMem_NEW(struct filedescr, countD + countS + 1);
Guido van Rossumed1170e1999-12-20 21:23:41 +000090 memcpy(filetab, _PyImport_DynLoadFiletab,
91 countD * sizeof(struct filedescr));
92 memcpy(filetab + countD, _PyImport_StandardFiletab,
93 countS * sizeof(struct filedescr));
94 filetab[countD + countS].suffix = NULL;
95
96 _PyImport_Filetab = filetab;
97
Guido van Rossum0824f631997-03-11 18:37:35 +000098 if (Py_OptimizeFlag) {
Guido van Rossumed1170e1999-12-20 21:23:41 +000099 /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */
100 for (; filetab->suffix != NULL; filetab++) {
Guido van Rossum48a680c2001-03-02 06:34:14 +0000101#ifndef RISCOS
Guido van Rossumed1170e1999-12-20 21:23:41 +0000102 if (strcmp(filetab->suffix, ".pyc") == 0)
103 filetab->suffix = ".pyo";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000104#else
105 if (strcmp(filetab->suffix, "/pyc") == 0)
106 filetab->suffix = "/pyo";
107#endif
Guido van Rossum0824f631997-03-11 18:37:35 +0000108 }
109 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000110
111 if (Py_UnicodeFlag) {
112 /* Fix the pyc_magic so that byte compiled code created
113 using the all-Unicode method doesn't interfere with
114 code created in normal operation mode. */
115 pyc_magic = MAGIC + 1;
116 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000117}
118
Guido van Rossum25ce5661997-08-02 03:10:38 +0000119void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000120_PyImport_Fini(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000121{
122 Py_XDECREF(extensions);
123 extensions = NULL;
Barry Warsaw84294482000-10-03 16:02:05 +0000124 PyMem_DEL(_PyImport_Filetab);
125 _PyImport_Filetab = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000126}
127
128
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000129/* Locking primitives to prevent parallel imports of the same module
130 in different threads to return with a partially loaded module.
131 These calls are serialized by the global interpreter lock. */
132
133#ifdef WITH_THREAD
134
Guido van Rossum49b56061998-10-01 20:42:43 +0000135#include "pythread.h"
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000136
Guido van Rossum65d5b571998-12-21 19:32:43 +0000137static PyThread_type_lock import_lock = 0;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000138static long import_lock_thread = -1;
139static int import_lock_level = 0;
140
141static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000142lock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000143{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000144 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000145 if (me == -1)
146 return; /* Too bad */
147 if (import_lock == NULL)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000148 import_lock = PyThread_allocate_lock();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000149 if (import_lock_thread == me) {
150 import_lock_level++;
151 return;
152 }
Guido van Rossum65d5b571998-12-21 19:32:43 +0000153 if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0)) {
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000154 PyThreadState *tstate = PyEval_SaveThread();
Guido van Rossum65d5b571998-12-21 19:32:43 +0000155 PyThread_acquire_lock(import_lock, 1);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000156 PyEval_RestoreThread(tstate);
157 }
158 import_lock_thread = me;
159 import_lock_level = 1;
160}
161
162static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000163unlock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000164{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000165 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000166 if (me == -1)
167 return; /* Too bad */
168 if (import_lock_thread != me)
169 Py_FatalError("unlock_import: not holding the import lock");
170 import_lock_level--;
171 if (import_lock_level == 0) {
172 import_lock_thread = -1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000173 PyThread_release_lock(import_lock);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000174 }
175}
176
177#else
178
179#define lock_import()
180#define unlock_import()
181
182#endif
183
Tim Peters69232342001-08-30 05:16:13 +0000184static PyObject *
185imp_lock_held(PyObject *self, PyObject *args)
186{
187 if (!PyArg_ParseTuple(args, ":lock_held"))
188 return NULL;
189#ifdef WITH_THREAD
190 return PyInt_FromLong(import_lock_thread != -1);
191#else
192 return PyInt_FromLong(0);
193#endif
194}
195
Guido van Rossum25ce5661997-08-02 03:10:38 +0000196/* Helper for sys */
197
198PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000199PyImport_GetModuleDict(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000200{
201 PyInterpreterState *interp = PyThreadState_Get()->interp;
202 if (interp->modules == NULL)
203 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
204 return interp->modules;
205}
206
Guido van Rossum3f5da241990-12-20 15:06:42 +0000207
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000208/* List of names to clear in sys */
209static char* sys_deletes[] = {
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000210 "path", "argv", "ps1", "ps2", "exitfunc",
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000211 "exc_type", "exc_value", "exc_traceback",
212 "last_type", "last_value", "last_traceback",
213 NULL
214};
215
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000216static char* sys_files[] = {
217 "stdin", "__stdin__",
218 "stdout", "__stdout__",
219 "stderr", "__stderr__",
220 NULL
221};
222
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000223
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000224/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000225
Guido van Rossum3f5da241990-12-20 15:06:42 +0000226void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000227PyImport_Cleanup(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000228{
Guido van Rossum758eec01998-01-19 21:58:26 +0000229 int pos, ndone;
230 char *name;
231 PyObject *key, *value, *dict;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000232 PyInterpreterState *interp = PyThreadState_Get()->interp;
Guido van Rossum758eec01998-01-19 21:58:26 +0000233 PyObject *modules = interp->modules;
234
235 if (modules == NULL)
236 return; /* Already done */
237
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000238 /* Delete some special variables first. These are common
239 places where user values hide and people complain when their
240 destructors fail. Since the modules containing them are
241 deleted *last* of all, they would come too late in the normal
242 destruction order. Sigh. */
243
244 value = PyDict_GetItemString(modules, "__builtin__");
245 if (value != NULL && PyModule_Check(value)) {
246 dict = PyModule_GetDict(value);
247 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000248 PySys_WriteStderr("# clear __builtin__._\n");
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000249 PyDict_SetItemString(dict, "_", Py_None);
250 }
251 value = PyDict_GetItemString(modules, "sys");
252 if (value != NULL && PyModule_Check(value)) {
253 char **p;
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000254 PyObject *v;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000255 dict = PyModule_GetDict(value);
256 for (p = sys_deletes; *p != NULL; p++) {
257 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000258 PySys_WriteStderr("# clear sys.%s\n", *p);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000259 PyDict_SetItemString(dict, *p, Py_None);
260 }
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000261 for (p = sys_files; *p != NULL; p+=2) {
262 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000263 PySys_WriteStderr("# restore sys.%s\n", *p);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000264 v = PyDict_GetItemString(dict, *(p+1));
265 if (v == NULL)
266 v = Py_None;
267 PyDict_SetItemString(dict, *p, v);
268 }
269 }
270
271 /* First, delete __main__ */
272 value = PyDict_GetItemString(modules, "__main__");
273 if (value != NULL && PyModule_Check(value)) {
274 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000275 PySys_WriteStderr("# cleanup __main__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000276 _PyModule_Clear(value);
277 PyDict_SetItemString(modules, "__main__", Py_None);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000278 }
279
Guido van Rossum758eec01998-01-19 21:58:26 +0000280 /* The special treatment of __builtin__ here is because even
281 when it's not referenced as a module, its dictionary is
282 referenced by almost every module's __builtins__. Since
283 deleting a module clears its dictionary (even if there are
284 references left to it), we need to delete the __builtin__
285 module last. Likewise, we don't delete sys until the very
286 end because it is implicitly referenced (e.g. by print).
287
288 Also note that we 'delete' modules by replacing their entry
289 in the modules dict with None, rather than really deleting
290 them; this avoids a rehash of the modules dictionary and
291 also marks them as "non existent" so they won't be
292 re-imported. */
293
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000294 /* Next, repeatedly delete modules with a reference count of
Guido van Rossum758eec01998-01-19 21:58:26 +0000295 one (skipping __builtin__ and sys) and delete them */
296 do {
297 ndone = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000298 pos = 0;
Guido van Rossum758eec01998-01-19 21:58:26 +0000299 while (PyDict_Next(modules, &pos, &key, &value)) {
300 if (value->ob_refcnt != 1)
301 continue;
Guido van Rossum566373e1998-10-01 15:24:50 +0000302 if (PyString_Check(key) && PyModule_Check(value)) {
303 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000304 if (strcmp(name, "__builtin__") == 0)
305 continue;
306 if (strcmp(name, "sys") == 0)
307 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000308 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000309 PySys_WriteStderr(
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000310 "# cleanup[1] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000311 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000312 PyDict_SetItem(modules, key, Py_None);
313 ndone++;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000314 }
315 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000316 } while (ndone > 0);
317
Guido van Rossum758eec01998-01-19 21:58:26 +0000318 /* Next, delete all modules (still skipping __builtin__ and sys) */
319 pos = 0;
320 while (PyDict_Next(modules, &pos, &key, &value)) {
Guido van Rossum566373e1998-10-01 15:24:50 +0000321 if (PyString_Check(key) && PyModule_Check(value)) {
322 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000323 if (strcmp(name, "__builtin__") == 0)
324 continue;
325 if (strcmp(name, "sys") == 0)
326 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000327 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000328 PySys_WriteStderr("# cleanup[2] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000329 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000330 PyDict_SetItem(modules, key, Py_None);
331 }
332 }
333
334 /* Next, delete sys and __builtin__ (in that order) */
335 value = PyDict_GetItemString(modules, "sys");
336 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000337 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000338 PySys_WriteStderr("# cleanup sys\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000339 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000340 PyDict_SetItemString(modules, "sys", Py_None);
341 }
342 value = PyDict_GetItemString(modules, "__builtin__");
343 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000344 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000345 PySys_WriteStderr("# cleanup __builtin__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000346 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000347 PyDict_SetItemString(modules, "__builtin__", Py_None);
348 }
349
350 /* Finally, clear and delete the modules directory */
351 PyDict_Clear(modules);
352 interp->modules = NULL;
353 Py_DECREF(modules);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000354}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000355
356
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000357/* Helper for pythonrun.c -- return magic number */
358
359long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000360PyImport_GetMagicNumber(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000361{
Guido van Rossum96774c12000-05-01 20:19:08 +0000362 return pyc_magic;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000363}
364
365
Guido van Rossum25ce5661997-08-02 03:10:38 +0000366/* Magic for extension modules (built-in as well as dynamically
367 loaded). To prevent initializing an extension module more than
368 once, we keep a static dictionary 'extensions' keyed by module name
369 (for built-in modules) or by filename (for dynamically loaded
Barry Warsaw92883382001-08-13 23:05:44 +0000370 modules), containing these modules. A copy of the module's
Guido van Rossum25ce5661997-08-02 03:10:38 +0000371 dictionary is stored by calling _PyImport_FixupExtension()
372 immediately after the module initialization function succeeds. A
373 copy can be retrieved from there by calling
374 _PyImport_FindExtension(). */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000375
Guido van Rossum79f25d91997-04-29 20:08:16 +0000376PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000377_PyImport_FixupExtension(char *name, char *filename)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000378{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000379 PyObject *modules, *mod, *dict, *copy;
380 if (extensions == NULL) {
381 extensions = PyDict_New();
382 if (extensions == NULL)
383 return NULL;
384 }
385 modules = PyImport_GetModuleDict();
386 mod = PyDict_GetItemString(modules, name);
387 if (mod == NULL || !PyModule_Check(mod)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000388 PyErr_Format(PyExc_SystemError,
389 "_PyImport_FixupExtension: module %.200s not loaded", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000390 return NULL;
391 }
392 dict = PyModule_GetDict(mod);
393 if (dict == NULL)
394 return NULL;
Fred Drake9cd0efc2001-10-25 21:38:59 +0000395 copy = PyDict_Copy(dict);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000396 if (copy == NULL)
397 return NULL;
398 PyDict_SetItemString(extensions, filename, copy);
399 Py_DECREF(copy);
400 return copy;
401}
402
403PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000404_PyImport_FindExtension(char *name, char *filename)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000405{
Fred Drake9cd0efc2001-10-25 21:38:59 +0000406 PyObject *dict, *mod, *mdict;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000407 if (extensions == NULL)
408 return NULL;
409 dict = PyDict_GetItemString(extensions, filename);
410 if (dict == NULL)
411 return NULL;
412 mod = PyImport_AddModule(name);
413 if (mod == NULL)
414 return NULL;
415 mdict = PyModule_GetDict(mod);
416 if (mdict == NULL)
417 return NULL;
Fred Drake9cd0efc2001-10-25 21:38:59 +0000418 if (PyDict_Update(mdict, dict))
Guido van Rossum25ce5661997-08-02 03:10:38 +0000419 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000420 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000421 PySys_WriteStderr("import %s # previously loaded (%s)\n",
Guido van Rossum25ce5661997-08-02 03:10:38 +0000422 name, filename);
423 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000424}
425
426
427/* Get the module object corresponding to a module name.
428 First check the modules dictionary if there's one there,
429 if not, create a new one and insert in in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000430 Because the former action is most common, THIS DOES NOT RETURN A
431 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000432
Guido van Rossum79f25d91997-04-29 20:08:16 +0000433PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000434PyImport_AddModule(char *name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000435{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000436 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000437 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000438
Guido van Rossum25ce5661997-08-02 03:10:38 +0000439 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
Guido van Rossum79f25d91997-04-29 20:08:16 +0000440 PyModule_Check(m))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000441 return m;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000442 m = PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000443 if (m == NULL)
444 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000445 if (PyDict_SetItemString(modules, name, m) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000446 Py_DECREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000447 return NULL;
448 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000449 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000450
451 return m;
452}
453
454
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000455/* Execute a code object in a module and return the module object
456 WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000457
Guido van Rossum79f25d91997-04-29 20:08:16 +0000458PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000459PyImport_ExecCodeModule(char *name, PyObject *co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000460{
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000461 return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
462}
463
464PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000465PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname)
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000466{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000467 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000468 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000469
Guido van Rossum79f25d91997-04-29 20:08:16 +0000470 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000471 if (m == NULL)
472 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000473 d = PyModule_GetDict(m);
474 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
475 if (PyDict_SetItemString(d, "__builtins__",
476 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000477 return NULL;
478 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000479 /* Remember the filename as the __file__ attribute */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000480 v = NULL;
481 if (pathname != NULL) {
482 v = PyString_FromString(pathname);
483 if (v == NULL)
484 PyErr_Clear();
485 }
486 if (v == NULL) {
487 v = ((PyCodeObject *)co)->co_filename;
488 Py_INCREF(v);
489 }
490 if (PyDict_SetItemString(d, "__file__", v) != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000491 PyErr_Clear(); /* Not important enough to report */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000492 Py_DECREF(v);
493
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000494 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000495 if (v == NULL)
496 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000497 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000498
Guido van Rossum25ce5661997-08-02 03:10:38 +0000499 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000500 PyErr_Format(PyExc_ImportError,
501 "Loaded module %.200s not found in sys.modules",
502 name);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000503 return NULL;
504 }
505
Guido van Rossum79f25d91997-04-29 20:08:16 +0000506 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000507
508 return m;
509}
510
511
512/* Given a pathname for a Python source file, fill a buffer with the
513 pathname for the corresponding compiled file. Return the pathname
514 for the compiled file, or NULL if there's no space in the buffer.
515 Doesn't set an exception. */
516
517static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000518make_compiled_pathname(char *pathname, char *buf, size_t buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000519{
Tim Petersc1731372001-08-04 08:12:36 +0000520 size_t len = strlen(pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000521 if (len+2 > buflen)
522 return NULL;
Tim Petersc1731372001-08-04 08:12:36 +0000523
524#ifdef MS_WIN32
525 /* Treat .pyw as if it were .py. The case of ".pyw" must match
526 that used in _PyImport_StandardFiletab. */
527 if (len >= 4 && strcmp(&pathname[len-4], ".pyw") == 0)
528 --len; /* pretend 'w' isn't there */
529#endif
530 memcpy(buf, pathname, len);
531 buf[len] = Py_OptimizeFlag ? 'o' : 'c';
532 buf[len+1] = '\0';
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000533
534 return buf;
535}
536
537
538/* Given a pathname for a Python source file, its time of last
539 modification, and a pathname for a compiled file, check whether the
540 compiled file represents the same version of the source. If so,
541 return a FILE pointer for the compiled file, positioned just after
542 the header; if not, return NULL.
543 Doesn't set an exception. */
544
545static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000546check_compiled_module(char *pathname, long mtime, char *cpathname)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000547{
548 FILE *fp;
549 long magic;
550 long pyc_mtime;
551
552 fp = fopen(cpathname, "rb");
553 if (fp == NULL)
554 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000555 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000556 if (magic != pyc_magic) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000557 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000558 PySys_WriteStderr("# %s has bad magic\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000559 fclose(fp);
560 return NULL;
561 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000562 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000563 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000564 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000565 PySys_WriteStderr("# %s has bad mtime\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000566 fclose(fp);
567 return NULL;
568 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000569 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000570 PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000571 return fp;
572}
573
574
575/* Read a code object from a file and check it for validity */
576
Guido van Rossum79f25d91997-04-29 20:08:16 +0000577static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000578read_compiled_module(char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000579{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000580 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000581
Tim Petersd9b9ac82001-01-28 00:27:39 +0000582 co = PyMarshal_ReadLastObjectFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000583 /* Ugly: rd_object() may return NULL with or without error */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000584 if (co == NULL || !PyCode_Check(co)) {
585 if (!PyErr_Occurred())
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000586 PyErr_Format(PyExc_ImportError,
587 "Non-code object in %.200s", cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000588 Py_XDECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000589 return NULL;
590 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000591 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000592}
593
594
595/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000596 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000597
Guido van Rossum79f25d91997-04-29 20:08:16 +0000598static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000599load_compiled_module(char *name, char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000600{
601 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000602 PyCodeObject *co;
603 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000604
Guido van Rossum79f25d91997-04-29 20:08:16 +0000605 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000606 if (magic != pyc_magic) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000607 PyErr_Format(PyExc_ImportError,
608 "Bad magic number in %.200s", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000609 return NULL;
610 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000611 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000612 co = read_compiled_module(cpathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000613 if (co == NULL)
614 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000615 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000616 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000617 name, cpathname);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000618 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000619 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000620
621 return m;
622}
623
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000624/* Parse a source file and return the corresponding code object */
625
Guido van Rossum79f25d91997-04-29 20:08:16 +0000626static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000627parse_source_module(char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000628{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000629 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000630 node *n;
631
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000632 n = PyParser_SimpleParseFile(fp, pathname, Py_file_input);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000633 if (n == NULL)
634 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000635 co = PyNode_Compile(n, pathname);
636 PyNode_Free(n);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000637
638 return co;
639}
640
641
Guido van Rossum55a83382000-09-20 20:31:38 +0000642/* Helper to open a bytecode file for writing in exclusive mode */
643
644static FILE *
645open_exclusive(char *filename)
646{
647#if defined(O_EXCL)&&defined(O_CREAT)&&defined(O_WRONLY)&&defined(O_TRUNC)
648 /* Use O_EXCL to avoid a race condition when another process tries to
649 write the same file. When that happens, our open() call fails,
650 which is just fine (since it's only a cache).
651 XXX If the file exists and is writable but the directory is not
652 writable, the file will never be written. Oh well.
653 */
654 int fd;
655 (void) unlink(filename);
Tim Peters42c83af2000-09-29 04:03:10 +0000656 fd = open(filename, O_EXCL|O_CREAT|O_WRONLY|O_TRUNC
657#ifdef O_BINARY
658 |O_BINARY /* necessary for Windows */
659#endif
Tim Peters50d8d372001-02-28 05:34:27 +0000660
Tim Peters42c83af2000-09-29 04:03:10 +0000661 , 0666);
Guido van Rossum55a83382000-09-20 20:31:38 +0000662 if (fd < 0)
663 return NULL;
664 return fdopen(fd, "wb");
665#else
666 /* Best we can do -- on Windows this can't happen anyway */
667 return fopen(filename, "wb");
668#endif
669}
670
671
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000672/* Write a compiled module to a file, placing the time of last
673 modification of its source into the header.
674 Errors are ignored, if a write error occurs an attempt is made to
675 remove the file. */
676
677static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000678write_compiled_module(PyCodeObject *co, char *cpathname, long mtime)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000679{
680 FILE *fp;
681
Guido van Rossum55a83382000-09-20 20:31:38 +0000682 fp = open_exclusive(cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000683 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000684 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000685 PySys_WriteStderr(
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000686 "# can't create %s\n", cpathname);
687 return;
688 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000689 PyMarshal_WriteLongToFile(pyc_magic, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000690 /* First write a 0 for mtime */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000691 PyMarshal_WriteLongToFile(0L, fp);
692 PyMarshal_WriteObjectToFile((PyObject *)co, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000693 if (ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000694 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000695 PySys_WriteStderr("# can't write %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000696 /* Don't keep partial file */
697 fclose(fp);
698 (void) unlink(cpathname);
699 return;
700 }
701 /* Now write the true mtime */
702 fseek(fp, 4L, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000703 PyMarshal_WriteLongToFile(mtime, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000704 fflush(fp);
705 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000706 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000707 PySys_WriteStderr("# wrote %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000708#ifdef macintosh
Jack Jansencbf630f2000-07-11 21:59:16 +0000709 PyMac_setfiletype(cpathname, 'Pyth', 'PYC ');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000710#endif
711}
712
713
714/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000715 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
716 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000717
Guido van Rossum79f25d91997-04-29 20:08:16 +0000718static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000719load_source_module(char *name, char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000720{
Fred Drake4c82b232000-06-30 16:18:57 +0000721 time_t mtime;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000722 FILE *fpc;
723 char buf[MAXPATHLEN+1];
724 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000725 PyCodeObject *co;
726 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000727
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000728 mtime = PyOS_GetLastModificationTime(pathname, fp);
Fred Drakec63d3e92001-03-01 06:33:32 +0000729 if (mtime == (time_t)(-1))
Fred Drake4c82b232000-06-30 16:18:57 +0000730 return NULL;
731#if SIZEOF_TIME_T > 4
732 /* Python's .pyc timestamp handling presumes that the timestamp fits
733 in 4 bytes. This will be fine until sometime in the year 2038,
734 when a 4-byte signed time_t will overflow.
735 */
736 if (mtime >> 32) {
737 PyErr_SetString(PyExc_OverflowError,
Fred Drakec63d3e92001-03-01 06:33:32 +0000738 "modification time overflows a 4 byte field");
Fred Drake4c82b232000-06-30 16:18:57 +0000739 return NULL;
740 }
741#endif
Jeremy Hylton37832f02001-04-13 17:50:20 +0000742 cpathname = make_compiled_pathname(pathname, buf,
743 (size_t)MAXPATHLEN + 1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000744 if (cpathname != NULL &&
745 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000746 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000747 fclose(fpc);
748 if (co == NULL)
749 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000750 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000751 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000752 name, cpathname);
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000753 pathname = cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000754 }
755 else {
756 co = parse_source_module(pathname, fp);
757 if (co == NULL)
758 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000759 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000760 PySys_WriteStderr("import %s # from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000761 name, pathname);
762 write_compiled_module(co, cpathname, mtime);
763 }
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000764 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000765 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000766
767 return m;
768}
769
770
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000771/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +0000772static PyObject *load_module(char *, FILE *, char *, int);
773static struct filedescr *find_module(char *, PyObject *,
774 char *, size_t, FILE **);
775static struct _frozen *find_frozen(char *name);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000776
777/* Load a package and return its module object WITH INCREMENTED
778 REFERENCE COUNT */
779
780static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000781load_package(char *name, char *pathname)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000782{
783 PyObject *m, *d, *file, *path;
784 int err;
785 char buf[MAXPATHLEN+1];
786 FILE *fp = NULL;
787 struct filedescr *fdp;
788
789 m = PyImport_AddModule(name);
790 if (m == NULL)
791 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000792 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000793 PySys_WriteStderr("import %s # directory %s\n",
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000794 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000795 d = PyModule_GetDict(m);
796 file = PyString_FromString(pathname);
797 if (file == NULL)
798 return NULL;
799 path = Py_BuildValue("[O]", file);
800 if (path == NULL) {
801 Py_DECREF(file);
802 return NULL;
803 }
804 err = PyDict_SetItemString(d, "__file__", file);
805 if (err == 0)
806 err = PyDict_SetItemString(d, "__path__", path);
807 if (err != 0) {
808 m = NULL;
809 goto cleanup;
810 }
811 buf[0] = '\0';
812 fdp = find_module("__init__", path, buf, sizeof(buf), &fp);
813 if (fdp == NULL) {
814 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
815 PyErr_Clear();
816 }
817 else
818 m = NULL;
819 goto cleanup;
820 }
821 m = load_module(name, fp, buf, fdp->type);
822 if (fp != NULL)
823 fclose(fp);
824 cleanup:
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000825 Py_XDECREF(path);
826 Py_XDECREF(file);
827 return m;
828}
829
830
831/* Helper to test for built-in module */
832
833static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000834is_builtin(char *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000835{
836 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +0000837 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
838 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
839 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000840 return -1;
841 else
842 return 1;
843 }
844 }
845 return 0;
846}
847
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000848
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000849/* Search the path (default sys.path) for a module. Return the
850 corresponding filedescr struct, and (via return arguments) the
851 pathname and an open file. Return NULL if the module is not found. */
852
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000853#ifdef MS_COREDLL
Thomas Woutersb4bd21c2000-07-22 23:38:01 +0000854extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **,
855 char *, int);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000856#endif
857
Tim Peters50d8d372001-02-28 05:34:27 +0000858static int case_ok(char *, int, int, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000859static int find_init_module(char *); /* Forward */
Guido van Rossum197346f1997-10-31 18:38:52 +0000860
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000861static struct filedescr *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000862find_module(char *realname, PyObject *path, char *buf, size_t buflen,
863 FILE **p_fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000864{
Fred Drake4c82b232000-06-30 16:18:57 +0000865 int i, npath;
866 size_t len, namelen;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000867 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000868 FILE *fp = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000869#ifndef RISCOS
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000870 struct stat statbuf;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000871#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000872 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
873 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
874 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossum0506a431998-08-11 15:07:39 +0000875 char name[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000876
Fred Drake4c82b232000-06-30 16:18:57 +0000877 if (strlen(realname) > MAXPATHLEN) {
Guido van Rossum8f4d3312001-10-18 18:54:11 +0000878 PyErr_SetString(PyExc_OverflowError,
879 "module name is too long");
Fred Drake4c82b232000-06-30 16:18:57 +0000880 return NULL;
881 }
Guido van Rossum0506a431998-08-11 15:07:39 +0000882 strcpy(name, realname);
883
884 if (path != NULL && PyString_Check(path)) {
Guido van Rossum8f4d3312001-10-18 18:54:11 +0000885 /* The only type of submodule allowed inside a "frozen"
886 package are other frozen modules or packages. */
Guido van Rossum0506a431998-08-11 15:07:39 +0000887 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
888 PyErr_SetString(PyExc_ImportError,
889 "full frozen module name too long");
890 return NULL;
891 }
892 strcpy(buf, PyString_AsString(path));
893 strcat(buf, ".");
894 strcat(buf, name);
895 strcpy(name, buf);
Jack Jansen550fdae2001-10-30 13:08:39 +0000896#ifdef macintosh
897 /* Freezing on the mac works different, and the modules are
898 ** actually on sys.path. So we don't take the quick exit but
899 ** continue with the normal flow.
900 */
901 path = NULL;
902#else
Guido van Rossum8f4d3312001-10-18 18:54:11 +0000903 if (find_frozen(name) != NULL) {
904 strcpy(buf, name);
905 return &fd_frozen;
906 }
907 PyErr_Format(PyExc_ImportError,
908 "No frozen submodule named %.200s", name);
909 return NULL;
Jack Jansen550fdae2001-10-30 13:08:39 +0000910#endif
Guido van Rossum0506a431998-08-11 15:07:39 +0000911 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000912 if (path == NULL) {
913 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000914 strcpy(buf, name);
915 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000916 }
Greg Ward201baee2001-10-04 14:52:06 +0000917 if ((find_frozen(name)) != NULL) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000918 strcpy(buf, name);
919 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000920 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000921
Guido van Rossumac279101996-08-22 23:10:58 +0000922#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000923 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
924 if (fp != NULL) {
925 *p_fp = fp;
926 return fdp;
927 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000928#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000929 path = PySys_GetObject("path");
930 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000931 if (path == NULL || !PyList_Check(path)) {
932 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +0000933 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000934 return NULL;
935 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000936 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000937 namelen = strlen(name);
938 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000939 PyObject *v = PyList_GetItem(path, i);
940 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000941 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000942 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000943 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000944 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000945 strcpy(buf, PyString_AsString(v));
Fred Drake4c82b232000-06-30 16:18:57 +0000946 if (strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000947 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000948#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000949#ifdef INTERN_STRINGS
Tim Peters50d8d372001-02-28 05:34:27 +0000950 /*
Guido van Rossum741689d1997-08-12 14:53:39 +0000951 ** Speedup: each sys.path item is interned, and
952 ** FindResourceModule remembers which items refer to
953 ** folders (so we don't have to bother trying to look
Tim Peters50d8d372001-02-28 05:34:27 +0000954 ** into them for resources).
Guido van Rossum741689d1997-08-12 14:53:39 +0000955 */
956 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
957 v = PyList_GET_ITEM(path, i);
958#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000959 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000960 static struct filedescr resfiledescr =
961 {"", "", PY_RESOURCE};
Tim Peters50d8d372001-02-28 05:34:27 +0000962
Jack Jansen9c96a921995-02-15 22:57:06 +0000963 return &resfiledescr;
964 }
Guido van Rossum0f84a341998-08-06 13:36:01 +0000965 if (PyMac_FindCodeResourceModule((PyStringObject *)v, name, buf)) {
966 static struct filedescr resfiledescr =
967 {"", "", PY_CODERESOURCE};
Tim Peters50d8d372001-02-28 05:34:27 +0000968
Guido van Rossum0f84a341998-08-06 13:36:01 +0000969 return &resfiledescr;
970 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000971#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000972 if (len > 0 && buf[len-1] != SEP
973#ifdef ALTSEP
974 && buf[len-1] != ALTSEP
975#endif
976 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000977 buf[len++] = SEP;
Guido van Rossum215c3402000-11-13 17:26:32 +0000978 strcpy(buf+len, name);
979 len += namelen;
Tim Peters50d8d372001-02-28 05:34:27 +0000980
981 /* Check for package import (buf holds a directory name,
982 and there's an __init__ module in that directory */
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000983#ifdef HAVE_STAT
Tim Peterscab3f682001-04-29 22:21:25 +0000984 if (stat(buf, &statbuf) == 0 && /* it exists */
985 S_ISDIR(statbuf.st_mode) && /* it's a directory */
986 find_init_module(buf) && /* it has __init__.py */
987 case_ok(buf, len, namelen, name)) /* and case matches */
988 return &fd_package;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000989#else
990 /* XXX How are you going to test for directories? */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000991#ifdef RISCOS
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000992 if (isdir(buf) &&
993 find_init_module(buf) &&
994 case_ok(buf, len, namelen, name))
995 return &fd_package;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000996#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000997#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000998#ifdef macintosh
999 fdp = PyMac_FindModuleExtension(buf, &len, name);
Jack Jansen4df3c522001-03-20 23:09:54 +00001000 if (fdp) {
Guido van Rossum9a61dc91997-10-08 15:25:08 +00001001#else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001002 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001003 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001004 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001005 PySys_WriteStderr("# trying %s\n", buf);
Jack Jansen4df3c522001-03-20 23:09:54 +00001006#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001007 fp = fopen(buf, fdp->mode);
Tim Peters50d8d372001-02-28 05:34:27 +00001008 if (fp != NULL) {
1009 if (case_ok(buf, len, namelen, name))
1010 break;
1011 else { /* continue search */
1012 fclose(fp);
1013 fp = NULL;
Barry Warsaw914a0b12001-02-02 19:12:16 +00001014 }
Barry Warsaw914a0b12001-02-02 19:12:16 +00001015 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001016 }
1017 if (fp != NULL)
1018 break;
1019 }
1020 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001021 PyErr_Format(PyExc_ImportError,
1022 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001023 return NULL;
1024 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001025 *p_fp = fp;
1026 return fdp;
1027}
1028
Tim Petersd1e87a82001-03-01 18:12:00 +00001029/* case_ok(char* buf, int len, int namelen, char* name)
1030 * The arguments here are tricky, best shown by example:
1031 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1032 * ^ ^ ^ ^
1033 * |--------------------- buf ---------------------|
1034 * |------------------- len ------------------|
1035 * |------ name -------|
1036 * |----- namelen -----|
1037 * buf is the full path, but len only counts up to (& exclusive of) the
1038 * extension. name is the module name, also exclusive of extension.
1039 *
1040 * We've already done a successful stat() or fopen() on buf, so know that
1041 * there's some match, possibly case-insensitive.
1042 *
Tim Peters50d8d372001-02-28 05:34:27 +00001043 * case_ok() is to return 1 if there's a case-sensitive match for
1044 * name, else 0. case_ok() is also to return 1 if envar PYTHONCASEOK
1045 * exists.
Tim Petersd1e87a82001-03-01 18:12:00 +00001046 *
Tim Peters50d8d372001-02-28 05:34:27 +00001047 * case_ok() is used to implement case-sensitive import semantics even
1048 * on platforms with case-insensitive filesystems. It's trivial to implement
1049 * for case-sensitive filesystems. It's pretty much a cross-platform
1050 * nightmare for systems with case-insensitive filesystems.
1051 */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001052
Tim Peters50d8d372001-02-28 05:34:27 +00001053/* First we may need a pile of platform-specific header files; the sequence
1054 * of #if's here should match the sequence in the body of case_ok().
1055 */
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001056#if defined(MS_WIN32) || defined(__CYGWIN__)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001057#include <windows.h>
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001058#ifdef __CYGWIN__
1059#include <sys/cygwin.h>
1060#endif
1061
Tim Peters50d8d372001-02-28 05:34:27 +00001062#elif defined(DJGPP)
1063#include <dir.h>
1064
1065#elif defined(macintosh)
1066#include <TextUtils.h>
1067#ifdef USE_GUSI1
1068#include "TFileSpec.h" /* for Path2FSSpec() */
1069#endif
1070
Tim Petersd1e87a82001-03-01 18:12:00 +00001071#elif defined(__MACH__) && defined(__APPLE__) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001072#include <sys/types.h>
1073#include <dirent.h>
1074
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001075#elif defined(RISCOS)
1076#include "oslib/osfscontrol.h"
Tim Peters50d8d372001-02-28 05:34:27 +00001077#endif
1078
Guido van Rossum0980bd91998-02-13 17:18:36 +00001079static int
Tim Peters50d8d372001-02-28 05:34:27 +00001080case_ok(char *buf, int len, int namelen, char *name)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001081{
Tim Peters50d8d372001-02-28 05:34:27 +00001082/* Pick a platform-specific implementation; the sequence of #if's here should
1083 * match the sequence just above.
1084 */
1085
1086/* MS_WIN32 || __CYGWIN__ */
1087#if defined(MS_WIN32) || defined(__CYGWIN__)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001088 WIN32_FIND_DATA data;
1089 HANDLE h;
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001090#ifdef __CYGWIN__
1091 char tempbuf[MAX_PATH];
1092#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001093
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001094 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001095 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001096
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001097#ifdef __CYGWIN__
1098 cygwin32_conv_to_win32_path(buf, tempbuf);
1099 h = FindFirstFile(tempbuf, &data);
1100#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001101 h = FindFirstFile(buf, &data);
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001102#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001103 if (h == INVALID_HANDLE_VALUE) {
1104 PyErr_Format(PyExc_NameError,
1105 "Can't find file for module %.100s\n(filename %.300s)",
1106 name, buf);
1107 return 0;
1108 }
1109 FindClose(h);
Tim Peters50d8d372001-02-28 05:34:27 +00001110 return strncmp(data.cFileName, name, namelen) == 0;
1111
1112/* DJGPP */
1113#elif defined(DJGPP)
1114 struct ffblk ffblk;
1115 int done;
1116
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001117 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001118 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001119
1120 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
1121 if (done) {
Guido van Rossum0980bd91998-02-13 17:18:36 +00001122 PyErr_Format(PyExc_NameError,
Tim Peters50d8d372001-02-28 05:34:27 +00001123 "Can't find file for module %.100s\n(filename %.300s)",
Guido van Rossum0980bd91998-02-13 17:18:36 +00001124 name, buf);
1125 return 0;
1126 }
Tim Peters50d8d372001-02-28 05:34:27 +00001127 return strncmp(ffblk.ff_name, name, namelen) == 0;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001128
Tim Peters50d8d372001-02-28 05:34:27 +00001129/* macintosh */
1130#elif defined(macintosh)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001131 FSSpec fss;
1132 OSErr err;
Tim Peters50d8d372001-02-28 05:34:27 +00001133
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001134 if (Py_GETENV("PYTHONCASEOK") != NULL)
Tim Peters50d8d372001-02-28 05:34:27 +00001135 return 1;
1136
Guido van Rossumb33aa1a2000-04-24 15:08:18 +00001137#ifndef USE_GUSI1
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001138 err = FSMakeFSSpec(0, 0, Pstring(buf), &fss);
1139#else
1140 /* GUSI's Path2FSSpec() resolves all possible aliases nicely on
1141 the way, which is fine for all directories, but here we need
1142 the original name of the alias file (say, Dlg.ppc.slb, not
1143 toolboxmodules.ppc.slb). */
1144 char *colon;
1145 err = Path2FSSpec(buf, &fss);
1146 if (err == noErr) {
1147 colon = strrchr(buf, ':'); /* find filename */
1148 if (colon != NULL)
1149 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1150 Pstring(colon+1), &fss);
1151 else
1152 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1153 fss.name, &fss);
1154 }
1155#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001156 if (err) {
1157 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001158 "Can't find file for module %.100s\n(filename %.300s)",
1159 name, buf);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001160 return 0;
1161 }
Tim Peters50d8d372001-02-28 05:34:27 +00001162 return fss.name[0] >= namelen &&
1163 strncmp(name, (char *)fss.name+1, namelen) == 0;
1164
Tim Peters677898a2001-03-02 03:28:03 +00001165/* new-fangled macintosh (macosx) */
Tim Petersd1e87a82001-03-01 18:12:00 +00001166#elif defined(__MACH__) && defined(__APPLE__) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001167 DIR *dirp;
1168 struct dirent *dp;
Tim Petersd1e87a82001-03-01 18:12:00 +00001169 char dirname[MAXPATHLEN + 1];
1170 const int dirlen = len - namelen - 1; /* don't want trailing SEP */
Tim Peters430f5d42001-03-01 01:30:56 +00001171
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001172 if (Py_GETENV("PYTHONCASEOK") != NULL)
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001173 return 1;
1174
Tim Petersd1e87a82001-03-01 18:12:00 +00001175 /* Copy the dir component into dirname; substitute "." if empty */
1176 if (dirlen <= 0) {
1177 dirname[0] = '.';
1178 dirname[1] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001179 }
1180 else {
Tim Petersd1e87a82001-03-01 18:12:00 +00001181 assert(dirlen <= MAXPATHLEN);
1182 memcpy(dirname, buf, dirlen);
1183 dirname[dirlen] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001184 }
1185 /* Open the directory and search the entries for an exact match. */
Tim Petersd1e87a82001-03-01 18:12:00 +00001186 dirp = opendir(dirname);
Tim Peters430f5d42001-03-01 01:30:56 +00001187 if (dirp) {
Tim Peters677898a2001-03-02 03:28:03 +00001188 char *nameWithExt = buf + len - namelen;
Tim Peters430f5d42001-03-01 01:30:56 +00001189 while ((dp = readdir(dirp)) != NULL) {
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001190 const int thislen =
Tim Peters430f5d42001-03-01 01:30:56 +00001191#ifdef _DIRENT_HAVE_D_NAMELEN
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001192 dp->d_namlen;
Tim Peters430f5d42001-03-01 01:30:56 +00001193#else
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001194 strlen(dp->d_name);
Tim Peters430f5d42001-03-01 01:30:56 +00001195#endif
Tim Petersd1e87a82001-03-01 18:12:00 +00001196 if (thislen >= namelen &&
Tim Peters677898a2001-03-02 03:28:03 +00001197 strcmp(dp->d_name, nameWithExt) == 0) {
Tim Peters430f5d42001-03-01 01:30:56 +00001198 (void)closedir(dirp);
1199 return 1; /* Found */
1200 }
1201 }
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001202 (void)closedir(dirp);
Tim Peters430f5d42001-03-01 01:30:56 +00001203 }
Tim Peters430f5d42001-03-01 01:30:56 +00001204 return 0 ; /* Not found */
Tim Peters430f5d42001-03-01 01:30:56 +00001205
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001206/* RISC OS */
1207#elif defined(RISCOS)
1208 char canon[MAXPATHLEN+1]; /* buffer for the canonical form of the path */
1209 char buf2[MAXPATHLEN+2];
1210 char *nameWithExt = buf+len-namelen;
1211 int canonlen;
1212 os_error *e;
1213
1214 if (Py_GETENV("PYTHONCASEOK") != NULL)
1215 return 1;
1216
1217 /* workaround:
1218 append wildcard, otherwise case of filename wouldn't be touched */
1219 strcpy(buf2, buf);
1220 strcat(buf2, "*");
1221
1222 e = xosfscontrol_canonicalise_path(buf2,canon,0,0,MAXPATHLEN+1,&canonlen);
1223 canonlen = MAXPATHLEN+1-canonlen;
1224 if (e || canonlen<=0 || canonlen>(MAXPATHLEN+1) )
1225 return 0;
1226 if (strcmp(nameWithExt, canon+canonlen-strlen(nameWithExt))==0)
1227 return 1; /* match */
1228
1229 return 0;
1230
Tim Peters50d8d372001-02-28 05:34:27 +00001231/* assuming it's a case-sensitive filesystem, so there's nothing to do! */
1232#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001233 return 1;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001234
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001235#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001236}
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001237
Guido van Rossum0980bd91998-02-13 17:18:36 +00001238
Guido van Rossum197346f1997-10-31 18:38:52 +00001239#ifdef HAVE_STAT
1240/* Helper to look for __init__.py or __init__.py[co] in potential package */
1241static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001242find_init_module(char *buf)
Guido van Rossum197346f1997-10-31 18:38:52 +00001243{
Tim Peters0f9431f2001-07-05 03:47:53 +00001244 const size_t save_len = strlen(buf);
Fred Drake4c82b232000-06-30 16:18:57 +00001245 size_t i = save_len;
Tim Peters0f9431f2001-07-05 03:47:53 +00001246 char *pname; /* pointer to start of __init__ */
Guido van Rossum197346f1997-10-31 18:38:52 +00001247 struct stat statbuf;
1248
Tim Peters0f9431f2001-07-05 03:47:53 +00001249/* For calling case_ok(buf, len, namelen, name):
1250 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1251 * ^ ^ ^ ^
1252 * |--------------------- buf ---------------------|
1253 * |------------------- len ------------------|
1254 * |------ name -------|
1255 * |----- namelen -----|
1256 */
Guido van Rossum197346f1997-10-31 18:38:52 +00001257 if (save_len + 13 >= MAXPATHLEN)
1258 return 0;
1259 buf[i++] = SEP;
Tim Peters0f9431f2001-07-05 03:47:53 +00001260 pname = buf + i;
1261 strcpy(pname, "__init__.py");
Guido van Rossum197346f1997-10-31 18:38:52 +00001262 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001263 if (case_ok(buf,
1264 save_len + 9, /* len("/__init__") */
1265 8, /* len("__init__") */
1266 pname)) {
1267 buf[save_len] = '\0';
1268 return 1;
1269 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001270 }
Tim Peters0f9431f2001-07-05 03:47:53 +00001271 i += strlen(pname);
1272 strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum197346f1997-10-31 18:38:52 +00001273 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001274 if (case_ok(buf,
1275 save_len + 9, /* len("/__init__") */
1276 8, /* len("__init__") */
1277 pname)) {
1278 buf[save_len] = '\0';
1279 return 1;
1280 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001281 }
1282 buf[save_len] = '\0';
1283 return 0;
1284}
Guido van Rossum48a680c2001-03-02 06:34:14 +00001285
1286#else
1287
1288#ifdef RISCOS
1289static int
1290find_init_module(buf)
1291 char *buf;
1292{
1293 int save_len = strlen(buf);
1294 int i = save_len;
1295
1296 if (save_len + 13 >= MAXPATHLEN)
1297 return 0;
1298 buf[i++] = SEP;
1299 strcpy(buf+i, "__init__/py");
1300 if (isfile(buf)) {
1301 buf[save_len] = '\0';
1302 return 1;
1303 }
1304
1305 if (Py_OptimizeFlag)
1306 strcpy(buf+i, "o");
1307 else
1308 strcpy(buf+i, "c");
1309 if (isfile(buf)) {
1310 buf[save_len] = '\0';
1311 return 1;
1312 }
1313 buf[save_len] = '\0';
1314 return 0;
1315}
1316#endif /*RISCOS*/
1317
Guido van Rossum197346f1997-10-31 18:38:52 +00001318#endif /* HAVE_STAT */
1319
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001320
Tim Petersdbd9ba62000-07-09 03:09:57 +00001321static int init_builtin(char *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001322
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001323/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001324 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001325
Guido van Rossum79f25d91997-04-29 20:08:16 +00001326static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001327load_module(char *name, FILE *fp, char *buf, int type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001328{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001329 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001330 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001331 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001332
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001333 /* First check that there's an open file (if we need one) */
1334 switch (type) {
1335 case PY_SOURCE:
1336 case PY_COMPILED:
1337 if (fp == NULL) {
1338 PyErr_Format(PyExc_ValueError,
1339 "file object required for import (type code %d)",
1340 type);
1341 return NULL;
1342 }
1343 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001344
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001345 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001346
1347 case PY_SOURCE:
1348 m = load_source_module(name, buf, fp);
1349 break;
1350
1351 case PY_COMPILED:
1352 m = load_compiled_module(name, buf, fp);
1353 break;
1354
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001355#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001356 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001357 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001358 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001359#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001360
Jack Jansen9c96a921995-02-15 22:57:06 +00001361#ifdef macintosh
1362 case PY_RESOURCE:
1363 m = PyMac_LoadResourceModule(name, buf);
1364 break;
Guido van Rossum0f84a341998-08-06 13:36:01 +00001365 case PY_CODERESOURCE:
1366 m = PyMac_LoadCodeResourceModule(name, buf);
1367 break;
Jack Jansen9c96a921995-02-15 22:57:06 +00001368#endif
1369
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001370 case PKG_DIRECTORY:
1371 m = load_package(name, buf);
1372 break;
1373
1374 case C_BUILTIN:
1375 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001376 if (buf != NULL && buf[0] != '\0')
1377 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001378 if (type == C_BUILTIN)
1379 err = init_builtin(name);
1380 else
1381 err = PyImport_ImportFrozenModule(name);
1382 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001383 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001384 if (err == 0) {
1385 PyErr_Format(PyExc_ImportError,
1386 "Purported %s module %.200s not found",
1387 type == C_BUILTIN ?
1388 "builtin" : "frozen",
1389 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001390 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001391 }
1392 modules = PyImport_GetModuleDict();
1393 m = PyDict_GetItemString(modules, name);
1394 if (m == NULL) {
1395 PyErr_Format(
1396 PyExc_ImportError,
1397 "%s module %.200s not properly initialized",
1398 type == C_BUILTIN ?
1399 "builtin" : "frozen",
1400 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001401 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001402 }
1403 Py_INCREF(m);
1404 break;
1405
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001406 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001407 PyErr_Format(PyExc_ImportError,
1408 "Don't know how to import %.200s (type code %d)",
1409 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001410 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001411
1412 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001413
1414 return m;
1415}
1416
1417
1418/* Initialize a built-in module.
1419 Return 1 for succes, 0 if the module is not found, and -1 with
1420 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001421
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001422static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001423init_builtin(char *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001424{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001425 struct _inittab *p;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001426
Greg Ward201baee2001-10-04 14:52:06 +00001427 if (_PyImport_FindExtension(name, name) != NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00001428 return 1;
1429
Guido van Rossum771c6c81997-10-31 18:37:24 +00001430 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001431 if (strcmp(name, p->name) == 0) {
1432 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001433 PyErr_Format(PyExc_ImportError,
1434 "Cannot re-init internal module %.200s",
1435 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001436 return -1;
1437 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001438 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001439 PySys_WriteStderr("import %s # builtin\n", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001440 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001441 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001442 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001443 if (_PyImport_FixupExtension(name, name) == NULL)
1444 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001445 return 1;
1446 }
1447 }
1448 return 0;
1449}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001450
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001451
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001452/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001453
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001454static struct _frozen *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001455find_frozen(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001456{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001457 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001458
Guido van Rossum79f25d91997-04-29 20:08:16 +00001459 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001460 if (p->name == NULL)
1461 return NULL;
1462 if (strcmp(p->name, name) == 0)
1463 break;
1464 }
1465 return p;
1466}
1467
Guido van Rossum79f25d91997-04-29 20:08:16 +00001468static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001469get_frozen_object(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001470{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001471 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001472 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001473
1474 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001475 PyErr_Format(PyExc_ImportError,
1476 "No such frozen object named %.200s",
1477 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001478 return NULL;
1479 }
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001480 if (p->code == NULL) {
1481 PyErr_Format(PyExc_ImportError,
1482 "Excluded frozen object named %.200s",
1483 name);
1484 return NULL;
1485 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001486 size = p->size;
1487 if (size < 0)
1488 size = -size;
1489 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001490}
1491
1492/* Initialize a frozen module.
1493 Return 1 for succes, 0 if the module is not found, and -1 with
1494 an exception set if the initialization failed.
1495 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001496
1497int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001498PyImport_ImportFrozenModule(char *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001499{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001500 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001501 PyObject *co;
1502 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001503 int ispackage;
1504 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001505
1506 if (p == NULL)
1507 return 0;
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001508 if (p->code == NULL) {
1509 PyErr_Format(PyExc_ImportError,
1510 "Excluded frozen object named %.200s",
1511 name);
1512 return -1;
1513 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001514 size = p->size;
1515 ispackage = (size < 0);
1516 if (ispackage)
1517 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001518 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001519 PySys_WriteStderr("import %s # frozen%s\n",
Guido van Rossuma5568d31998-03-05 03:45:08 +00001520 name, ispackage ? " package" : "");
1521 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001522 if (co == NULL)
1523 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001524 if (!PyCode_Check(co)) {
1525 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001526 PyErr_Format(PyExc_TypeError,
1527 "frozen object %.200s is not a code object",
1528 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001529 return -1;
1530 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001531 if (ispackage) {
1532 /* Set __path__ to the package name */
1533 PyObject *d, *s;
1534 int err;
1535 m = PyImport_AddModule(name);
1536 if (m == NULL)
1537 return -1;
1538 d = PyModule_GetDict(m);
1539 s = PyString_InternFromString(name);
1540 if (s == NULL)
1541 return -1;
1542 err = PyDict_SetItemString(d, "__path__", s);
1543 Py_DECREF(s);
1544 if (err != 0)
1545 return err;
1546 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001547 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001548 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001549 if (m == NULL)
1550 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001551 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001552 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001553}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001554
1555
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001556/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001557 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001558
Guido van Rossum79f25d91997-04-29 20:08:16 +00001559PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001560PyImport_ImportModule(char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00001561{
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00001562 PyObject *pname;
1563 PyObject *result;
1564
1565 pname = PyString_FromString(name);
1566 result = PyImport_Import(pname);
1567 Py_DECREF(pname);
1568 return result;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001569}
1570
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001571/* Forward declarations for helper routines */
Tim Petersdbd9ba62000-07-09 03:09:57 +00001572static PyObject *get_parent(PyObject *globals, char *buf, int *p_buflen);
1573static PyObject *load_next(PyObject *mod, PyObject *altmod,
1574 char **p_name, char *buf, int *p_buflen);
1575static int mark_miss(char *name);
1576static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
1577 char *buf, int buflen, int recursive);
1578static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001579
1580/* The Magnum Opus of dotted-name import :-) */
1581
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001582static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001583import_module_ex(char *name, PyObject *globals, PyObject *locals,
1584 PyObject *fromlist)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001585{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001586 char buf[MAXPATHLEN+1];
1587 int buflen = 0;
1588 PyObject *parent, *head, *next, *tail;
1589
1590 parent = get_parent(globals, buf, &buflen);
1591 if (parent == NULL)
1592 return NULL;
1593
1594 head = load_next(parent, Py_None, &name, buf, &buflen);
1595 if (head == NULL)
1596 return NULL;
1597
1598 tail = head;
1599 Py_INCREF(tail);
1600 while (name) {
1601 next = load_next(tail, tail, &name, buf, &buflen);
1602 Py_DECREF(tail);
1603 if (next == NULL) {
1604 Py_DECREF(head);
1605 return NULL;
1606 }
1607 tail = next;
1608 }
1609
1610 if (fromlist != NULL) {
1611 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1612 fromlist = NULL;
1613 }
1614
1615 if (fromlist == NULL) {
1616 Py_DECREF(tail);
1617 return head;
1618 }
1619
1620 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001621 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001622 Py_DECREF(tail);
1623 return NULL;
1624 }
1625
1626 return tail;
1627}
1628
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001629PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001630PyImport_ImportModuleEx(char *name, PyObject *globals, PyObject *locals,
1631 PyObject *fromlist)
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001632{
1633 PyObject *result;
1634 lock_import();
Guido van Rossumd65911b1998-03-03 22:33:27 +00001635 result = import_module_ex(name, globals, locals, fromlist);
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001636 unlock_import();
1637 return result;
1638}
1639
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001640static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001641get_parent(PyObject *globals, char *buf, int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001642{
1643 static PyObject *namestr = NULL;
1644 static PyObject *pathstr = NULL;
1645 PyObject *modname, *modpath, *modules, *parent;
1646
1647 if (globals == NULL || !PyDict_Check(globals))
1648 return Py_None;
1649
1650 if (namestr == NULL) {
1651 namestr = PyString_InternFromString("__name__");
1652 if (namestr == NULL)
1653 return NULL;
1654 }
1655 if (pathstr == NULL) {
1656 pathstr = PyString_InternFromString("__path__");
1657 if (pathstr == NULL)
1658 return NULL;
1659 }
1660
1661 *buf = '\0';
1662 *p_buflen = 0;
1663 modname = PyDict_GetItem(globals, namestr);
1664 if (modname == NULL || !PyString_Check(modname))
1665 return Py_None;
1666
1667 modpath = PyDict_GetItem(globals, pathstr);
1668 if (modpath != NULL) {
1669 int len = PyString_GET_SIZE(modname);
1670 if (len > MAXPATHLEN) {
1671 PyErr_SetString(PyExc_ValueError,
1672 "Module name too long");
1673 return NULL;
1674 }
1675 strcpy(buf, PyString_AS_STRING(modname));
1676 *p_buflen = len;
1677 }
1678 else {
1679 char *start = PyString_AS_STRING(modname);
1680 char *lastdot = strrchr(start, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001681 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001682 if (lastdot == NULL)
1683 return Py_None;
1684 len = lastdot - start;
1685 if (len >= MAXPATHLEN) {
1686 PyErr_SetString(PyExc_ValueError,
1687 "Module name too long");
1688 return NULL;
1689 }
1690 strncpy(buf, start, len);
1691 buf[len] = '\0';
1692 *p_buflen = len;
1693 }
1694
1695 modules = PyImport_GetModuleDict();
1696 parent = PyDict_GetItemString(modules, buf);
1697 if (parent == NULL)
1698 parent = Py_None;
1699 return parent;
1700 /* We expect, but can't guarantee, if parent != None, that:
1701 - parent.__name__ == buf
1702 - parent.__dict__ is globals
1703 If this is violated... Who cares? */
1704}
1705
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001706/* altmod is either None or same as mod */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001707static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001708load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
1709 int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001710{
1711 char *name = *p_name;
1712 char *dot = strchr(name, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001713 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001714 char *p;
1715 PyObject *result;
1716
1717 if (dot == NULL) {
1718 *p_name = NULL;
1719 len = strlen(name);
1720 }
1721 else {
1722 *p_name = dot+1;
1723 len = dot-name;
1724 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00001725 if (len == 0) {
1726 PyErr_SetString(PyExc_ValueError,
1727 "Empty module name");
1728 return NULL;
1729 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001730
1731 p = buf + *p_buflen;
1732 if (p != buf)
1733 *p++ = '.';
1734 if (p+len-buf >= MAXPATHLEN) {
1735 PyErr_SetString(PyExc_ValueError,
1736 "Module name too long");
1737 return NULL;
1738 }
1739 strncpy(p, name, len);
1740 p[len] = '\0';
1741 *p_buflen = p+len-buf;
1742
1743 result = import_submodule(mod, p, buf);
1744 if (result == Py_None && altmod != mod) {
1745 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001746 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001747 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001748 if (result != NULL && result != Py_None) {
1749 if (mark_miss(buf) != 0) {
1750 Py_DECREF(result);
1751 return NULL;
1752 }
1753 strncpy(buf, name, len);
1754 buf[len] = '\0';
1755 *p_buflen = len;
1756 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001757 }
1758 if (result == NULL)
1759 return NULL;
1760
1761 if (result == Py_None) {
1762 Py_DECREF(result);
1763 PyErr_Format(PyExc_ImportError,
1764 "No module named %.200s", name);
1765 return NULL;
1766 }
1767
1768 return result;
1769}
1770
1771static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001772mark_miss(char *name)
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001773{
1774 PyObject *modules = PyImport_GetModuleDict();
1775 return PyDict_SetItemString(modules, name, Py_None);
1776}
1777
1778static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001779ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, int buflen,
1780 int recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001781{
1782 int i;
1783
1784 if (!PyObject_HasAttrString(mod, "__path__"))
1785 return 1;
1786
1787 for (i = 0; ; i++) {
1788 PyObject *item = PySequence_GetItem(fromlist, i);
1789 int hasit;
1790 if (item == NULL) {
1791 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1792 PyErr_Clear();
1793 return 1;
1794 }
1795 return 0;
1796 }
1797 if (!PyString_Check(item)) {
1798 PyErr_SetString(PyExc_TypeError,
1799 "Item in ``from list'' not a string");
1800 Py_DECREF(item);
1801 return 0;
1802 }
1803 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001804 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001805 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001806 /* See if the package defines __all__ */
1807 if (recursive)
1808 continue; /* Avoid endless recursion */
1809 all = PyObject_GetAttrString(mod, "__all__");
1810 if (all == NULL)
1811 PyErr_Clear();
1812 else {
1813 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1814 return 0;
1815 Py_DECREF(all);
1816 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001817 continue;
1818 }
1819 hasit = PyObject_HasAttr(mod, item);
1820 if (!hasit) {
1821 char *subname = PyString_AS_STRING(item);
1822 PyObject *submod;
1823 char *p;
1824 if (buflen + strlen(subname) >= MAXPATHLEN) {
1825 PyErr_SetString(PyExc_ValueError,
1826 "Module name too long");
1827 Py_DECREF(item);
1828 return 0;
1829 }
1830 p = buf + buflen;
1831 *p++ = '.';
1832 strcpy(p, subname);
1833 submod = import_submodule(mod, subname, buf);
1834 Py_XDECREF(submod);
1835 if (submod == NULL) {
1836 Py_DECREF(item);
1837 return 0;
1838 }
1839 }
1840 Py_DECREF(item);
1841 }
1842
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001843 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001844}
1845
1846static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001847import_submodule(PyObject *mod, char *subname, char *fullname)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001848{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001849 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossumf48f11c2001-07-23 13:27:49 +00001850 PyObject *m, *res = NULL;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001851
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001852 /* Require:
1853 if mod == None: subname == fullname
1854 else: mod.__name__ + "." + subname == fullname
1855 */
1856
Tim Peters50d8d372001-02-28 05:34:27 +00001857 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001858 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001859 }
1860 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001861 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001862 char buf[MAXPATHLEN+1];
1863 struct filedescr *fdp;
1864 FILE *fp = NULL;
1865
Guido van Rossum9c0afe51998-05-19 15:09:05 +00001866 if (mod == Py_None)
1867 path = NULL;
1868 else {
1869 path = PyObject_GetAttrString(mod, "__path__");
1870 if (path == NULL) {
1871 PyErr_Clear();
1872 Py_INCREF(Py_None);
1873 return Py_None;
1874 }
1875 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001876
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001877 buf[0] = '\0';
Guido van Rossumb68cd421998-07-01 17:36:26 +00001878 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1879 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001880 if (fdp == NULL) {
1881 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1882 return NULL;
1883 PyErr_Clear();
1884 Py_INCREF(Py_None);
1885 return Py_None;
1886 }
1887 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001888 if (fp)
1889 fclose(fp);
Guido van Rossumf48f11c2001-07-23 13:27:49 +00001890 if (mod != Py_None) {
1891 /* Irrespective of the success of this load, make a
1892 reference to it in the parent package module.
1893 A copy gets saved in the modules dictionary
1894 under the full name, so get a reference from
1895 there, if need be. (The exception is when
1896 the load failed with a SyntaxError -- then
1897 there's no trace in sys.modules. In that case,
1898 of course, do nothing extra.) */
1899 res = m;
1900 if (res == NULL)
1901 res = PyDict_GetItemString(modules, fullname);
1902 if (res != NULL &&
1903 PyObject_SetAttrString(mod, subname, res) < 0) {
1904 Py_XDECREF(m);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001905 m = NULL;
1906 }
1907 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001908 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001909
1910 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001911}
1912
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001913
1914/* Re-import a module of any kind and return its module object, WITH
1915 INCREMENTED REFERENCE COUNT */
1916
Guido van Rossum79f25d91997-04-29 20:08:16 +00001917PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001918PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001919{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001920 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001921 PyObject *path = NULL;
1922 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001923 char buf[MAXPATHLEN+1];
1924 struct filedescr *fdp;
1925 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001926
Guido van Rossum79f25d91997-04-29 20:08:16 +00001927 if (m == NULL || !PyModule_Check(m)) {
1928 PyErr_SetString(PyExc_TypeError,
1929 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001930 return NULL;
1931 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001932 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001933 if (name == NULL)
1934 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001935 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001936 PyErr_Format(PyExc_ImportError,
1937 "reload(): module %.200s not in sys.modules",
1938 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001939 return NULL;
1940 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001941 subname = strrchr(name, '.');
1942 if (subname == NULL)
1943 subname = name;
1944 else {
1945 PyObject *parentname, *parent;
1946 parentname = PyString_FromStringAndSize(name, (subname-name));
1947 if (parentname == NULL)
1948 return NULL;
1949 parent = PyDict_GetItem(modules, parentname);
Barry Warsaw38793331999-01-27 17:54:20 +00001950 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00001951 if (parent == NULL) {
1952 PyErr_Format(PyExc_ImportError,
1953 "reload(): parent %.200s not in sys.modules",
1954 name);
1955 return NULL;
1956 }
1957 subname++;
1958 path = PyObject_GetAttrString(parent, "__path__");
1959 if (path == NULL)
1960 PyErr_Clear();
1961 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001962 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001963 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1964 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001965 if (fdp == NULL)
1966 return NULL;
1967 m = load_module(name, fp, buf, fdp->type);
1968 if (fp)
1969 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001970 return m;
1971}
1972
1973
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001974/* Higher-level import emulator which emulates the "import" statement
1975 more accurately -- it invokes the __import__() function from the
1976 builtins of the current globals. This means that the import is
1977 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00001978 environment, e.g. by "rexec".
1979 A dummy list ["__doc__"] is passed as the 4th argument so that
1980 e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
1981 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001982
1983PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001984PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001985{
1986 static PyObject *silly_list = NULL;
1987 static PyObject *builtins_str = NULL;
1988 static PyObject *import_str = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001989 PyObject *globals = NULL;
1990 PyObject *import = NULL;
1991 PyObject *builtins = NULL;
1992 PyObject *r = NULL;
1993
1994 /* Initialize constant string objects */
1995 if (silly_list == NULL) {
1996 import_str = PyString_InternFromString("__import__");
1997 if (import_str == NULL)
1998 return NULL;
1999 builtins_str = PyString_InternFromString("__builtins__");
2000 if (builtins_str == NULL)
2001 return NULL;
2002 silly_list = Py_BuildValue("[s]", "__doc__");
2003 if (silly_list == NULL)
2004 return NULL;
2005 }
2006
2007 /* Get the builtins from current globals */
2008 globals = PyEval_GetGlobals();
Guido van Rossum85cd1d62001-02-20 21:43:24 +00002009 if (globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00002010 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002011 builtins = PyObject_GetItem(globals, builtins_str);
2012 if (builtins == NULL)
2013 goto err;
2014 }
2015 else {
2016 /* No globals -- use standard builtins, and fake globals */
2017 PyErr_Clear();
2018
Guido van Rossum85cd1d62001-02-20 21:43:24 +00002019 builtins = PyImport_ImportModuleEx("__builtin__",
2020 NULL, NULL, NULL);
2021 if (builtins == NULL)
2022 return NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002023 globals = Py_BuildValue("{OO}", builtins_str, builtins);
2024 if (globals == NULL)
2025 goto err;
2026 }
2027
2028 /* Get the __import__ function from the builtins */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002029 if (PyDict_Check(builtins)) {
Fred Drakea76ba6e2001-03-06 06:31:15 +00002030 import = PyObject_GetItem(builtins, import_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002031 if (import == NULL)
2032 PyErr_SetObject(PyExc_KeyError, import_str);
2033 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002034 else
Fred Drakea76ba6e2001-03-06 06:31:15 +00002035 import = PyObject_GetAttr(builtins, import_str);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002036 if (import == NULL)
2037 goto err;
2038
2039 /* Call the _import__ function with the proper argument list */
2040 r = PyObject_CallFunction(import, "OOOO",
2041 module_name, globals, globals, silly_list);
2042
2043 err:
2044 Py_XDECREF(globals);
2045 Py_XDECREF(builtins);
2046 Py_XDECREF(import);
Tim Peters50d8d372001-02-28 05:34:27 +00002047
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002048 return r;
2049}
2050
2051
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002052/* Module 'imp' provides Python access to the primitives used for
2053 importing modules.
2054*/
2055
Guido van Rossum79f25d91997-04-29 20:08:16 +00002056static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002057imp_get_magic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002058{
2059 char buf[4];
2060
Guido van Rossum43713e52000-02-29 13:59:29 +00002061 if (!PyArg_ParseTuple(args, ":get_magic"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002062 return NULL;
Guido van Rossum96774c12000-05-01 20:19:08 +00002063 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
2064 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
2065 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
2066 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002067
Guido van Rossum79f25d91997-04-29 20:08:16 +00002068 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002069}
2070
Guido van Rossum79f25d91997-04-29 20:08:16 +00002071static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002072imp_get_suffixes(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002073{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002074 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002075 struct filedescr *fdp;
2076
Guido van Rossum43713e52000-02-29 13:59:29 +00002077 if (!PyArg_ParseTuple(args, ":get_suffixes"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002078 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002079 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002080 if (list == NULL)
2081 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002082 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
2083 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002084 fdp->suffix, fdp->mode, fdp->type);
2085 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002086 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002087 return NULL;
2088 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002089 if (PyList_Append(list, item) < 0) {
2090 Py_DECREF(list);
2091 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002092 return NULL;
2093 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002094 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002095 }
2096 return list;
2097}
2098
Guido van Rossum79f25d91997-04-29 20:08:16 +00002099static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002100call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002101{
Tim Petersdbd9ba62000-07-09 03:09:57 +00002102 extern int fclose(FILE *);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002103 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002104 struct filedescr *fdp;
2105 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002106 FILE *fp = NULL;
2107
2108 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002109 if (path == Py_None)
2110 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002111 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
2112 if (fdp == NULL)
2113 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002114 if (fp != NULL) {
2115 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
2116 if (fob == NULL) {
2117 fclose(fp);
2118 return NULL;
2119 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002120 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002121 else {
2122 fob = Py_None;
2123 Py_INCREF(fob);
Tim Peters50d8d372001-02-28 05:34:27 +00002124 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002125 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002126 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002127 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002128 return ret;
2129}
2130
Guido van Rossum79f25d91997-04-29 20:08:16 +00002131static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002132imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002133{
2134 char *name;
2135 PyObject *path = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002136 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002137 return NULL;
2138 return call_find_module(name, path);
2139}
2140
2141static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002142imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002143{
2144 char *name;
2145 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002146 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002147 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002148 return NULL;
2149 ret = init_builtin(name);
2150 if (ret < 0)
2151 return NULL;
2152 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002153 Py_INCREF(Py_None);
2154 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002155 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002156 m = PyImport_AddModule(name);
2157 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002158 return m;
2159}
2160
Guido van Rossum79f25d91997-04-29 20:08:16 +00002161static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002162imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002163{
2164 char *name;
2165 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002166 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002167 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002168 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002169 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002170 if (ret < 0)
2171 return NULL;
2172 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002173 Py_INCREF(Py_None);
2174 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002175 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002176 m = PyImport_AddModule(name);
2177 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002178 return m;
2179}
2180
Guido van Rossum79f25d91997-04-29 20:08:16 +00002181static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002182imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002183{
2184 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002185
Guido van Rossum43713e52000-02-29 13:59:29 +00002186 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002187 return NULL;
2188 return get_frozen_object(name);
2189}
2190
Guido van Rossum79f25d91997-04-29 20:08:16 +00002191static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002192imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002193{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002194 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002195 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002196 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002197 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002198}
2199
Guido van Rossum79f25d91997-04-29 20:08:16 +00002200static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002201imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002202{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002203 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002204 struct _frozen *p;
Guido van Rossum43713e52000-02-29 13:59:29 +00002205 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002206 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002207 p = find_frozen(name);
2208 return PyInt_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002209}
2210
2211static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002212get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002213{
2214 FILE *fp;
2215 if (fob == NULL) {
2216 fp = fopen(pathname, mode);
2217 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002218 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002219 }
2220 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002221 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002222 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002223 PyErr_SetString(PyExc_ValueError,
2224 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002225 }
2226 return fp;
2227}
2228
Guido van Rossum79f25d91997-04-29 20:08:16 +00002229static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002230imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002231{
2232 char *name;
2233 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002234 PyObject *fob = NULL;
2235 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002236 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002237 if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002238 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002239 return NULL;
2240 fp = get_file(pathname, fob, "rb");
2241 if (fp == NULL)
2242 return NULL;
2243 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002244 if (fob == NULL)
2245 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002246 return m;
2247}
2248
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002249#ifdef HAVE_DYNAMIC_LOADING
2250
Guido van Rossum79f25d91997-04-29 20:08:16 +00002251static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002252imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002253{
2254 char *name;
2255 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002256 PyObject *fob = NULL;
2257 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002258 FILE *fp = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002259 if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002260 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002261 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002262 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002263 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002264 if (fp == NULL)
2265 return NULL;
2266 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002267 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002268 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002269}
2270
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002271#endif /* HAVE_DYNAMIC_LOADING */
2272
Guido van Rossum79f25d91997-04-29 20:08:16 +00002273static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002274imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002275{
2276 char *name;
2277 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002278 PyObject *fob = NULL;
2279 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002280 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002281 if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002282 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002283 return NULL;
2284 fp = get_file(pathname, fob, "r");
2285 if (fp == NULL)
2286 return NULL;
2287 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002288 if (fob == NULL)
2289 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002290 return m;
2291}
2292
Jack Jansen9c96a921995-02-15 22:57:06 +00002293#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002294static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002295imp_load_resource(PyObject *self, PyObject *args)
Jack Jansen9c96a921995-02-15 22:57:06 +00002296{
2297 char *name;
2298 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002299 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002300
Guido van Rossum43713e52000-02-29 13:59:29 +00002301 if (!PyArg_ParseTuple(args, "ss:load_resource", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002302 return NULL;
2303 m = PyMac_LoadResourceModule(name, pathname);
2304 return m;
2305}
2306#endif /* macintosh */
2307
Guido van Rossum79f25d91997-04-29 20:08:16 +00002308static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002309imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002310{
2311 char *name;
2312 PyObject *fob;
2313 char *pathname;
2314 char *suffix; /* Unused */
2315 char *mode;
2316 int type;
2317 FILE *fp;
2318
Guido van Rossum43713e52000-02-29 13:59:29 +00002319 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002320 &name, &fob, &pathname,
2321 &suffix, &mode, &type))
2322 return NULL;
2323 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
2324 PyErr_Format(PyExc_ValueError,
2325 "invalid file open mode %.200s", mode);
2326 return NULL;
2327 }
2328 if (fob == Py_None)
2329 fp = NULL;
2330 else {
2331 if (!PyFile_Check(fob)) {
2332 PyErr_SetString(PyExc_ValueError,
2333 "load_module arg#2 should be a file or None");
2334 return NULL;
2335 }
2336 fp = get_file(pathname, fob, mode);
2337 if (fp == NULL)
2338 return NULL;
2339 }
2340 return load_module(name, fp, pathname, type);
2341}
2342
2343static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002344imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002345{
2346 char *name;
2347 char *pathname;
Guido van Rossum43713e52000-02-29 13:59:29 +00002348 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002349 return NULL;
2350 return load_package(name, pathname);
2351}
2352
2353static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002354imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002355{
2356 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002357 if (!PyArg_ParseTuple(args, "s:new_module", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002358 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002359 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002360}
2361
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002362/* Doc strings */
2363
2364static char doc_imp[] = "\
2365This module provides the components needed to build your own\n\
2366__import__ function. Undocumented functions are obsolete.\n\
2367";
2368
2369static char doc_find_module[] = "\
2370find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
2371Search for a module. If path is omitted or None, search for a\n\
2372built-in, frozen or special module and continue search in sys.path.\n\
2373The module name cannot contain '.'; to search for a submodule of a\n\
2374package, pass the submodule name and the package's __path__.\
2375";
2376
2377static char doc_load_module[] = "\
2378load_module(name, file, filename, (suffix, mode, type)) -> module\n\
2379Load a module, given information returned by find_module().\n\
2380The module name must include the full package name, if any.\
2381";
2382
2383static char doc_get_magic[] = "\
2384get_magic() -> string\n\
2385Return the magic number for .pyc or .pyo files.\
2386";
2387
2388static char doc_get_suffixes[] = "\
2389get_suffixes() -> [(suffix, mode, type), ...]\n\
2390Return a list of (suffix, mode, type) tuples describing the files\n\
2391that find_module() looks for.\
2392";
2393
2394static char doc_new_module[] = "\
2395new_module(name) -> module\n\
2396Create a new module. Do not enter it in sys.modules.\n\
2397The module name must include the full package name, if any.\
2398";
2399
Tim Peters69232342001-08-30 05:16:13 +00002400static char doc_lock_held[] = "\
2401lock_held() -> 0 or 1\n\
2402Return 1 if the import lock is currently held.\n\
2403On platforms without threads, return 0.\
2404";
2405
Guido van Rossum79f25d91997-04-29 20:08:16 +00002406static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002407 {"find_module", imp_find_module, 1, doc_find_module},
2408 {"get_magic", imp_get_magic, 1, doc_get_magic},
2409 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2410 {"load_module", imp_load_module, 1, doc_load_module},
2411 {"new_module", imp_new_module, 1, doc_new_module},
Tim Peters69232342001-08-30 05:16:13 +00002412 {"lock_held", imp_lock_held, 1, doc_lock_held},
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002413 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002414 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002415 {"init_builtin", imp_init_builtin, 1},
2416 {"init_frozen", imp_init_frozen, 1},
2417 {"is_builtin", imp_is_builtin, 1},
2418 {"is_frozen", imp_is_frozen, 1},
2419 {"load_compiled", imp_load_compiled, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002420#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002421 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002422#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002423 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002424#ifdef macintosh
2425 {"load_resource", imp_load_resource, 1},
2426#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002427 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002428 {NULL, NULL} /* sentinel */
2429};
2430
Guido van Rossum1a8791e1998-08-04 22:46:29 +00002431static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002432setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002433{
2434 PyObject *v;
2435 int err;
2436
2437 v = PyInt_FromLong((long)value);
2438 err = PyDict_SetItemString(d, name, v);
2439 Py_XDECREF(v);
2440 return err;
2441}
2442
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002443void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002444initimp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002445{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002446 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002447
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002448 m = Py_InitModule4("imp", imp_methods, doc_imp,
2449 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002450 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002451
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002452 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2453 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2454 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2455 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2456 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2457 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2458 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2459 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00002460 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002461
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002462 failure:
2463 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002464}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002465
2466
Guido van Rossumb18618d2000-05-03 23:44:39 +00002467/* API for embedding applications that want to add their own entries
2468 to the table of built-in modules. This should normally be called
2469 *before* Py_Initialize(). When the table resize fails, -1 is
2470 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002471
2472 After a similar function by Just van Rossum. */
2473
2474int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002475PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002476{
2477 static struct _inittab *our_copy = NULL;
2478 struct _inittab *p;
2479 int i, n;
2480
2481 /* Count the number of entries in both tables */
2482 for (n = 0; newtab[n].name != NULL; n++)
2483 ;
2484 if (n == 0)
2485 return 0; /* Nothing to do */
2486 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2487 ;
2488
2489 /* Allocate new memory for the combined table */
Guido van Rossumb18618d2000-05-03 23:44:39 +00002490 p = our_copy;
2491 PyMem_RESIZE(p, struct _inittab, i+n+1);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002492 if (p == NULL)
2493 return -1;
2494
2495 /* Copy the tables into the new memory */
2496 if (our_copy != PyImport_Inittab)
2497 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2498 PyImport_Inittab = our_copy = p;
2499 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
2500
2501 return 0;
2502}
2503
2504/* Shorthand to add a single entry given a name and a function */
2505
2506int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002507PyImport_AppendInittab(char *name, void (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002508{
2509 struct _inittab newtab[2];
2510
2511 memset(newtab, '\0', sizeof newtab);
2512
2513 newtab[0].name = name;
2514 newtab[0].initfunc = initfunc;
2515
2516 return PyImport_ExtendInittab(newtab);
2517}