blob: a1cd16db5c33ed6c6f02148f419560f383ef9ef9 [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) {
880 PyErr_SetString(PyExc_OverflowError, "module name is too long");
881 return NULL;
882 }
Guido van Rossum0506a431998-08-11 15:07:39 +0000883 strcpy(name, realname);
884
885 if (path != NULL && PyString_Check(path)) {
886 /* Submodule of "frozen" package:
887 Set name to the fullname, path to NULL
888 and continue as "usual" */
889 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);
898 path = NULL;
899 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000900 if (path == NULL) {
901 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000902 strcpy(buf, name);
903 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000904 }
Greg Ward201baee2001-10-04 14:52:06 +0000905 if ((find_frozen(name)) != NULL) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000906 strcpy(buf, name);
907 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000908 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000909
Guido van Rossumac279101996-08-22 23:10:58 +0000910#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000911 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
912 if (fp != NULL) {
913 *p_fp = fp;
914 return fdp;
915 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000916#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000917 path = PySys_GetObject("path");
918 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000919 if (path == NULL || !PyList_Check(path)) {
920 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +0000921 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000922 return NULL;
923 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000924 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000925 namelen = strlen(name);
926 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000927 PyObject *v = PyList_GetItem(path, i);
928 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000929 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000930 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000931 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000932 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000933 strcpy(buf, PyString_AsString(v));
Fred Drake4c82b232000-06-30 16:18:57 +0000934 if (strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000935 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000936#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000937#ifdef INTERN_STRINGS
Tim Peters50d8d372001-02-28 05:34:27 +0000938 /*
Guido van Rossum741689d1997-08-12 14:53:39 +0000939 ** Speedup: each sys.path item is interned, and
940 ** FindResourceModule remembers which items refer to
941 ** folders (so we don't have to bother trying to look
Tim Peters50d8d372001-02-28 05:34:27 +0000942 ** into them for resources).
Guido van Rossum741689d1997-08-12 14:53:39 +0000943 */
944 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
945 v = PyList_GET_ITEM(path, i);
946#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000947 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000948 static struct filedescr resfiledescr =
949 {"", "", PY_RESOURCE};
Tim Peters50d8d372001-02-28 05:34:27 +0000950
Jack Jansen9c96a921995-02-15 22:57:06 +0000951 return &resfiledescr;
952 }
Guido van Rossum0f84a341998-08-06 13:36:01 +0000953 if (PyMac_FindCodeResourceModule((PyStringObject *)v, name, buf)) {
954 static struct filedescr resfiledescr =
955 {"", "", PY_CODERESOURCE};
Tim Peters50d8d372001-02-28 05:34:27 +0000956
Guido van Rossum0f84a341998-08-06 13:36:01 +0000957 return &resfiledescr;
958 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000959#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000960 if (len > 0 && buf[len-1] != SEP
961#ifdef ALTSEP
962 && buf[len-1] != ALTSEP
963#endif
964 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000965 buf[len++] = SEP;
Guido van Rossum215c3402000-11-13 17:26:32 +0000966 strcpy(buf+len, name);
967 len += namelen;
Tim Peters50d8d372001-02-28 05:34:27 +0000968
969 /* Check for package import (buf holds a directory name,
970 and there's an __init__ module in that directory */
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000971#ifdef HAVE_STAT
Tim Peterscab3f682001-04-29 22:21:25 +0000972 if (stat(buf, &statbuf) == 0 && /* it exists */
973 S_ISDIR(statbuf.st_mode) && /* it's a directory */
974 find_init_module(buf) && /* it has __init__.py */
975 case_ok(buf, len, namelen, name)) /* and case matches */
976 return &fd_package;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000977#else
978 /* XXX How are you going to test for directories? */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000979#ifdef RISCOS
980 {
981 static struct filedescr fd = {"", "", PKG_DIRECTORY};
982 if (isdir(buf)) {
983 if (find_init_module(buf))
984 return &fd;
985 }
986 }
987#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000988#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000989#ifdef macintosh
990 fdp = PyMac_FindModuleExtension(buf, &len, name);
Jack Jansen4df3c522001-03-20 23:09:54 +0000991 if (fdp) {
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000992#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000993 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000994 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000995 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000996 PySys_WriteStderr("# trying %s\n", buf);
Jack Jansen4df3c522001-03-20 23:09:54 +0000997#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000998 fp = fopen(buf, fdp->mode);
Tim Peters50d8d372001-02-28 05:34:27 +0000999 if (fp != NULL) {
1000 if (case_ok(buf, len, namelen, name))
1001 break;
1002 else { /* continue search */
1003 fclose(fp);
1004 fp = NULL;
Barry Warsaw914a0b12001-02-02 19:12:16 +00001005 }
Barry Warsaw914a0b12001-02-02 19:12:16 +00001006 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001007 }
1008 if (fp != NULL)
1009 break;
1010 }
1011 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001012 PyErr_Format(PyExc_ImportError,
1013 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001014 return NULL;
1015 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001016 *p_fp = fp;
1017 return fdp;
1018}
1019
Tim Petersd1e87a82001-03-01 18:12:00 +00001020/* case_ok(char* buf, int len, int namelen, char* name)
1021 * The arguments here are tricky, best shown by example:
1022 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1023 * ^ ^ ^ ^
1024 * |--------------------- buf ---------------------|
1025 * |------------------- len ------------------|
1026 * |------ name -------|
1027 * |----- namelen -----|
1028 * buf is the full path, but len only counts up to (& exclusive of) the
1029 * extension. name is the module name, also exclusive of extension.
1030 *
1031 * We've already done a successful stat() or fopen() on buf, so know that
1032 * there's some match, possibly case-insensitive.
1033 *
Tim Peters50d8d372001-02-28 05:34:27 +00001034 * case_ok() is to return 1 if there's a case-sensitive match for
1035 * name, else 0. case_ok() is also to return 1 if envar PYTHONCASEOK
1036 * exists.
Tim Petersd1e87a82001-03-01 18:12:00 +00001037 *
Tim Peters50d8d372001-02-28 05:34:27 +00001038 * case_ok() is used to implement case-sensitive import semantics even
1039 * on platforms with case-insensitive filesystems. It's trivial to implement
1040 * for case-sensitive filesystems. It's pretty much a cross-platform
1041 * nightmare for systems with case-insensitive filesystems.
1042 */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001043
Tim Peters50d8d372001-02-28 05:34:27 +00001044/* First we may need a pile of platform-specific header files; the sequence
1045 * of #if's here should match the sequence in the body of case_ok().
1046 */
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001047#if defined(MS_WIN32) || defined(__CYGWIN__)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001048#include <windows.h>
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001049#ifdef __CYGWIN__
1050#include <sys/cygwin.h>
1051#endif
1052
Tim Peters50d8d372001-02-28 05:34:27 +00001053#elif defined(DJGPP)
1054#include <dir.h>
1055
1056#elif defined(macintosh)
1057#include <TextUtils.h>
1058#ifdef USE_GUSI1
1059#include "TFileSpec.h" /* for Path2FSSpec() */
1060#endif
1061
Tim Petersd1e87a82001-03-01 18:12:00 +00001062#elif defined(__MACH__) && defined(__APPLE__) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001063#include <sys/types.h>
1064#include <dirent.h>
1065
Tim Peters50d8d372001-02-28 05:34:27 +00001066#endif
1067
Guido van Rossum0980bd91998-02-13 17:18:36 +00001068static int
Tim Peters50d8d372001-02-28 05:34:27 +00001069case_ok(char *buf, int len, int namelen, char *name)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001070{
Tim Peters50d8d372001-02-28 05:34:27 +00001071/* Pick a platform-specific implementation; the sequence of #if's here should
1072 * match the sequence just above.
1073 */
1074
1075/* MS_WIN32 || __CYGWIN__ */
1076#if defined(MS_WIN32) || defined(__CYGWIN__)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001077 WIN32_FIND_DATA data;
1078 HANDLE h;
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001079#ifdef __CYGWIN__
1080 char tempbuf[MAX_PATH];
1081#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001082
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001083 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001084 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001085
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001086#ifdef __CYGWIN__
1087 cygwin32_conv_to_win32_path(buf, tempbuf);
1088 h = FindFirstFile(tempbuf, &data);
1089#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001090 h = FindFirstFile(buf, &data);
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001091#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001092 if (h == INVALID_HANDLE_VALUE) {
1093 PyErr_Format(PyExc_NameError,
1094 "Can't find file for module %.100s\n(filename %.300s)",
1095 name, buf);
1096 return 0;
1097 }
1098 FindClose(h);
Tim Peters50d8d372001-02-28 05:34:27 +00001099 return strncmp(data.cFileName, name, namelen) == 0;
1100
1101/* DJGPP */
1102#elif defined(DJGPP)
1103 struct ffblk ffblk;
1104 int done;
1105
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001106 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001107 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001108
1109 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
1110 if (done) {
Guido van Rossum0980bd91998-02-13 17:18:36 +00001111 PyErr_Format(PyExc_NameError,
Tim Peters50d8d372001-02-28 05:34:27 +00001112 "Can't find file for module %.100s\n(filename %.300s)",
Guido van Rossum0980bd91998-02-13 17:18:36 +00001113 name, buf);
1114 return 0;
1115 }
Tim Peters50d8d372001-02-28 05:34:27 +00001116 return strncmp(ffblk.ff_name, name, namelen) == 0;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001117
Tim Peters50d8d372001-02-28 05:34:27 +00001118/* macintosh */
1119#elif defined(macintosh)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001120 FSSpec fss;
1121 OSErr err;
Tim Peters50d8d372001-02-28 05:34:27 +00001122
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001123 if (Py_GETENV("PYTHONCASEOK") != NULL)
Tim Peters50d8d372001-02-28 05:34:27 +00001124 return 1;
1125
Guido van Rossumb33aa1a2000-04-24 15:08:18 +00001126#ifndef USE_GUSI1
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001127 err = FSMakeFSSpec(0, 0, Pstring(buf), &fss);
1128#else
1129 /* GUSI's Path2FSSpec() resolves all possible aliases nicely on
1130 the way, which is fine for all directories, but here we need
1131 the original name of the alias file (say, Dlg.ppc.slb, not
1132 toolboxmodules.ppc.slb). */
1133 char *colon;
1134 err = Path2FSSpec(buf, &fss);
1135 if (err == noErr) {
1136 colon = strrchr(buf, ':'); /* find filename */
1137 if (colon != NULL)
1138 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1139 Pstring(colon+1), &fss);
1140 else
1141 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1142 fss.name, &fss);
1143 }
1144#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001145 if (err) {
1146 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001147 "Can't find file for module %.100s\n(filename %.300s)",
1148 name, buf);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001149 return 0;
1150 }
Tim Peters50d8d372001-02-28 05:34:27 +00001151 return fss.name[0] >= namelen &&
1152 strncmp(name, (char *)fss.name+1, namelen) == 0;
1153
Tim Peters677898a2001-03-02 03:28:03 +00001154/* new-fangled macintosh (macosx) */
Tim Petersd1e87a82001-03-01 18:12:00 +00001155#elif defined(__MACH__) && defined(__APPLE__) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001156 DIR *dirp;
1157 struct dirent *dp;
Tim Petersd1e87a82001-03-01 18:12:00 +00001158 char dirname[MAXPATHLEN + 1];
1159 const int dirlen = len - namelen - 1; /* don't want trailing SEP */
Tim Peters430f5d42001-03-01 01:30:56 +00001160
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001161 if (Py_GETENV("PYTHONCASEOK") != NULL)
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001162 return 1;
1163
Tim Petersd1e87a82001-03-01 18:12:00 +00001164 /* Copy the dir component into dirname; substitute "." if empty */
1165 if (dirlen <= 0) {
1166 dirname[0] = '.';
1167 dirname[1] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001168 }
1169 else {
Tim Petersd1e87a82001-03-01 18:12:00 +00001170 assert(dirlen <= MAXPATHLEN);
1171 memcpy(dirname, buf, dirlen);
1172 dirname[dirlen] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001173 }
1174 /* Open the directory and search the entries for an exact match. */
Tim Petersd1e87a82001-03-01 18:12:00 +00001175 dirp = opendir(dirname);
Tim Peters430f5d42001-03-01 01:30:56 +00001176 if (dirp) {
Tim Peters677898a2001-03-02 03:28:03 +00001177 char *nameWithExt = buf + len - namelen;
Tim Peters430f5d42001-03-01 01:30:56 +00001178 while ((dp = readdir(dirp)) != NULL) {
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001179 const int thislen =
Tim Peters430f5d42001-03-01 01:30:56 +00001180#ifdef _DIRENT_HAVE_D_NAMELEN
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001181 dp->d_namlen;
Tim Peters430f5d42001-03-01 01:30:56 +00001182#else
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001183 strlen(dp->d_name);
Tim Peters430f5d42001-03-01 01:30:56 +00001184#endif
Tim Petersd1e87a82001-03-01 18:12:00 +00001185 if (thislen >= namelen &&
Tim Peters677898a2001-03-02 03:28:03 +00001186 strcmp(dp->d_name, nameWithExt) == 0) {
Tim Peters430f5d42001-03-01 01:30:56 +00001187 (void)closedir(dirp);
1188 return 1; /* Found */
1189 }
1190 }
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001191 (void)closedir(dirp);
Tim Peters430f5d42001-03-01 01:30:56 +00001192 }
Tim Peters430f5d42001-03-01 01:30:56 +00001193 return 0 ; /* Not found */
Tim Peters430f5d42001-03-01 01:30:56 +00001194
Tim Peters50d8d372001-02-28 05:34:27 +00001195/* assuming it's a case-sensitive filesystem, so there's nothing to do! */
1196#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001197 return 1;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001198
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001199#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001200}
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001201
Guido van Rossum0980bd91998-02-13 17:18:36 +00001202
Guido van Rossum197346f1997-10-31 18:38:52 +00001203#ifdef HAVE_STAT
1204/* Helper to look for __init__.py or __init__.py[co] in potential package */
1205static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001206find_init_module(char *buf)
Guido van Rossum197346f1997-10-31 18:38:52 +00001207{
Tim Peters0f9431f2001-07-05 03:47:53 +00001208 const size_t save_len = strlen(buf);
Fred Drake4c82b232000-06-30 16:18:57 +00001209 size_t i = save_len;
Tim Peters0f9431f2001-07-05 03:47:53 +00001210 char *pname; /* pointer to start of __init__ */
Guido van Rossum197346f1997-10-31 18:38:52 +00001211 struct stat statbuf;
1212
Tim Peters0f9431f2001-07-05 03:47:53 +00001213/* For calling case_ok(buf, len, namelen, name):
1214 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1215 * ^ ^ ^ ^
1216 * |--------------------- buf ---------------------|
1217 * |------------------- len ------------------|
1218 * |------ name -------|
1219 * |----- namelen -----|
1220 */
Guido van Rossum197346f1997-10-31 18:38:52 +00001221 if (save_len + 13 >= MAXPATHLEN)
1222 return 0;
1223 buf[i++] = SEP;
Tim Peters0f9431f2001-07-05 03:47:53 +00001224 pname = buf + i;
1225 strcpy(pname, "__init__.py");
Guido van Rossum197346f1997-10-31 18:38:52 +00001226 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001227 if (case_ok(buf,
1228 save_len + 9, /* len("/__init__") */
1229 8, /* len("__init__") */
1230 pname)) {
1231 buf[save_len] = '\0';
1232 return 1;
1233 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001234 }
Tim Peters0f9431f2001-07-05 03:47:53 +00001235 i += strlen(pname);
1236 strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum197346f1997-10-31 18:38:52 +00001237 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001238 if (case_ok(buf,
1239 save_len + 9, /* len("/__init__") */
1240 8, /* len("__init__") */
1241 pname)) {
1242 buf[save_len] = '\0';
1243 return 1;
1244 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001245 }
1246 buf[save_len] = '\0';
1247 return 0;
1248}
Guido van Rossum48a680c2001-03-02 06:34:14 +00001249
1250#else
1251
1252#ifdef RISCOS
1253static int
1254find_init_module(buf)
1255 char *buf;
1256{
1257 int save_len = strlen(buf);
1258 int i = save_len;
1259
1260 if (save_len + 13 >= MAXPATHLEN)
1261 return 0;
1262 buf[i++] = SEP;
1263 strcpy(buf+i, "__init__/py");
1264 if (isfile(buf)) {
1265 buf[save_len] = '\0';
1266 return 1;
1267 }
1268
1269 if (Py_OptimizeFlag)
1270 strcpy(buf+i, "o");
1271 else
1272 strcpy(buf+i, "c");
1273 if (isfile(buf)) {
1274 buf[save_len] = '\0';
1275 return 1;
1276 }
1277 buf[save_len] = '\0';
1278 return 0;
1279}
1280#endif /*RISCOS*/
1281
Guido van Rossum197346f1997-10-31 18:38:52 +00001282#endif /* HAVE_STAT */
1283
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001284
Tim Petersdbd9ba62000-07-09 03:09:57 +00001285static int init_builtin(char *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001286
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001287/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001288 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001289
Guido van Rossum79f25d91997-04-29 20:08:16 +00001290static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001291load_module(char *name, FILE *fp, char *buf, int type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001292{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001293 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001294 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001295 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001296
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001297 /* First check that there's an open file (if we need one) */
1298 switch (type) {
1299 case PY_SOURCE:
1300 case PY_COMPILED:
1301 if (fp == NULL) {
1302 PyErr_Format(PyExc_ValueError,
1303 "file object required for import (type code %d)",
1304 type);
1305 return NULL;
1306 }
1307 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001308
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001309 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001310
1311 case PY_SOURCE:
1312 m = load_source_module(name, buf, fp);
1313 break;
1314
1315 case PY_COMPILED:
1316 m = load_compiled_module(name, buf, fp);
1317 break;
1318
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001319#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001320 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001321 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001322 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001323#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001324
Jack Jansen9c96a921995-02-15 22:57:06 +00001325#ifdef macintosh
1326 case PY_RESOURCE:
1327 m = PyMac_LoadResourceModule(name, buf);
1328 break;
Guido van Rossum0f84a341998-08-06 13:36:01 +00001329 case PY_CODERESOURCE:
1330 m = PyMac_LoadCodeResourceModule(name, buf);
1331 break;
Jack Jansen9c96a921995-02-15 22:57:06 +00001332#endif
1333
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001334 case PKG_DIRECTORY:
1335 m = load_package(name, buf);
1336 break;
1337
1338 case C_BUILTIN:
1339 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001340 if (buf != NULL && buf[0] != '\0')
1341 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001342 if (type == C_BUILTIN)
1343 err = init_builtin(name);
1344 else
1345 err = PyImport_ImportFrozenModule(name);
1346 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001347 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001348 if (err == 0) {
1349 PyErr_Format(PyExc_ImportError,
1350 "Purported %s module %.200s not found",
1351 type == C_BUILTIN ?
1352 "builtin" : "frozen",
1353 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001354 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001355 }
1356 modules = PyImport_GetModuleDict();
1357 m = PyDict_GetItemString(modules, name);
1358 if (m == NULL) {
1359 PyErr_Format(
1360 PyExc_ImportError,
1361 "%s module %.200s not properly initialized",
1362 type == C_BUILTIN ?
1363 "builtin" : "frozen",
1364 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001365 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001366 }
1367 Py_INCREF(m);
1368 break;
1369
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001370 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001371 PyErr_Format(PyExc_ImportError,
1372 "Don't know how to import %.200s (type code %d)",
1373 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001374 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001375
1376 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001377
1378 return m;
1379}
1380
1381
1382/* Initialize a built-in module.
1383 Return 1 for succes, 0 if the module is not found, and -1 with
1384 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001385
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001386static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001387init_builtin(char *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001388{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001389 struct _inittab *p;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001390
Greg Ward201baee2001-10-04 14:52:06 +00001391 if (_PyImport_FindExtension(name, name) != NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00001392 return 1;
1393
Guido van Rossum771c6c81997-10-31 18:37:24 +00001394 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001395 if (strcmp(name, p->name) == 0) {
1396 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001397 PyErr_Format(PyExc_ImportError,
1398 "Cannot re-init internal module %.200s",
1399 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001400 return -1;
1401 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001402 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001403 PySys_WriteStderr("import %s # builtin\n", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001404 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001405 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001406 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001407 if (_PyImport_FixupExtension(name, name) == NULL)
1408 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001409 return 1;
1410 }
1411 }
1412 return 0;
1413}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001414
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001415
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001416/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001417
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001418static struct _frozen *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001419find_frozen(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001420{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001421 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001422
Guido van Rossum79f25d91997-04-29 20:08:16 +00001423 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001424 if (p->name == NULL)
1425 return NULL;
1426 if (strcmp(p->name, name) == 0)
1427 break;
1428 }
1429 return p;
1430}
1431
Guido van Rossum79f25d91997-04-29 20:08:16 +00001432static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001433get_frozen_object(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001434{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001435 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001436 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001437
1438 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001439 PyErr_Format(PyExc_ImportError,
1440 "No such frozen object named %.200s",
1441 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001442 return NULL;
1443 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001444 size = p->size;
1445 if (size < 0)
1446 size = -size;
1447 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001448}
1449
1450/* Initialize a frozen module.
1451 Return 1 for succes, 0 if the module is not found, and -1 with
1452 an exception set if the initialization failed.
1453 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001454
1455int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001456PyImport_ImportFrozenModule(char *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001457{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001458 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001459 PyObject *co;
1460 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001461 int ispackage;
1462 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001463
1464 if (p == NULL)
1465 return 0;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001466 size = p->size;
1467 ispackage = (size < 0);
1468 if (ispackage)
1469 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001470 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001471 PySys_WriteStderr("import %s # frozen%s\n",
Guido van Rossuma5568d31998-03-05 03:45:08 +00001472 name, ispackage ? " package" : "");
1473 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001474 if (co == NULL)
1475 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001476 if (!PyCode_Check(co)) {
1477 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001478 PyErr_Format(PyExc_TypeError,
1479 "frozen object %.200s is not a code object",
1480 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001481 return -1;
1482 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001483 if (ispackage) {
1484 /* Set __path__ to the package name */
1485 PyObject *d, *s;
1486 int err;
1487 m = PyImport_AddModule(name);
1488 if (m == NULL)
1489 return -1;
1490 d = PyModule_GetDict(m);
1491 s = PyString_InternFromString(name);
1492 if (s == NULL)
1493 return -1;
1494 err = PyDict_SetItemString(d, "__path__", s);
1495 Py_DECREF(s);
1496 if (err != 0)
1497 return err;
1498 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001499 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001500 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001501 if (m == NULL)
1502 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001503 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001504 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001505}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001506
1507
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001508/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001509 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001510
Guido van Rossum79f25d91997-04-29 20:08:16 +00001511PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001512PyImport_ImportModule(char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00001513{
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00001514 PyObject *pname;
1515 PyObject *result;
1516
1517 pname = PyString_FromString(name);
1518 result = PyImport_Import(pname);
1519 Py_DECREF(pname);
1520 return result;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001521}
1522
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001523/* Forward declarations for helper routines */
Tim Petersdbd9ba62000-07-09 03:09:57 +00001524static PyObject *get_parent(PyObject *globals, char *buf, int *p_buflen);
1525static PyObject *load_next(PyObject *mod, PyObject *altmod,
1526 char **p_name, char *buf, int *p_buflen);
1527static int mark_miss(char *name);
1528static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
1529 char *buf, int buflen, int recursive);
1530static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001531
1532/* The Magnum Opus of dotted-name import :-) */
1533
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001534static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001535import_module_ex(char *name, PyObject *globals, PyObject *locals,
1536 PyObject *fromlist)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001537{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001538 char buf[MAXPATHLEN+1];
1539 int buflen = 0;
1540 PyObject *parent, *head, *next, *tail;
1541
1542 parent = get_parent(globals, buf, &buflen);
1543 if (parent == NULL)
1544 return NULL;
1545
1546 head = load_next(parent, Py_None, &name, buf, &buflen);
1547 if (head == NULL)
1548 return NULL;
1549
1550 tail = head;
1551 Py_INCREF(tail);
1552 while (name) {
1553 next = load_next(tail, tail, &name, buf, &buflen);
1554 Py_DECREF(tail);
1555 if (next == NULL) {
1556 Py_DECREF(head);
1557 return NULL;
1558 }
1559 tail = next;
1560 }
1561
1562 if (fromlist != NULL) {
1563 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1564 fromlist = NULL;
1565 }
1566
1567 if (fromlist == NULL) {
1568 Py_DECREF(tail);
1569 return head;
1570 }
1571
1572 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001573 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001574 Py_DECREF(tail);
1575 return NULL;
1576 }
1577
1578 return tail;
1579}
1580
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001581PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001582PyImport_ImportModuleEx(char *name, PyObject *globals, PyObject *locals,
1583 PyObject *fromlist)
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001584{
1585 PyObject *result;
1586 lock_import();
Guido van Rossumd65911b1998-03-03 22:33:27 +00001587 result = import_module_ex(name, globals, locals, fromlist);
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001588 unlock_import();
1589 return result;
1590}
1591
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001592static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001593get_parent(PyObject *globals, char *buf, int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001594{
1595 static PyObject *namestr = NULL;
1596 static PyObject *pathstr = NULL;
1597 PyObject *modname, *modpath, *modules, *parent;
1598
1599 if (globals == NULL || !PyDict_Check(globals))
1600 return Py_None;
1601
1602 if (namestr == NULL) {
1603 namestr = PyString_InternFromString("__name__");
1604 if (namestr == NULL)
1605 return NULL;
1606 }
1607 if (pathstr == NULL) {
1608 pathstr = PyString_InternFromString("__path__");
1609 if (pathstr == NULL)
1610 return NULL;
1611 }
1612
1613 *buf = '\0';
1614 *p_buflen = 0;
1615 modname = PyDict_GetItem(globals, namestr);
1616 if (modname == NULL || !PyString_Check(modname))
1617 return Py_None;
1618
1619 modpath = PyDict_GetItem(globals, pathstr);
1620 if (modpath != NULL) {
1621 int len = PyString_GET_SIZE(modname);
1622 if (len > MAXPATHLEN) {
1623 PyErr_SetString(PyExc_ValueError,
1624 "Module name too long");
1625 return NULL;
1626 }
1627 strcpy(buf, PyString_AS_STRING(modname));
1628 *p_buflen = len;
1629 }
1630 else {
1631 char *start = PyString_AS_STRING(modname);
1632 char *lastdot = strrchr(start, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001633 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001634 if (lastdot == NULL)
1635 return Py_None;
1636 len = lastdot - start;
1637 if (len >= MAXPATHLEN) {
1638 PyErr_SetString(PyExc_ValueError,
1639 "Module name too long");
1640 return NULL;
1641 }
1642 strncpy(buf, start, len);
1643 buf[len] = '\0';
1644 *p_buflen = len;
1645 }
1646
1647 modules = PyImport_GetModuleDict();
1648 parent = PyDict_GetItemString(modules, buf);
1649 if (parent == NULL)
1650 parent = Py_None;
1651 return parent;
1652 /* We expect, but can't guarantee, if parent != None, that:
1653 - parent.__name__ == buf
1654 - parent.__dict__ is globals
1655 If this is violated... Who cares? */
1656}
1657
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001658/* altmod is either None or same as mod */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001659static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001660load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
1661 int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001662{
1663 char *name = *p_name;
1664 char *dot = strchr(name, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001665 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001666 char *p;
1667 PyObject *result;
1668
1669 if (dot == NULL) {
1670 *p_name = NULL;
1671 len = strlen(name);
1672 }
1673 else {
1674 *p_name = dot+1;
1675 len = dot-name;
1676 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00001677 if (len == 0) {
1678 PyErr_SetString(PyExc_ValueError,
1679 "Empty module name");
1680 return NULL;
1681 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001682
1683 p = buf + *p_buflen;
1684 if (p != buf)
1685 *p++ = '.';
1686 if (p+len-buf >= MAXPATHLEN) {
1687 PyErr_SetString(PyExc_ValueError,
1688 "Module name too long");
1689 return NULL;
1690 }
1691 strncpy(p, name, len);
1692 p[len] = '\0';
1693 *p_buflen = p+len-buf;
1694
1695 result = import_submodule(mod, p, buf);
1696 if (result == Py_None && altmod != mod) {
1697 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001698 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001699 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001700 if (result != NULL && result != Py_None) {
1701 if (mark_miss(buf) != 0) {
1702 Py_DECREF(result);
1703 return NULL;
1704 }
1705 strncpy(buf, name, len);
1706 buf[len] = '\0';
1707 *p_buflen = len;
1708 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001709 }
1710 if (result == NULL)
1711 return NULL;
1712
1713 if (result == Py_None) {
1714 Py_DECREF(result);
1715 PyErr_Format(PyExc_ImportError,
1716 "No module named %.200s", name);
1717 return NULL;
1718 }
1719
1720 return result;
1721}
1722
1723static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001724mark_miss(char *name)
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001725{
1726 PyObject *modules = PyImport_GetModuleDict();
1727 return PyDict_SetItemString(modules, name, Py_None);
1728}
1729
1730static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001731ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, int buflen,
1732 int recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001733{
1734 int i;
1735
1736 if (!PyObject_HasAttrString(mod, "__path__"))
1737 return 1;
1738
1739 for (i = 0; ; i++) {
1740 PyObject *item = PySequence_GetItem(fromlist, i);
1741 int hasit;
1742 if (item == NULL) {
1743 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1744 PyErr_Clear();
1745 return 1;
1746 }
1747 return 0;
1748 }
1749 if (!PyString_Check(item)) {
1750 PyErr_SetString(PyExc_TypeError,
1751 "Item in ``from list'' not a string");
1752 Py_DECREF(item);
1753 return 0;
1754 }
1755 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001756 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001757 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001758 /* See if the package defines __all__ */
1759 if (recursive)
1760 continue; /* Avoid endless recursion */
1761 all = PyObject_GetAttrString(mod, "__all__");
1762 if (all == NULL)
1763 PyErr_Clear();
1764 else {
1765 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1766 return 0;
1767 Py_DECREF(all);
1768 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001769 continue;
1770 }
1771 hasit = PyObject_HasAttr(mod, item);
1772 if (!hasit) {
1773 char *subname = PyString_AS_STRING(item);
1774 PyObject *submod;
1775 char *p;
1776 if (buflen + strlen(subname) >= MAXPATHLEN) {
1777 PyErr_SetString(PyExc_ValueError,
1778 "Module name too long");
1779 Py_DECREF(item);
1780 return 0;
1781 }
1782 p = buf + buflen;
1783 *p++ = '.';
1784 strcpy(p, subname);
1785 submod = import_submodule(mod, subname, buf);
1786 Py_XDECREF(submod);
1787 if (submod == NULL) {
1788 Py_DECREF(item);
1789 return 0;
1790 }
1791 }
1792 Py_DECREF(item);
1793 }
1794
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001795 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001796}
1797
1798static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001799import_submodule(PyObject *mod, char *subname, char *fullname)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001800{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001801 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossumf48f11c2001-07-23 13:27:49 +00001802 PyObject *m, *res = NULL;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001803
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001804 /* Require:
1805 if mod == None: subname == fullname
1806 else: mod.__name__ + "." + subname == fullname
1807 */
1808
Tim Peters50d8d372001-02-28 05:34:27 +00001809 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001810 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001811 }
1812 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001813 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001814 char buf[MAXPATHLEN+1];
1815 struct filedescr *fdp;
1816 FILE *fp = NULL;
1817
Guido van Rossum9c0afe51998-05-19 15:09:05 +00001818 if (mod == Py_None)
1819 path = NULL;
1820 else {
1821 path = PyObject_GetAttrString(mod, "__path__");
1822 if (path == NULL) {
1823 PyErr_Clear();
1824 Py_INCREF(Py_None);
1825 return Py_None;
1826 }
1827 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001828
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001829 buf[0] = '\0';
Guido van Rossumb68cd421998-07-01 17:36:26 +00001830 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1831 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001832 if (fdp == NULL) {
1833 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1834 return NULL;
1835 PyErr_Clear();
1836 Py_INCREF(Py_None);
1837 return Py_None;
1838 }
1839 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001840 if (fp)
1841 fclose(fp);
Guido van Rossumf48f11c2001-07-23 13:27:49 +00001842 if (mod != Py_None) {
1843 /* Irrespective of the success of this load, make a
1844 reference to it in the parent package module.
1845 A copy gets saved in the modules dictionary
1846 under the full name, so get a reference from
1847 there, if need be. (The exception is when
1848 the load failed with a SyntaxError -- then
1849 there's no trace in sys.modules. In that case,
1850 of course, do nothing extra.) */
1851 res = m;
1852 if (res == NULL)
1853 res = PyDict_GetItemString(modules, fullname);
1854 if (res != NULL &&
1855 PyObject_SetAttrString(mod, subname, res) < 0) {
1856 Py_XDECREF(m);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001857 m = NULL;
1858 }
1859 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001860 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001861
1862 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001863}
1864
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001865
1866/* Re-import a module of any kind and return its module object, WITH
1867 INCREMENTED REFERENCE COUNT */
1868
Guido van Rossum79f25d91997-04-29 20:08:16 +00001869PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001870PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001871{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001872 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001873 PyObject *path = NULL;
1874 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001875 char buf[MAXPATHLEN+1];
1876 struct filedescr *fdp;
1877 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001878
Guido van Rossum79f25d91997-04-29 20:08:16 +00001879 if (m == NULL || !PyModule_Check(m)) {
1880 PyErr_SetString(PyExc_TypeError,
1881 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001882 return NULL;
1883 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001884 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001885 if (name == NULL)
1886 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001887 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001888 PyErr_Format(PyExc_ImportError,
1889 "reload(): module %.200s not in sys.modules",
1890 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001891 return NULL;
1892 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001893 subname = strrchr(name, '.');
1894 if (subname == NULL)
1895 subname = name;
1896 else {
1897 PyObject *parentname, *parent;
1898 parentname = PyString_FromStringAndSize(name, (subname-name));
1899 if (parentname == NULL)
1900 return NULL;
1901 parent = PyDict_GetItem(modules, parentname);
Barry Warsaw38793331999-01-27 17:54:20 +00001902 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00001903 if (parent == NULL) {
1904 PyErr_Format(PyExc_ImportError,
1905 "reload(): parent %.200s not in sys.modules",
1906 name);
1907 return NULL;
1908 }
1909 subname++;
1910 path = PyObject_GetAttrString(parent, "__path__");
1911 if (path == NULL)
1912 PyErr_Clear();
1913 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001914 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001915 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1916 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001917 if (fdp == NULL)
1918 return NULL;
1919 m = load_module(name, fp, buf, fdp->type);
1920 if (fp)
1921 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001922 return m;
1923}
1924
1925
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001926/* Higher-level import emulator which emulates the "import" statement
1927 more accurately -- it invokes the __import__() function from the
1928 builtins of the current globals. This means that the import is
1929 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00001930 environment, e.g. by "rexec".
1931 A dummy list ["__doc__"] is passed as the 4th argument so that
1932 e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
1933 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001934
1935PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001936PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001937{
1938 static PyObject *silly_list = NULL;
1939 static PyObject *builtins_str = NULL;
1940 static PyObject *import_str = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001941 PyObject *globals = NULL;
1942 PyObject *import = NULL;
1943 PyObject *builtins = NULL;
1944 PyObject *r = NULL;
1945
1946 /* Initialize constant string objects */
1947 if (silly_list == NULL) {
1948 import_str = PyString_InternFromString("__import__");
1949 if (import_str == NULL)
1950 return NULL;
1951 builtins_str = PyString_InternFromString("__builtins__");
1952 if (builtins_str == NULL)
1953 return NULL;
1954 silly_list = Py_BuildValue("[s]", "__doc__");
1955 if (silly_list == NULL)
1956 return NULL;
1957 }
1958
1959 /* Get the builtins from current globals */
1960 globals = PyEval_GetGlobals();
Guido van Rossum85cd1d62001-02-20 21:43:24 +00001961 if (globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00001962 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001963 builtins = PyObject_GetItem(globals, builtins_str);
1964 if (builtins == NULL)
1965 goto err;
1966 }
1967 else {
1968 /* No globals -- use standard builtins, and fake globals */
1969 PyErr_Clear();
1970
Guido van Rossum85cd1d62001-02-20 21:43:24 +00001971 builtins = PyImport_ImportModuleEx("__builtin__",
1972 NULL, NULL, NULL);
1973 if (builtins == NULL)
1974 return NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001975 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1976 if (globals == NULL)
1977 goto err;
1978 }
1979
1980 /* Get the __import__ function from the builtins */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001981 if (PyDict_Check(builtins)) {
Fred Drakea76ba6e2001-03-06 06:31:15 +00001982 import = PyObject_GetItem(builtins, import_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001983 if (import == NULL)
1984 PyErr_SetObject(PyExc_KeyError, import_str);
1985 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001986 else
Fred Drakea76ba6e2001-03-06 06:31:15 +00001987 import = PyObject_GetAttr(builtins, import_str);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001988 if (import == NULL)
1989 goto err;
1990
1991 /* Call the _import__ function with the proper argument list */
1992 r = PyObject_CallFunction(import, "OOOO",
1993 module_name, globals, globals, silly_list);
1994
1995 err:
1996 Py_XDECREF(globals);
1997 Py_XDECREF(builtins);
1998 Py_XDECREF(import);
Tim Peters50d8d372001-02-28 05:34:27 +00001999
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002000 return r;
2001}
2002
2003
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002004/* Module 'imp' provides Python access to the primitives used for
2005 importing modules.
2006*/
2007
Guido van Rossum79f25d91997-04-29 20:08:16 +00002008static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002009imp_get_magic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002010{
2011 char buf[4];
2012
Guido van Rossum43713e52000-02-29 13:59:29 +00002013 if (!PyArg_ParseTuple(args, ":get_magic"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002014 return NULL;
Guido van Rossum96774c12000-05-01 20:19:08 +00002015 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
2016 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
2017 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
2018 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002019
Guido van Rossum79f25d91997-04-29 20:08:16 +00002020 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002021}
2022
Guido van Rossum79f25d91997-04-29 20:08:16 +00002023static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002024imp_get_suffixes(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002025{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002026 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002027 struct filedescr *fdp;
2028
Guido van Rossum43713e52000-02-29 13:59:29 +00002029 if (!PyArg_ParseTuple(args, ":get_suffixes"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002030 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002031 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002032 if (list == NULL)
2033 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002034 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
2035 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002036 fdp->suffix, fdp->mode, fdp->type);
2037 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002038 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002039 return NULL;
2040 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002041 if (PyList_Append(list, item) < 0) {
2042 Py_DECREF(list);
2043 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002044 return NULL;
2045 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002046 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002047 }
2048 return list;
2049}
2050
Guido van Rossum79f25d91997-04-29 20:08:16 +00002051static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002052call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002053{
Tim Petersdbd9ba62000-07-09 03:09:57 +00002054 extern int fclose(FILE *);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002055 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002056 struct filedescr *fdp;
2057 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002058 FILE *fp = NULL;
2059
2060 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002061 if (path == Py_None)
2062 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002063 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
2064 if (fdp == NULL)
2065 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002066 if (fp != NULL) {
2067 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
2068 if (fob == NULL) {
2069 fclose(fp);
2070 return NULL;
2071 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002072 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002073 else {
2074 fob = Py_None;
2075 Py_INCREF(fob);
Tim Peters50d8d372001-02-28 05:34:27 +00002076 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002077 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002078 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002079 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002080 return ret;
2081}
2082
Guido van Rossum79f25d91997-04-29 20:08:16 +00002083static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002084imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002085{
2086 char *name;
2087 PyObject *path = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002088 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002089 return NULL;
2090 return call_find_module(name, path);
2091}
2092
2093static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002094imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002095{
2096 char *name;
2097 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002098 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002099 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002100 return NULL;
2101 ret = init_builtin(name);
2102 if (ret < 0)
2103 return NULL;
2104 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002105 Py_INCREF(Py_None);
2106 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002107 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002108 m = PyImport_AddModule(name);
2109 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002110 return m;
2111}
2112
Guido van Rossum79f25d91997-04-29 20:08:16 +00002113static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002114imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002115{
2116 char *name;
2117 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002118 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002119 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002120 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002121 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002122 if (ret < 0)
2123 return NULL;
2124 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002125 Py_INCREF(Py_None);
2126 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002127 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002128 m = PyImport_AddModule(name);
2129 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002130 return m;
2131}
2132
Guido van Rossum79f25d91997-04-29 20:08:16 +00002133static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002134imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002135{
2136 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002137
Guido van Rossum43713e52000-02-29 13:59:29 +00002138 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002139 return NULL;
2140 return get_frozen_object(name);
2141}
2142
Guido van Rossum79f25d91997-04-29 20:08:16 +00002143static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002144imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002145{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002146 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002147 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002148 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002149 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002150}
2151
Guido van Rossum79f25d91997-04-29 20:08:16 +00002152static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002153imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002154{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002155 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002156 struct _frozen *p;
Guido van Rossum43713e52000-02-29 13:59:29 +00002157 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002158 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002159 p = find_frozen(name);
2160 return PyInt_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002161}
2162
2163static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002164get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002165{
2166 FILE *fp;
2167 if (fob == NULL) {
2168 fp = fopen(pathname, mode);
2169 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002170 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002171 }
2172 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002173 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002174 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002175 PyErr_SetString(PyExc_ValueError,
2176 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002177 }
2178 return fp;
2179}
2180
Guido van Rossum79f25d91997-04-29 20:08:16 +00002181static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002182imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002183{
2184 char *name;
2185 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002186 PyObject *fob = NULL;
2187 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002188 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002189 if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002190 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002191 return NULL;
2192 fp = get_file(pathname, fob, "rb");
2193 if (fp == NULL)
2194 return NULL;
2195 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002196 if (fob == NULL)
2197 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002198 return m;
2199}
2200
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002201#ifdef HAVE_DYNAMIC_LOADING
2202
Guido van Rossum79f25d91997-04-29 20:08:16 +00002203static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002204imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002205{
2206 char *name;
2207 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002208 PyObject *fob = NULL;
2209 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002210 FILE *fp = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002211 if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002212 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002213 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002214 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002215 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002216 if (fp == NULL)
2217 return NULL;
2218 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002219 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002220 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002221}
2222
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002223#endif /* HAVE_DYNAMIC_LOADING */
2224
Guido van Rossum79f25d91997-04-29 20:08:16 +00002225static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002226imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002227{
2228 char *name;
2229 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002230 PyObject *fob = NULL;
2231 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002232 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002233 if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002234 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002235 return NULL;
2236 fp = get_file(pathname, fob, "r");
2237 if (fp == NULL)
2238 return NULL;
2239 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002240 if (fob == NULL)
2241 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002242 return m;
2243}
2244
Jack Jansen9c96a921995-02-15 22:57:06 +00002245#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002246static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002247imp_load_resource(PyObject *self, PyObject *args)
Jack Jansen9c96a921995-02-15 22:57:06 +00002248{
2249 char *name;
2250 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002251 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002252
Guido van Rossum43713e52000-02-29 13:59:29 +00002253 if (!PyArg_ParseTuple(args, "ss:load_resource", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002254 return NULL;
2255 m = PyMac_LoadResourceModule(name, pathname);
2256 return m;
2257}
2258#endif /* macintosh */
2259
Guido van Rossum79f25d91997-04-29 20:08:16 +00002260static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002261imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002262{
2263 char *name;
2264 PyObject *fob;
2265 char *pathname;
2266 char *suffix; /* Unused */
2267 char *mode;
2268 int type;
2269 FILE *fp;
2270
Guido van Rossum43713e52000-02-29 13:59:29 +00002271 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002272 &name, &fob, &pathname,
2273 &suffix, &mode, &type))
2274 return NULL;
2275 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
2276 PyErr_Format(PyExc_ValueError,
2277 "invalid file open mode %.200s", mode);
2278 return NULL;
2279 }
2280 if (fob == Py_None)
2281 fp = NULL;
2282 else {
2283 if (!PyFile_Check(fob)) {
2284 PyErr_SetString(PyExc_ValueError,
2285 "load_module arg#2 should be a file or None");
2286 return NULL;
2287 }
2288 fp = get_file(pathname, fob, mode);
2289 if (fp == NULL)
2290 return NULL;
2291 }
2292 return load_module(name, fp, pathname, type);
2293}
2294
2295static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002296imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002297{
2298 char *name;
2299 char *pathname;
Guido van Rossum43713e52000-02-29 13:59:29 +00002300 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002301 return NULL;
2302 return load_package(name, pathname);
2303}
2304
2305static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002306imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002307{
2308 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002309 if (!PyArg_ParseTuple(args, "s:new_module", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002310 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002311 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002312}
2313
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002314/* Doc strings */
2315
2316static char doc_imp[] = "\
2317This module provides the components needed to build your own\n\
2318__import__ function. Undocumented functions are obsolete.\n\
2319";
2320
2321static char doc_find_module[] = "\
2322find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
2323Search for a module. If path is omitted or None, search for a\n\
2324built-in, frozen or special module and continue search in sys.path.\n\
2325The module name cannot contain '.'; to search for a submodule of a\n\
2326package, pass the submodule name and the package's __path__.\
2327";
2328
2329static char doc_load_module[] = "\
2330load_module(name, file, filename, (suffix, mode, type)) -> module\n\
2331Load a module, given information returned by find_module().\n\
2332The module name must include the full package name, if any.\
2333";
2334
2335static char doc_get_magic[] = "\
2336get_magic() -> string\n\
2337Return the magic number for .pyc or .pyo files.\
2338";
2339
2340static char doc_get_suffixes[] = "\
2341get_suffixes() -> [(suffix, mode, type), ...]\n\
2342Return a list of (suffix, mode, type) tuples describing the files\n\
2343that find_module() looks for.\
2344";
2345
2346static char doc_new_module[] = "\
2347new_module(name) -> module\n\
2348Create a new module. Do not enter it in sys.modules.\n\
2349The module name must include the full package name, if any.\
2350";
2351
Tim Peters69232342001-08-30 05:16:13 +00002352static char doc_lock_held[] = "\
2353lock_held() -> 0 or 1\n\
2354Return 1 if the import lock is currently held.\n\
2355On platforms without threads, return 0.\
2356";
2357
Guido van Rossum79f25d91997-04-29 20:08:16 +00002358static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002359 {"find_module", imp_find_module, 1, doc_find_module},
2360 {"get_magic", imp_get_magic, 1, doc_get_magic},
2361 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2362 {"load_module", imp_load_module, 1, doc_load_module},
2363 {"new_module", imp_new_module, 1, doc_new_module},
Tim Peters69232342001-08-30 05:16:13 +00002364 {"lock_held", imp_lock_held, 1, doc_lock_held},
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002365 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002366 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002367 {"init_builtin", imp_init_builtin, 1},
2368 {"init_frozen", imp_init_frozen, 1},
2369 {"is_builtin", imp_is_builtin, 1},
2370 {"is_frozen", imp_is_frozen, 1},
2371 {"load_compiled", imp_load_compiled, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002372#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002373 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002374#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002375 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002376#ifdef macintosh
2377 {"load_resource", imp_load_resource, 1},
2378#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002379 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002380 {NULL, NULL} /* sentinel */
2381};
2382
Guido van Rossum1a8791e1998-08-04 22:46:29 +00002383static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002384setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002385{
2386 PyObject *v;
2387 int err;
2388
2389 v = PyInt_FromLong((long)value);
2390 err = PyDict_SetItemString(d, name, v);
2391 Py_XDECREF(v);
2392 return err;
2393}
2394
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002395void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002396initimp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002397{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002398 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002399
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002400 m = Py_InitModule4("imp", imp_methods, doc_imp,
2401 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002402 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002403
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002404 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2405 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2406 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2407 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2408 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2409 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2410 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2411 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00002412 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002413
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002414 failure:
2415 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002416}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002417
2418
Guido van Rossumb18618d2000-05-03 23:44:39 +00002419/* API for embedding applications that want to add their own entries
2420 to the table of built-in modules. This should normally be called
2421 *before* Py_Initialize(). When the table resize fails, -1 is
2422 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002423
2424 After a similar function by Just van Rossum. */
2425
2426int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002427PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002428{
2429 static struct _inittab *our_copy = NULL;
2430 struct _inittab *p;
2431 int i, n;
2432
2433 /* Count the number of entries in both tables */
2434 for (n = 0; newtab[n].name != NULL; n++)
2435 ;
2436 if (n == 0)
2437 return 0; /* Nothing to do */
2438 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2439 ;
2440
2441 /* Allocate new memory for the combined table */
Guido van Rossumb18618d2000-05-03 23:44:39 +00002442 p = our_copy;
2443 PyMem_RESIZE(p, struct _inittab, i+n+1);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002444 if (p == NULL)
2445 return -1;
2446
2447 /* Copy the tables into the new memory */
2448 if (our_copy != PyImport_Inittab)
2449 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2450 PyImport_Inittab = our_copy = p;
2451 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
2452
2453 return 0;
2454}
2455
2456/* Shorthand to add a single entry given a name and a function */
2457
2458int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002459PyImport_AppendInittab(char *name, void (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002460{
2461 struct _inittab newtab[2];
2462
2463 memset(newtab, '\0', sizeof newtab);
2464
2465 newtab[0].name = name;
2466 newtab[0].initfunc = initfunc;
2467
2468 return PyImport_ExtendInittab(newtab);
2469}