blob: 626695cb8345ec16a502685350689145d0d12869 [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
986 {
987 static struct filedescr fd = {"", "", PKG_DIRECTORY};
988 if (isdir(buf)) {
989 if (find_init_module(buf))
990 return &fd;
991 }
992 }
993#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000994#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000995#ifdef macintosh
996 fdp = PyMac_FindModuleExtension(buf, &len, name);
Jack Jansen4df3c522001-03-20 23:09:54 +0000997 if (fdp) {
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000998#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000999 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001000 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001001 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001002 PySys_WriteStderr("# trying %s\n", buf);
Jack Jansen4df3c522001-03-20 23:09:54 +00001003#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001004 fp = fopen(buf, fdp->mode);
Tim Peters50d8d372001-02-28 05:34:27 +00001005 if (fp != NULL) {
1006 if (case_ok(buf, len, namelen, name))
1007 break;
1008 else { /* continue search */
1009 fclose(fp);
1010 fp = NULL;
Barry Warsaw914a0b12001-02-02 19:12:16 +00001011 }
Barry Warsaw914a0b12001-02-02 19:12:16 +00001012 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001013 }
1014 if (fp != NULL)
1015 break;
1016 }
1017 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001018 PyErr_Format(PyExc_ImportError,
1019 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001020 return NULL;
1021 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001022 *p_fp = fp;
1023 return fdp;
1024}
1025
Tim Petersd1e87a82001-03-01 18:12:00 +00001026/* case_ok(char* buf, int len, int namelen, char* name)
1027 * The arguments here are tricky, best shown by example:
1028 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1029 * ^ ^ ^ ^
1030 * |--------------------- buf ---------------------|
1031 * |------------------- len ------------------|
1032 * |------ name -------|
1033 * |----- namelen -----|
1034 * buf is the full path, but len only counts up to (& exclusive of) the
1035 * extension. name is the module name, also exclusive of extension.
1036 *
1037 * We've already done a successful stat() or fopen() on buf, so know that
1038 * there's some match, possibly case-insensitive.
1039 *
Tim Peters50d8d372001-02-28 05:34:27 +00001040 * case_ok() is to return 1 if there's a case-sensitive match for
1041 * name, else 0. case_ok() is also to return 1 if envar PYTHONCASEOK
1042 * exists.
Tim Petersd1e87a82001-03-01 18:12:00 +00001043 *
Tim Peters50d8d372001-02-28 05:34:27 +00001044 * case_ok() is used to implement case-sensitive import semantics even
1045 * on platforms with case-insensitive filesystems. It's trivial to implement
1046 * for case-sensitive filesystems. It's pretty much a cross-platform
1047 * nightmare for systems with case-insensitive filesystems.
1048 */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001049
Tim Peters50d8d372001-02-28 05:34:27 +00001050/* First we may need a pile of platform-specific header files; the sequence
1051 * of #if's here should match the sequence in the body of case_ok().
1052 */
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001053#if defined(MS_WIN32) || defined(__CYGWIN__)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001054#include <windows.h>
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001055#ifdef __CYGWIN__
1056#include <sys/cygwin.h>
1057#endif
1058
Tim Peters50d8d372001-02-28 05:34:27 +00001059#elif defined(DJGPP)
1060#include <dir.h>
1061
1062#elif defined(macintosh)
1063#include <TextUtils.h>
1064#ifdef USE_GUSI1
1065#include "TFileSpec.h" /* for Path2FSSpec() */
1066#endif
1067
Tim Petersd1e87a82001-03-01 18:12:00 +00001068#elif defined(__MACH__) && defined(__APPLE__) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001069#include <sys/types.h>
1070#include <dirent.h>
1071
Tim Peters50d8d372001-02-28 05:34:27 +00001072#endif
1073
Guido van Rossum0980bd91998-02-13 17:18:36 +00001074static int
Tim Peters50d8d372001-02-28 05:34:27 +00001075case_ok(char *buf, int len, int namelen, char *name)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001076{
Tim Peters50d8d372001-02-28 05:34:27 +00001077/* Pick a platform-specific implementation; the sequence of #if's here should
1078 * match the sequence just above.
1079 */
1080
1081/* MS_WIN32 || __CYGWIN__ */
1082#if defined(MS_WIN32) || defined(__CYGWIN__)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001083 WIN32_FIND_DATA data;
1084 HANDLE h;
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001085#ifdef __CYGWIN__
1086 char tempbuf[MAX_PATH];
1087#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001088
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001089 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001090 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001091
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001092#ifdef __CYGWIN__
1093 cygwin32_conv_to_win32_path(buf, tempbuf);
1094 h = FindFirstFile(tempbuf, &data);
1095#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001096 h = FindFirstFile(buf, &data);
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001097#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001098 if (h == INVALID_HANDLE_VALUE) {
1099 PyErr_Format(PyExc_NameError,
1100 "Can't find file for module %.100s\n(filename %.300s)",
1101 name, buf);
1102 return 0;
1103 }
1104 FindClose(h);
Tim Peters50d8d372001-02-28 05:34:27 +00001105 return strncmp(data.cFileName, name, namelen) == 0;
1106
1107/* DJGPP */
1108#elif defined(DJGPP)
1109 struct ffblk ffblk;
1110 int done;
1111
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001112 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001113 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001114
1115 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
1116 if (done) {
Guido van Rossum0980bd91998-02-13 17:18:36 +00001117 PyErr_Format(PyExc_NameError,
Tim Peters50d8d372001-02-28 05:34:27 +00001118 "Can't find file for module %.100s\n(filename %.300s)",
Guido van Rossum0980bd91998-02-13 17:18:36 +00001119 name, buf);
1120 return 0;
1121 }
Tim Peters50d8d372001-02-28 05:34:27 +00001122 return strncmp(ffblk.ff_name, name, namelen) == 0;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001123
Tim Peters50d8d372001-02-28 05:34:27 +00001124/* macintosh */
1125#elif defined(macintosh)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001126 FSSpec fss;
1127 OSErr err;
Tim Peters50d8d372001-02-28 05:34:27 +00001128
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001129 if (Py_GETENV("PYTHONCASEOK") != NULL)
Tim Peters50d8d372001-02-28 05:34:27 +00001130 return 1;
1131
Guido van Rossumb33aa1a2000-04-24 15:08:18 +00001132#ifndef USE_GUSI1
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001133 err = FSMakeFSSpec(0, 0, Pstring(buf), &fss);
1134#else
1135 /* GUSI's Path2FSSpec() resolves all possible aliases nicely on
1136 the way, which is fine for all directories, but here we need
1137 the original name of the alias file (say, Dlg.ppc.slb, not
1138 toolboxmodules.ppc.slb). */
1139 char *colon;
1140 err = Path2FSSpec(buf, &fss);
1141 if (err == noErr) {
1142 colon = strrchr(buf, ':'); /* find filename */
1143 if (colon != NULL)
1144 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1145 Pstring(colon+1), &fss);
1146 else
1147 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1148 fss.name, &fss);
1149 }
1150#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001151 if (err) {
1152 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001153 "Can't find file for module %.100s\n(filename %.300s)",
1154 name, buf);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001155 return 0;
1156 }
Tim Peters50d8d372001-02-28 05:34:27 +00001157 return fss.name[0] >= namelen &&
1158 strncmp(name, (char *)fss.name+1, namelen) == 0;
1159
Tim Peters677898a2001-03-02 03:28:03 +00001160/* new-fangled macintosh (macosx) */
Tim Petersd1e87a82001-03-01 18:12:00 +00001161#elif defined(__MACH__) && defined(__APPLE__) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001162 DIR *dirp;
1163 struct dirent *dp;
Tim Petersd1e87a82001-03-01 18:12:00 +00001164 char dirname[MAXPATHLEN + 1];
1165 const int dirlen = len - namelen - 1; /* don't want trailing SEP */
Tim Peters430f5d42001-03-01 01:30:56 +00001166
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001167 if (Py_GETENV("PYTHONCASEOK") != NULL)
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001168 return 1;
1169
Tim Petersd1e87a82001-03-01 18:12:00 +00001170 /* Copy the dir component into dirname; substitute "." if empty */
1171 if (dirlen <= 0) {
1172 dirname[0] = '.';
1173 dirname[1] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001174 }
1175 else {
Tim Petersd1e87a82001-03-01 18:12:00 +00001176 assert(dirlen <= MAXPATHLEN);
1177 memcpy(dirname, buf, dirlen);
1178 dirname[dirlen] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001179 }
1180 /* Open the directory and search the entries for an exact match. */
Tim Petersd1e87a82001-03-01 18:12:00 +00001181 dirp = opendir(dirname);
Tim Peters430f5d42001-03-01 01:30:56 +00001182 if (dirp) {
Tim Peters677898a2001-03-02 03:28:03 +00001183 char *nameWithExt = buf + len - namelen;
Tim Peters430f5d42001-03-01 01:30:56 +00001184 while ((dp = readdir(dirp)) != NULL) {
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001185 const int thislen =
Tim Peters430f5d42001-03-01 01:30:56 +00001186#ifdef _DIRENT_HAVE_D_NAMELEN
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001187 dp->d_namlen;
Tim Peters430f5d42001-03-01 01:30:56 +00001188#else
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001189 strlen(dp->d_name);
Tim Peters430f5d42001-03-01 01:30:56 +00001190#endif
Tim Petersd1e87a82001-03-01 18:12:00 +00001191 if (thislen >= namelen &&
Tim Peters677898a2001-03-02 03:28:03 +00001192 strcmp(dp->d_name, nameWithExt) == 0) {
Tim Peters430f5d42001-03-01 01:30:56 +00001193 (void)closedir(dirp);
1194 return 1; /* Found */
1195 }
1196 }
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001197 (void)closedir(dirp);
Tim Peters430f5d42001-03-01 01:30:56 +00001198 }
Tim Peters430f5d42001-03-01 01:30:56 +00001199 return 0 ; /* Not found */
Tim Peters430f5d42001-03-01 01:30:56 +00001200
Tim Peters50d8d372001-02-28 05:34:27 +00001201/* assuming it's a case-sensitive filesystem, so there's nothing to do! */
1202#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001203 return 1;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001204
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001205#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001206}
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001207
Guido van Rossum0980bd91998-02-13 17:18:36 +00001208
Guido van Rossum197346f1997-10-31 18:38:52 +00001209#ifdef HAVE_STAT
1210/* Helper to look for __init__.py or __init__.py[co] in potential package */
1211static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001212find_init_module(char *buf)
Guido van Rossum197346f1997-10-31 18:38:52 +00001213{
Tim Peters0f9431f2001-07-05 03:47:53 +00001214 const size_t save_len = strlen(buf);
Fred Drake4c82b232000-06-30 16:18:57 +00001215 size_t i = save_len;
Tim Peters0f9431f2001-07-05 03:47:53 +00001216 char *pname; /* pointer to start of __init__ */
Guido van Rossum197346f1997-10-31 18:38:52 +00001217 struct stat statbuf;
1218
Tim Peters0f9431f2001-07-05 03:47:53 +00001219/* For calling case_ok(buf, len, namelen, name):
1220 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1221 * ^ ^ ^ ^
1222 * |--------------------- buf ---------------------|
1223 * |------------------- len ------------------|
1224 * |------ name -------|
1225 * |----- namelen -----|
1226 */
Guido van Rossum197346f1997-10-31 18:38:52 +00001227 if (save_len + 13 >= MAXPATHLEN)
1228 return 0;
1229 buf[i++] = SEP;
Tim Peters0f9431f2001-07-05 03:47:53 +00001230 pname = buf + i;
1231 strcpy(pname, "__init__.py");
Guido van Rossum197346f1997-10-31 18:38:52 +00001232 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001233 if (case_ok(buf,
1234 save_len + 9, /* len("/__init__") */
1235 8, /* len("__init__") */
1236 pname)) {
1237 buf[save_len] = '\0';
1238 return 1;
1239 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001240 }
Tim Peters0f9431f2001-07-05 03:47:53 +00001241 i += strlen(pname);
1242 strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum197346f1997-10-31 18:38:52 +00001243 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001244 if (case_ok(buf,
1245 save_len + 9, /* len("/__init__") */
1246 8, /* len("__init__") */
1247 pname)) {
1248 buf[save_len] = '\0';
1249 return 1;
1250 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001251 }
1252 buf[save_len] = '\0';
1253 return 0;
1254}
Guido van Rossum48a680c2001-03-02 06:34:14 +00001255
1256#else
1257
1258#ifdef RISCOS
1259static int
1260find_init_module(buf)
1261 char *buf;
1262{
1263 int save_len = strlen(buf);
1264 int i = save_len;
1265
1266 if (save_len + 13 >= MAXPATHLEN)
1267 return 0;
1268 buf[i++] = SEP;
1269 strcpy(buf+i, "__init__/py");
1270 if (isfile(buf)) {
1271 buf[save_len] = '\0';
1272 return 1;
1273 }
1274
1275 if (Py_OptimizeFlag)
1276 strcpy(buf+i, "o");
1277 else
1278 strcpy(buf+i, "c");
1279 if (isfile(buf)) {
1280 buf[save_len] = '\0';
1281 return 1;
1282 }
1283 buf[save_len] = '\0';
1284 return 0;
1285}
1286#endif /*RISCOS*/
1287
Guido van Rossum197346f1997-10-31 18:38:52 +00001288#endif /* HAVE_STAT */
1289
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001290
Tim Petersdbd9ba62000-07-09 03:09:57 +00001291static int init_builtin(char *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001292
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001293/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001294 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001295
Guido van Rossum79f25d91997-04-29 20:08:16 +00001296static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001297load_module(char *name, FILE *fp, char *buf, int type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001298{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001299 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001300 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001301 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001302
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001303 /* First check that there's an open file (if we need one) */
1304 switch (type) {
1305 case PY_SOURCE:
1306 case PY_COMPILED:
1307 if (fp == NULL) {
1308 PyErr_Format(PyExc_ValueError,
1309 "file object required for import (type code %d)",
1310 type);
1311 return NULL;
1312 }
1313 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001314
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001315 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001316
1317 case PY_SOURCE:
1318 m = load_source_module(name, buf, fp);
1319 break;
1320
1321 case PY_COMPILED:
1322 m = load_compiled_module(name, buf, fp);
1323 break;
1324
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001325#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001326 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001327 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001328 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001329#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001330
Jack Jansen9c96a921995-02-15 22:57:06 +00001331#ifdef macintosh
1332 case PY_RESOURCE:
1333 m = PyMac_LoadResourceModule(name, buf);
1334 break;
Guido van Rossum0f84a341998-08-06 13:36:01 +00001335 case PY_CODERESOURCE:
1336 m = PyMac_LoadCodeResourceModule(name, buf);
1337 break;
Jack Jansen9c96a921995-02-15 22:57:06 +00001338#endif
1339
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001340 case PKG_DIRECTORY:
1341 m = load_package(name, buf);
1342 break;
1343
1344 case C_BUILTIN:
1345 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001346 if (buf != NULL && buf[0] != '\0')
1347 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001348 if (type == C_BUILTIN)
1349 err = init_builtin(name);
1350 else
1351 err = PyImport_ImportFrozenModule(name);
1352 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001353 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001354 if (err == 0) {
1355 PyErr_Format(PyExc_ImportError,
1356 "Purported %s module %.200s not found",
1357 type == C_BUILTIN ?
1358 "builtin" : "frozen",
1359 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001360 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001361 }
1362 modules = PyImport_GetModuleDict();
1363 m = PyDict_GetItemString(modules, name);
1364 if (m == NULL) {
1365 PyErr_Format(
1366 PyExc_ImportError,
1367 "%s module %.200s not properly initialized",
1368 type == C_BUILTIN ?
1369 "builtin" : "frozen",
1370 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001371 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001372 }
1373 Py_INCREF(m);
1374 break;
1375
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001376 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001377 PyErr_Format(PyExc_ImportError,
1378 "Don't know how to import %.200s (type code %d)",
1379 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001380 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001381
1382 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001383
1384 return m;
1385}
1386
1387
1388/* Initialize a built-in module.
1389 Return 1 for succes, 0 if the module is not found, and -1 with
1390 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001391
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001392static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001393init_builtin(char *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001394{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001395 struct _inittab *p;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001396
Greg Ward201baee2001-10-04 14:52:06 +00001397 if (_PyImport_FindExtension(name, name) != NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00001398 return 1;
1399
Guido van Rossum771c6c81997-10-31 18:37:24 +00001400 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001401 if (strcmp(name, p->name) == 0) {
1402 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001403 PyErr_Format(PyExc_ImportError,
1404 "Cannot re-init internal module %.200s",
1405 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001406 return -1;
1407 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001408 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001409 PySys_WriteStderr("import %s # builtin\n", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001410 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001411 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001412 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001413 if (_PyImport_FixupExtension(name, name) == NULL)
1414 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001415 return 1;
1416 }
1417 }
1418 return 0;
1419}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001420
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001421
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001422/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001423
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001424static struct _frozen *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001425find_frozen(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001426{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001427 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001428
Guido van Rossum79f25d91997-04-29 20:08:16 +00001429 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001430 if (p->name == NULL)
1431 return NULL;
1432 if (strcmp(p->name, name) == 0)
1433 break;
1434 }
1435 return p;
1436}
1437
Guido van Rossum79f25d91997-04-29 20:08:16 +00001438static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001439get_frozen_object(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001440{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001441 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001442 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001443
1444 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001445 PyErr_Format(PyExc_ImportError,
1446 "No such frozen object named %.200s",
1447 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001448 return NULL;
1449 }
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001450 if (p->code == NULL) {
1451 PyErr_Format(PyExc_ImportError,
1452 "Excluded frozen object named %.200s",
1453 name);
1454 return NULL;
1455 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001456 size = p->size;
1457 if (size < 0)
1458 size = -size;
1459 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001460}
1461
1462/* Initialize a frozen module.
1463 Return 1 for succes, 0 if the module is not found, and -1 with
1464 an exception set if the initialization failed.
1465 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001466
1467int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001468PyImport_ImportFrozenModule(char *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001469{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001470 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001471 PyObject *co;
1472 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001473 int ispackage;
1474 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001475
1476 if (p == NULL)
1477 return 0;
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001478 if (p->code == NULL) {
1479 PyErr_Format(PyExc_ImportError,
1480 "Excluded frozen object named %.200s",
1481 name);
1482 return -1;
1483 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001484 size = p->size;
1485 ispackage = (size < 0);
1486 if (ispackage)
1487 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001488 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001489 PySys_WriteStderr("import %s # frozen%s\n",
Guido van Rossuma5568d31998-03-05 03:45:08 +00001490 name, ispackage ? " package" : "");
1491 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001492 if (co == NULL)
1493 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001494 if (!PyCode_Check(co)) {
1495 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001496 PyErr_Format(PyExc_TypeError,
1497 "frozen object %.200s is not a code object",
1498 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001499 return -1;
1500 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001501 if (ispackage) {
1502 /* Set __path__ to the package name */
1503 PyObject *d, *s;
1504 int err;
1505 m = PyImport_AddModule(name);
1506 if (m == NULL)
1507 return -1;
1508 d = PyModule_GetDict(m);
1509 s = PyString_InternFromString(name);
1510 if (s == NULL)
1511 return -1;
1512 err = PyDict_SetItemString(d, "__path__", s);
1513 Py_DECREF(s);
1514 if (err != 0)
1515 return err;
1516 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001517 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001518 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001519 if (m == NULL)
1520 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001521 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001522 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001523}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001524
1525
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001526/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001527 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001528
Guido van Rossum79f25d91997-04-29 20:08:16 +00001529PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001530PyImport_ImportModule(char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00001531{
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00001532 PyObject *pname;
1533 PyObject *result;
1534
1535 pname = PyString_FromString(name);
1536 result = PyImport_Import(pname);
1537 Py_DECREF(pname);
1538 return result;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001539}
1540
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001541/* Forward declarations for helper routines */
Tim Petersdbd9ba62000-07-09 03:09:57 +00001542static PyObject *get_parent(PyObject *globals, char *buf, int *p_buflen);
1543static PyObject *load_next(PyObject *mod, PyObject *altmod,
1544 char **p_name, char *buf, int *p_buflen);
1545static int mark_miss(char *name);
1546static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
1547 char *buf, int buflen, int recursive);
1548static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001549
1550/* The Magnum Opus of dotted-name import :-) */
1551
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001552static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001553import_module_ex(char *name, PyObject *globals, PyObject *locals,
1554 PyObject *fromlist)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001555{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001556 char buf[MAXPATHLEN+1];
1557 int buflen = 0;
1558 PyObject *parent, *head, *next, *tail;
1559
1560 parent = get_parent(globals, buf, &buflen);
1561 if (parent == NULL)
1562 return NULL;
1563
1564 head = load_next(parent, Py_None, &name, buf, &buflen);
1565 if (head == NULL)
1566 return NULL;
1567
1568 tail = head;
1569 Py_INCREF(tail);
1570 while (name) {
1571 next = load_next(tail, tail, &name, buf, &buflen);
1572 Py_DECREF(tail);
1573 if (next == NULL) {
1574 Py_DECREF(head);
1575 return NULL;
1576 }
1577 tail = next;
1578 }
1579
1580 if (fromlist != NULL) {
1581 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1582 fromlist = NULL;
1583 }
1584
1585 if (fromlist == NULL) {
1586 Py_DECREF(tail);
1587 return head;
1588 }
1589
1590 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001591 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001592 Py_DECREF(tail);
1593 return NULL;
1594 }
1595
1596 return tail;
1597}
1598
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001599PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001600PyImport_ImportModuleEx(char *name, PyObject *globals, PyObject *locals,
1601 PyObject *fromlist)
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001602{
1603 PyObject *result;
1604 lock_import();
Guido van Rossumd65911b1998-03-03 22:33:27 +00001605 result = import_module_ex(name, globals, locals, fromlist);
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001606 unlock_import();
1607 return result;
1608}
1609
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001610static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001611get_parent(PyObject *globals, char *buf, int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001612{
1613 static PyObject *namestr = NULL;
1614 static PyObject *pathstr = NULL;
1615 PyObject *modname, *modpath, *modules, *parent;
1616
1617 if (globals == NULL || !PyDict_Check(globals))
1618 return Py_None;
1619
1620 if (namestr == NULL) {
1621 namestr = PyString_InternFromString("__name__");
1622 if (namestr == NULL)
1623 return NULL;
1624 }
1625 if (pathstr == NULL) {
1626 pathstr = PyString_InternFromString("__path__");
1627 if (pathstr == NULL)
1628 return NULL;
1629 }
1630
1631 *buf = '\0';
1632 *p_buflen = 0;
1633 modname = PyDict_GetItem(globals, namestr);
1634 if (modname == NULL || !PyString_Check(modname))
1635 return Py_None;
1636
1637 modpath = PyDict_GetItem(globals, pathstr);
1638 if (modpath != NULL) {
1639 int len = PyString_GET_SIZE(modname);
1640 if (len > MAXPATHLEN) {
1641 PyErr_SetString(PyExc_ValueError,
1642 "Module name too long");
1643 return NULL;
1644 }
1645 strcpy(buf, PyString_AS_STRING(modname));
1646 *p_buflen = len;
1647 }
1648 else {
1649 char *start = PyString_AS_STRING(modname);
1650 char *lastdot = strrchr(start, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001651 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001652 if (lastdot == NULL)
1653 return Py_None;
1654 len = lastdot - start;
1655 if (len >= MAXPATHLEN) {
1656 PyErr_SetString(PyExc_ValueError,
1657 "Module name too long");
1658 return NULL;
1659 }
1660 strncpy(buf, start, len);
1661 buf[len] = '\0';
1662 *p_buflen = len;
1663 }
1664
1665 modules = PyImport_GetModuleDict();
1666 parent = PyDict_GetItemString(modules, buf);
1667 if (parent == NULL)
1668 parent = Py_None;
1669 return parent;
1670 /* We expect, but can't guarantee, if parent != None, that:
1671 - parent.__name__ == buf
1672 - parent.__dict__ is globals
1673 If this is violated... Who cares? */
1674}
1675
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001676/* altmod is either None or same as mod */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001677static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001678load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
1679 int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001680{
1681 char *name = *p_name;
1682 char *dot = strchr(name, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001683 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001684 char *p;
1685 PyObject *result;
1686
1687 if (dot == NULL) {
1688 *p_name = NULL;
1689 len = strlen(name);
1690 }
1691 else {
1692 *p_name = dot+1;
1693 len = dot-name;
1694 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00001695 if (len == 0) {
1696 PyErr_SetString(PyExc_ValueError,
1697 "Empty module name");
1698 return NULL;
1699 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001700
1701 p = buf + *p_buflen;
1702 if (p != buf)
1703 *p++ = '.';
1704 if (p+len-buf >= MAXPATHLEN) {
1705 PyErr_SetString(PyExc_ValueError,
1706 "Module name too long");
1707 return NULL;
1708 }
1709 strncpy(p, name, len);
1710 p[len] = '\0';
1711 *p_buflen = p+len-buf;
1712
1713 result = import_submodule(mod, p, buf);
1714 if (result == Py_None && altmod != mod) {
1715 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001716 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001717 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001718 if (result != NULL && result != Py_None) {
1719 if (mark_miss(buf) != 0) {
1720 Py_DECREF(result);
1721 return NULL;
1722 }
1723 strncpy(buf, name, len);
1724 buf[len] = '\0';
1725 *p_buflen = len;
1726 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001727 }
1728 if (result == NULL)
1729 return NULL;
1730
1731 if (result == Py_None) {
1732 Py_DECREF(result);
1733 PyErr_Format(PyExc_ImportError,
1734 "No module named %.200s", name);
1735 return NULL;
1736 }
1737
1738 return result;
1739}
1740
1741static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001742mark_miss(char *name)
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001743{
1744 PyObject *modules = PyImport_GetModuleDict();
1745 return PyDict_SetItemString(modules, name, Py_None);
1746}
1747
1748static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001749ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, int buflen,
1750 int recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001751{
1752 int i;
1753
1754 if (!PyObject_HasAttrString(mod, "__path__"))
1755 return 1;
1756
1757 for (i = 0; ; i++) {
1758 PyObject *item = PySequence_GetItem(fromlist, i);
1759 int hasit;
1760 if (item == NULL) {
1761 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1762 PyErr_Clear();
1763 return 1;
1764 }
1765 return 0;
1766 }
1767 if (!PyString_Check(item)) {
1768 PyErr_SetString(PyExc_TypeError,
1769 "Item in ``from list'' not a string");
1770 Py_DECREF(item);
1771 return 0;
1772 }
1773 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001774 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001775 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001776 /* See if the package defines __all__ */
1777 if (recursive)
1778 continue; /* Avoid endless recursion */
1779 all = PyObject_GetAttrString(mod, "__all__");
1780 if (all == NULL)
1781 PyErr_Clear();
1782 else {
1783 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1784 return 0;
1785 Py_DECREF(all);
1786 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001787 continue;
1788 }
1789 hasit = PyObject_HasAttr(mod, item);
1790 if (!hasit) {
1791 char *subname = PyString_AS_STRING(item);
1792 PyObject *submod;
1793 char *p;
1794 if (buflen + strlen(subname) >= MAXPATHLEN) {
1795 PyErr_SetString(PyExc_ValueError,
1796 "Module name too long");
1797 Py_DECREF(item);
1798 return 0;
1799 }
1800 p = buf + buflen;
1801 *p++ = '.';
1802 strcpy(p, subname);
1803 submod = import_submodule(mod, subname, buf);
1804 Py_XDECREF(submod);
1805 if (submod == NULL) {
1806 Py_DECREF(item);
1807 return 0;
1808 }
1809 }
1810 Py_DECREF(item);
1811 }
1812
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001813 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001814}
1815
1816static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001817import_submodule(PyObject *mod, char *subname, char *fullname)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001818{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001819 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossumf48f11c2001-07-23 13:27:49 +00001820 PyObject *m, *res = NULL;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001821
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001822 /* Require:
1823 if mod == None: subname == fullname
1824 else: mod.__name__ + "." + subname == fullname
1825 */
1826
Tim Peters50d8d372001-02-28 05:34:27 +00001827 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001828 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001829 }
1830 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001831 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001832 char buf[MAXPATHLEN+1];
1833 struct filedescr *fdp;
1834 FILE *fp = NULL;
1835
Guido van Rossum9c0afe51998-05-19 15:09:05 +00001836 if (mod == Py_None)
1837 path = NULL;
1838 else {
1839 path = PyObject_GetAttrString(mod, "__path__");
1840 if (path == NULL) {
1841 PyErr_Clear();
1842 Py_INCREF(Py_None);
1843 return Py_None;
1844 }
1845 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001846
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001847 buf[0] = '\0';
Guido van Rossumb68cd421998-07-01 17:36:26 +00001848 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1849 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001850 if (fdp == NULL) {
1851 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1852 return NULL;
1853 PyErr_Clear();
1854 Py_INCREF(Py_None);
1855 return Py_None;
1856 }
1857 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001858 if (fp)
1859 fclose(fp);
Guido van Rossumf48f11c2001-07-23 13:27:49 +00001860 if (mod != Py_None) {
1861 /* Irrespective of the success of this load, make a
1862 reference to it in the parent package module.
1863 A copy gets saved in the modules dictionary
1864 under the full name, so get a reference from
1865 there, if need be. (The exception is when
1866 the load failed with a SyntaxError -- then
1867 there's no trace in sys.modules. In that case,
1868 of course, do nothing extra.) */
1869 res = m;
1870 if (res == NULL)
1871 res = PyDict_GetItemString(modules, fullname);
1872 if (res != NULL &&
1873 PyObject_SetAttrString(mod, subname, res) < 0) {
1874 Py_XDECREF(m);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001875 m = NULL;
1876 }
1877 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001878 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001879
1880 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001881}
1882
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001883
1884/* Re-import a module of any kind and return its module object, WITH
1885 INCREMENTED REFERENCE COUNT */
1886
Guido van Rossum79f25d91997-04-29 20:08:16 +00001887PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001888PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001889{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001890 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001891 PyObject *path = NULL;
1892 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001893 char buf[MAXPATHLEN+1];
1894 struct filedescr *fdp;
1895 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001896
Guido van Rossum79f25d91997-04-29 20:08:16 +00001897 if (m == NULL || !PyModule_Check(m)) {
1898 PyErr_SetString(PyExc_TypeError,
1899 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001900 return NULL;
1901 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001902 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001903 if (name == NULL)
1904 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001905 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001906 PyErr_Format(PyExc_ImportError,
1907 "reload(): module %.200s not in sys.modules",
1908 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001909 return NULL;
1910 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001911 subname = strrchr(name, '.');
1912 if (subname == NULL)
1913 subname = name;
1914 else {
1915 PyObject *parentname, *parent;
1916 parentname = PyString_FromStringAndSize(name, (subname-name));
1917 if (parentname == NULL)
1918 return NULL;
1919 parent = PyDict_GetItem(modules, parentname);
Barry Warsaw38793331999-01-27 17:54:20 +00001920 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00001921 if (parent == NULL) {
1922 PyErr_Format(PyExc_ImportError,
1923 "reload(): parent %.200s not in sys.modules",
1924 name);
1925 return NULL;
1926 }
1927 subname++;
1928 path = PyObject_GetAttrString(parent, "__path__");
1929 if (path == NULL)
1930 PyErr_Clear();
1931 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001932 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001933 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1934 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001935 if (fdp == NULL)
1936 return NULL;
1937 m = load_module(name, fp, buf, fdp->type);
1938 if (fp)
1939 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001940 return m;
1941}
1942
1943
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001944/* Higher-level import emulator which emulates the "import" statement
1945 more accurately -- it invokes the __import__() function from the
1946 builtins of the current globals. This means that the import is
1947 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00001948 environment, e.g. by "rexec".
1949 A dummy list ["__doc__"] is passed as the 4th argument so that
1950 e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
1951 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001952
1953PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001954PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001955{
1956 static PyObject *silly_list = NULL;
1957 static PyObject *builtins_str = NULL;
1958 static PyObject *import_str = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001959 PyObject *globals = NULL;
1960 PyObject *import = NULL;
1961 PyObject *builtins = NULL;
1962 PyObject *r = NULL;
1963
1964 /* Initialize constant string objects */
1965 if (silly_list == NULL) {
1966 import_str = PyString_InternFromString("__import__");
1967 if (import_str == NULL)
1968 return NULL;
1969 builtins_str = PyString_InternFromString("__builtins__");
1970 if (builtins_str == NULL)
1971 return NULL;
1972 silly_list = Py_BuildValue("[s]", "__doc__");
1973 if (silly_list == NULL)
1974 return NULL;
1975 }
1976
1977 /* Get the builtins from current globals */
1978 globals = PyEval_GetGlobals();
Guido van Rossum85cd1d62001-02-20 21:43:24 +00001979 if (globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00001980 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001981 builtins = PyObject_GetItem(globals, builtins_str);
1982 if (builtins == NULL)
1983 goto err;
1984 }
1985 else {
1986 /* No globals -- use standard builtins, and fake globals */
1987 PyErr_Clear();
1988
Guido van Rossum85cd1d62001-02-20 21:43:24 +00001989 builtins = PyImport_ImportModuleEx("__builtin__",
1990 NULL, NULL, NULL);
1991 if (builtins == NULL)
1992 return NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001993 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1994 if (globals == NULL)
1995 goto err;
1996 }
1997
1998 /* Get the __import__ function from the builtins */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001999 if (PyDict_Check(builtins)) {
Fred Drakea76ba6e2001-03-06 06:31:15 +00002000 import = PyObject_GetItem(builtins, import_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002001 if (import == NULL)
2002 PyErr_SetObject(PyExc_KeyError, import_str);
2003 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002004 else
Fred Drakea76ba6e2001-03-06 06:31:15 +00002005 import = PyObject_GetAttr(builtins, import_str);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002006 if (import == NULL)
2007 goto err;
2008
2009 /* Call the _import__ function with the proper argument list */
2010 r = PyObject_CallFunction(import, "OOOO",
2011 module_name, globals, globals, silly_list);
2012
2013 err:
2014 Py_XDECREF(globals);
2015 Py_XDECREF(builtins);
2016 Py_XDECREF(import);
Tim Peters50d8d372001-02-28 05:34:27 +00002017
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002018 return r;
2019}
2020
2021
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002022/* Module 'imp' provides Python access to the primitives used for
2023 importing modules.
2024*/
2025
Guido van Rossum79f25d91997-04-29 20:08:16 +00002026static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002027imp_get_magic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002028{
2029 char buf[4];
2030
Guido van Rossum43713e52000-02-29 13:59:29 +00002031 if (!PyArg_ParseTuple(args, ":get_magic"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002032 return NULL;
Guido van Rossum96774c12000-05-01 20:19:08 +00002033 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
2034 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
2035 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
2036 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002037
Guido van Rossum79f25d91997-04-29 20:08:16 +00002038 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002039}
2040
Guido van Rossum79f25d91997-04-29 20:08:16 +00002041static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002042imp_get_suffixes(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002043{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002044 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002045 struct filedescr *fdp;
2046
Guido van Rossum43713e52000-02-29 13:59:29 +00002047 if (!PyArg_ParseTuple(args, ":get_suffixes"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002048 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002049 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002050 if (list == NULL)
2051 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002052 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
2053 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002054 fdp->suffix, fdp->mode, fdp->type);
2055 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002056 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002057 return NULL;
2058 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002059 if (PyList_Append(list, item) < 0) {
2060 Py_DECREF(list);
2061 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002062 return NULL;
2063 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002064 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002065 }
2066 return list;
2067}
2068
Guido van Rossum79f25d91997-04-29 20:08:16 +00002069static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002070call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002071{
Tim Petersdbd9ba62000-07-09 03:09:57 +00002072 extern int fclose(FILE *);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002073 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002074 struct filedescr *fdp;
2075 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002076 FILE *fp = NULL;
2077
2078 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002079 if (path == Py_None)
2080 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002081 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
2082 if (fdp == NULL)
2083 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002084 if (fp != NULL) {
2085 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
2086 if (fob == NULL) {
2087 fclose(fp);
2088 return NULL;
2089 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002090 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002091 else {
2092 fob = Py_None;
2093 Py_INCREF(fob);
Tim Peters50d8d372001-02-28 05:34:27 +00002094 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002095 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002096 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002097 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002098 return ret;
2099}
2100
Guido van Rossum79f25d91997-04-29 20:08:16 +00002101static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002102imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002103{
2104 char *name;
2105 PyObject *path = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002106 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002107 return NULL;
2108 return call_find_module(name, path);
2109}
2110
2111static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002112imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002113{
2114 char *name;
2115 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002116 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002117 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002118 return NULL;
2119 ret = init_builtin(name);
2120 if (ret < 0)
2121 return NULL;
2122 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002123 Py_INCREF(Py_None);
2124 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002125 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002126 m = PyImport_AddModule(name);
2127 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002128 return m;
2129}
2130
Guido van Rossum79f25d91997-04-29 20:08:16 +00002131static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002132imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002133{
2134 char *name;
2135 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002136 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002137 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002138 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002139 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002140 if (ret < 0)
2141 return NULL;
2142 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002143 Py_INCREF(Py_None);
2144 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002145 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002146 m = PyImport_AddModule(name);
2147 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002148 return m;
2149}
2150
Guido van Rossum79f25d91997-04-29 20:08:16 +00002151static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002152imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002153{
2154 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002155
Guido van Rossum43713e52000-02-29 13:59:29 +00002156 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002157 return NULL;
2158 return get_frozen_object(name);
2159}
2160
Guido van Rossum79f25d91997-04-29 20:08:16 +00002161static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002162imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002163{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002164 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002165 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002166 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002167 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002168}
2169
Guido van Rossum79f25d91997-04-29 20:08:16 +00002170static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002171imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002172{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002173 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002174 struct _frozen *p;
Guido van Rossum43713e52000-02-29 13:59:29 +00002175 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002176 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002177 p = find_frozen(name);
2178 return PyInt_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002179}
2180
2181static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002182get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002183{
2184 FILE *fp;
2185 if (fob == NULL) {
2186 fp = fopen(pathname, mode);
2187 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002188 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002189 }
2190 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002191 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002192 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002193 PyErr_SetString(PyExc_ValueError,
2194 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002195 }
2196 return fp;
2197}
2198
Guido van Rossum79f25d91997-04-29 20:08:16 +00002199static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002200imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002201{
2202 char *name;
2203 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002204 PyObject *fob = NULL;
2205 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002206 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002207 if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002208 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002209 return NULL;
2210 fp = get_file(pathname, fob, "rb");
2211 if (fp == NULL)
2212 return NULL;
2213 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002214 if (fob == NULL)
2215 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002216 return m;
2217}
2218
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002219#ifdef HAVE_DYNAMIC_LOADING
2220
Guido van Rossum79f25d91997-04-29 20:08:16 +00002221static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002222imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002223{
2224 char *name;
2225 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002226 PyObject *fob = NULL;
2227 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002228 FILE *fp = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002229 if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002230 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002231 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002232 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002233 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002234 if (fp == NULL)
2235 return NULL;
2236 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002237 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002238 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002239}
2240
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002241#endif /* HAVE_DYNAMIC_LOADING */
2242
Guido van Rossum79f25d91997-04-29 20:08:16 +00002243static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002244imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002245{
2246 char *name;
2247 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002248 PyObject *fob = NULL;
2249 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002250 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002251 if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002252 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002253 return NULL;
2254 fp = get_file(pathname, fob, "r");
2255 if (fp == NULL)
2256 return NULL;
2257 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002258 if (fob == NULL)
2259 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002260 return m;
2261}
2262
Jack Jansen9c96a921995-02-15 22:57:06 +00002263#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002264static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002265imp_load_resource(PyObject *self, PyObject *args)
Jack Jansen9c96a921995-02-15 22:57:06 +00002266{
2267 char *name;
2268 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002269 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002270
Guido van Rossum43713e52000-02-29 13:59:29 +00002271 if (!PyArg_ParseTuple(args, "ss:load_resource", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002272 return NULL;
2273 m = PyMac_LoadResourceModule(name, pathname);
2274 return m;
2275}
2276#endif /* macintosh */
2277
Guido van Rossum79f25d91997-04-29 20:08:16 +00002278static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002279imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002280{
2281 char *name;
2282 PyObject *fob;
2283 char *pathname;
2284 char *suffix; /* Unused */
2285 char *mode;
2286 int type;
2287 FILE *fp;
2288
Guido van Rossum43713e52000-02-29 13:59:29 +00002289 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002290 &name, &fob, &pathname,
2291 &suffix, &mode, &type))
2292 return NULL;
2293 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
2294 PyErr_Format(PyExc_ValueError,
2295 "invalid file open mode %.200s", mode);
2296 return NULL;
2297 }
2298 if (fob == Py_None)
2299 fp = NULL;
2300 else {
2301 if (!PyFile_Check(fob)) {
2302 PyErr_SetString(PyExc_ValueError,
2303 "load_module arg#2 should be a file or None");
2304 return NULL;
2305 }
2306 fp = get_file(pathname, fob, mode);
2307 if (fp == NULL)
2308 return NULL;
2309 }
2310 return load_module(name, fp, pathname, type);
2311}
2312
2313static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002314imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002315{
2316 char *name;
2317 char *pathname;
Guido van Rossum43713e52000-02-29 13:59:29 +00002318 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002319 return NULL;
2320 return load_package(name, pathname);
2321}
2322
2323static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002324imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002325{
2326 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002327 if (!PyArg_ParseTuple(args, "s:new_module", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002328 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002329 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002330}
2331
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002332/* Doc strings */
2333
2334static char doc_imp[] = "\
2335This module provides the components needed to build your own\n\
2336__import__ function. Undocumented functions are obsolete.\n\
2337";
2338
2339static char doc_find_module[] = "\
2340find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
2341Search for a module. If path is omitted or None, search for a\n\
2342built-in, frozen or special module and continue search in sys.path.\n\
2343The module name cannot contain '.'; to search for a submodule of a\n\
2344package, pass the submodule name and the package's __path__.\
2345";
2346
2347static char doc_load_module[] = "\
2348load_module(name, file, filename, (suffix, mode, type)) -> module\n\
2349Load a module, given information returned by find_module().\n\
2350The module name must include the full package name, if any.\
2351";
2352
2353static char doc_get_magic[] = "\
2354get_magic() -> string\n\
2355Return the magic number for .pyc or .pyo files.\
2356";
2357
2358static char doc_get_suffixes[] = "\
2359get_suffixes() -> [(suffix, mode, type), ...]\n\
2360Return a list of (suffix, mode, type) tuples describing the files\n\
2361that find_module() looks for.\
2362";
2363
2364static char doc_new_module[] = "\
2365new_module(name) -> module\n\
2366Create a new module. Do not enter it in sys.modules.\n\
2367The module name must include the full package name, if any.\
2368";
2369
Tim Peters69232342001-08-30 05:16:13 +00002370static char doc_lock_held[] = "\
2371lock_held() -> 0 or 1\n\
2372Return 1 if the import lock is currently held.\n\
2373On platforms without threads, return 0.\
2374";
2375
Guido van Rossum79f25d91997-04-29 20:08:16 +00002376static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002377 {"find_module", imp_find_module, 1, doc_find_module},
2378 {"get_magic", imp_get_magic, 1, doc_get_magic},
2379 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2380 {"load_module", imp_load_module, 1, doc_load_module},
2381 {"new_module", imp_new_module, 1, doc_new_module},
Tim Peters69232342001-08-30 05:16:13 +00002382 {"lock_held", imp_lock_held, 1, doc_lock_held},
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002383 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002384 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002385 {"init_builtin", imp_init_builtin, 1},
2386 {"init_frozen", imp_init_frozen, 1},
2387 {"is_builtin", imp_is_builtin, 1},
2388 {"is_frozen", imp_is_frozen, 1},
2389 {"load_compiled", imp_load_compiled, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002390#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002391 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002392#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002393 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002394#ifdef macintosh
2395 {"load_resource", imp_load_resource, 1},
2396#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002397 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002398 {NULL, NULL} /* sentinel */
2399};
2400
Guido van Rossum1a8791e1998-08-04 22:46:29 +00002401static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002402setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002403{
2404 PyObject *v;
2405 int err;
2406
2407 v = PyInt_FromLong((long)value);
2408 err = PyDict_SetItemString(d, name, v);
2409 Py_XDECREF(v);
2410 return err;
2411}
2412
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002413void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002414initimp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002415{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002416 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002417
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002418 m = Py_InitModule4("imp", imp_methods, doc_imp,
2419 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002420 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002421
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002422 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2423 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2424 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2425 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2426 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2427 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2428 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2429 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00002430 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002431
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002432 failure:
2433 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002434}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002435
2436
Guido van Rossumb18618d2000-05-03 23:44:39 +00002437/* API for embedding applications that want to add their own entries
2438 to the table of built-in modules. This should normally be called
2439 *before* Py_Initialize(). When the table resize fails, -1 is
2440 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002441
2442 After a similar function by Just van Rossum. */
2443
2444int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002445PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002446{
2447 static struct _inittab *our_copy = NULL;
2448 struct _inittab *p;
2449 int i, n;
2450
2451 /* Count the number of entries in both tables */
2452 for (n = 0; newtab[n].name != NULL; n++)
2453 ;
2454 if (n == 0)
2455 return 0; /* Nothing to do */
2456 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2457 ;
2458
2459 /* Allocate new memory for the combined table */
Guido van Rossumb18618d2000-05-03 23:44:39 +00002460 p = our_copy;
2461 PyMem_RESIZE(p, struct _inittab, i+n+1);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002462 if (p == NULL)
2463 return -1;
2464
2465 /* Copy the tables into the new memory */
2466 if (our_copy != PyImport_Inittab)
2467 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2468 PyImport_Inittab = our_copy = p;
2469 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
2470
2471 return 0;
2472}
2473
2474/* Shorthand to add a single entry given a name and a function */
2475
2476int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002477PyImport_AppendInittab(char *name, void (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002478{
2479 struct _inittab newtab[2];
2480
2481 memset(newtab, '\0', sizeof newtab);
2482
2483 newtab[0].name = name;
2484 newtab[0].initfunc = initfunc;
2485
2486 return PyImport_ExtendInittab(newtab);
2487}