blob: f00a563100b9f2d10ac7ed73c82f4c8b93c5b828 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Module definition and import implementation */
3
Guido van Rossum79f25d91997-04-29 20:08:16 +00004#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00005
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00006#include "node.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00007#include "token.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00008#include "errcode.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +00009#include "marshal.h"
10#include "compile.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000011#include "eval.h"
Guido van Rossumd8bac6d1992-02-26 15:19:13 +000012#include "osdefs.h"
Guido van Rossum1ae940a1995-01-02 19:04:15 +000013#include "importdl.h"
Jack Jansen9c96a921995-02-15 22:57:06 +000014#ifdef macintosh
15#include "macglue.h"
16#endif
Guido van Rossumc405b7b1991-06-04 19:39:42 +000017
Guido van Rossum80bb9651996-12-05 23:27:02 +000018#ifdef HAVE_UNISTD_H
19#include <unistd.h>
20#endif
21
Guido van Rossum55a83382000-09-20 20:31:38 +000022#ifdef HAVE_FCNTL_H
23#include <fcntl.h>
24#endif
25
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000026extern time_t PyOS_GetLastModificationTime(char *, FILE *);
27 /* In getmtime.c */
Guido van Rossum21d335e1993-10-15 13:01:11 +000028
Guido van Rossum6c849691994-09-26 15:47:17 +000029/* Magic word to reject .pyc files generated by other Python versions */
Guido van Rossum7faeab31995-07-07 22:50:36 +000030/* Change for each incompatible change */
31/* The value of CR and LF is incorporated so if you ever read or write
32 a .pyc file in text mode the magic number will be wrong; also, the
33 Apple MPW compiler swaps their values, botching string constants */
34/* XXX Perhaps the magic number should be frozen and a version field
35 added to the .pyc file header? */
Guido van Rossumdd5db431997-01-17 21:06:11 +000036/* New way to come up with the magic number: (YEAR-1995), MONTH, DAY */
Tim Peters6d6c1a32001-08-02 04:15:00 +000037#define MAGIC (60717 | ((long)'\r'<<16) | ((long)'\n'<<24))
Guido van Rossum3ddee711991-12-16 13:06:34 +000038
Guido van Rossum96774c12000-05-01 20:19:08 +000039/* Magic word as global; note that _PyImport_Init() can change the
Jeremy Hylton9262b8a2000-06-30 04:59:17 +000040 value of this global to accommodate for alterations of how the
Guido van Rossum96774c12000-05-01 20:19:08 +000041 compiler works which are enabled by command line switches. */
42static long pyc_magic = MAGIC;
43
Guido van Rossum25ce5661997-08-02 03:10:38 +000044/* See _PyImport_FixupExtension() below */
45static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000046
Guido van Rossum771c6c81997-10-31 18:37:24 +000047/* This table is defined in config.c: */
48extern struct _inittab _PyImport_Inittab[];
49
50struct _inittab *PyImport_Inittab = _PyImport_Inittab;
Guido van Rossum66f1fa81991-04-03 19:03:52 +000051
Guido van Rossumed1170e1999-12-20 21:23:41 +000052/* these tables define the module suffixes that Python recognizes */
53struct filedescr * _PyImport_Filetab = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +000054
55#ifdef RISCOS
56static const struct filedescr _PyImport_StandardFiletab[] = {
57 {"/py", "r", PY_SOURCE},
58 {"/pyc", "rb", PY_COMPILED},
59 {0, 0}
60};
61#else
Guido van Rossumed1170e1999-12-20 21:23:41 +000062static const struct filedescr _PyImport_StandardFiletab[] = {
63 {".py", "r", PY_SOURCE},
Tim Petersc1731372001-08-04 08:12:36 +000064#ifdef MS_WIN32
65 {".pyw", "r", PY_SOURCE},
66#endif
Guido van Rossumed1170e1999-12-20 21:23:41 +000067 {".pyc", "rb", PY_COMPILED},
68 {0, 0}
69};
Guido van Rossum48a680c2001-03-02 06:34:14 +000070#endif
Guido van Rossumed1170e1999-12-20 21:23:41 +000071
Guido van Rossum1ae940a1995-01-02 19:04:15 +000072/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000073
74void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000075_PyImport_Init(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000076{
Guido van Rossumed1170e1999-12-20 21:23:41 +000077 const struct filedescr *scan;
78 struct filedescr *filetab;
79 int countD = 0;
80 int countS = 0;
81
82 /* prepare _PyImport_Filetab: copy entries from
83 _PyImport_DynLoadFiletab and _PyImport_StandardFiletab.
84 */
85 for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan)
86 ++countD;
87 for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan)
88 ++countS;
Guido van Rossumb18618d2000-05-03 23:44:39 +000089 filetab = PyMem_NEW(struct filedescr, countD + countS + 1);
Guido van Rossumed1170e1999-12-20 21:23:41 +000090 memcpy(filetab, _PyImport_DynLoadFiletab,
91 countD * sizeof(struct filedescr));
92 memcpy(filetab + countD, _PyImport_StandardFiletab,
93 countS * sizeof(struct filedescr));
94 filetab[countD + countS].suffix = NULL;
95
96 _PyImport_Filetab = filetab;
97
Guido van Rossum0824f631997-03-11 18:37:35 +000098 if (Py_OptimizeFlag) {
Guido van Rossumed1170e1999-12-20 21:23:41 +000099 /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */
100 for (; filetab->suffix != NULL; filetab++) {
Guido van Rossum48a680c2001-03-02 06:34:14 +0000101#ifndef RISCOS
Guido van Rossumed1170e1999-12-20 21:23:41 +0000102 if (strcmp(filetab->suffix, ".pyc") == 0)
103 filetab->suffix = ".pyo";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000104#else
105 if (strcmp(filetab->suffix, "/pyc") == 0)
106 filetab->suffix = "/pyo";
107#endif
Guido van Rossum0824f631997-03-11 18:37:35 +0000108 }
109 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000110
111 if (Py_UnicodeFlag) {
112 /* Fix the pyc_magic so that byte compiled code created
113 using the all-Unicode method doesn't interfere with
114 code created in normal operation mode. */
115 pyc_magic = MAGIC + 1;
116 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000117}
118
Guido van Rossum25ce5661997-08-02 03:10:38 +0000119void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000120_PyImport_Fini(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000121{
122 Py_XDECREF(extensions);
123 extensions = NULL;
Barry Warsaw84294482000-10-03 16:02:05 +0000124 PyMem_DEL(_PyImport_Filetab);
125 _PyImport_Filetab = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000126}
127
128
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000129/* Locking primitives to prevent parallel imports of the same module
130 in different threads to return with a partially loaded module.
131 These calls are serialized by the global interpreter lock. */
132
133#ifdef WITH_THREAD
134
Guido van Rossum49b56061998-10-01 20:42:43 +0000135#include "pythread.h"
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000136
Guido van Rossum65d5b571998-12-21 19:32:43 +0000137static PyThread_type_lock import_lock = 0;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000138static long import_lock_thread = -1;
139static int import_lock_level = 0;
140
141static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000142lock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000143{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000144 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000145 if (me == -1)
146 return; /* Too bad */
147 if (import_lock == NULL)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000148 import_lock = PyThread_allocate_lock();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000149 if (import_lock_thread == me) {
150 import_lock_level++;
151 return;
152 }
Guido van Rossum65d5b571998-12-21 19:32:43 +0000153 if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0)) {
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000154 PyThreadState *tstate = PyEval_SaveThread();
Guido van Rossum65d5b571998-12-21 19:32:43 +0000155 PyThread_acquire_lock(import_lock, 1);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000156 PyEval_RestoreThread(tstate);
157 }
158 import_lock_thread = me;
159 import_lock_level = 1;
160}
161
162static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000163unlock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000164{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000165 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000166 if (me == -1)
167 return; /* Too bad */
168 if (import_lock_thread != me)
169 Py_FatalError("unlock_import: not holding the import lock");
170 import_lock_level--;
171 if (import_lock_level == 0) {
172 import_lock_thread = -1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000173 PyThread_release_lock(import_lock);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000174 }
175}
176
177#else
178
179#define lock_import()
180#define unlock_import()
181
182#endif
183
Tim Peters69232342001-08-30 05:16:13 +0000184static PyObject *
185imp_lock_held(PyObject *self, PyObject *args)
186{
187 if (!PyArg_ParseTuple(args, ":lock_held"))
188 return NULL;
189#ifdef WITH_THREAD
190 return PyInt_FromLong(import_lock_thread != -1);
191#else
192 return PyInt_FromLong(0);
193#endif
194}
195
Guido van Rossum25ce5661997-08-02 03:10:38 +0000196/* Helper for sys */
197
198PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000199PyImport_GetModuleDict(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000200{
201 PyInterpreterState *interp = PyThreadState_Get()->interp;
202 if (interp->modules == NULL)
203 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
204 return interp->modules;
205}
206
Guido van Rossum3f5da241990-12-20 15:06:42 +0000207
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000208/* List of names to clear in sys */
209static char* sys_deletes[] = {
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000210 "path", "argv", "ps1", "ps2", "exitfunc",
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000211 "exc_type", "exc_value", "exc_traceback",
212 "last_type", "last_value", "last_traceback",
213 NULL
214};
215
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000216static char* sys_files[] = {
217 "stdin", "__stdin__",
218 "stdout", "__stdout__",
219 "stderr", "__stderr__",
220 NULL
221};
222
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000223
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000224/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000225
Guido van Rossum3f5da241990-12-20 15:06:42 +0000226void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000227PyImport_Cleanup(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000228{
Guido van Rossum758eec01998-01-19 21:58:26 +0000229 int pos, ndone;
230 char *name;
231 PyObject *key, *value, *dict;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000232 PyInterpreterState *interp = PyThreadState_Get()->interp;
Guido van Rossum758eec01998-01-19 21:58:26 +0000233 PyObject *modules = interp->modules;
234
235 if (modules == NULL)
236 return; /* Already done */
237
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000238 /* Delete some special variables first. These are common
239 places where user values hide and people complain when their
240 destructors fail. Since the modules containing them are
241 deleted *last* of all, they would come too late in the normal
242 destruction order. Sigh. */
243
244 value = PyDict_GetItemString(modules, "__builtin__");
245 if (value != NULL && PyModule_Check(value)) {
246 dict = PyModule_GetDict(value);
247 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000248 PySys_WriteStderr("# clear __builtin__._\n");
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000249 PyDict_SetItemString(dict, "_", Py_None);
250 }
251 value = PyDict_GetItemString(modules, "sys");
252 if (value != NULL && PyModule_Check(value)) {
253 char **p;
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000254 PyObject *v;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000255 dict = PyModule_GetDict(value);
256 for (p = sys_deletes; *p != NULL; p++) {
257 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000258 PySys_WriteStderr("# clear sys.%s\n", *p);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000259 PyDict_SetItemString(dict, *p, Py_None);
260 }
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000261 for (p = sys_files; *p != NULL; p+=2) {
262 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000263 PySys_WriteStderr("# restore sys.%s\n", *p);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000264 v = PyDict_GetItemString(dict, *(p+1));
265 if (v == NULL)
266 v = Py_None;
267 PyDict_SetItemString(dict, *p, v);
268 }
269 }
270
271 /* First, delete __main__ */
272 value = PyDict_GetItemString(modules, "__main__");
273 if (value != NULL && PyModule_Check(value)) {
274 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000275 PySys_WriteStderr("# cleanup __main__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000276 _PyModule_Clear(value);
277 PyDict_SetItemString(modules, "__main__", Py_None);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000278 }
279
Guido van Rossum758eec01998-01-19 21:58:26 +0000280 /* The special treatment of __builtin__ here is because even
281 when it's not referenced as a module, its dictionary is
282 referenced by almost every module's __builtins__. Since
283 deleting a module clears its dictionary (even if there are
284 references left to it), we need to delete the __builtin__
285 module last. Likewise, we don't delete sys until the very
286 end because it is implicitly referenced (e.g. by print).
287
288 Also note that we 'delete' modules by replacing their entry
289 in the modules dict with None, rather than really deleting
290 them; this avoids a rehash of the modules dictionary and
291 also marks them as "non existent" so they won't be
292 re-imported. */
293
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000294 /* Next, repeatedly delete modules with a reference count of
Guido van Rossum758eec01998-01-19 21:58:26 +0000295 one (skipping __builtin__ and sys) and delete them */
296 do {
297 ndone = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000298 pos = 0;
Guido van Rossum758eec01998-01-19 21:58:26 +0000299 while (PyDict_Next(modules, &pos, &key, &value)) {
300 if (value->ob_refcnt != 1)
301 continue;
Guido van Rossum566373e1998-10-01 15:24:50 +0000302 if (PyString_Check(key) && PyModule_Check(value)) {
303 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000304 if (strcmp(name, "__builtin__") == 0)
305 continue;
306 if (strcmp(name, "sys") == 0)
307 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000308 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000309 PySys_WriteStderr(
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000310 "# cleanup[1] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000311 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000312 PyDict_SetItem(modules, key, Py_None);
313 ndone++;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000314 }
315 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000316 } while (ndone > 0);
317
Guido van Rossum758eec01998-01-19 21:58:26 +0000318 /* Next, delete all modules (still skipping __builtin__ and sys) */
319 pos = 0;
320 while (PyDict_Next(modules, &pos, &key, &value)) {
Guido van Rossum566373e1998-10-01 15:24:50 +0000321 if (PyString_Check(key) && PyModule_Check(value)) {
322 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000323 if (strcmp(name, "__builtin__") == 0)
324 continue;
325 if (strcmp(name, "sys") == 0)
326 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000327 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000328 PySys_WriteStderr("# cleanup[2] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000329 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000330 PyDict_SetItem(modules, key, Py_None);
331 }
332 }
333
334 /* Next, delete sys and __builtin__ (in that order) */
335 value = PyDict_GetItemString(modules, "sys");
336 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000337 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000338 PySys_WriteStderr("# cleanup sys\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000339 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000340 PyDict_SetItemString(modules, "sys", Py_None);
341 }
342 value = PyDict_GetItemString(modules, "__builtin__");
343 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000344 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000345 PySys_WriteStderr("# cleanup __builtin__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000346 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000347 PyDict_SetItemString(modules, "__builtin__", Py_None);
348 }
349
350 /* Finally, clear and delete the modules directory */
351 PyDict_Clear(modules);
352 interp->modules = NULL;
353 Py_DECREF(modules);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000354}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000355
356
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000357/* Helper for pythonrun.c -- return magic number */
358
359long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000360PyImport_GetMagicNumber(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000361{
Guido van Rossum96774c12000-05-01 20:19:08 +0000362 return pyc_magic;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000363}
364
365
Guido van Rossum25ce5661997-08-02 03:10:38 +0000366/* Magic for extension modules (built-in as well as dynamically
367 loaded). To prevent initializing an extension module more than
368 once, we keep a static dictionary 'extensions' keyed by module name
369 (for built-in modules) or by filename (for dynamically loaded
Barry Warsaw92883382001-08-13 23:05:44 +0000370 modules), containing these modules. A copy of the module's
Guido van Rossum25ce5661997-08-02 03:10:38 +0000371 dictionary is stored by calling _PyImport_FixupExtension()
372 immediately after the module initialization function succeeds. A
373 copy can be retrieved from there by calling
374 _PyImport_FindExtension(). */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000375
Guido van Rossum79f25d91997-04-29 20:08:16 +0000376PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000377_PyImport_FixupExtension(char *name, char *filename)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000378{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000379 PyObject *modules, *mod, *dict, *copy;
380 if (extensions == NULL) {
381 extensions = PyDict_New();
382 if (extensions == NULL)
383 return NULL;
384 }
385 modules = PyImport_GetModuleDict();
386 mod = PyDict_GetItemString(modules, name);
387 if (mod == NULL || !PyModule_Check(mod)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000388 PyErr_Format(PyExc_SystemError,
389 "_PyImport_FixupExtension: module %.200s not loaded", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000390 return NULL;
391 }
392 dict = PyModule_GetDict(mod);
393 if (dict == NULL)
394 return NULL;
395 copy = PyObject_CallMethod(dict, "copy", "");
396 if (copy == NULL)
397 return NULL;
398 PyDict_SetItemString(extensions, filename, copy);
399 Py_DECREF(copy);
400 return copy;
401}
402
403PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000404_PyImport_FindExtension(char *name, char *filename)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000405{
406 PyObject *dict, *mod, *mdict, *result;
407 if (extensions == NULL)
408 return NULL;
409 dict = PyDict_GetItemString(extensions, filename);
410 if (dict == NULL)
411 return NULL;
412 mod = PyImport_AddModule(name);
413 if (mod == NULL)
414 return NULL;
415 mdict = PyModule_GetDict(mod);
416 if (mdict == NULL)
417 return NULL;
418 result = PyObject_CallMethod(mdict, "update", "O", dict);
419 if (result == NULL)
420 return NULL;
421 Py_DECREF(result);
422 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000423 PySys_WriteStderr("import %s # previously loaded (%s)\n",
Guido van Rossum25ce5661997-08-02 03:10:38 +0000424 name, filename);
425 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000426}
427
428
429/* Get the module object corresponding to a module name.
430 First check the modules dictionary if there's one there,
431 if not, create a new one and insert in in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000432 Because the former action is most common, THIS DOES NOT RETURN A
433 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000434
Guido van Rossum79f25d91997-04-29 20:08:16 +0000435PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000436PyImport_AddModule(char *name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000437{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000438 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000439 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000440
Guido van Rossum25ce5661997-08-02 03:10:38 +0000441 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
Guido van Rossum79f25d91997-04-29 20:08:16 +0000442 PyModule_Check(m))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000443 return m;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000444 m = PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000445 if (m == NULL)
446 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000447 if (PyDict_SetItemString(modules, name, m) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000448 Py_DECREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000449 return NULL;
450 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000451 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000452
453 return m;
454}
455
456
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000457/* Execute a code object in a module and return the module object
458 WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000459
Guido van Rossum79f25d91997-04-29 20:08:16 +0000460PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000461PyImport_ExecCodeModule(char *name, PyObject *co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000462{
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000463 return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
464}
465
466PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000467PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname)
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000468{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000469 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000470 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000471
Guido van Rossum79f25d91997-04-29 20:08:16 +0000472 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000473 if (m == NULL)
474 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000475 d = PyModule_GetDict(m);
476 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
477 if (PyDict_SetItemString(d, "__builtins__",
478 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000479 return NULL;
480 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000481 /* Remember the filename as the __file__ attribute */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000482 v = NULL;
483 if (pathname != NULL) {
484 v = PyString_FromString(pathname);
485 if (v == NULL)
486 PyErr_Clear();
487 }
488 if (v == NULL) {
489 v = ((PyCodeObject *)co)->co_filename;
490 Py_INCREF(v);
491 }
492 if (PyDict_SetItemString(d, "__file__", v) != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000493 PyErr_Clear(); /* Not important enough to report */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000494 Py_DECREF(v);
495
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000496 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000497 if (v == NULL)
498 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000499 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000500
Guido van Rossum25ce5661997-08-02 03:10:38 +0000501 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000502 PyErr_Format(PyExc_ImportError,
503 "Loaded module %.200s not found in sys.modules",
504 name);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000505 return NULL;
506 }
507
Guido van Rossum79f25d91997-04-29 20:08:16 +0000508 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000509
510 return m;
511}
512
513
514/* Given a pathname for a Python source file, fill a buffer with the
515 pathname for the corresponding compiled file. Return the pathname
516 for the compiled file, or NULL if there's no space in the buffer.
517 Doesn't set an exception. */
518
519static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000520make_compiled_pathname(char *pathname, char *buf, size_t buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000521{
Tim Petersc1731372001-08-04 08:12:36 +0000522 size_t len = strlen(pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000523 if (len+2 > buflen)
524 return NULL;
Tim Petersc1731372001-08-04 08:12:36 +0000525
526#ifdef MS_WIN32
527 /* Treat .pyw as if it were .py. The case of ".pyw" must match
528 that used in _PyImport_StandardFiletab. */
529 if (len >= 4 && strcmp(&pathname[len-4], ".pyw") == 0)
530 --len; /* pretend 'w' isn't there */
531#endif
532 memcpy(buf, pathname, len);
533 buf[len] = Py_OptimizeFlag ? 'o' : 'c';
534 buf[len+1] = '\0';
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000535
536 return buf;
537}
538
539
540/* Given a pathname for a Python source file, its time of last
541 modification, and a pathname for a compiled file, check whether the
542 compiled file represents the same version of the source. If so,
543 return a FILE pointer for the compiled file, positioned just after
544 the header; if not, return NULL.
545 Doesn't set an exception. */
546
547static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000548check_compiled_module(char *pathname, long mtime, char *cpathname)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000549{
550 FILE *fp;
551 long magic;
552 long pyc_mtime;
553
554 fp = fopen(cpathname, "rb");
555 if (fp == NULL)
556 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000557 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000558 if (magic != pyc_magic) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000559 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000560 PySys_WriteStderr("# %s has bad magic\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000561 fclose(fp);
562 return NULL;
563 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000564 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000565 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000566 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000567 PySys_WriteStderr("# %s has bad mtime\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000568 fclose(fp);
569 return NULL;
570 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000571 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000572 PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000573 return fp;
574}
575
576
577/* Read a code object from a file and check it for validity */
578
Guido van Rossum79f25d91997-04-29 20:08:16 +0000579static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000580read_compiled_module(char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000581{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000582 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000583
Tim Petersd9b9ac82001-01-28 00:27:39 +0000584 co = PyMarshal_ReadLastObjectFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000585 /* Ugly: rd_object() may return NULL with or without error */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000586 if (co == NULL || !PyCode_Check(co)) {
587 if (!PyErr_Occurred())
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000588 PyErr_Format(PyExc_ImportError,
589 "Non-code object in %.200s", cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000590 Py_XDECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000591 return NULL;
592 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000593 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000594}
595
596
597/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000598 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000599
Guido van Rossum79f25d91997-04-29 20:08:16 +0000600static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000601load_compiled_module(char *name, char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000602{
603 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000604 PyCodeObject *co;
605 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000606
Guido van Rossum79f25d91997-04-29 20:08:16 +0000607 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000608 if (magic != pyc_magic) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000609 PyErr_Format(PyExc_ImportError,
610 "Bad magic number in %.200s", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000611 return NULL;
612 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000613 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000614 co = read_compiled_module(cpathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000615 if (co == NULL)
616 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000617 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000618 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000619 name, cpathname);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000620 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000621 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000622
623 return m;
624}
625
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000626/* Parse a source file and return the corresponding code object */
627
Guido van Rossum79f25d91997-04-29 20:08:16 +0000628static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000629parse_source_module(char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000630{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000631 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000632 node *n;
633
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000634 n = PyParser_SimpleParseFile(fp, pathname, Py_file_input);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000635 if (n == NULL)
636 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000637 co = PyNode_Compile(n, pathname);
638 PyNode_Free(n);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000639
640 return co;
641}
642
643
Guido van Rossum55a83382000-09-20 20:31:38 +0000644/* Helper to open a bytecode file for writing in exclusive mode */
645
646static FILE *
647open_exclusive(char *filename)
648{
649#if defined(O_EXCL)&&defined(O_CREAT)&&defined(O_WRONLY)&&defined(O_TRUNC)
650 /* Use O_EXCL to avoid a race condition when another process tries to
651 write the same file. When that happens, our open() call fails,
652 which is just fine (since it's only a cache).
653 XXX If the file exists and is writable but the directory is not
654 writable, the file will never be written. Oh well.
655 */
656 int fd;
657 (void) unlink(filename);
Tim Peters42c83af2000-09-29 04:03:10 +0000658 fd = open(filename, O_EXCL|O_CREAT|O_WRONLY|O_TRUNC
659#ifdef O_BINARY
660 |O_BINARY /* necessary for Windows */
661#endif
Tim Peters50d8d372001-02-28 05:34:27 +0000662
Tim Peters42c83af2000-09-29 04:03:10 +0000663 , 0666);
Guido van Rossum55a83382000-09-20 20:31:38 +0000664 if (fd < 0)
665 return NULL;
666 return fdopen(fd, "wb");
667#else
668 /* Best we can do -- on Windows this can't happen anyway */
669 return fopen(filename, "wb");
670#endif
671}
672
673
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000674/* Write a compiled module to a file, placing the time of last
675 modification of its source into the header.
676 Errors are ignored, if a write error occurs an attempt is made to
677 remove the file. */
678
679static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000680write_compiled_module(PyCodeObject *co, char *cpathname, long mtime)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000681{
682 FILE *fp;
683
Guido van Rossum55a83382000-09-20 20:31:38 +0000684 fp = open_exclusive(cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000685 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000686 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000687 PySys_WriteStderr(
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000688 "# can't create %s\n", cpathname);
689 return;
690 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000691 PyMarshal_WriteLongToFile(pyc_magic, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000692 /* First write a 0 for mtime */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000693 PyMarshal_WriteLongToFile(0L, fp);
694 PyMarshal_WriteObjectToFile((PyObject *)co, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000695 if (ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000696 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000697 PySys_WriteStderr("# can't write %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000698 /* Don't keep partial file */
699 fclose(fp);
700 (void) unlink(cpathname);
701 return;
702 }
703 /* Now write the true mtime */
704 fseek(fp, 4L, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000705 PyMarshal_WriteLongToFile(mtime, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000706 fflush(fp);
707 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000708 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000709 PySys_WriteStderr("# wrote %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000710#ifdef macintosh
Jack Jansencbf630f2000-07-11 21:59:16 +0000711 PyMac_setfiletype(cpathname, 'Pyth', 'PYC ');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000712#endif
713}
714
715
716/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000717 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
718 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000719
Guido van Rossum79f25d91997-04-29 20:08:16 +0000720static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000721load_source_module(char *name, char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000722{
Fred Drake4c82b232000-06-30 16:18:57 +0000723 time_t mtime;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000724 FILE *fpc;
725 char buf[MAXPATHLEN+1];
726 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000727 PyCodeObject *co;
728 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000729
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000730 mtime = PyOS_GetLastModificationTime(pathname, fp);
Fred Drakec63d3e92001-03-01 06:33:32 +0000731 if (mtime == (time_t)(-1))
Fred Drake4c82b232000-06-30 16:18:57 +0000732 return NULL;
733#if SIZEOF_TIME_T > 4
734 /* Python's .pyc timestamp handling presumes that the timestamp fits
735 in 4 bytes. This will be fine until sometime in the year 2038,
736 when a 4-byte signed time_t will overflow.
737 */
738 if (mtime >> 32) {
739 PyErr_SetString(PyExc_OverflowError,
Fred Drakec63d3e92001-03-01 06:33:32 +0000740 "modification time overflows a 4 byte field");
Fred Drake4c82b232000-06-30 16:18:57 +0000741 return NULL;
742 }
743#endif
Jeremy Hylton37832f02001-04-13 17:50:20 +0000744 cpathname = make_compiled_pathname(pathname, buf,
745 (size_t)MAXPATHLEN + 1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000746 if (cpathname != NULL &&
747 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000748 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000749 fclose(fpc);
750 if (co == NULL)
751 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000752 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000753 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000754 name, cpathname);
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000755 pathname = cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000756 }
757 else {
758 co = parse_source_module(pathname, fp);
759 if (co == NULL)
760 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000761 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000762 PySys_WriteStderr("import %s # from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000763 name, pathname);
764 write_compiled_module(co, cpathname, mtime);
765 }
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000766 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000767 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000768
769 return m;
770}
771
772
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000773/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +0000774static PyObject *load_module(char *, FILE *, char *, int);
775static struct filedescr *find_module(char *, PyObject *,
776 char *, size_t, FILE **);
777static struct _frozen *find_frozen(char *name);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000778
779/* Load a package and return its module object WITH INCREMENTED
780 REFERENCE COUNT */
781
782static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000783load_package(char *name, char *pathname)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000784{
785 PyObject *m, *d, *file, *path;
786 int err;
787 char buf[MAXPATHLEN+1];
788 FILE *fp = NULL;
789 struct filedescr *fdp;
790
791 m = PyImport_AddModule(name);
792 if (m == NULL)
793 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000794 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000795 PySys_WriteStderr("import %s # directory %s\n",
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000796 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000797 d = PyModule_GetDict(m);
798 file = PyString_FromString(pathname);
799 if (file == NULL)
800 return NULL;
801 path = Py_BuildValue("[O]", file);
802 if (path == NULL) {
803 Py_DECREF(file);
804 return NULL;
805 }
806 err = PyDict_SetItemString(d, "__file__", file);
807 if (err == 0)
808 err = PyDict_SetItemString(d, "__path__", path);
809 if (err != 0) {
810 m = NULL;
811 goto cleanup;
812 }
813 buf[0] = '\0';
814 fdp = find_module("__init__", path, buf, sizeof(buf), &fp);
815 if (fdp == NULL) {
816 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
817 PyErr_Clear();
818 }
819 else
820 m = NULL;
821 goto cleanup;
822 }
823 m = load_module(name, fp, buf, fdp->type);
824 if (fp != NULL)
825 fclose(fp);
826 cleanup:
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000827 Py_XDECREF(path);
828 Py_XDECREF(file);
829 return m;
830}
831
832
833/* Helper to test for built-in module */
834
835static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000836is_builtin(char *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000837{
838 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +0000839 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
840 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
841 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000842 return -1;
843 else
844 return 1;
845 }
846 }
847 return 0;
848}
849
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000850
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000851/* Search the path (default sys.path) for a module. Return the
852 corresponding filedescr struct, and (via return arguments) the
853 pathname and an open file. Return NULL if the module is not found. */
854
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000855#ifdef MS_COREDLL
Thomas Woutersb4bd21c2000-07-22 23:38:01 +0000856extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **,
857 char *, int);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000858#endif
859
Tim Peters50d8d372001-02-28 05:34:27 +0000860static int case_ok(char *, int, int, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000861static int find_init_module(char *); /* Forward */
Guido van Rossum197346f1997-10-31 18:38:52 +0000862
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000863static struct filedescr *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000864find_module(char *realname, PyObject *path, char *buf, size_t buflen,
865 FILE **p_fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000866{
Fred Drake4c82b232000-06-30 16:18:57 +0000867 int i, npath;
868 size_t len, namelen;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000869 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000870 FILE *fp = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000871#ifndef RISCOS
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000872 struct stat statbuf;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000873#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000874 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
875 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
876 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossum0506a431998-08-11 15:07:39 +0000877 char name[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000878
Fred Drake4c82b232000-06-30 16:18:57 +0000879 if (strlen(realname) > MAXPATHLEN) {
Guido van Rossum8f4d3312001-10-18 18:54:11 +0000880 PyErr_SetString(PyExc_OverflowError,
881 "module name is too long");
Fred Drake4c82b232000-06-30 16:18:57 +0000882 return NULL;
883 }
Guido van Rossum0506a431998-08-11 15:07:39 +0000884 strcpy(name, realname);
885
886 if (path != NULL && PyString_Check(path)) {
Guido van Rossum8f4d3312001-10-18 18:54:11 +0000887 /* The only type of submodule allowed inside a "frozen"
888 package are other frozen modules or packages. */
Guido van Rossum0506a431998-08-11 15:07:39 +0000889 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
890 PyErr_SetString(PyExc_ImportError,
891 "full frozen module name too long");
892 return NULL;
893 }
894 strcpy(buf, PyString_AsString(path));
895 strcat(buf, ".");
896 strcat(buf, name);
897 strcpy(name, buf);
Guido van Rossum8f4d3312001-10-18 18:54:11 +0000898 if (find_frozen(name) != NULL) {
899 strcpy(buf, name);
900 return &fd_frozen;
901 }
902 PyErr_Format(PyExc_ImportError,
903 "No frozen submodule named %.200s", name);
904 return NULL;
Guido van Rossum0506a431998-08-11 15:07:39 +0000905 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000906 if (path == NULL) {
907 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000908 strcpy(buf, name);
909 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000910 }
Greg Ward201baee2001-10-04 14:52:06 +0000911 if ((find_frozen(name)) != NULL) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000912 strcpy(buf, name);
913 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000914 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000915
Guido van Rossumac279101996-08-22 23:10:58 +0000916#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000917 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
918 if (fp != NULL) {
919 *p_fp = fp;
920 return fdp;
921 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000922#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000923 path = PySys_GetObject("path");
924 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000925 if (path == NULL || !PyList_Check(path)) {
926 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +0000927 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000928 return NULL;
929 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000930 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000931 namelen = strlen(name);
932 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000933 PyObject *v = PyList_GetItem(path, i);
934 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000935 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000936 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000937 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000938 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000939 strcpy(buf, PyString_AsString(v));
Fred Drake4c82b232000-06-30 16:18:57 +0000940 if (strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000941 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000942#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000943#ifdef INTERN_STRINGS
Tim Peters50d8d372001-02-28 05:34:27 +0000944 /*
Guido van Rossum741689d1997-08-12 14:53:39 +0000945 ** Speedup: each sys.path item is interned, and
946 ** FindResourceModule remembers which items refer to
947 ** folders (so we don't have to bother trying to look
Tim Peters50d8d372001-02-28 05:34:27 +0000948 ** into them for resources).
Guido van Rossum741689d1997-08-12 14:53:39 +0000949 */
950 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
951 v = PyList_GET_ITEM(path, i);
952#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000953 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000954 static struct filedescr resfiledescr =
955 {"", "", PY_RESOURCE};
Tim Peters50d8d372001-02-28 05:34:27 +0000956
Jack Jansen9c96a921995-02-15 22:57:06 +0000957 return &resfiledescr;
958 }
Guido van Rossum0f84a341998-08-06 13:36:01 +0000959 if (PyMac_FindCodeResourceModule((PyStringObject *)v, name, buf)) {
960 static struct filedescr resfiledescr =
961 {"", "", PY_CODERESOURCE};
Tim Peters50d8d372001-02-28 05:34:27 +0000962
Guido van Rossum0f84a341998-08-06 13:36:01 +0000963 return &resfiledescr;
964 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000965#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000966 if (len > 0 && buf[len-1] != SEP
967#ifdef ALTSEP
968 && buf[len-1] != ALTSEP
969#endif
970 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000971 buf[len++] = SEP;
Guido van Rossum215c3402000-11-13 17:26:32 +0000972 strcpy(buf+len, name);
973 len += namelen;
Tim Peters50d8d372001-02-28 05:34:27 +0000974
975 /* Check for package import (buf holds a directory name,
976 and there's an __init__ module in that directory */
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000977#ifdef HAVE_STAT
Tim Peterscab3f682001-04-29 22:21:25 +0000978 if (stat(buf, &statbuf) == 0 && /* it exists */
979 S_ISDIR(statbuf.st_mode) && /* it's a directory */
980 find_init_module(buf) && /* it has __init__.py */
981 case_ok(buf, len, namelen, name)) /* and case matches */
982 return &fd_package;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000983#else
984 /* XXX How are you going to test for directories? */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000985#ifdef RISCOS
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000986 if (isdir(buf) &&
987 find_init_module(buf) &&
988 case_ok(buf, len, namelen, name))
989 return &fd_package;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000990#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000991#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000992#ifdef macintosh
993 fdp = PyMac_FindModuleExtension(buf, &len, name);
Jack Jansen4df3c522001-03-20 23:09:54 +0000994 if (fdp) {
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000995#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000996 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000997 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000998 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000999 PySys_WriteStderr("# trying %s\n", buf);
Jack Jansen4df3c522001-03-20 23:09:54 +00001000#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001001 fp = fopen(buf, fdp->mode);
Tim Peters50d8d372001-02-28 05:34:27 +00001002 if (fp != NULL) {
1003 if (case_ok(buf, len, namelen, name))
1004 break;
1005 else { /* continue search */
1006 fclose(fp);
1007 fp = NULL;
Barry Warsaw914a0b12001-02-02 19:12:16 +00001008 }
Barry Warsaw914a0b12001-02-02 19:12:16 +00001009 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001010 }
1011 if (fp != NULL)
1012 break;
1013 }
1014 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001015 PyErr_Format(PyExc_ImportError,
1016 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001017 return NULL;
1018 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001019 *p_fp = fp;
1020 return fdp;
1021}
1022
Tim Petersd1e87a82001-03-01 18:12:00 +00001023/* case_ok(char* buf, int len, int namelen, char* name)
1024 * The arguments here are tricky, best shown by example:
1025 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1026 * ^ ^ ^ ^
1027 * |--------------------- buf ---------------------|
1028 * |------------------- len ------------------|
1029 * |------ name -------|
1030 * |----- namelen -----|
1031 * buf is the full path, but len only counts up to (& exclusive of) the
1032 * extension. name is the module name, also exclusive of extension.
1033 *
1034 * We've already done a successful stat() or fopen() on buf, so know that
1035 * there's some match, possibly case-insensitive.
1036 *
Tim Peters50d8d372001-02-28 05:34:27 +00001037 * case_ok() is to return 1 if there's a case-sensitive match for
1038 * name, else 0. case_ok() is also to return 1 if envar PYTHONCASEOK
1039 * exists.
Tim Petersd1e87a82001-03-01 18:12:00 +00001040 *
Tim Peters50d8d372001-02-28 05:34:27 +00001041 * case_ok() is used to implement case-sensitive import semantics even
1042 * on platforms with case-insensitive filesystems. It's trivial to implement
1043 * for case-sensitive filesystems. It's pretty much a cross-platform
1044 * nightmare for systems with case-insensitive filesystems.
1045 */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001046
Tim Peters50d8d372001-02-28 05:34:27 +00001047/* First we may need a pile of platform-specific header files; the sequence
1048 * of #if's here should match the sequence in the body of case_ok().
1049 */
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001050#if defined(MS_WIN32) || defined(__CYGWIN__)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001051#include <windows.h>
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001052#ifdef __CYGWIN__
1053#include <sys/cygwin.h>
1054#endif
1055
Tim Peters50d8d372001-02-28 05:34:27 +00001056#elif defined(DJGPP)
1057#include <dir.h>
1058
1059#elif defined(macintosh)
1060#include <TextUtils.h>
1061#ifdef USE_GUSI1
1062#include "TFileSpec.h" /* for Path2FSSpec() */
1063#endif
1064
Tim Petersd1e87a82001-03-01 18:12:00 +00001065#elif defined(__MACH__) && defined(__APPLE__) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001066#include <sys/types.h>
1067#include <dirent.h>
1068
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001069#elif defined(RISCOS)
1070#include "oslib/osfscontrol.h"
Tim Peters50d8d372001-02-28 05:34:27 +00001071#endif
1072
Guido van Rossum0980bd91998-02-13 17:18:36 +00001073static int
Tim Peters50d8d372001-02-28 05:34:27 +00001074case_ok(char *buf, int len, int namelen, char *name)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001075{
Tim Peters50d8d372001-02-28 05:34:27 +00001076/* Pick a platform-specific implementation; the sequence of #if's here should
1077 * match the sequence just above.
1078 */
1079
1080/* MS_WIN32 || __CYGWIN__ */
1081#if defined(MS_WIN32) || defined(__CYGWIN__)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001082 WIN32_FIND_DATA data;
1083 HANDLE h;
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001084#ifdef __CYGWIN__
1085 char tempbuf[MAX_PATH];
1086#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001087
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001088 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001089 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001090
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001091#ifdef __CYGWIN__
1092 cygwin32_conv_to_win32_path(buf, tempbuf);
1093 h = FindFirstFile(tempbuf, &data);
1094#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001095 h = FindFirstFile(buf, &data);
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001096#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001097 if (h == INVALID_HANDLE_VALUE) {
1098 PyErr_Format(PyExc_NameError,
1099 "Can't find file for module %.100s\n(filename %.300s)",
1100 name, buf);
1101 return 0;
1102 }
1103 FindClose(h);
Tim Peters50d8d372001-02-28 05:34:27 +00001104 return strncmp(data.cFileName, name, namelen) == 0;
1105
1106/* DJGPP */
1107#elif defined(DJGPP)
1108 struct ffblk ffblk;
1109 int done;
1110
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001111 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001112 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001113
1114 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
1115 if (done) {
Guido van Rossum0980bd91998-02-13 17:18:36 +00001116 PyErr_Format(PyExc_NameError,
Tim Peters50d8d372001-02-28 05:34:27 +00001117 "Can't find file for module %.100s\n(filename %.300s)",
Guido van Rossum0980bd91998-02-13 17:18:36 +00001118 name, buf);
1119 return 0;
1120 }
Tim Peters50d8d372001-02-28 05:34:27 +00001121 return strncmp(ffblk.ff_name, name, namelen) == 0;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001122
Tim Peters50d8d372001-02-28 05:34:27 +00001123/* macintosh */
1124#elif defined(macintosh)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001125 FSSpec fss;
1126 OSErr err;
Tim Peters50d8d372001-02-28 05:34:27 +00001127
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001128 if (Py_GETENV("PYTHONCASEOK") != NULL)
Tim Peters50d8d372001-02-28 05:34:27 +00001129 return 1;
1130
Guido van Rossumb33aa1a2000-04-24 15:08:18 +00001131#ifndef USE_GUSI1
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001132 err = FSMakeFSSpec(0, 0, Pstring(buf), &fss);
1133#else
1134 /* GUSI's Path2FSSpec() resolves all possible aliases nicely on
1135 the way, which is fine for all directories, but here we need
1136 the original name of the alias file (say, Dlg.ppc.slb, not
1137 toolboxmodules.ppc.slb). */
1138 char *colon;
1139 err = Path2FSSpec(buf, &fss);
1140 if (err == noErr) {
1141 colon = strrchr(buf, ':'); /* find filename */
1142 if (colon != NULL)
1143 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1144 Pstring(colon+1), &fss);
1145 else
1146 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1147 fss.name, &fss);
1148 }
1149#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001150 if (err) {
1151 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001152 "Can't find file for module %.100s\n(filename %.300s)",
1153 name, buf);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001154 return 0;
1155 }
Tim Peters50d8d372001-02-28 05:34:27 +00001156 return fss.name[0] >= namelen &&
1157 strncmp(name, (char *)fss.name+1, namelen) == 0;
1158
Tim Peters677898a2001-03-02 03:28:03 +00001159/* new-fangled macintosh (macosx) */
Tim Petersd1e87a82001-03-01 18:12:00 +00001160#elif defined(__MACH__) && defined(__APPLE__) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001161 DIR *dirp;
1162 struct dirent *dp;
Tim Petersd1e87a82001-03-01 18:12:00 +00001163 char dirname[MAXPATHLEN + 1];
1164 const int dirlen = len - namelen - 1; /* don't want trailing SEP */
Tim Peters430f5d42001-03-01 01:30:56 +00001165
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001166 if (Py_GETENV("PYTHONCASEOK") != NULL)
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001167 return 1;
1168
Tim Petersd1e87a82001-03-01 18:12:00 +00001169 /* Copy the dir component into dirname; substitute "." if empty */
1170 if (dirlen <= 0) {
1171 dirname[0] = '.';
1172 dirname[1] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001173 }
1174 else {
Tim Petersd1e87a82001-03-01 18:12:00 +00001175 assert(dirlen <= MAXPATHLEN);
1176 memcpy(dirname, buf, dirlen);
1177 dirname[dirlen] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001178 }
1179 /* Open the directory and search the entries for an exact match. */
Tim Petersd1e87a82001-03-01 18:12:00 +00001180 dirp = opendir(dirname);
Tim Peters430f5d42001-03-01 01:30:56 +00001181 if (dirp) {
Tim Peters677898a2001-03-02 03:28:03 +00001182 char *nameWithExt = buf + len - namelen;
Tim Peters430f5d42001-03-01 01:30:56 +00001183 while ((dp = readdir(dirp)) != NULL) {
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001184 const int thislen =
Tim Peters430f5d42001-03-01 01:30:56 +00001185#ifdef _DIRENT_HAVE_D_NAMELEN
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001186 dp->d_namlen;
Tim Peters430f5d42001-03-01 01:30:56 +00001187#else
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001188 strlen(dp->d_name);
Tim Peters430f5d42001-03-01 01:30:56 +00001189#endif
Tim Petersd1e87a82001-03-01 18:12:00 +00001190 if (thislen >= namelen &&
Tim Peters677898a2001-03-02 03:28:03 +00001191 strcmp(dp->d_name, nameWithExt) == 0) {
Tim Peters430f5d42001-03-01 01:30:56 +00001192 (void)closedir(dirp);
1193 return 1; /* Found */
1194 }
1195 }
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001196 (void)closedir(dirp);
Tim Peters430f5d42001-03-01 01:30:56 +00001197 }
Tim Peters430f5d42001-03-01 01:30:56 +00001198 return 0 ; /* Not found */
Tim Peters430f5d42001-03-01 01:30:56 +00001199
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001200/* RISC OS */
1201#elif defined(RISCOS)
1202 char canon[MAXPATHLEN+1]; /* buffer for the canonical form of the path */
1203 char buf2[MAXPATHLEN+2];
1204 char *nameWithExt = buf+len-namelen;
1205 int canonlen;
1206 os_error *e;
1207
1208 if (Py_GETENV("PYTHONCASEOK") != NULL)
1209 return 1;
1210
1211 /* workaround:
1212 append wildcard, otherwise case of filename wouldn't be touched */
1213 strcpy(buf2, buf);
1214 strcat(buf2, "*");
1215
1216 e = xosfscontrol_canonicalise_path(buf2,canon,0,0,MAXPATHLEN+1,&canonlen);
1217 canonlen = MAXPATHLEN+1-canonlen;
1218 if (e || canonlen<=0 || canonlen>(MAXPATHLEN+1) )
1219 return 0;
1220 if (strcmp(nameWithExt, canon+canonlen-strlen(nameWithExt))==0)
1221 return 1; /* match */
1222
1223 return 0;
1224
Tim Peters50d8d372001-02-28 05:34:27 +00001225/* assuming it's a case-sensitive filesystem, so there's nothing to do! */
1226#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001227 return 1;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001228
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001229#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001230}
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001231
Guido van Rossum0980bd91998-02-13 17:18:36 +00001232
Guido van Rossum197346f1997-10-31 18:38:52 +00001233#ifdef HAVE_STAT
1234/* Helper to look for __init__.py or __init__.py[co] in potential package */
1235static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001236find_init_module(char *buf)
Guido van Rossum197346f1997-10-31 18:38:52 +00001237{
Tim Peters0f9431f2001-07-05 03:47:53 +00001238 const size_t save_len = strlen(buf);
Fred Drake4c82b232000-06-30 16:18:57 +00001239 size_t i = save_len;
Tim Peters0f9431f2001-07-05 03:47:53 +00001240 char *pname; /* pointer to start of __init__ */
Guido van Rossum197346f1997-10-31 18:38:52 +00001241 struct stat statbuf;
1242
Tim Peters0f9431f2001-07-05 03:47:53 +00001243/* For calling case_ok(buf, len, namelen, name):
1244 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1245 * ^ ^ ^ ^
1246 * |--------------------- buf ---------------------|
1247 * |------------------- len ------------------|
1248 * |------ name -------|
1249 * |----- namelen -----|
1250 */
Guido van Rossum197346f1997-10-31 18:38:52 +00001251 if (save_len + 13 >= MAXPATHLEN)
1252 return 0;
1253 buf[i++] = SEP;
Tim Peters0f9431f2001-07-05 03:47:53 +00001254 pname = buf + i;
1255 strcpy(pname, "__init__.py");
Guido van Rossum197346f1997-10-31 18:38:52 +00001256 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001257 if (case_ok(buf,
1258 save_len + 9, /* len("/__init__") */
1259 8, /* len("__init__") */
1260 pname)) {
1261 buf[save_len] = '\0';
1262 return 1;
1263 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001264 }
Tim Peters0f9431f2001-07-05 03:47:53 +00001265 i += strlen(pname);
1266 strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum197346f1997-10-31 18:38:52 +00001267 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001268 if (case_ok(buf,
1269 save_len + 9, /* len("/__init__") */
1270 8, /* len("__init__") */
1271 pname)) {
1272 buf[save_len] = '\0';
1273 return 1;
1274 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001275 }
1276 buf[save_len] = '\0';
1277 return 0;
1278}
Guido van Rossum48a680c2001-03-02 06:34:14 +00001279
1280#else
1281
1282#ifdef RISCOS
1283static int
1284find_init_module(buf)
1285 char *buf;
1286{
1287 int save_len = strlen(buf);
1288 int i = save_len;
1289
1290 if (save_len + 13 >= MAXPATHLEN)
1291 return 0;
1292 buf[i++] = SEP;
1293 strcpy(buf+i, "__init__/py");
1294 if (isfile(buf)) {
1295 buf[save_len] = '\0';
1296 return 1;
1297 }
1298
1299 if (Py_OptimizeFlag)
1300 strcpy(buf+i, "o");
1301 else
1302 strcpy(buf+i, "c");
1303 if (isfile(buf)) {
1304 buf[save_len] = '\0';
1305 return 1;
1306 }
1307 buf[save_len] = '\0';
1308 return 0;
1309}
1310#endif /*RISCOS*/
1311
Guido van Rossum197346f1997-10-31 18:38:52 +00001312#endif /* HAVE_STAT */
1313
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001314
Tim Petersdbd9ba62000-07-09 03:09:57 +00001315static int init_builtin(char *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001316
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001317/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001318 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001319
Guido van Rossum79f25d91997-04-29 20:08:16 +00001320static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001321load_module(char *name, FILE *fp, char *buf, int type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001322{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001323 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001324 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001325 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001326
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001327 /* First check that there's an open file (if we need one) */
1328 switch (type) {
1329 case PY_SOURCE:
1330 case PY_COMPILED:
1331 if (fp == NULL) {
1332 PyErr_Format(PyExc_ValueError,
1333 "file object required for import (type code %d)",
1334 type);
1335 return NULL;
1336 }
1337 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001338
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001339 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001340
1341 case PY_SOURCE:
1342 m = load_source_module(name, buf, fp);
1343 break;
1344
1345 case PY_COMPILED:
1346 m = load_compiled_module(name, buf, fp);
1347 break;
1348
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001349#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001350 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001351 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001352 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001353#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001354
Jack Jansen9c96a921995-02-15 22:57:06 +00001355#ifdef macintosh
1356 case PY_RESOURCE:
1357 m = PyMac_LoadResourceModule(name, buf);
1358 break;
Guido van Rossum0f84a341998-08-06 13:36:01 +00001359 case PY_CODERESOURCE:
1360 m = PyMac_LoadCodeResourceModule(name, buf);
1361 break;
Jack Jansen9c96a921995-02-15 22:57:06 +00001362#endif
1363
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001364 case PKG_DIRECTORY:
1365 m = load_package(name, buf);
1366 break;
1367
1368 case C_BUILTIN:
1369 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001370 if (buf != NULL && buf[0] != '\0')
1371 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001372 if (type == C_BUILTIN)
1373 err = init_builtin(name);
1374 else
1375 err = PyImport_ImportFrozenModule(name);
1376 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001377 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001378 if (err == 0) {
1379 PyErr_Format(PyExc_ImportError,
1380 "Purported %s module %.200s not found",
1381 type == C_BUILTIN ?
1382 "builtin" : "frozen",
1383 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001384 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001385 }
1386 modules = PyImport_GetModuleDict();
1387 m = PyDict_GetItemString(modules, name);
1388 if (m == NULL) {
1389 PyErr_Format(
1390 PyExc_ImportError,
1391 "%s module %.200s not properly initialized",
1392 type == C_BUILTIN ?
1393 "builtin" : "frozen",
1394 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001395 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001396 }
1397 Py_INCREF(m);
1398 break;
1399
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001400 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001401 PyErr_Format(PyExc_ImportError,
1402 "Don't know how to import %.200s (type code %d)",
1403 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001404 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001405
1406 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001407
1408 return m;
1409}
1410
1411
1412/* Initialize a built-in module.
1413 Return 1 for succes, 0 if the module is not found, and -1 with
1414 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001415
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001416static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001417init_builtin(char *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001418{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001419 struct _inittab *p;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001420
Greg Ward201baee2001-10-04 14:52:06 +00001421 if (_PyImport_FindExtension(name, name) != NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00001422 return 1;
1423
Guido van Rossum771c6c81997-10-31 18:37:24 +00001424 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001425 if (strcmp(name, p->name) == 0) {
1426 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001427 PyErr_Format(PyExc_ImportError,
1428 "Cannot re-init internal module %.200s",
1429 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001430 return -1;
1431 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001432 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001433 PySys_WriteStderr("import %s # builtin\n", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001434 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001435 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001436 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001437 if (_PyImport_FixupExtension(name, name) == NULL)
1438 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001439 return 1;
1440 }
1441 }
1442 return 0;
1443}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001444
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001445
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001446/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001447
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001448static struct _frozen *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001449find_frozen(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001450{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001451 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001452
Guido van Rossum79f25d91997-04-29 20:08:16 +00001453 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001454 if (p->name == NULL)
1455 return NULL;
1456 if (strcmp(p->name, name) == 0)
1457 break;
1458 }
1459 return p;
1460}
1461
Guido van Rossum79f25d91997-04-29 20:08:16 +00001462static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001463get_frozen_object(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001464{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001465 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001466 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001467
1468 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001469 PyErr_Format(PyExc_ImportError,
1470 "No such frozen object named %.200s",
1471 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001472 return NULL;
1473 }
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001474 if (p->code == NULL) {
1475 PyErr_Format(PyExc_ImportError,
1476 "Excluded frozen object named %.200s",
1477 name);
1478 return NULL;
1479 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001480 size = p->size;
1481 if (size < 0)
1482 size = -size;
1483 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001484}
1485
1486/* Initialize a frozen module.
1487 Return 1 for succes, 0 if the module is not found, and -1 with
1488 an exception set if the initialization failed.
1489 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001490
1491int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001492PyImport_ImportFrozenModule(char *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001493{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001494 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001495 PyObject *co;
1496 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001497 int ispackage;
1498 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001499
1500 if (p == NULL)
1501 return 0;
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001502 if (p->code == NULL) {
1503 PyErr_Format(PyExc_ImportError,
1504 "Excluded frozen object named %.200s",
1505 name);
1506 return -1;
1507 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001508 size = p->size;
1509 ispackage = (size < 0);
1510 if (ispackage)
1511 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001512 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001513 PySys_WriteStderr("import %s # frozen%s\n",
Guido van Rossuma5568d31998-03-05 03:45:08 +00001514 name, ispackage ? " package" : "");
1515 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001516 if (co == NULL)
1517 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001518 if (!PyCode_Check(co)) {
1519 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001520 PyErr_Format(PyExc_TypeError,
1521 "frozen object %.200s is not a code object",
1522 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001523 return -1;
1524 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001525 if (ispackage) {
1526 /* Set __path__ to the package name */
1527 PyObject *d, *s;
1528 int err;
1529 m = PyImport_AddModule(name);
1530 if (m == NULL)
1531 return -1;
1532 d = PyModule_GetDict(m);
1533 s = PyString_InternFromString(name);
1534 if (s == NULL)
1535 return -1;
1536 err = PyDict_SetItemString(d, "__path__", s);
1537 Py_DECREF(s);
1538 if (err != 0)
1539 return err;
1540 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001541 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001542 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001543 if (m == NULL)
1544 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001545 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001546 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001547}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001548
1549
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001550/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001551 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001552
Guido van Rossum79f25d91997-04-29 20:08:16 +00001553PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001554PyImport_ImportModule(char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00001555{
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00001556 PyObject *pname;
1557 PyObject *result;
1558
1559 pname = PyString_FromString(name);
1560 result = PyImport_Import(pname);
1561 Py_DECREF(pname);
1562 return result;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001563}
1564
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001565/* Forward declarations for helper routines */
Tim Petersdbd9ba62000-07-09 03:09:57 +00001566static PyObject *get_parent(PyObject *globals, char *buf, int *p_buflen);
1567static PyObject *load_next(PyObject *mod, PyObject *altmod,
1568 char **p_name, char *buf, int *p_buflen);
1569static int mark_miss(char *name);
1570static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
1571 char *buf, int buflen, int recursive);
1572static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001573
1574/* The Magnum Opus of dotted-name import :-) */
1575
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001576static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001577import_module_ex(char *name, PyObject *globals, PyObject *locals,
1578 PyObject *fromlist)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001579{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001580 char buf[MAXPATHLEN+1];
1581 int buflen = 0;
1582 PyObject *parent, *head, *next, *tail;
1583
1584 parent = get_parent(globals, buf, &buflen);
1585 if (parent == NULL)
1586 return NULL;
1587
1588 head = load_next(parent, Py_None, &name, buf, &buflen);
1589 if (head == NULL)
1590 return NULL;
1591
1592 tail = head;
1593 Py_INCREF(tail);
1594 while (name) {
1595 next = load_next(tail, tail, &name, buf, &buflen);
1596 Py_DECREF(tail);
1597 if (next == NULL) {
1598 Py_DECREF(head);
1599 return NULL;
1600 }
1601 tail = next;
1602 }
1603
1604 if (fromlist != NULL) {
1605 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1606 fromlist = NULL;
1607 }
1608
1609 if (fromlist == NULL) {
1610 Py_DECREF(tail);
1611 return head;
1612 }
1613
1614 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001615 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001616 Py_DECREF(tail);
1617 return NULL;
1618 }
1619
1620 return tail;
1621}
1622
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001623PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001624PyImport_ImportModuleEx(char *name, PyObject *globals, PyObject *locals,
1625 PyObject *fromlist)
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001626{
1627 PyObject *result;
1628 lock_import();
Guido van Rossumd65911b1998-03-03 22:33:27 +00001629 result = import_module_ex(name, globals, locals, fromlist);
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001630 unlock_import();
1631 return result;
1632}
1633
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001634static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001635get_parent(PyObject *globals, char *buf, int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001636{
1637 static PyObject *namestr = NULL;
1638 static PyObject *pathstr = NULL;
1639 PyObject *modname, *modpath, *modules, *parent;
1640
1641 if (globals == NULL || !PyDict_Check(globals))
1642 return Py_None;
1643
1644 if (namestr == NULL) {
1645 namestr = PyString_InternFromString("__name__");
1646 if (namestr == NULL)
1647 return NULL;
1648 }
1649 if (pathstr == NULL) {
1650 pathstr = PyString_InternFromString("__path__");
1651 if (pathstr == NULL)
1652 return NULL;
1653 }
1654
1655 *buf = '\0';
1656 *p_buflen = 0;
1657 modname = PyDict_GetItem(globals, namestr);
1658 if (modname == NULL || !PyString_Check(modname))
1659 return Py_None;
1660
1661 modpath = PyDict_GetItem(globals, pathstr);
1662 if (modpath != NULL) {
1663 int len = PyString_GET_SIZE(modname);
1664 if (len > MAXPATHLEN) {
1665 PyErr_SetString(PyExc_ValueError,
1666 "Module name too long");
1667 return NULL;
1668 }
1669 strcpy(buf, PyString_AS_STRING(modname));
1670 *p_buflen = len;
1671 }
1672 else {
1673 char *start = PyString_AS_STRING(modname);
1674 char *lastdot = strrchr(start, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001675 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001676 if (lastdot == NULL)
1677 return Py_None;
1678 len = lastdot - start;
1679 if (len >= MAXPATHLEN) {
1680 PyErr_SetString(PyExc_ValueError,
1681 "Module name too long");
1682 return NULL;
1683 }
1684 strncpy(buf, start, len);
1685 buf[len] = '\0';
1686 *p_buflen = len;
1687 }
1688
1689 modules = PyImport_GetModuleDict();
1690 parent = PyDict_GetItemString(modules, buf);
1691 if (parent == NULL)
1692 parent = Py_None;
1693 return parent;
1694 /* We expect, but can't guarantee, if parent != None, that:
1695 - parent.__name__ == buf
1696 - parent.__dict__ is globals
1697 If this is violated... Who cares? */
1698}
1699
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001700/* altmod is either None or same as mod */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001701static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001702load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
1703 int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001704{
1705 char *name = *p_name;
1706 char *dot = strchr(name, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001707 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001708 char *p;
1709 PyObject *result;
1710
1711 if (dot == NULL) {
1712 *p_name = NULL;
1713 len = strlen(name);
1714 }
1715 else {
1716 *p_name = dot+1;
1717 len = dot-name;
1718 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00001719 if (len == 0) {
1720 PyErr_SetString(PyExc_ValueError,
1721 "Empty module name");
1722 return NULL;
1723 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001724
1725 p = buf + *p_buflen;
1726 if (p != buf)
1727 *p++ = '.';
1728 if (p+len-buf >= MAXPATHLEN) {
1729 PyErr_SetString(PyExc_ValueError,
1730 "Module name too long");
1731 return NULL;
1732 }
1733 strncpy(p, name, len);
1734 p[len] = '\0';
1735 *p_buflen = p+len-buf;
1736
1737 result = import_submodule(mod, p, buf);
1738 if (result == Py_None && altmod != mod) {
1739 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001740 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001741 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001742 if (result != NULL && result != Py_None) {
1743 if (mark_miss(buf) != 0) {
1744 Py_DECREF(result);
1745 return NULL;
1746 }
1747 strncpy(buf, name, len);
1748 buf[len] = '\0';
1749 *p_buflen = len;
1750 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001751 }
1752 if (result == NULL)
1753 return NULL;
1754
1755 if (result == Py_None) {
1756 Py_DECREF(result);
1757 PyErr_Format(PyExc_ImportError,
1758 "No module named %.200s", name);
1759 return NULL;
1760 }
1761
1762 return result;
1763}
1764
1765static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001766mark_miss(char *name)
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001767{
1768 PyObject *modules = PyImport_GetModuleDict();
1769 return PyDict_SetItemString(modules, name, Py_None);
1770}
1771
1772static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001773ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, int buflen,
1774 int recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001775{
1776 int i;
1777
1778 if (!PyObject_HasAttrString(mod, "__path__"))
1779 return 1;
1780
1781 for (i = 0; ; i++) {
1782 PyObject *item = PySequence_GetItem(fromlist, i);
1783 int hasit;
1784 if (item == NULL) {
1785 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1786 PyErr_Clear();
1787 return 1;
1788 }
1789 return 0;
1790 }
1791 if (!PyString_Check(item)) {
1792 PyErr_SetString(PyExc_TypeError,
1793 "Item in ``from list'' not a string");
1794 Py_DECREF(item);
1795 return 0;
1796 }
1797 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001798 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001799 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001800 /* See if the package defines __all__ */
1801 if (recursive)
1802 continue; /* Avoid endless recursion */
1803 all = PyObject_GetAttrString(mod, "__all__");
1804 if (all == NULL)
1805 PyErr_Clear();
1806 else {
1807 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1808 return 0;
1809 Py_DECREF(all);
1810 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001811 continue;
1812 }
1813 hasit = PyObject_HasAttr(mod, item);
1814 if (!hasit) {
1815 char *subname = PyString_AS_STRING(item);
1816 PyObject *submod;
1817 char *p;
1818 if (buflen + strlen(subname) >= MAXPATHLEN) {
1819 PyErr_SetString(PyExc_ValueError,
1820 "Module name too long");
1821 Py_DECREF(item);
1822 return 0;
1823 }
1824 p = buf + buflen;
1825 *p++ = '.';
1826 strcpy(p, subname);
1827 submod = import_submodule(mod, subname, buf);
1828 Py_XDECREF(submod);
1829 if (submod == NULL) {
1830 Py_DECREF(item);
1831 return 0;
1832 }
1833 }
1834 Py_DECREF(item);
1835 }
1836
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001837 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001838}
1839
1840static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001841import_submodule(PyObject *mod, char *subname, char *fullname)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001842{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001843 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossumf48f11c2001-07-23 13:27:49 +00001844 PyObject *m, *res = NULL;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001845
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001846 /* Require:
1847 if mod == None: subname == fullname
1848 else: mod.__name__ + "." + subname == fullname
1849 */
1850
Tim Peters50d8d372001-02-28 05:34:27 +00001851 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001852 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001853 }
1854 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001855 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001856 char buf[MAXPATHLEN+1];
1857 struct filedescr *fdp;
1858 FILE *fp = NULL;
1859
Guido van Rossum9c0afe51998-05-19 15:09:05 +00001860 if (mod == Py_None)
1861 path = NULL;
1862 else {
1863 path = PyObject_GetAttrString(mod, "__path__");
1864 if (path == NULL) {
1865 PyErr_Clear();
1866 Py_INCREF(Py_None);
1867 return Py_None;
1868 }
1869 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001870
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001871 buf[0] = '\0';
Guido van Rossumb68cd421998-07-01 17:36:26 +00001872 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1873 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001874 if (fdp == NULL) {
1875 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1876 return NULL;
1877 PyErr_Clear();
1878 Py_INCREF(Py_None);
1879 return Py_None;
1880 }
1881 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001882 if (fp)
1883 fclose(fp);
Guido van Rossumf48f11c2001-07-23 13:27:49 +00001884 if (mod != Py_None) {
1885 /* Irrespective of the success of this load, make a
1886 reference to it in the parent package module.
1887 A copy gets saved in the modules dictionary
1888 under the full name, so get a reference from
1889 there, if need be. (The exception is when
1890 the load failed with a SyntaxError -- then
1891 there's no trace in sys.modules. In that case,
1892 of course, do nothing extra.) */
1893 res = m;
1894 if (res == NULL)
1895 res = PyDict_GetItemString(modules, fullname);
1896 if (res != NULL &&
1897 PyObject_SetAttrString(mod, subname, res) < 0) {
1898 Py_XDECREF(m);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001899 m = NULL;
1900 }
1901 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001902 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001903
1904 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001905}
1906
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001907
1908/* Re-import a module of any kind and return its module object, WITH
1909 INCREMENTED REFERENCE COUNT */
1910
Guido van Rossum79f25d91997-04-29 20:08:16 +00001911PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001912PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001913{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001914 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001915 PyObject *path = NULL;
1916 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001917 char buf[MAXPATHLEN+1];
1918 struct filedescr *fdp;
1919 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001920
Guido van Rossum79f25d91997-04-29 20:08:16 +00001921 if (m == NULL || !PyModule_Check(m)) {
1922 PyErr_SetString(PyExc_TypeError,
1923 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001924 return NULL;
1925 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001926 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001927 if (name == NULL)
1928 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001929 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001930 PyErr_Format(PyExc_ImportError,
1931 "reload(): module %.200s not in sys.modules",
1932 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001933 return NULL;
1934 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001935 subname = strrchr(name, '.');
1936 if (subname == NULL)
1937 subname = name;
1938 else {
1939 PyObject *parentname, *parent;
1940 parentname = PyString_FromStringAndSize(name, (subname-name));
1941 if (parentname == NULL)
1942 return NULL;
1943 parent = PyDict_GetItem(modules, parentname);
Barry Warsaw38793331999-01-27 17:54:20 +00001944 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00001945 if (parent == NULL) {
1946 PyErr_Format(PyExc_ImportError,
1947 "reload(): parent %.200s not in sys.modules",
1948 name);
1949 return NULL;
1950 }
1951 subname++;
1952 path = PyObject_GetAttrString(parent, "__path__");
1953 if (path == NULL)
1954 PyErr_Clear();
1955 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001956 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001957 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1958 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001959 if (fdp == NULL)
1960 return NULL;
1961 m = load_module(name, fp, buf, fdp->type);
1962 if (fp)
1963 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001964 return m;
1965}
1966
1967
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001968/* Higher-level import emulator which emulates the "import" statement
1969 more accurately -- it invokes the __import__() function from the
1970 builtins of the current globals. This means that the import is
1971 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00001972 environment, e.g. by "rexec".
1973 A dummy list ["__doc__"] is passed as the 4th argument so that
1974 e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
1975 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001976
1977PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001978PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001979{
1980 static PyObject *silly_list = NULL;
1981 static PyObject *builtins_str = NULL;
1982 static PyObject *import_str = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001983 PyObject *globals = NULL;
1984 PyObject *import = NULL;
1985 PyObject *builtins = NULL;
1986 PyObject *r = NULL;
1987
1988 /* Initialize constant string objects */
1989 if (silly_list == NULL) {
1990 import_str = PyString_InternFromString("__import__");
1991 if (import_str == NULL)
1992 return NULL;
1993 builtins_str = PyString_InternFromString("__builtins__");
1994 if (builtins_str == NULL)
1995 return NULL;
1996 silly_list = Py_BuildValue("[s]", "__doc__");
1997 if (silly_list == NULL)
1998 return NULL;
1999 }
2000
2001 /* Get the builtins from current globals */
2002 globals = PyEval_GetGlobals();
Guido van Rossum85cd1d62001-02-20 21:43:24 +00002003 if (globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00002004 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002005 builtins = PyObject_GetItem(globals, builtins_str);
2006 if (builtins == NULL)
2007 goto err;
2008 }
2009 else {
2010 /* No globals -- use standard builtins, and fake globals */
2011 PyErr_Clear();
2012
Guido van Rossum85cd1d62001-02-20 21:43:24 +00002013 builtins = PyImport_ImportModuleEx("__builtin__",
2014 NULL, NULL, NULL);
2015 if (builtins == NULL)
2016 return NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002017 globals = Py_BuildValue("{OO}", builtins_str, builtins);
2018 if (globals == NULL)
2019 goto err;
2020 }
2021
2022 /* Get the __import__ function from the builtins */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002023 if (PyDict_Check(builtins)) {
Fred Drakea76ba6e2001-03-06 06:31:15 +00002024 import = PyObject_GetItem(builtins, import_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002025 if (import == NULL)
2026 PyErr_SetObject(PyExc_KeyError, import_str);
2027 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002028 else
Fred Drakea76ba6e2001-03-06 06:31:15 +00002029 import = PyObject_GetAttr(builtins, import_str);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002030 if (import == NULL)
2031 goto err;
2032
2033 /* Call the _import__ function with the proper argument list */
2034 r = PyObject_CallFunction(import, "OOOO",
2035 module_name, globals, globals, silly_list);
2036
2037 err:
2038 Py_XDECREF(globals);
2039 Py_XDECREF(builtins);
2040 Py_XDECREF(import);
Tim Peters50d8d372001-02-28 05:34:27 +00002041
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002042 return r;
2043}
2044
2045
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002046/* Module 'imp' provides Python access to the primitives used for
2047 importing modules.
2048*/
2049
Guido van Rossum79f25d91997-04-29 20:08:16 +00002050static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002051imp_get_magic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002052{
2053 char buf[4];
2054
Guido van Rossum43713e52000-02-29 13:59:29 +00002055 if (!PyArg_ParseTuple(args, ":get_magic"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002056 return NULL;
Guido van Rossum96774c12000-05-01 20:19:08 +00002057 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
2058 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
2059 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
2060 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002061
Guido van Rossum79f25d91997-04-29 20:08:16 +00002062 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002063}
2064
Guido van Rossum79f25d91997-04-29 20:08:16 +00002065static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002066imp_get_suffixes(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002067{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002068 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002069 struct filedescr *fdp;
2070
Guido van Rossum43713e52000-02-29 13:59:29 +00002071 if (!PyArg_ParseTuple(args, ":get_suffixes"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002072 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002073 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002074 if (list == NULL)
2075 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002076 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
2077 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002078 fdp->suffix, fdp->mode, fdp->type);
2079 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002080 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002081 return NULL;
2082 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002083 if (PyList_Append(list, item) < 0) {
2084 Py_DECREF(list);
2085 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002086 return NULL;
2087 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002088 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002089 }
2090 return list;
2091}
2092
Guido van Rossum79f25d91997-04-29 20:08:16 +00002093static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002094call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002095{
Tim Petersdbd9ba62000-07-09 03:09:57 +00002096 extern int fclose(FILE *);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002097 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002098 struct filedescr *fdp;
2099 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002100 FILE *fp = NULL;
2101
2102 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002103 if (path == Py_None)
2104 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002105 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
2106 if (fdp == NULL)
2107 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002108 if (fp != NULL) {
2109 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
2110 if (fob == NULL) {
2111 fclose(fp);
2112 return NULL;
2113 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002114 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002115 else {
2116 fob = Py_None;
2117 Py_INCREF(fob);
Tim Peters50d8d372001-02-28 05:34:27 +00002118 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002119 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002120 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002121 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002122 return ret;
2123}
2124
Guido van Rossum79f25d91997-04-29 20:08:16 +00002125static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002126imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002127{
2128 char *name;
2129 PyObject *path = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002130 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002131 return NULL;
2132 return call_find_module(name, path);
2133}
2134
2135static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002136imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002137{
2138 char *name;
2139 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002140 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002141 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002142 return NULL;
2143 ret = init_builtin(name);
2144 if (ret < 0)
2145 return NULL;
2146 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002147 Py_INCREF(Py_None);
2148 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002149 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002150 m = PyImport_AddModule(name);
2151 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002152 return m;
2153}
2154
Guido van Rossum79f25d91997-04-29 20:08:16 +00002155static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002156imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002157{
2158 char *name;
2159 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002160 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002161 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002162 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002163 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002164 if (ret < 0)
2165 return NULL;
2166 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002167 Py_INCREF(Py_None);
2168 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002169 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002170 m = PyImport_AddModule(name);
2171 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002172 return m;
2173}
2174
Guido van Rossum79f25d91997-04-29 20:08:16 +00002175static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002176imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002177{
2178 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002179
Guido van Rossum43713e52000-02-29 13:59:29 +00002180 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002181 return NULL;
2182 return get_frozen_object(name);
2183}
2184
Guido van Rossum79f25d91997-04-29 20:08:16 +00002185static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002186imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002187{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002188 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002189 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002190 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002191 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002192}
2193
Guido van Rossum79f25d91997-04-29 20:08:16 +00002194static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002195imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002196{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002197 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002198 struct _frozen *p;
Guido van Rossum43713e52000-02-29 13:59:29 +00002199 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002200 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002201 p = find_frozen(name);
2202 return PyInt_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002203}
2204
2205static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002206get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002207{
2208 FILE *fp;
2209 if (fob == NULL) {
2210 fp = fopen(pathname, mode);
2211 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002212 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002213 }
2214 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002215 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002216 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002217 PyErr_SetString(PyExc_ValueError,
2218 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002219 }
2220 return fp;
2221}
2222
Guido van Rossum79f25d91997-04-29 20:08:16 +00002223static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002224imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002225{
2226 char *name;
2227 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002228 PyObject *fob = NULL;
2229 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002230 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002231 if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002232 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002233 return NULL;
2234 fp = get_file(pathname, fob, "rb");
2235 if (fp == NULL)
2236 return NULL;
2237 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002238 if (fob == NULL)
2239 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002240 return m;
2241}
2242
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002243#ifdef HAVE_DYNAMIC_LOADING
2244
Guido van Rossum79f25d91997-04-29 20:08:16 +00002245static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002246imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002247{
2248 char *name;
2249 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002250 PyObject *fob = NULL;
2251 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002252 FILE *fp = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002253 if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002254 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002255 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002256 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002257 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002258 if (fp == NULL)
2259 return NULL;
2260 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002261 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002262 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002263}
2264
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002265#endif /* HAVE_DYNAMIC_LOADING */
2266
Guido van Rossum79f25d91997-04-29 20:08:16 +00002267static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002268imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002269{
2270 char *name;
2271 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002272 PyObject *fob = NULL;
2273 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002274 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002275 if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002276 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002277 return NULL;
2278 fp = get_file(pathname, fob, "r");
2279 if (fp == NULL)
2280 return NULL;
2281 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002282 if (fob == NULL)
2283 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002284 return m;
2285}
2286
Jack Jansen9c96a921995-02-15 22:57:06 +00002287#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002288static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002289imp_load_resource(PyObject *self, PyObject *args)
Jack Jansen9c96a921995-02-15 22:57:06 +00002290{
2291 char *name;
2292 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002293 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002294
Guido van Rossum43713e52000-02-29 13:59:29 +00002295 if (!PyArg_ParseTuple(args, "ss:load_resource", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002296 return NULL;
2297 m = PyMac_LoadResourceModule(name, pathname);
2298 return m;
2299}
2300#endif /* macintosh */
2301
Guido van Rossum79f25d91997-04-29 20:08:16 +00002302static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002303imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002304{
2305 char *name;
2306 PyObject *fob;
2307 char *pathname;
2308 char *suffix; /* Unused */
2309 char *mode;
2310 int type;
2311 FILE *fp;
2312
Guido van Rossum43713e52000-02-29 13:59:29 +00002313 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002314 &name, &fob, &pathname,
2315 &suffix, &mode, &type))
2316 return NULL;
2317 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
2318 PyErr_Format(PyExc_ValueError,
2319 "invalid file open mode %.200s", mode);
2320 return NULL;
2321 }
2322 if (fob == Py_None)
2323 fp = NULL;
2324 else {
2325 if (!PyFile_Check(fob)) {
2326 PyErr_SetString(PyExc_ValueError,
2327 "load_module arg#2 should be a file or None");
2328 return NULL;
2329 }
2330 fp = get_file(pathname, fob, mode);
2331 if (fp == NULL)
2332 return NULL;
2333 }
2334 return load_module(name, fp, pathname, type);
2335}
2336
2337static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002338imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002339{
2340 char *name;
2341 char *pathname;
Guido van Rossum43713e52000-02-29 13:59:29 +00002342 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002343 return NULL;
2344 return load_package(name, pathname);
2345}
2346
2347static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002348imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002349{
2350 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002351 if (!PyArg_ParseTuple(args, "s:new_module", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002352 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002353 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002354}
2355
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002356/* Doc strings */
2357
2358static char doc_imp[] = "\
2359This module provides the components needed to build your own\n\
2360__import__ function. Undocumented functions are obsolete.\n\
2361";
2362
2363static char doc_find_module[] = "\
2364find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
2365Search for a module. If path is omitted or None, search for a\n\
2366built-in, frozen or special module and continue search in sys.path.\n\
2367The module name cannot contain '.'; to search for a submodule of a\n\
2368package, pass the submodule name and the package's __path__.\
2369";
2370
2371static char doc_load_module[] = "\
2372load_module(name, file, filename, (suffix, mode, type)) -> module\n\
2373Load a module, given information returned by find_module().\n\
2374The module name must include the full package name, if any.\
2375";
2376
2377static char doc_get_magic[] = "\
2378get_magic() -> string\n\
2379Return the magic number for .pyc or .pyo files.\
2380";
2381
2382static char doc_get_suffixes[] = "\
2383get_suffixes() -> [(suffix, mode, type), ...]\n\
2384Return a list of (suffix, mode, type) tuples describing the files\n\
2385that find_module() looks for.\
2386";
2387
2388static char doc_new_module[] = "\
2389new_module(name) -> module\n\
2390Create a new module. Do not enter it in sys.modules.\n\
2391The module name must include the full package name, if any.\
2392";
2393
Tim Peters69232342001-08-30 05:16:13 +00002394static char doc_lock_held[] = "\
2395lock_held() -> 0 or 1\n\
2396Return 1 if the import lock is currently held.\n\
2397On platforms without threads, return 0.\
2398";
2399
Guido van Rossum79f25d91997-04-29 20:08:16 +00002400static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002401 {"find_module", imp_find_module, 1, doc_find_module},
2402 {"get_magic", imp_get_magic, 1, doc_get_magic},
2403 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2404 {"load_module", imp_load_module, 1, doc_load_module},
2405 {"new_module", imp_new_module, 1, doc_new_module},
Tim Peters69232342001-08-30 05:16:13 +00002406 {"lock_held", imp_lock_held, 1, doc_lock_held},
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002407 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002408 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002409 {"init_builtin", imp_init_builtin, 1},
2410 {"init_frozen", imp_init_frozen, 1},
2411 {"is_builtin", imp_is_builtin, 1},
2412 {"is_frozen", imp_is_frozen, 1},
2413 {"load_compiled", imp_load_compiled, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002414#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002415 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002416#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002417 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002418#ifdef macintosh
2419 {"load_resource", imp_load_resource, 1},
2420#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002421 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002422 {NULL, NULL} /* sentinel */
2423};
2424
Guido van Rossum1a8791e1998-08-04 22:46:29 +00002425static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002426setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002427{
2428 PyObject *v;
2429 int err;
2430
2431 v = PyInt_FromLong((long)value);
2432 err = PyDict_SetItemString(d, name, v);
2433 Py_XDECREF(v);
2434 return err;
2435}
2436
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002437void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002438initimp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002439{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002440 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002441
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002442 m = Py_InitModule4("imp", imp_methods, doc_imp,
2443 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002444 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002445
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002446 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2447 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2448 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2449 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2450 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2451 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2452 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2453 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00002454 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002455
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002456 failure:
2457 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002458}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002459
2460
Guido van Rossumb18618d2000-05-03 23:44:39 +00002461/* API for embedding applications that want to add their own entries
2462 to the table of built-in modules. This should normally be called
2463 *before* Py_Initialize(). When the table resize fails, -1 is
2464 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002465
2466 After a similar function by Just van Rossum. */
2467
2468int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002469PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002470{
2471 static struct _inittab *our_copy = NULL;
2472 struct _inittab *p;
2473 int i, n;
2474
2475 /* Count the number of entries in both tables */
2476 for (n = 0; newtab[n].name != NULL; n++)
2477 ;
2478 if (n == 0)
2479 return 0; /* Nothing to do */
2480 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2481 ;
2482
2483 /* Allocate new memory for the combined table */
Guido van Rossumb18618d2000-05-03 23:44:39 +00002484 p = our_copy;
2485 PyMem_RESIZE(p, struct _inittab, i+n+1);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002486 if (p == NULL)
2487 return -1;
2488
2489 /* Copy the tables into the new memory */
2490 if (our_copy != PyImport_Inittab)
2491 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2492 PyImport_Inittab = our_copy = p;
2493 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
2494
2495 return 0;
2496}
2497
2498/* Shorthand to add a single entry given a name and a function */
2499
2500int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002501PyImport_AppendInittab(char *name, void (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002502{
2503 struct _inittab newtab[2];
2504
2505 memset(newtab, '\0', sizeof newtab);
2506
2507 newtab[0].name = name;
2508 newtab[0].initfunc = initfunc;
2509
2510 return PyImport_ExtendInittab(newtab);
2511}