blob: ba7d5d50408a1a67b5332cd98dc1fd3fd2adf36d [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 Rossum55a83382000-09-20 20:31:38 +000018#ifdef HAVE_FCNTL_H
19#include <fcntl.h>
20#endif
21
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000022extern time_t PyOS_GetLastModificationTime(char *, FILE *);
23 /* In getmtime.c */
Guido van Rossum21d335e1993-10-15 13:01:11 +000024
Guido van Rossum6c849691994-09-26 15:47:17 +000025/* Magic word to reject .pyc files generated by other Python versions */
Guido van Rossum7faeab31995-07-07 22:50:36 +000026/* Change for each incompatible change */
27/* The value of CR and LF is incorporated so if you ever read or write
28 a .pyc file in text mode the magic number will be wrong; also, the
Tim Peters36515e22001-11-18 04:06:29 +000029 Apple MPW compiler swaps their values, botching string constants.
30 XXX That probably isn't important anymore.
31*/
Guido van Rossum7faeab31995-07-07 22:50:36 +000032/* XXX Perhaps the magic number should be frozen and a version field
33 added to the .pyc file header? */
Tim Peters36515e22001-11-18 04:06:29 +000034/* New way to come up with the low 16 bits of the magic number:
35 (YEAR-1995) * 10000 + MONTH * 100 + DAY
36 where MONTH and DAY are 1-based.
37 XXX Whatever the "old way" may have been isn't documented.
38 XXX This scheme breaks in 2002, as (2002-1995)*10000 = 70000 doesn't
39 fit in 16 bits.
40 XXX Later, sometimes 1 gets added to MAGIC in order to record that
41 the Unicode -U option is in use. IMO (Tim's), that's a Bad Idea
42 (quite apart from that the -U option doesn't work so isn't used
43 anyway).
44*/
Tim Peters6d6c1a32001-08-02 04:15:00 +000045#define MAGIC (60717 | ((long)'\r'<<16) | ((long)'\n'<<24))
Guido van Rossum3ddee711991-12-16 13:06:34 +000046
Guido van Rossum96774c12000-05-01 20:19:08 +000047/* Magic word as global; note that _PyImport_Init() can change the
Jeremy Hylton9262b8a2000-06-30 04:59:17 +000048 value of this global to accommodate for alterations of how the
Guido van Rossum96774c12000-05-01 20:19:08 +000049 compiler works which are enabled by command line switches. */
50static long pyc_magic = MAGIC;
51
Guido van Rossum25ce5661997-08-02 03:10:38 +000052/* See _PyImport_FixupExtension() below */
53static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000054
Guido van Rossum771c6c81997-10-31 18:37:24 +000055/* This table is defined in config.c: */
56extern struct _inittab _PyImport_Inittab[];
57
58struct _inittab *PyImport_Inittab = _PyImport_Inittab;
Guido van Rossum66f1fa81991-04-03 19:03:52 +000059
Guido van Rossumed1170e1999-12-20 21:23:41 +000060/* these tables define the module suffixes that Python recognizes */
61struct filedescr * _PyImport_Filetab = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +000062
63#ifdef RISCOS
64static const struct filedescr _PyImport_StandardFiletab[] = {
65 {"/py", "r", PY_SOURCE},
66 {"/pyc", "rb", PY_COMPILED},
67 {0, 0}
68};
69#else
Guido van Rossumed1170e1999-12-20 21:23:41 +000070static const struct filedescr _PyImport_StandardFiletab[] = {
71 {".py", "r", PY_SOURCE},
Tim Petersc1731372001-08-04 08:12:36 +000072#ifdef MS_WIN32
73 {".pyw", "r", PY_SOURCE},
Tim Peters36515e22001-11-18 04:06:29 +000074#endif
Guido van Rossumed1170e1999-12-20 21:23:41 +000075 {".pyc", "rb", PY_COMPILED},
76 {0, 0}
77};
Guido van Rossum48a680c2001-03-02 06:34:14 +000078#endif
Guido van Rossumed1170e1999-12-20 21:23:41 +000079
Guido van Rossum1ae940a1995-01-02 19:04:15 +000080/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000081
82void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000083_PyImport_Init(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000084{
Guido van Rossumed1170e1999-12-20 21:23:41 +000085 const struct filedescr *scan;
86 struct filedescr *filetab;
87 int countD = 0;
88 int countS = 0;
89
90 /* prepare _PyImport_Filetab: copy entries from
91 _PyImport_DynLoadFiletab and _PyImport_StandardFiletab.
92 */
93 for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan)
94 ++countD;
95 for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan)
96 ++countS;
Guido van Rossumb18618d2000-05-03 23:44:39 +000097 filetab = PyMem_NEW(struct filedescr, countD + countS + 1);
Guido van Rossumed1170e1999-12-20 21:23:41 +000098 memcpy(filetab, _PyImport_DynLoadFiletab,
99 countD * sizeof(struct filedescr));
100 memcpy(filetab + countD, _PyImport_StandardFiletab,
101 countS * sizeof(struct filedescr));
102 filetab[countD + countS].suffix = NULL;
103
104 _PyImport_Filetab = filetab;
105
Guido van Rossum0824f631997-03-11 18:37:35 +0000106 if (Py_OptimizeFlag) {
Guido van Rossumed1170e1999-12-20 21:23:41 +0000107 /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */
108 for (; filetab->suffix != NULL; filetab++) {
Guido van Rossum48a680c2001-03-02 06:34:14 +0000109#ifndef RISCOS
Guido van Rossumed1170e1999-12-20 21:23:41 +0000110 if (strcmp(filetab->suffix, ".pyc") == 0)
111 filetab->suffix = ".pyo";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000112#else
113 if (strcmp(filetab->suffix, "/pyc") == 0)
114 filetab->suffix = "/pyo";
115#endif
Guido van Rossum0824f631997-03-11 18:37:35 +0000116 }
117 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000118
119 if (Py_UnicodeFlag) {
120 /* Fix the pyc_magic so that byte compiled code created
121 using the all-Unicode method doesn't interfere with
122 code created in normal operation mode. */
123 pyc_magic = MAGIC + 1;
124 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000125}
126
Guido van Rossum25ce5661997-08-02 03:10:38 +0000127void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000128_PyImport_Fini(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000129{
130 Py_XDECREF(extensions);
131 extensions = NULL;
Barry Warsaw84294482000-10-03 16:02:05 +0000132 PyMem_DEL(_PyImport_Filetab);
133 _PyImport_Filetab = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000134}
135
136
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000137/* Locking primitives to prevent parallel imports of the same module
138 in different threads to return with a partially loaded module.
139 These calls are serialized by the global interpreter lock. */
140
141#ifdef WITH_THREAD
142
Guido van Rossum49b56061998-10-01 20:42:43 +0000143#include "pythread.h"
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000144
Guido van Rossum65d5b571998-12-21 19:32:43 +0000145static PyThread_type_lock import_lock = 0;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000146static long import_lock_thread = -1;
147static int import_lock_level = 0;
148
149static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000150lock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000151{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000152 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000153 if (me == -1)
154 return; /* Too bad */
155 if (import_lock == NULL)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000156 import_lock = PyThread_allocate_lock();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000157 if (import_lock_thread == me) {
158 import_lock_level++;
159 return;
160 }
Guido van Rossum65d5b571998-12-21 19:32:43 +0000161 if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0)) {
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000162 PyThreadState *tstate = PyEval_SaveThread();
Guido van Rossum65d5b571998-12-21 19:32:43 +0000163 PyThread_acquire_lock(import_lock, 1);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000164 PyEval_RestoreThread(tstate);
165 }
166 import_lock_thread = me;
167 import_lock_level = 1;
168}
169
170static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000171unlock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000172{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000173 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000174 if (me == -1)
175 return; /* Too bad */
176 if (import_lock_thread != me)
177 Py_FatalError("unlock_import: not holding the import lock");
178 import_lock_level--;
179 if (import_lock_level == 0) {
180 import_lock_thread = -1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000181 PyThread_release_lock(import_lock);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000182 }
183}
184
185#else
186
187#define lock_import()
188#define unlock_import()
189
190#endif
191
Tim Peters69232342001-08-30 05:16:13 +0000192static PyObject *
193imp_lock_held(PyObject *self, PyObject *args)
194{
195 if (!PyArg_ParseTuple(args, ":lock_held"))
196 return NULL;
197#ifdef WITH_THREAD
198 return PyInt_FromLong(import_lock_thread != -1);
199#else
200 return PyInt_FromLong(0);
201#endif
202}
203
Guido van Rossum25ce5661997-08-02 03:10:38 +0000204/* Helper for sys */
205
206PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000207PyImport_GetModuleDict(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000208{
209 PyInterpreterState *interp = PyThreadState_Get()->interp;
210 if (interp->modules == NULL)
211 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
212 return interp->modules;
213}
214
Guido van Rossum3f5da241990-12-20 15:06:42 +0000215
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000216/* List of names to clear in sys */
217static char* sys_deletes[] = {
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000218 "path", "argv", "ps1", "ps2", "exitfunc",
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000219 "exc_type", "exc_value", "exc_traceback",
220 "last_type", "last_value", "last_traceback",
221 NULL
222};
223
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000224static char* sys_files[] = {
225 "stdin", "__stdin__",
226 "stdout", "__stdout__",
227 "stderr", "__stderr__",
228 NULL
229};
230
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000231
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000232/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000233
Guido van Rossum3f5da241990-12-20 15:06:42 +0000234void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000235PyImport_Cleanup(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000236{
Guido van Rossum758eec01998-01-19 21:58:26 +0000237 int pos, ndone;
238 char *name;
239 PyObject *key, *value, *dict;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000240 PyInterpreterState *interp = PyThreadState_Get()->interp;
Guido van Rossum758eec01998-01-19 21:58:26 +0000241 PyObject *modules = interp->modules;
242
243 if (modules == NULL)
244 return; /* Already done */
245
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000246 /* Delete some special variables first. These are common
247 places where user values hide and people complain when their
248 destructors fail. Since the modules containing them are
249 deleted *last* of all, they would come too late in the normal
250 destruction order. Sigh. */
251
252 value = PyDict_GetItemString(modules, "__builtin__");
253 if (value != NULL && PyModule_Check(value)) {
254 dict = PyModule_GetDict(value);
255 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000256 PySys_WriteStderr("# clear __builtin__._\n");
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000257 PyDict_SetItemString(dict, "_", Py_None);
258 }
259 value = PyDict_GetItemString(modules, "sys");
260 if (value != NULL && PyModule_Check(value)) {
261 char **p;
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000262 PyObject *v;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000263 dict = PyModule_GetDict(value);
264 for (p = sys_deletes; *p != NULL; p++) {
265 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000266 PySys_WriteStderr("# clear sys.%s\n", *p);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000267 PyDict_SetItemString(dict, *p, Py_None);
268 }
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000269 for (p = sys_files; *p != NULL; p+=2) {
270 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000271 PySys_WriteStderr("# restore sys.%s\n", *p);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000272 v = PyDict_GetItemString(dict, *(p+1));
273 if (v == NULL)
274 v = Py_None;
275 PyDict_SetItemString(dict, *p, v);
276 }
277 }
278
279 /* First, delete __main__ */
280 value = PyDict_GetItemString(modules, "__main__");
281 if (value != NULL && PyModule_Check(value)) {
282 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000283 PySys_WriteStderr("# cleanup __main__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000284 _PyModule_Clear(value);
285 PyDict_SetItemString(modules, "__main__", Py_None);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000286 }
287
Guido van Rossum758eec01998-01-19 21:58:26 +0000288 /* The special treatment of __builtin__ here is because even
289 when it's not referenced as a module, its dictionary is
290 referenced by almost every module's __builtins__. Since
291 deleting a module clears its dictionary (even if there are
292 references left to it), we need to delete the __builtin__
293 module last. Likewise, we don't delete sys until the very
294 end because it is implicitly referenced (e.g. by print).
295
296 Also note that we 'delete' modules by replacing their entry
297 in the modules dict with None, rather than really deleting
298 them; this avoids a rehash of the modules dictionary and
299 also marks them as "non existent" so they won't be
300 re-imported. */
301
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000302 /* Next, repeatedly delete modules with a reference count of
Guido van Rossum758eec01998-01-19 21:58:26 +0000303 one (skipping __builtin__ and sys) and delete them */
304 do {
305 ndone = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000306 pos = 0;
Guido van Rossum758eec01998-01-19 21:58:26 +0000307 while (PyDict_Next(modules, &pos, &key, &value)) {
308 if (value->ob_refcnt != 1)
309 continue;
Guido van Rossum566373e1998-10-01 15:24:50 +0000310 if (PyString_Check(key) && PyModule_Check(value)) {
311 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000312 if (strcmp(name, "__builtin__") == 0)
313 continue;
314 if (strcmp(name, "sys") == 0)
315 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000316 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000317 PySys_WriteStderr(
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000318 "# cleanup[1] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000319 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000320 PyDict_SetItem(modules, key, Py_None);
321 ndone++;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000322 }
323 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000324 } while (ndone > 0);
325
Guido van Rossum758eec01998-01-19 21:58:26 +0000326 /* Next, delete all modules (still skipping __builtin__ and sys) */
327 pos = 0;
328 while (PyDict_Next(modules, &pos, &key, &value)) {
Guido van Rossum566373e1998-10-01 15:24:50 +0000329 if (PyString_Check(key) && PyModule_Check(value)) {
330 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000331 if (strcmp(name, "__builtin__") == 0)
332 continue;
333 if (strcmp(name, "sys") == 0)
334 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000335 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000336 PySys_WriteStderr("# cleanup[2] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000337 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000338 PyDict_SetItem(modules, key, Py_None);
339 }
340 }
341
342 /* Next, delete sys and __builtin__ (in that order) */
343 value = PyDict_GetItemString(modules, "sys");
344 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000345 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000346 PySys_WriteStderr("# cleanup sys\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000347 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000348 PyDict_SetItemString(modules, "sys", Py_None);
349 }
350 value = PyDict_GetItemString(modules, "__builtin__");
351 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000352 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000353 PySys_WriteStderr("# cleanup __builtin__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000354 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000355 PyDict_SetItemString(modules, "__builtin__", Py_None);
356 }
357
358 /* Finally, clear and delete the modules directory */
359 PyDict_Clear(modules);
360 interp->modules = NULL;
361 Py_DECREF(modules);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000362}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000363
364
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000365/* Helper for pythonrun.c -- return magic number */
366
367long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000368PyImport_GetMagicNumber(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000369{
Guido van Rossum96774c12000-05-01 20:19:08 +0000370 return pyc_magic;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000371}
372
373
Guido van Rossum25ce5661997-08-02 03:10:38 +0000374/* Magic for extension modules (built-in as well as dynamically
375 loaded). To prevent initializing an extension module more than
376 once, we keep a static dictionary 'extensions' keyed by module name
377 (for built-in modules) or by filename (for dynamically loaded
Barry Warsaw92883382001-08-13 23:05:44 +0000378 modules), containing these modules. A copy of the module's
Guido van Rossum25ce5661997-08-02 03:10:38 +0000379 dictionary is stored by calling _PyImport_FixupExtension()
380 immediately after the module initialization function succeeds. A
381 copy can be retrieved from there by calling
382 _PyImport_FindExtension(). */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000383
Guido van Rossum79f25d91997-04-29 20:08:16 +0000384PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000385_PyImport_FixupExtension(char *name, char *filename)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000386{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000387 PyObject *modules, *mod, *dict, *copy;
388 if (extensions == NULL) {
389 extensions = PyDict_New();
390 if (extensions == NULL)
391 return NULL;
392 }
393 modules = PyImport_GetModuleDict();
394 mod = PyDict_GetItemString(modules, name);
395 if (mod == NULL || !PyModule_Check(mod)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000396 PyErr_Format(PyExc_SystemError,
397 "_PyImport_FixupExtension: module %.200s not loaded", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000398 return NULL;
399 }
400 dict = PyModule_GetDict(mod);
401 if (dict == NULL)
402 return NULL;
Fred Drake9cd0efc2001-10-25 21:38:59 +0000403 copy = PyDict_Copy(dict);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000404 if (copy == NULL)
405 return NULL;
406 PyDict_SetItemString(extensions, filename, copy);
407 Py_DECREF(copy);
408 return copy;
409}
410
411PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000412_PyImport_FindExtension(char *name, char *filename)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000413{
Fred Drake9cd0efc2001-10-25 21:38:59 +0000414 PyObject *dict, *mod, *mdict;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000415 if (extensions == NULL)
416 return NULL;
417 dict = PyDict_GetItemString(extensions, filename);
418 if (dict == NULL)
419 return NULL;
420 mod = PyImport_AddModule(name);
421 if (mod == NULL)
422 return NULL;
423 mdict = PyModule_GetDict(mod);
424 if (mdict == NULL)
425 return NULL;
Fred Drake9cd0efc2001-10-25 21:38:59 +0000426 if (PyDict_Update(mdict, dict))
Guido van Rossum25ce5661997-08-02 03:10:38 +0000427 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000428 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000429 PySys_WriteStderr("import %s # previously loaded (%s)\n",
Guido van Rossum25ce5661997-08-02 03:10:38 +0000430 name, filename);
431 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000432}
433
434
435/* Get the module object corresponding to a module name.
436 First check the modules dictionary if there's one there,
437 if not, create a new one and insert in in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000438 Because the former action is most common, THIS DOES NOT RETURN A
439 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000440
Guido van Rossum79f25d91997-04-29 20:08:16 +0000441PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000442PyImport_AddModule(char *name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000443{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000444 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000445 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000446
Guido van Rossum25ce5661997-08-02 03:10:38 +0000447 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
Guido van Rossum79f25d91997-04-29 20:08:16 +0000448 PyModule_Check(m))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000449 return m;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000450 m = PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000451 if (m == NULL)
452 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000453 if (PyDict_SetItemString(modules, name, m) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000454 Py_DECREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000455 return NULL;
456 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000457 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000458
459 return m;
460}
461
462
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000463/* Execute a code object in a module and return the module object
464 WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000465
Guido van Rossum79f25d91997-04-29 20:08:16 +0000466PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000467PyImport_ExecCodeModule(char *name, PyObject *co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000468{
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000469 return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
470}
471
472PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000473PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname)
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000474{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000475 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000476 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000477
Guido van Rossum79f25d91997-04-29 20:08:16 +0000478 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000479 if (m == NULL)
480 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000481 d = PyModule_GetDict(m);
482 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
483 if (PyDict_SetItemString(d, "__builtins__",
484 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000485 return NULL;
486 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000487 /* Remember the filename as the __file__ attribute */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000488 v = NULL;
489 if (pathname != NULL) {
490 v = PyString_FromString(pathname);
491 if (v == NULL)
492 PyErr_Clear();
493 }
494 if (v == NULL) {
495 v = ((PyCodeObject *)co)->co_filename;
496 Py_INCREF(v);
497 }
498 if (PyDict_SetItemString(d, "__file__", v) != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000499 PyErr_Clear(); /* Not important enough to report */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000500 Py_DECREF(v);
501
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000502 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000503 if (v == NULL)
504 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000505 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000506
Guido van Rossum25ce5661997-08-02 03:10:38 +0000507 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000508 PyErr_Format(PyExc_ImportError,
509 "Loaded module %.200s not found in sys.modules",
510 name);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000511 return NULL;
512 }
513
Guido van Rossum79f25d91997-04-29 20:08:16 +0000514 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000515
516 return m;
517}
518
519
520/* Given a pathname for a Python source file, fill a buffer with the
521 pathname for the corresponding compiled file. Return the pathname
522 for the compiled file, or NULL if there's no space in the buffer.
523 Doesn't set an exception. */
524
525static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000526make_compiled_pathname(char *pathname, char *buf, size_t buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000527{
Tim Petersc1731372001-08-04 08:12:36 +0000528 size_t len = strlen(pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000529 if (len+2 > buflen)
530 return NULL;
Tim Petersc1731372001-08-04 08:12:36 +0000531
532#ifdef MS_WIN32
533 /* Treat .pyw as if it were .py. The case of ".pyw" must match
534 that used in _PyImport_StandardFiletab. */
535 if (len >= 4 && strcmp(&pathname[len-4], ".pyw") == 0)
536 --len; /* pretend 'w' isn't there */
537#endif
538 memcpy(buf, pathname, len);
539 buf[len] = Py_OptimizeFlag ? 'o' : 'c';
540 buf[len+1] = '\0';
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000541
542 return buf;
543}
544
545
546/* Given a pathname for a Python source file, its time of last
547 modification, and a pathname for a compiled file, check whether the
548 compiled file represents the same version of the source. If so,
549 return a FILE pointer for the compiled file, positioned just after
550 the header; if not, return NULL.
551 Doesn't set an exception. */
552
553static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000554check_compiled_module(char *pathname, long mtime, char *cpathname)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000555{
556 FILE *fp;
557 long magic;
558 long pyc_mtime;
559
560 fp = fopen(cpathname, "rb");
561 if (fp == NULL)
562 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000563 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000564 if (magic != pyc_magic) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000565 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000566 PySys_WriteStderr("# %s has bad magic\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000567 fclose(fp);
568 return NULL;
569 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000570 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000571 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000572 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000573 PySys_WriteStderr("# %s has bad mtime\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000574 fclose(fp);
575 return NULL;
576 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000577 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000578 PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000579 return fp;
580}
581
582
583/* Read a code object from a file and check it for validity */
584
Guido van Rossum79f25d91997-04-29 20:08:16 +0000585static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000586read_compiled_module(char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000587{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000588 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000589
Tim Petersd9b9ac82001-01-28 00:27:39 +0000590 co = PyMarshal_ReadLastObjectFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000591 /* Ugly: rd_object() may return NULL with or without error */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000592 if (co == NULL || !PyCode_Check(co)) {
593 if (!PyErr_Occurred())
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000594 PyErr_Format(PyExc_ImportError,
595 "Non-code object in %.200s", cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000596 Py_XDECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000597 return NULL;
598 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000599 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000600}
601
602
603/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000604 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000605
Guido van Rossum79f25d91997-04-29 20:08:16 +0000606static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000607load_compiled_module(char *name, char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000608{
609 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000610 PyCodeObject *co;
611 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000612
Guido van Rossum79f25d91997-04-29 20:08:16 +0000613 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000614 if (magic != pyc_magic) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000615 PyErr_Format(PyExc_ImportError,
616 "Bad magic number in %.200s", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000617 return NULL;
618 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000619 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000620 co = read_compiled_module(cpathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000621 if (co == NULL)
622 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000623 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000624 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000625 name, cpathname);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000626 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000627 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000628
629 return m;
630}
631
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000632/* Parse a source file and return the corresponding code object */
633
Guido van Rossum79f25d91997-04-29 20:08:16 +0000634static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000635parse_source_module(char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000636{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000637 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000638 node *n;
639
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000640 n = PyParser_SimpleParseFile(fp, pathname, Py_file_input);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000641 if (n == NULL)
642 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000643 co = PyNode_Compile(n, pathname);
644 PyNode_Free(n);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000645
646 return co;
647}
648
649
Guido van Rossum55a83382000-09-20 20:31:38 +0000650/* Helper to open a bytecode file for writing in exclusive mode */
651
652static FILE *
653open_exclusive(char *filename)
654{
655#if defined(O_EXCL)&&defined(O_CREAT)&&defined(O_WRONLY)&&defined(O_TRUNC)
656 /* Use O_EXCL to avoid a race condition when another process tries to
657 write the same file. When that happens, our open() call fails,
658 which is just fine (since it's only a cache).
659 XXX If the file exists and is writable but the directory is not
660 writable, the file will never be written. Oh well.
661 */
662 int fd;
663 (void) unlink(filename);
Tim Peters42c83af2000-09-29 04:03:10 +0000664 fd = open(filename, O_EXCL|O_CREAT|O_WRONLY|O_TRUNC
665#ifdef O_BINARY
666 |O_BINARY /* necessary for Windows */
667#endif
Tim Peters50d8d372001-02-28 05:34:27 +0000668
Tim Peters42c83af2000-09-29 04:03:10 +0000669 , 0666);
Guido van Rossum55a83382000-09-20 20:31:38 +0000670 if (fd < 0)
671 return NULL;
672 return fdopen(fd, "wb");
673#else
674 /* Best we can do -- on Windows this can't happen anyway */
675 return fopen(filename, "wb");
676#endif
677}
678
679
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000680/* Write a compiled module to a file, placing the time of last
681 modification of its source into the header.
682 Errors are ignored, if a write error occurs an attempt is made to
683 remove the file. */
684
685static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000686write_compiled_module(PyCodeObject *co, char *cpathname, long mtime)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000687{
688 FILE *fp;
689
Guido van Rossum55a83382000-09-20 20:31:38 +0000690 fp = open_exclusive(cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000691 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000692 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000693 PySys_WriteStderr(
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000694 "# can't create %s\n", cpathname);
695 return;
696 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000697 PyMarshal_WriteLongToFile(pyc_magic, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000698 /* First write a 0 for mtime */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000699 PyMarshal_WriteLongToFile(0L, fp);
700 PyMarshal_WriteObjectToFile((PyObject *)co, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000701 if (ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000702 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000703 PySys_WriteStderr("# can't write %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000704 /* Don't keep partial file */
705 fclose(fp);
706 (void) unlink(cpathname);
707 return;
708 }
709 /* Now write the true mtime */
710 fseek(fp, 4L, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000711 PyMarshal_WriteLongToFile(mtime, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000712 fflush(fp);
713 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000714 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000715 PySys_WriteStderr("# wrote %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000716#ifdef macintosh
Jack Jansencbf630f2000-07-11 21:59:16 +0000717 PyMac_setfiletype(cpathname, 'Pyth', 'PYC ');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000718#endif
719}
720
721
722/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000723 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
724 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000725
Guido van Rossum79f25d91997-04-29 20:08:16 +0000726static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000727load_source_module(char *name, char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000728{
Fred Drake4c82b232000-06-30 16:18:57 +0000729 time_t mtime;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000730 FILE *fpc;
731 char buf[MAXPATHLEN+1];
732 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000733 PyCodeObject *co;
734 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000735
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000736 mtime = PyOS_GetLastModificationTime(pathname, fp);
Fred Drakec63d3e92001-03-01 06:33:32 +0000737 if (mtime == (time_t)(-1))
Fred Drake4c82b232000-06-30 16:18:57 +0000738 return NULL;
739#if SIZEOF_TIME_T > 4
740 /* Python's .pyc timestamp handling presumes that the timestamp fits
741 in 4 bytes. This will be fine until sometime in the year 2038,
742 when a 4-byte signed time_t will overflow.
743 */
744 if (mtime >> 32) {
745 PyErr_SetString(PyExc_OverflowError,
Fred Drakec63d3e92001-03-01 06:33:32 +0000746 "modification time overflows a 4 byte field");
Fred Drake4c82b232000-06-30 16:18:57 +0000747 return NULL;
748 }
749#endif
Tim Peters36515e22001-11-18 04:06:29 +0000750 cpathname = make_compiled_pathname(pathname, buf,
Jeremy Hylton37832f02001-04-13 17:50:20 +0000751 (size_t)MAXPATHLEN + 1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000752 if (cpathname != NULL &&
753 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000754 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000755 fclose(fpc);
756 if (co == NULL)
757 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000758 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000759 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000760 name, cpathname);
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000761 pathname = cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000762 }
763 else {
764 co = parse_source_module(pathname, fp);
765 if (co == NULL)
766 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000767 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000768 PySys_WriteStderr("import %s # from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000769 name, pathname);
770 write_compiled_module(co, cpathname, mtime);
771 }
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000772 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000773 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000774
775 return m;
776}
777
778
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000779/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +0000780static PyObject *load_module(char *, FILE *, char *, int);
781static struct filedescr *find_module(char *, PyObject *,
782 char *, size_t, FILE **);
783static struct _frozen *find_frozen(char *name);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000784
785/* Load a package and return its module object WITH INCREMENTED
786 REFERENCE COUNT */
787
788static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000789load_package(char *name, char *pathname)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000790{
791 PyObject *m, *d, *file, *path;
792 int err;
793 char buf[MAXPATHLEN+1];
794 FILE *fp = NULL;
795 struct filedescr *fdp;
796
797 m = PyImport_AddModule(name);
798 if (m == NULL)
799 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000800 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000801 PySys_WriteStderr("import %s # directory %s\n",
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000802 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000803 d = PyModule_GetDict(m);
804 file = PyString_FromString(pathname);
805 if (file == NULL)
806 return NULL;
807 path = Py_BuildValue("[O]", file);
808 if (path == NULL) {
809 Py_DECREF(file);
810 return NULL;
811 }
812 err = PyDict_SetItemString(d, "__file__", file);
813 if (err == 0)
814 err = PyDict_SetItemString(d, "__path__", path);
815 if (err != 0) {
816 m = NULL;
817 goto cleanup;
818 }
819 buf[0] = '\0';
820 fdp = find_module("__init__", path, buf, sizeof(buf), &fp);
821 if (fdp == NULL) {
822 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
823 PyErr_Clear();
824 }
825 else
826 m = NULL;
827 goto cleanup;
828 }
829 m = load_module(name, fp, buf, fdp->type);
830 if (fp != NULL)
831 fclose(fp);
832 cleanup:
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000833 Py_XDECREF(path);
834 Py_XDECREF(file);
835 return m;
836}
837
838
839/* Helper to test for built-in module */
840
841static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000842is_builtin(char *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000843{
844 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +0000845 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
846 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
847 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000848 return -1;
849 else
850 return 1;
851 }
852 }
853 return 0;
854}
855
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000856
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000857/* Search the path (default sys.path) for a module. Return the
858 corresponding filedescr struct, and (via return arguments) the
859 pathname and an open file. Return NULL if the module is not found. */
860
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000861#ifdef MS_COREDLL
Thomas Woutersb4bd21c2000-07-22 23:38:01 +0000862extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **,
863 char *, int);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000864#endif
865
Tim Peters50d8d372001-02-28 05:34:27 +0000866static int case_ok(char *, int, int, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000867static int find_init_module(char *); /* Forward */
Guido van Rossum197346f1997-10-31 18:38:52 +0000868
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000869static struct filedescr *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000870find_module(char *realname, PyObject *path, char *buf, size_t buflen,
871 FILE **p_fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000872{
Fred Drake4c82b232000-06-30 16:18:57 +0000873 int i, npath;
874 size_t len, namelen;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000875 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000876 FILE *fp = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000877#ifndef RISCOS
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000878 struct stat statbuf;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000879#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000880 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
881 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
882 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossum0506a431998-08-11 15:07:39 +0000883 char name[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000884
Fred Drake4c82b232000-06-30 16:18:57 +0000885 if (strlen(realname) > MAXPATHLEN) {
Guido van Rossum8f4d3312001-10-18 18:54:11 +0000886 PyErr_SetString(PyExc_OverflowError,
887 "module name is too long");
Fred Drake4c82b232000-06-30 16:18:57 +0000888 return NULL;
889 }
Guido van Rossum0506a431998-08-11 15:07:39 +0000890 strcpy(name, realname);
891
892 if (path != NULL && PyString_Check(path)) {
Guido van Rossum8f4d3312001-10-18 18:54:11 +0000893 /* The only type of submodule allowed inside a "frozen"
894 package are other frozen modules or packages. */
Guido van Rossum0506a431998-08-11 15:07:39 +0000895 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
896 PyErr_SetString(PyExc_ImportError,
897 "full frozen module name too long");
898 return NULL;
899 }
900 strcpy(buf, PyString_AsString(path));
901 strcat(buf, ".");
902 strcat(buf, name);
903 strcpy(name, buf);
Jack Jansen550fdae2001-10-30 13:08:39 +0000904#ifdef macintosh
905 /* Freezing on the mac works different, and the modules are
906 ** actually on sys.path. So we don't take the quick exit but
907 ** continue with the normal flow.
908 */
909 path = NULL;
910#else
Guido van Rossum8f4d3312001-10-18 18:54:11 +0000911 if (find_frozen(name) != NULL) {
912 strcpy(buf, name);
913 return &fd_frozen;
914 }
915 PyErr_Format(PyExc_ImportError,
916 "No frozen submodule named %.200s", name);
917 return NULL;
Jack Jansen550fdae2001-10-30 13:08:39 +0000918#endif
Guido van Rossum0506a431998-08-11 15:07:39 +0000919 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000920 if (path == NULL) {
921 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000922 strcpy(buf, name);
923 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000924 }
Greg Ward201baee2001-10-04 14:52:06 +0000925 if ((find_frozen(name)) != NULL) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000926 strcpy(buf, name);
927 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000928 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000929
Guido van Rossumac279101996-08-22 23:10:58 +0000930#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000931 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
932 if (fp != NULL) {
933 *p_fp = fp;
934 return fdp;
935 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000936#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000937 path = PySys_GetObject("path");
938 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000939 if (path == NULL || !PyList_Check(path)) {
940 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +0000941 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000942 return NULL;
943 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000944 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000945 namelen = strlen(name);
946 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000947 PyObject *v = PyList_GetItem(path, i);
948 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000949 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000950 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000951 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000952 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000953 strcpy(buf, PyString_AsString(v));
Fred Drake4c82b232000-06-30 16:18:57 +0000954 if (strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000955 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000956#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000957#ifdef INTERN_STRINGS
Tim Peters50d8d372001-02-28 05:34:27 +0000958 /*
Guido van Rossum741689d1997-08-12 14:53:39 +0000959 ** Speedup: each sys.path item is interned, and
960 ** FindResourceModule remembers which items refer to
961 ** folders (so we don't have to bother trying to look
Tim Peters50d8d372001-02-28 05:34:27 +0000962 ** into them for resources).
Guido van Rossum741689d1997-08-12 14:53:39 +0000963 */
964 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
965 v = PyList_GET_ITEM(path, i);
966#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000967 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000968 static struct filedescr resfiledescr =
969 {"", "", PY_RESOURCE};
Tim Peters50d8d372001-02-28 05:34:27 +0000970
Jack Jansen9c96a921995-02-15 22:57:06 +0000971 return &resfiledescr;
972 }
Guido van Rossum0f84a341998-08-06 13:36:01 +0000973 if (PyMac_FindCodeResourceModule((PyStringObject *)v, name, buf)) {
974 static struct filedescr resfiledescr =
975 {"", "", PY_CODERESOURCE};
Tim Peters50d8d372001-02-28 05:34:27 +0000976
Guido van Rossum0f84a341998-08-06 13:36:01 +0000977 return &resfiledescr;
978 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000979#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000980 if (len > 0 && buf[len-1] != SEP
981#ifdef ALTSEP
982 && buf[len-1] != ALTSEP
983#endif
984 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000985 buf[len++] = SEP;
Guido van Rossum215c3402000-11-13 17:26:32 +0000986 strcpy(buf+len, name);
987 len += namelen;
Tim Peters50d8d372001-02-28 05:34:27 +0000988
989 /* Check for package import (buf holds a directory name,
990 and there's an __init__ module in that directory */
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000991#ifdef HAVE_STAT
Tim Peterscab3f682001-04-29 22:21:25 +0000992 if (stat(buf, &statbuf) == 0 && /* it exists */
993 S_ISDIR(statbuf.st_mode) && /* it's a directory */
994 find_init_module(buf) && /* it has __init__.py */
995 case_ok(buf, len, namelen, name)) /* and case matches */
996 return &fd_package;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000997#else
998 /* XXX How are you going to test for directories? */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000999#ifdef RISCOS
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001000 if (isdir(buf) &&
1001 find_init_module(buf) &&
1002 case_ok(buf, len, namelen, name))
1003 return &fd_package;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001004#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001005#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +00001006#ifdef macintosh
1007 fdp = PyMac_FindModuleExtension(buf, &len, name);
Jack Jansen4df3c522001-03-20 23:09:54 +00001008 if (fdp) {
Guido van Rossum9a61dc91997-10-08 15:25:08 +00001009#else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001010 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001011 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001012 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001013 PySys_WriteStderr("# trying %s\n", buf);
Jack Jansen4df3c522001-03-20 23:09:54 +00001014#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001015 fp = fopen(buf, fdp->mode);
Tim Peters50d8d372001-02-28 05:34:27 +00001016 if (fp != NULL) {
1017 if (case_ok(buf, len, namelen, name))
1018 break;
1019 else { /* continue search */
1020 fclose(fp);
1021 fp = NULL;
Barry Warsaw914a0b12001-02-02 19:12:16 +00001022 }
Barry Warsaw914a0b12001-02-02 19:12:16 +00001023 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001024 }
1025 if (fp != NULL)
1026 break;
1027 }
1028 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001029 PyErr_Format(PyExc_ImportError,
1030 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001031 return NULL;
1032 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001033 *p_fp = fp;
1034 return fdp;
1035}
1036
Tim Petersd1e87a82001-03-01 18:12:00 +00001037/* case_ok(char* buf, int len, int namelen, char* name)
1038 * The arguments here are tricky, best shown by example:
1039 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1040 * ^ ^ ^ ^
1041 * |--------------------- buf ---------------------|
1042 * |------------------- len ------------------|
1043 * |------ name -------|
1044 * |----- namelen -----|
1045 * buf is the full path, but len only counts up to (& exclusive of) the
1046 * extension. name is the module name, also exclusive of extension.
1047 *
1048 * We've already done a successful stat() or fopen() on buf, so know that
1049 * there's some match, possibly case-insensitive.
1050 *
Tim Peters50d8d372001-02-28 05:34:27 +00001051 * case_ok() is to return 1 if there's a case-sensitive match for
1052 * name, else 0. case_ok() is also to return 1 if envar PYTHONCASEOK
1053 * exists.
Tim Petersd1e87a82001-03-01 18:12:00 +00001054 *
Tim Peters50d8d372001-02-28 05:34:27 +00001055 * case_ok() is used to implement case-sensitive import semantics even
1056 * on platforms with case-insensitive filesystems. It's trivial to implement
1057 * for case-sensitive filesystems. It's pretty much a cross-platform
1058 * nightmare for systems with case-insensitive filesystems.
1059 */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001060
Tim Peters50d8d372001-02-28 05:34:27 +00001061/* First we may need a pile of platform-specific header files; the sequence
1062 * of #if's here should match the sequence in the body of case_ok().
1063 */
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001064#if defined(MS_WIN32) || defined(__CYGWIN__)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001065#include <windows.h>
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001066#ifdef __CYGWIN__
1067#include <sys/cygwin.h>
1068#endif
1069
Tim Peters50d8d372001-02-28 05:34:27 +00001070#elif defined(DJGPP)
1071#include <dir.h>
1072
1073#elif defined(macintosh)
1074#include <TextUtils.h>
1075#ifdef USE_GUSI1
1076#include "TFileSpec.h" /* for Path2FSSpec() */
1077#endif
1078
Tim Petersd1e87a82001-03-01 18:12:00 +00001079#elif defined(__MACH__) && defined(__APPLE__) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001080#include <sys/types.h>
1081#include <dirent.h>
1082
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001083#elif defined(RISCOS)
1084#include "oslib/osfscontrol.h"
Tim Peters50d8d372001-02-28 05:34:27 +00001085#endif
1086
Guido van Rossum0980bd91998-02-13 17:18:36 +00001087static int
Tim Peters50d8d372001-02-28 05:34:27 +00001088case_ok(char *buf, int len, int namelen, char *name)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001089{
Tim Peters50d8d372001-02-28 05:34:27 +00001090/* Pick a platform-specific implementation; the sequence of #if's here should
1091 * match the sequence just above.
1092 */
1093
1094/* MS_WIN32 || __CYGWIN__ */
1095#if defined(MS_WIN32) || defined(__CYGWIN__)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001096 WIN32_FIND_DATA data;
1097 HANDLE h;
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001098#ifdef __CYGWIN__
1099 char tempbuf[MAX_PATH];
1100#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001101
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001102 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001103 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001104
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001105#ifdef __CYGWIN__
1106 cygwin32_conv_to_win32_path(buf, tempbuf);
1107 h = FindFirstFile(tempbuf, &data);
1108#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001109 h = FindFirstFile(buf, &data);
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001110#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001111 if (h == INVALID_HANDLE_VALUE) {
1112 PyErr_Format(PyExc_NameError,
1113 "Can't find file for module %.100s\n(filename %.300s)",
1114 name, buf);
1115 return 0;
1116 }
1117 FindClose(h);
Tim Peters50d8d372001-02-28 05:34:27 +00001118 return strncmp(data.cFileName, name, namelen) == 0;
1119
1120/* DJGPP */
1121#elif defined(DJGPP)
1122 struct ffblk ffblk;
1123 int done;
1124
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001125 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001126 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001127
1128 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
1129 if (done) {
Guido van Rossum0980bd91998-02-13 17:18:36 +00001130 PyErr_Format(PyExc_NameError,
Tim Peters50d8d372001-02-28 05:34:27 +00001131 "Can't find file for module %.100s\n(filename %.300s)",
Guido van Rossum0980bd91998-02-13 17:18:36 +00001132 name, buf);
1133 return 0;
1134 }
Tim Peters50d8d372001-02-28 05:34:27 +00001135 return strncmp(ffblk.ff_name, name, namelen) == 0;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001136
Tim Peters50d8d372001-02-28 05:34:27 +00001137/* macintosh */
1138#elif defined(macintosh)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001139 FSSpec fss;
1140 OSErr err;
Tim Peters50d8d372001-02-28 05:34:27 +00001141
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001142 if (Py_GETENV("PYTHONCASEOK") != NULL)
Tim Peters50d8d372001-02-28 05:34:27 +00001143 return 1;
1144
Guido van Rossumb33aa1a2000-04-24 15:08:18 +00001145#ifndef USE_GUSI1
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001146 err = FSMakeFSSpec(0, 0, Pstring(buf), &fss);
1147#else
1148 /* GUSI's Path2FSSpec() resolves all possible aliases nicely on
1149 the way, which is fine for all directories, but here we need
1150 the original name of the alias file (say, Dlg.ppc.slb, not
1151 toolboxmodules.ppc.slb). */
1152 char *colon;
1153 err = Path2FSSpec(buf, &fss);
1154 if (err == noErr) {
1155 colon = strrchr(buf, ':'); /* find filename */
1156 if (colon != NULL)
1157 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1158 Pstring(colon+1), &fss);
1159 else
1160 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1161 fss.name, &fss);
1162 }
1163#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001164 if (err) {
1165 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001166 "Can't find file for module %.100s\n(filename %.300s)",
1167 name, buf);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001168 return 0;
1169 }
Tim Peters50d8d372001-02-28 05:34:27 +00001170 return fss.name[0] >= namelen &&
1171 strncmp(name, (char *)fss.name+1, namelen) == 0;
1172
Tim Peters677898a2001-03-02 03:28:03 +00001173/* new-fangled macintosh (macosx) */
Tim Petersd1e87a82001-03-01 18:12:00 +00001174#elif defined(__MACH__) && defined(__APPLE__) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001175 DIR *dirp;
1176 struct dirent *dp;
Tim Petersd1e87a82001-03-01 18:12:00 +00001177 char dirname[MAXPATHLEN + 1];
1178 const int dirlen = len - namelen - 1; /* don't want trailing SEP */
Tim Peters430f5d42001-03-01 01:30:56 +00001179
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001180 if (Py_GETENV("PYTHONCASEOK") != NULL)
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001181 return 1;
1182
Tim Petersd1e87a82001-03-01 18:12:00 +00001183 /* Copy the dir component into dirname; substitute "." if empty */
1184 if (dirlen <= 0) {
1185 dirname[0] = '.';
1186 dirname[1] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001187 }
1188 else {
Tim Petersd1e87a82001-03-01 18:12:00 +00001189 assert(dirlen <= MAXPATHLEN);
1190 memcpy(dirname, buf, dirlen);
1191 dirname[dirlen] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001192 }
1193 /* Open the directory and search the entries for an exact match. */
Tim Petersd1e87a82001-03-01 18:12:00 +00001194 dirp = opendir(dirname);
Tim Peters430f5d42001-03-01 01:30:56 +00001195 if (dirp) {
Tim Peters677898a2001-03-02 03:28:03 +00001196 char *nameWithExt = buf + len - namelen;
Tim Peters430f5d42001-03-01 01:30:56 +00001197 while ((dp = readdir(dirp)) != NULL) {
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001198 const int thislen =
Tim Peters430f5d42001-03-01 01:30:56 +00001199#ifdef _DIRENT_HAVE_D_NAMELEN
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001200 dp->d_namlen;
Tim Peters430f5d42001-03-01 01:30:56 +00001201#else
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001202 strlen(dp->d_name);
Tim Peters430f5d42001-03-01 01:30:56 +00001203#endif
Tim Petersd1e87a82001-03-01 18:12:00 +00001204 if (thislen >= namelen &&
Tim Peters677898a2001-03-02 03:28:03 +00001205 strcmp(dp->d_name, nameWithExt) == 0) {
Tim Peters430f5d42001-03-01 01:30:56 +00001206 (void)closedir(dirp);
1207 return 1; /* Found */
1208 }
1209 }
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001210 (void)closedir(dirp);
Tim Peters430f5d42001-03-01 01:30:56 +00001211 }
Tim Peters430f5d42001-03-01 01:30:56 +00001212 return 0 ; /* Not found */
Tim Peters430f5d42001-03-01 01:30:56 +00001213
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001214/* RISC OS */
1215#elif defined(RISCOS)
1216 char canon[MAXPATHLEN+1]; /* buffer for the canonical form of the path */
1217 char buf2[MAXPATHLEN+2];
1218 char *nameWithExt = buf+len-namelen;
1219 int canonlen;
1220 os_error *e;
1221
1222 if (Py_GETENV("PYTHONCASEOK") != NULL)
1223 return 1;
1224
1225 /* workaround:
1226 append wildcard, otherwise case of filename wouldn't be touched */
1227 strcpy(buf2, buf);
1228 strcat(buf2, "*");
1229
1230 e = xosfscontrol_canonicalise_path(buf2,canon,0,0,MAXPATHLEN+1,&canonlen);
1231 canonlen = MAXPATHLEN+1-canonlen;
1232 if (e || canonlen<=0 || canonlen>(MAXPATHLEN+1) )
1233 return 0;
1234 if (strcmp(nameWithExt, canon+canonlen-strlen(nameWithExt))==0)
1235 return 1; /* match */
1236
1237 return 0;
1238
Tim Peters50d8d372001-02-28 05:34:27 +00001239/* assuming it's a case-sensitive filesystem, so there's nothing to do! */
1240#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001241 return 1;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001242
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001243#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001244}
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001245
Guido van Rossum0980bd91998-02-13 17:18:36 +00001246
Guido van Rossum197346f1997-10-31 18:38:52 +00001247#ifdef HAVE_STAT
1248/* Helper to look for __init__.py or __init__.py[co] in potential package */
1249static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001250find_init_module(char *buf)
Guido van Rossum197346f1997-10-31 18:38:52 +00001251{
Tim Peters0f9431f2001-07-05 03:47:53 +00001252 const size_t save_len = strlen(buf);
Fred Drake4c82b232000-06-30 16:18:57 +00001253 size_t i = save_len;
Tim Peters0f9431f2001-07-05 03:47:53 +00001254 char *pname; /* pointer to start of __init__ */
Guido van Rossum197346f1997-10-31 18:38:52 +00001255 struct stat statbuf;
1256
Tim Peters0f9431f2001-07-05 03:47:53 +00001257/* For calling case_ok(buf, len, namelen, name):
1258 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1259 * ^ ^ ^ ^
1260 * |--------------------- buf ---------------------|
1261 * |------------------- len ------------------|
1262 * |------ name -------|
1263 * |----- namelen -----|
1264 */
Guido van Rossum197346f1997-10-31 18:38:52 +00001265 if (save_len + 13 >= MAXPATHLEN)
1266 return 0;
1267 buf[i++] = SEP;
Tim Peters0f9431f2001-07-05 03:47:53 +00001268 pname = buf + i;
1269 strcpy(pname, "__init__.py");
Guido van Rossum197346f1997-10-31 18:38:52 +00001270 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001271 if (case_ok(buf,
1272 save_len + 9, /* len("/__init__") */
1273 8, /* len("__init__") */
1274 pname)) {
1275 buf[save_len] = '\0';
1276 return 1;
1277 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001278 }
Tim Peters0f9431f2001-07-05 03:47:53 +00001279 i += strlen(pname);
1280 strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum197346f1997-10-31 18:38:52 +00001281 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001282 if (case_ok(buf,
1283 save_len + 9, /* len("/__init__") */
1284 8, /* len("__init__") */
1285 pname)) {
1286 buf[save_len] = '\0';
1287 return 1;
1288 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001289 }
1290 buf[save_len] = '\0';
1291 return 0;
1292}
Guido van Rossum48a680c2001-03-02 06:34:14 +00001293
1294#else
1295
1296#ifdef RISCOS
1297static int
1298find_init_module(buf)
1299 char *buf;
1300{
1301 int save_len = strlen(buf);
1302 int i = save_len;
1303
1304 if (save_len + 13 >= MAXPATHLEN)
1305 return 0;
1306 buf[i++] = SEP;
1307 strcpy(buf+i, "__init__/py");
1308 if (isfile(buf)) {
1309 buf[save_len] = '\0';
1310 return 1;
1311 }
1312
1313 if (Py_OptimizeFlag)
1314 strcpy(buf+i, "o");
1315 else
1316 strcpy(buf+i, "c");
1317 if (isfile(buf)) {
1318 buf[save_len] = '\0';
1319 return 1;
1320 }
1321 buf[save_len] = '\0';
1322 return 0;
1323}
1324#endif /*RISCOS*/
1325
Guido van Rossum197346f1997-10-31 18:38:52 +00001326#endif /* HAVE_STAT */
1327
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001328
Tim Petersdbd9ba62000-07-09 03:09:57 +00001329static int init_builtin(char *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001330
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001331/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001332 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001333
Guido van Rossum79f25d91997-04-29 20:08:16 +00001334static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001335load_module(char *name, FILE *fp, char *buf, int type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001336{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001337 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001338 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001339 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001340
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001341 /* First check that there's an open file (if we need one) */
1342 switch (type) {
1343 case PY_SOURCE:
1344 case PY_COMPILED:
1345 if (fp == NULL) {
1346 PyErr_Format(PyExc_ValueError,
1347 "file object required for import (type code %d)",
1348 type);
1349 return NULL;
1350 }
1351 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001352
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001353 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001354
1355 case PY_SOURCE:
1356 m = load_source_module(name, buf, fp);
1357 break;
1358
1359 case PY_COMPILED:
1360 m = load_compiled_module(name, buf, fp);
1361 break;
1362
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001363#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001364 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001365 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001366 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001367#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001368
Jack Jansen9c96a921995-02-15 22:57:06 +00001369#ifdef macintosh
1370 case PY_RESOURCE:
1371 m = PyMac_LoadResourceModule(name, buf);
1372 break;
Guido van Rossum0f84a341998-08-06 13:36:01 +00001373 case PY_CODERESOURCE:
1374 m = PyMac_LoadCodeResourceModule(name, buf);
1375 break;
Jack Jansen9c96a921995-02-15 22:57:06 +00001376#endif
1377
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001378 case PKG_DIRECTORY:
1379 m = load_package(name, buf);
1380 break;
1381
1382 case C_BUILTIN:
1383 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001384 if (buf != NULL && buf[0] != '\0')
1385 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001386 if (type == C_BUILTIN)
1387 err = init_builtin(name);
1388 else
1389 err = PyImport_ImportFrozenModule(name);
1390 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001391 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001392 if (err == 0) {
1393 PyErr_Format(PyExc_ImportError,
1394 "Purported %s module %.200s not found",
1395 type == C_BUILTIN ?
1396 "builtin" : "frozen",
1397 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001398 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001399 }
1400 modules = PyImport_GetModuleDict();
1401 m = PyDict_GetItemString(modules, name);
1402 if (m == NULL) {
1403 PyErr_Format(
1404 PyExc_ImportError,
1405 "%s module %.200s not properly initialized",
1406 type == C_BUILTIN ?
1407 "builtin" : "frozen",
1408 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001409 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001410 }
1411 Py_INCREF(m);
1412 break;
1413
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001414 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001415 PyErr_Format(PyExc_ImportError,
1416 "Don't know how to import %.200s (type code %d)",
1417 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001418 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001419
1420 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001421
1422 return m;
1423}
1424
1425
1426/* Initialize a built-in module.
1427 Return 1 for succes, 0 if the module is not found, and -1 with
1428 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001429
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001430static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001431init_builtin(char *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001432{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001433 struct _inittab *p;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001434
Greg Ward201baee2001-10-04 14:52:06 +00001435 if (_PyImport_FindExtension(name, name) != NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00001436 return 1;
1437
Guido van Rossum771c6c81997-10-31 18:37:24 +00001438 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001439 if (strcmp(name, p->name) == 0) {
1440 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001441 PyErr_Format(PyExc_ImportError,
1442 "Cannot re-init internal module %.200s",
1443 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001444 return -1;
1445 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001446 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001447 PySys_WriteStderr("import %s # builtin\n", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001448 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001449 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001450 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001451 if (_PyImport_FixupExtension(name, name) == NULL)
1452 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001453 return 1;
1454 }
1455 }
1456 return 0;
1457}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001458
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001459
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001460/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001461
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001462static struct _frozen *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001463find_frozen(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001464{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001465 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001466
Guido van Rossum79f25d91997-04-29 20:08:16 +00001467 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001468 if (p->name == NULL)
1469 return NULL;
1470 if (strcmp(p->name, name) == 0)
1471 break;
1472 }
1473 return p;
1474}
1475
Guido van Rossum79f25d91997-04-29 20:08:16 +00001476static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001477get_frozen_object(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001478{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001479 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001480 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001481
1482 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001483 PyErr_Format(PyExc_ImportError,
1484 "No such frozen object named %.200s",
1485 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001486 return NULL;
1487 }
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001488 if (p->code == NULL) {
1489 PyErr_Format(PyExc_ImportError,
1490 "Excluded frozen object named %.200s",
1491 name);
1492 return NULL;
1493 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001494 size = p->size;
1495 if (size < 0)
1496 size = -size;
1497 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001498}
1499
1500/* Initialize a frozen module.
1501 Return 1 for succes, 0 if the module is not found, and -1 with
1502 an exception set if the initialization failed.
1503 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001504
1505int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001506PyImport_ImportFrozenModule(char *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001507{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001508 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001509 PyObject *co;
1510 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001511 int ispackage;
1512 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001513
1514 if (p == NULL)
1515 return 0;
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001516 if (p->code == NULL) {
1517 PyErr_Format(PyExc_ImportError,
1518 "Excluded frozen object named %.200s",
1519 name);
1520 return -1;
1521 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001522 size = p->size;
1523 ispackage = (size < 0);
1524 if (ispackage)
1525 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001526 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001527 PySys_WriteStderr("import %s # frozen%s\n",
Guido van Rossuma5568d31998-03-05 03:45:08 +00001528 name, ispackage ? " package" : "");
1529 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001530 if (co == NULL)
1531 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001532 if (!PyCode_Check(co)) {
1533 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001534 PyErr_Format(PyExc_TypeError,
1535 "frozen object %.200s is not a code object",
1536 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001537 return -1;
1538 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001539 if (ispackage) {
1540 /* Set __path__ to the package name */
1541 PyObject *d, *s;
1542 int err;
1543 m = PyImport_AddModule(name);
1544 if (m == NULL)
1545 return -1;
1546 d = PyModule_GetDict(m);
1547 s = PyString_InternFromString(name);
1548 if (s == NULL)
1549 return -1;
1550 err = PyDict_SetItemString(d, "__path__", s);
1551 Py_DECREF(s);
1552 if (err != 0)
1553 return err;
1554 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001555 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001556 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001557 if (m == NULL)
1558 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001559 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001560 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001561}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001562
1563
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001564/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001565 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001566
Guido van Rossum79f25d91997-04-29 20:08:16 +00001567PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001568PyImport_ImportModule(char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00001569{
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00001570 PyObject *pname;
1571 PyObject *result;
1572
1573 pname = PyString_FromString(name);
1574 result = PyImport_Import(pname);
1575 Py_DECREF(pname);
1576 return result;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001577}
1578
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001579/* Forward declarations for helper routines */
Tim Petersdbd9ba62000-07-09 03:09:57 +00001580static PyObject *get_parent(PyObject *globals, char *buf, int *p_buflen);
1581static PyObject *load_next(PyObject *mod, PyObject *altmod,
1582 char **p_name, char *buf, int *p_buflen);
1583static int mark_miss(char *name);
1584static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
1585 char *buf, int buflen, int recursive);
1586static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001587
1588/* The Magnum Opus of dotted-name import :-) */
1589
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001590static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001591import_module_ex(char *name, PyObject *globals, PyObject *locals,
1592 PyObject *fromlist)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001593{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001594 char buf[MAXPATHLEN+1];
1595 int buflen = 0;
1596 PyObject *parent, *head, *next, *tail;
1597
1598 parent = get_parent(globals, buf, &buflen);
1599 if (parent == NULL)
1600 return NULL;
1601
1602 head = load_next(parent, Py_None, &name, buf, &buflen);
1603 if (head == NULL)
1604 return NULL;
1605
1606 tail = head;
1607 Py_INCREF(tail);
1608 while (name) {
1609 next = load_next(tail, tail, &name, buf, &buflen);
1610 Py_DECREF(tail);
1611 if (next == NULL) {
1612 Py_DECREF(head);
1613 return NULL;
1614 }
1615 tail = next;
1616 }
1617
1618 if (fromlist != NULL) {
1619 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1620 fromlist = NULL;
1621 }
1622
1623 if (fromlist == NULL) {
1624 Py_DECREF(tail);
1625 return head;
1626 }
1627
1628 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001629 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001630 Py_DECREF(tail);
1631 return NULL;
1632 }
1633
1634 return tail;
1635}
1636
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001637PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001638PyImport_ImportModuleEx(char *name, PyObject *globals, PyObject *locals,
1639 PyObject *fromlist)
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001640{
1641 PyObject *result;
1642 lock_import();
Guido van Rossumd65911b1998-03-03 22:33:27 +00001643 result = import_module_ex(name, globals, locals, fromlist);
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001644 unlock_import();
1645 return result;
1646}
1647
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001648static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001649get_parent(PyObject *globals, char *buf, int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001650{
1651 static PyObject *namestr = NULL;
1652 static PyObject *pathstr = NULL;
1653 PyObject *modname, *modpath, *modules, *parent;
1654
1655 if (globals == NULL || !PyDict_Check(globals))
1656 return Py_None;
1657
1658 if (namestr == NULL) {
1659 namestr = PyString_InternFromString("__name__");
1660 if (namestr == NULL)
1661 return NULL;
1662 }
1663 if (pathstr == NULL) {
1664 pathstr = PyString_InternFromString("__path__");
1665 if (pathstr == NULL)
1666 return NULL;
1667 }
1668
1669 *buf = '\0';
1670 *p_buflen = 0;
1671 modname = PyDict_GetItem(globals, namestr);
1672 if (modname == NULL || !PyString_Check(modname))
1673 return Py_None;
1674
1675 modpath = PyDict_GetItem(globals, pathstr);
1676 if (modpath != NULL) {
1677 int len = PyString_GET_SIZE(modname);
1678 if (len > MAXPATHLEN) {
1679 PyErr_SetString(PyExc_ValueError,
1680 "Module name too long");
1681 return NULL;
1682 }
1683 strcpy(buf, PyString_AS_STRING(modname));
1684 *p_buflen = len;
1685 }
1686 else {
1687 char *start = PyString_AS_STRING(modname);
1688 char *lastdot = strrchr(start, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001689 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001690 if (lastdot == NULL)
1691 return Py_None;
1692 len = lastdot - start;
1693 if (len >= MAXPATHLEN) {
1694 PyErr_SetString(PyExc_ValueError,
1695 "Module name too long");
1696 return NULL;
1697 }
1698 strncpy(buf, start, len);
1699 buf[len] = '\0';
1700 *p_buflen = len;
1701 }
1702
1703 modules = PyImport_GetModuleDict();
1704 parent = PyDict_GetItemString(modules, buf);
1705 if (parent == NULL)
1706 parent = Py_None;
1707 return parent;
1708 /* We expect, but can't guarantee, if parent != None, that:
1709 - parent.__name__ == buf
1710 - parent.__dict__ is globals
1711 If this is violated... Who cares? */
1712}
1713
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001714/* altmod is either None or same as mod */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001715static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001716load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
1717 int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001718{
1719 char *name = *p_name;
1720 char *dot = strchr(name, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001721 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001722 char *p;
1723 PyObject *result;
1724
1725 if (dot == NULL) {
1726 *p_name = NULL;
1727 len = strlen(name);
1728 }
1729 else {
1730 *p_name = dot+1;
1731 len = dot-name;
1732 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00001733 if (len == 0) {
1734 PyErr_SetString(PyExc_ValueError,
1735 "Empty module name");
1736 return NULL;
1737 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001738
1739 p = buf + *p_buflen;
1740 if (p != buf)
1741 *p++ = '.';
1742 if (p+len-buf >= MAXPATHLEN) {
1743 PyErr_SetString(PyExc_ValueError,
1744 "Module name too long");
1745 return NULL;
1746 }
1747 strncpy(p, name, len);
1748 p[len] = '\0';
1749 *p_buflen = p+len-buf;
1750
1751 result = import_submodule(mod, p, buf);
1752 if (result == Py_None && altmod != mod) {
1753 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001754 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001755 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001756 if (result != NULL && result != Py_None) {
1757 if (mark_miss(buf) != 0) {
1758 Py_DECREF(result);
1759 return NULL;
1760 }
1761 strncpy(buf, name, len);
1762 buf[len] = '\0';
1763 *p_buflen = len;
1764 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001765 }
1766 if (result == NULL)
1767 return NULL;
1768
1769 if (result == Py_None) {
1770 Py_DECREF(result);
1771 PyErr_Format(PyExc_ImportError,
1772 "No module named %.200s", name);
1773 return NULL;
1774 }
1775
1776 return result;
1777}
1778
1779static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001780mark_miss(char *name)
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001781{
1782 PyObject *modules = PyImport_GetModuleDict();
1783 return PyDict_SetItemString(modules, name, Py_None);
1784}
1785
1786static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001787ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, int buflen,
1788 int recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001789{
1790 int i;
1791
1792 if (!PyObject_HasAttrString(mod, "__path__"))
1793 return 1;
1794
1795 for (i = 0; ; i++) {
1796 PyObject *item = PySequence_GetItem(fromlist, i);
1797 int hasit;
1798 if (item == NULL) {
1799 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1800 PyErr_Clear();
1801 return 1;
1802 }
1803 return 0;
1804 }
1805 if (!PyString_Check(item)) {
1806 PyErr_SetString(PyExc_TypeError,
1807 "Item in ``from list'' not a string");
1808 Py_DECREF(item);
1809 return 0;
1810 }
1811 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001812 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001813 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001814 /* See if the package defines __all__ */
1815 if (recursive)
1816 continue; /* Avoid endless recursion */
1817 all = PyObject_GetAttrString(mod, "__all__");
1818 if (all == NULL)
1819 PyErr_Clear();
1820 else {
1821 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1822 return 0;
1823 Py_DECREF(all);
1824 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001825 continue;
1826 }
1827 hasit = PyObject_HasAttr(mod, item);
1828 if (!hasit) {
1829 char *subname = PyString_AS_STRING(item);
1830 PyObject *submod;
1831 char *p;
1832 if (buflen + strlen(subname) >= MAXPATHLEN) {
1833 PyErr_SetString(PyExc_ValueError,
1834 "Module name too long");
1835 Py_DECREF(item);
1836 return 0;
1837 }
1838 p = buf + buflen;
1839 *p++ = '.';
1840 strcpy(p, subname);
1841 submod = import_submodule(mod, subname, buf);
1842 Py_XDECREF(submod);
1843 if (submod == NULL) {
1844 Py_DECREF(item);
1845 return 0;
1846 }
1847 }
1848 Py_DECREF(item);
1849 }
1850
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001851 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001852}
1853
1854static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001855import_submodule(PyObject *mod, char *subname, char *fullname)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001856{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001857 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossumf48f11c2001-07-23 13:27:49 +00001858 PyObject *m, *res = NULL;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001859
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001860 /* Require:
1861 if mod == None: subname == fullname
1862 else: mod.__name__ + "." + subname == fullname
1863 */
1864
Tim Peters50d8d372001-02-28 05:34:27 +00001865 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001866 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001867 }
1868 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001869 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001870 char buf[MAXPATHLEN+1];
1871 struct filedescr *fdp;
1872 FILE *fp = NULL;
1873
Guido van Rossum9c0afe51998-05-19 15:09:05 +00001874 if (mod == Py_None)
1875 path = NULL;
1876 else {
1877 path = PyObject_GetAttrString(mod, "__path__");
1878 if (path == NULL) {
1879 PyErr_Clear();
1880 Py_INCREF(Py_None);
1881 return Py_None;
1882 }
1883 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001884
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001885 buf[0] = '\0';
Guido van Rossumb68cd421998-07-01 17:36:26 +00001886 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1887 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001888 if (fdp == NULL) {
1889 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1890 return NULL;
1891 PyErr_Clear();
1892 Py_INCREF(Py_None);
1893 return Py_None;
1894 }
1895 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001896 if (fp)
1897 fclose(fp);
Guido van Rossumf48f11c2001-07-23 13:27:49 +00001898 if (mod != Py_None) {
1899 /* Irrespective of the success of this load, make a
1900 reference to it in the parent package module.
1901 A copy gets saved in the modules dictionary
1902 under the full name, so get a reference from
1903 there, if need be. (The exception is when
1904 the load failed with a SyntaxError -- then
1905 there's no trace in sys.modules. In that case,
1906 of course, do nothing extra.) */
1907 res = m;
1908 if (res == NULL)
1909 res = PyDict_GetItemString(modules, fullname);
1910 if (res != NULL &&
1911 PyObject_SetAttrString(mod, subname, res) < 0) {
1912 Py_XDECREF(m);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001913 m = NULL;
1914 }
1915 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001916 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001917
1918 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001919}
1920
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001921
1922/* Re-import a module of any kind and return its module object, WITH
1923 INCREMENTED REFERENCE COUNT */
1924
Guido van Rossum79f25d91997-04-29 20:08:16 +00001925PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001926PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001927{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001928 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001929 PyObject *path = NULL;
1930 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001931 char buf[MAXPATHLEN+1];
1932 struct filedescr *fdp;
1933 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001934
Guido van Rossum79f25d91997-04-29 20:08:16 +00001935 if (m == NULL || !PyModule_Check(m)) {
1936 PyErr_SetString(PyExc_TypeError,
1937 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001938 return NULL;
1939 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001940 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001941 if (name == NULL)
1942 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001943 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001944 PyErr_Format(PyExc_ImportError,
1945 "reload(): module %.200s not in sys.modules",
1946 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001947 return NULL;
1948 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001949 subname = strrchr(name, '.');
1950 if (subname == NULL)
1951 subname = name;
1952 else {
1953 PyObject *parentname, *parent;
1954 parentname = PyString_FromStringAndSize(name, (subname-name));
1955 if (parentname == NULL)
1956 return NULL;
1957 parent = PyDict_GetItem(modules, parentname);
Barry Warsaw38793331999-01-27 17:54:20 +00001958 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00001959 if (parent == NULL) {
1960 PyErr_Format(PyExc_ImportError,
1961 "reload(): parent %.200s not in sys.modules",
1962 name);
1963 return NULL;
1964 }
1965 subname++;
1966 path = PyObject_GetAttrString(parent, "__path__");
1967 if (path == NULL)
1968 PyErr_Clear();
1969 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001970 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001971 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1972 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001973 if (fdp == NULL)
1974 return NULL;
1975 m = load_module(name, fp, buf, fdp->type);
1976 if (fp)
1977 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001978 return m;
1979}
1980
1981
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001982/* Higher-level import emulator which emulates the "import" statement
1983 more accurately -- it invokes the __import__() function from the
1984 builtins of the current globals. This means that the import is
1985 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00001986 environment, e.g. by "rexec".
1987 A dummy list ["__doc__"] is passed as the 4th argument so that
1988 e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
1989 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001990
1991PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001992PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001993{
1994 static PyObject *silly_list = NULL;
1995 static PyObject *builtins_str = NULL;
1996 static PyObject *import_str = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001997 PyObject *globals = NULL;
1998 PyObject *import = NULL;
1999 PyObject *builtins = NULL;
2000 PyObject *r = NULL;
2001
2002 /* Initialize constant string objects */
2003 if (silly_list == NULL) {
2004 import_str = PyString_InternFromString("__import__");
2005 if (import_str == NULL)
2006 return NULL;
2007 builtins_str = PyString_InternFromString("__builtins__");
2008 if (builtins_str == NULL)
2009 return NULL;
2010 silly_list = Py_BuildValue("[s]", "__doc__");
2011 if (silly_list == NULL)
2012 return NULL;
2013 }
2014
2015 /* Get the builtins from current globals */
2016 globals = PyEval_GetGlobals();
Guido van Rossum85cd1d62001-02-20 21:43:24 +00002017 if (globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00002018 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002019 builtins = PyObject_GetItem(globals, builtins_str);
2020 if (builtins == NULL)
2021 goto err;
2022 }
2023 else {
2024 /* No globals -- use standard builtins, and fake globals */
2025 PyErr_Clear();
2026
Guido van Rossum85cd1d62001-02-20 21:43:24 +00002027 builtins = PyImport_ImportModuleEx("__builtin__",
2028 NULL, NULL, NULL);
2029 if (builtins == NULL)
2030 return NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002031 globals = Py_BuildValue("{OO}", builtins_str, builtins);
2032 if (globals == NULL)
2033 goto err;
2034 }
2035
2036 /* Get the __import__ function from the builtins */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002037 if (PyDict_Check(builtins)) {
Fred Drakea76ba6e2001-03-06 06:31:15 +00002038 import = PyObject_GetItem(builtins, import_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002039 if (import == NULL)
2040 PyErr_SetObject(PyExc_KeyError, import_str);
2041 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002042 else
Fred Drakea76ba6e2001-03-06 06:31:15 +00002043 import = PyObject_GetAttr(builtins, import_str);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002044 if (import == NULL)
2045 goto err;
2046
2047 /* Call the _import__ function with the proper argument list */
2048 r = PyObject_CallFunction(import, "OOOO",
2049 module_name, globals, globals, silly_list);
2050
2051 err:
2052 Py_XDECREF(globals);
2053 Py_XDECREF(builtins);
2054 Py_XDECREF(import);
Tim Peters50d8d372001-02-28 05:34:27 +00002055
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002056 return r;
2057}
2058
2059
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002060/* Module 'imp' provides Python access to the primitives used for
2061 importing modules.
2062*/
2063
Guido van Rossum79f25d91997-04-29 20:08:16 +00002064static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002065imp_get_magic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002066{
2067 char buf[4];
2068
Guido van Rossum43713e52000-02-29 13:59:29 +00002069 if (!PyArg_ParseTuple(args, ":get_magic"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002070 return NULL;
Guido van Rossum96774c12000-05-01 20:19:08 +00002071 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
2072 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
2073 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
2074 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002075
Guido van Rossum79f25d91997-04-29 20:08:16 +00002076 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002077}
2078
Guido van Rossum79f25d91997-04-29 20:08:16 +00002079static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002080imp_get_suffixes(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002081{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002082 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002083 struct filedescr *fdp;
2084
Guido van Rossum43713e52000-02-29 13:59:29 +00002085 if (!PyArg_ParseTuple(args, ":get_suffixes"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002086 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002087 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002088 if (list == NULL)
2089 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002090 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
2091 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002092 fdp->suffix, fdp->mode, fdp->type);
2093 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002094 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002095 return NULL;
2096 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002097 if (PyList_Append(list, item) < 0) {
2098 Py_DECREF(list);
2099 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002100 return NULL;
2101 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002102 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002103 }
2104 return list;
2105}
2106
Guido van Rossum79f25d91997-04-29 20:08:16 +00002107static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002108call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002109{
Tim Petersdbd9ba62000-07-09 03:09:57 +00002110 extern int fclose(FILE *);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002111 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002112 struct filedescr *fdp;
2113 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002114 FILE *fp = NULL;
2115
2116 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002117 if (path == Py_None)
2118 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002119 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
2120 if (fdp == NULL)
2121 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002122 if (fp != NULL) {
2123 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
2124 if (fob == NULL) {
2125 fclose(fp);
2126 return NULL;
2127 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002128 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002129 else {
2130 fob = Py_None;
2131 Py_INCREF(fob);
Tim Peters50d8d372001-02-28 05:34:27 +00002132 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002133 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002134 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002135 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002136 return ret;
2137}
2138
Guido van Rossum79f25d91997-04-29 20:08:16 +00002139static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002140imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002141{
2142 char *name;
2143 PyObject *path = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002144 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002145 return NULL;
2146 return call_find_module(name, path);
2147}
2148
2149static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002150imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002151{
2152 char *name;
2153 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002154 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002155 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002156 return NULL;
2157 ret = init_builtin(name);
2158 if (ret < 0)
2159 return NULL;
2160 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002161 Py_INCREF(Py_None);
2162 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002163 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002164 m = PyImport_AddModule(name);
2165 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002166 return m;
2167}
2168
Guido van Rossum79f25d91997-04-29 20:08:16 +00002169static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002170imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002171{
2172 char *name;
2173 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002174 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002175 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002176 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002177 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002178 if (ret < 0)
2179 return NULL;
2180 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002181 Py_INCREF(Py_None);
2182 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002183 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002184 m = PyImport_AddModule(name);
2185 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002186 return m;
2187}
2188
Guido van Rossum79f25d91997-04-29 20:08:16 +00002189static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002190imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002191{
2192 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002193
Guido van Rossum43713e52000-02-29 13:59:29 +00002194 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002195 return NULL;
2196 return get_frozen_object(name);
2197}
2198
Guido van Rossum79f25d91997-04-29 20:08:16 +00002199static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002200imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002201{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002202 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002203 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002204 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002205 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002206}
2207
Guido van Rossum79f25d91997-04-29 20:08:16 +00002208static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002209imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002210{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002211 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002212 struct _frozen *p;
Guido van Rossum43713e52000-02-29 13:59:29 +00002213 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002214 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002215 p = find_frozen(name);
2216 return PyInt_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002217}
2218
2219static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002220get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002221{
2222 FILE *fp;
2223 if (fob == NULL) {
2224 fp = fopen(pathname, mode);
2225 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002226 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002227 }
2228 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002229 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002230 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002231 PyErr_SetString(PyExc_ValueError,
2232 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002233 }
2234 return fp;
2235}
2236
Guido van Rossum79f25d91997-04-29 20:08:16 +00002237static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002238imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002239{
2240 char *name;
2241 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002242 PyObject *fob = NULL;
2243 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002244 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002245 if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002246 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002247 return NULL;
2248 fp = get_file(pathname, fob, "rb");
2249 if (fp == NULL)
2250 return NULL;
2251 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002252 if (fob == NULL)
2253 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002254 return m;
2255}
2256
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002257#ifdef HAVE_DYNAMIC_LOADING
2258
Guido van Rossum79f25d91997-04-29 20:08:16 +00002259static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002260imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002261{
2262 char *name;
2263 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002264 PyObject *fob = NULL;
2265 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002266 FILE *fp = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002267 if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002268 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002269 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002270 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002271 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002272 if (fp == NULL)
2273 return NULL;
2274 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002275 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002276 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002277}
2278
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002279#endif /* HAVE_DYNAMIC_LOADING */
2280
Guido van Rossum79f25d91997-04-29 20:08:16 +00002281static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002282imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002283{
2284 char *name;
2285 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002286 PyObject *fob = NULL;
2287 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002288 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002289 if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002290 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002291 return NULL;
2292 fp = get_file(pathname, fob, "r");
2293 if (fp == NULL)
2294 return NULL;
2295 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002296 if (fob == NULL)
2297 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002298 return m;
2299}
2300
Jack Jansen9c96a921995-02-15 22:57:06 +00002301#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002302static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002303imp_load_resource(PyObject *self, PyObject *args)
Jack Jansen9c96a921995-02-15 22:57:06 +00002304{
2305 char *name;
2306 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002307 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002308
Guido van Rossum43713e52000-02-29 13:59:29 +00002309 if (!PyArg_ParseTuple(args, "ss:load_resource", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002310 return NULL;
2311 m = PyMac_LoadResourceModule(name, pathname);
2312 return m;
2313}
2314#endif /* macintosh */
2315
Guido van Rossum79f25d91997-04-29 20:08:16 +00002316static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002317imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002318{
2319 char *name;
2320 PyObject *fob;
2321 char *pathname;
2322 char *suffix; /* Unused */
2323 char *mode;
2324 int type;
2325 FILE *fp;
2326
Guido van Rossum43713e52000-02-29 13:59:29 +00002327 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002328 &name, &fob, &pathname,
2329 &suffix, &mode, &type))
2330 return NULL;
2331 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
2332 PyErr_Format(PyExc_ValueError,
2333 "invalid file open mode %.200s", mode);
2334 return NULL;
2335 }
2336 if (fob == Py_None)
2337 fp = NULL;
2338 else {
2339 if (!PyFile_Check(fob)) {
2340 PyErr_SetString(PyExc_ValueError,
2341 "load_module arg#2 should be a file or None");
2342 return NULL;
2343 }
2344 fp = get_file(pathname, fob, mode);
2345 if (fp == NULL)
2346 return NULL;
2347 }
2348 return load_module(name, fp, pathname, type);
2349}
2350
2351static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002352imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002353{
2354 char *name;
2355 char *pathname;
Guido van Rossum43713e52000-02-29 13:59:29 +00002356 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002357 return NULL;
2358 return load_package(name, pathname);
2359}
2360
2361static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002362imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002363{
2364 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002365 if (!PyArg_ParseTuple(args, "s:new_module", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002366 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002367 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002368}
2369
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002370/* Doc strings */
2371
2372static char doc_imp[] = "\
2373This module provides the components needed to build your own\n\
2374__import__ function. Undocumented functions are obsolete.\n\
2375";
2376
2377static char doc_find_module[] = "\
2378find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
2379Search for a module. If path is omitted or None, search for a\n\
2380built-in, frozen or special module and continue search in sys.path.\n\
2381The module name cannot contain '.'; to search for a submodule of a\n\
2382package, pass the submodule name and the package's __path__.\
2383";
2384
2385static char doc_load_module[] = "\
2386load_module(name, file, filename, (suffix, mode, type)) -> module\n\
2387Load a module, given information returned by find_module().\n\
2388The module name must include the full package name, if any.\
2389";
2390
2391static char doc_get_magic[] = "\
2392get_magic() -> string\n\
2393Return the magic number for .pyc or .pyo files.\
2394";
2395
2396static char doc_get_suffixes[] = "\
2397get_suffixes() -> [(suffix, mode, type), ...]\n\
2398Return a list of (suffix, mode, type) tuples describing the files\n\
2399that find_module() looks for.\
2400";
2401
2402static char doc_new_module[] = "\
2403new_module(name) -> module\n\
2404Create a new module. Do not enter it in sys.modules.\n\
2405The module name must include the full package name, if any.\
2406";
2407
Tim Peters69232342001-08-30 05:16:13 +00002408static char doc_lock_held[] = "\
2409lock_held() -> 0 or 1\n\
2410Return 1 if the import lock is currently held.\n\
2411On platforms without threads, return 0.\
2412";
2413
Guido van Rossum79f25d91997-04-29 20:08:16 +00002414static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002415 {"find_module", imp_find_module, 1, doc_find_module},
2416 {"get_magic", imp_get_magic, 1, doc_get_magic},
2417 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2418 {"load_module", imp_load_module, 1, doc_load_module},
2419 {"new_module", imp_new_module, 1, doc_new_module},
Tim Peters69232342001-08-30 05:16:13 +00002420 {"lock_held", imp_lock_held, 1, doc_lock_held},
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002421 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002422 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002423 {"init_builtin", imp_init_builtin, 1},
2424 {"init_frozen", imp_init_frozen, 1},
2425 {"is_builtin", imp_is_builtin, 1},
2426 {"is_frozen", imp_is_frozen, 1},
2427 {"load_compiled", imp_load_compiled, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002428#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002429 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002430#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002431 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002432#ifdef macintosh
2433 {"load_resource", imp_load_resource, 1},
2434#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002435 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002436 {NULL, NULL} /* sentinel */
2437};
2438
Guido van Rossum1a8791e1998-08-04 22:46:29 +00002439static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002440setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002441{
2442 PyObject *v;
2443 int err;
2444
2445 v = PyInt_FromLong((long)value);
2446 err = PyDict_SetItemString(d, name, v);
2447 Py_XDECREF(v);
2448 return err;
2449}
2450
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002451void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002452initimp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002453{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002454 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002455
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002456 m = Py_InitModule4("imp", imp_methods, doc_imp,
2457 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002458 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002459
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002460 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2461 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2462 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2463 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2464 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2465 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2466 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2467 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00002468 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002469
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002470 failure:
2471 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002472}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002473
2474
Guido van Rossumb18618d2000-05-03 23:44:39 +00002475/* API for embedding applications that want to add their own entries
2476 to the table of built-in modules. This should normally be called
2477 *before* Py_Initialize(). When the table resize fails, -1 is
2478 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002479
2480 After a similar function by Just van Rossum. */
2481
2482int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002483PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002484{
2485 static struct _inittab *our_copy = NULL;
2486 struct _inittab *p;
2487 int i, n;
2488
2489 /* Count the number of entries in both tables */
2490 for (n = 0; newtab[n].name != NULL; n++)
2491 ;
2492 if (n == 0)
2493 return 0; /* Nothing to do */
2494 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2495 ;
2496
2497 /* Allocate new memory for the combined table */
Guido van Rossumb18618d2000-05-03 23:44:39 +00002498 p = our_copy;
2499 PyMem_RESIZE(p, struct _inittab, i+n+1);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002500 if (p == NULL)
2501 return -1;
2502
2503 /* Copy the tables into the new memory */
2504 if (our_copy != PyImport_Inittab)
2505 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2506 PyImport_Inittab = our_copy = p;
2507 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
2508
2509 return 0;
2510}
2511
2512/* Shorthand to add a single entry given a name and a function */
2513
2514int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002515PyImport_AppendInittab(char *name, void (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002516{
2517 struct _inittab newtab[2];
2518
2519 memset(newtab, '\0', sizeof newtab);
2520
2521 newtab[0].name = name;
2522 newtab[0].initfunc = initfunc;
2523
2524 return PyImport_ExtendInittab(newtab);
2525}