blob: 52ad85e99e3a0bda3c091b02c224c02583f9c9ab [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 Rossuma5568d31998-03-05 03:45:08 +0000869 struct _frozen *f;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000870 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000871 FILE *fp = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000872#ifndef RISCOS
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000873 struct stat statbuf;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000874#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000875 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
876 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
877 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossum0506a431998-08-11 15:07:39 +0000878 char name[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000879
Fred Drake4c82b232000-06-30 16:18:57 +0000880 if (strlen(realname) > MAXPATHLEN) {
881 PyErr_SetString(PyExc_OverflowError, "module name is too long");
882 return NULL;
883 }
Guido van Rossum0506a431998-08-11 15:07:39 +0000884 strcpy(name, realname);
885
886 if (path != NULL && PyString_Check(path)) {
887 /* Submodule of "frozen" package:
888 Set name to the fullname, path to NULL
889 and continue as "usual" */
890 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
891 PyErr_SetString(PyExc_ImportError,
892 "full frozen module name too long");
893 return NULL;
894 }
895 strcpy(buf, PyString_AsString(path));
896 strcat(buf, ".");
897 strcat(buf, name);
898 strcpy(name, buf);
899 path = NULL;
900 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000901 if (path == NULL) {
902 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000903 strcpy(buf, name);
904 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000905 }
Guido van Rossuma5568d31998-03-05 03:45:08 +0000906 if ((f = find_frozen(name)) != NULL) {
907 strcpy(buf, name);
908 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000909 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000910
Guido van Rossumac279101996-08-22 23:10:58 +0000911#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000912 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
913 if (fp != NULL) {
914 *p_fp = fp;
915 return fdp;
916 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000917#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000918 path = PySys_GetObject("path");
919 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000920 if (path == NULL || !PyList_Check(path)) {
921 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +0000922 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000923 return NULL;
924 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000925 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000926 namelen = strlen(name);
927 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000928 PyObject *v = PyList_GetItem(path, i);
929 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000930 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000931 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000932 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000933 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000934 strcpy(buf, PyString_AsString(v));
Fred Drake4c82b232000-06-30 16:18:57 +0000935 if (strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000936 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000937#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000938#ifdef INTERN_STRINGS
Tim Peters50d8d372001-02-28 05:34:27 +0000939 /*
Guido van Rossum741689d1997-08-12 14:53:39 +0000940 ** Speedup: each sys.path item is interned, and
941 ** FindResourceModule remembers which items refer to
942 ** folders (so we don't have to bother trying to look
Tim Peters50d8d372001-02-28 05:34:27 +0000943 ** into them for resources).
Guido van Rossum741689d1997-08-12 14:53:39 +0000944 */
945 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
946 v = PyList_GET_ITEM(path, i);
947#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000948 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000949 static struct filedescr resfiledescr =
950 {"", "", PY_RESOURCE};
Tim Peters50d8d372001-02-28 05:34:27 +0000951
Jack Jansen9c96a921995-02-15 22:57:06 +0000952 return &resfiledescr;
953 }
Guido van Rossum0f84a341998-08-06 13:36:01 +0000954 if (PyMac_FindCodeResourceModule((PyStringObject *)v, name, buf)) {
955 static struct filedescr resfiledescr =
956 {"", "", PY_CODERESOURCE};
Tim Peters50d8d372001-02-28 05:34:27 +0000957
Guido van Rossum0f84a341998-08-06 13:36:01 +0000958 return &resfiledescr;
959 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000960#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000961 if (len > 0 && buf[len-1] != SEP
962#ifdef ALTSEP
963 && buf[len-1] != ALTSEP
964#endif
965 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000966 buf[len++] = SEP;
Guido van Rossum215c3402000-11-13 17:26:32 +0000967 strcpy(buf+len, name);
968 len += namelen;
Tim Peters50d8d372001-02-28 05:34:27 +0000969
970 /* Check for package import (buf holds a directory name,
971 and there's an __init__ module in that directory */
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000972#ifdef HAVE_STAT
Tim Peterscab3f682001-04-29 22:21:25 +0000973 if (stat(buf, &statbuf) == 0 && /* it exists */
974 S_ISDIR(statbuf.st_mode) && /* it's a directory */
975 find_init_module(buf) && /* it has __init__.py */
976 case_ok(buf, len, namelen, name)) /* and case matches */
977 return &fd_package;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000978#else
979 /* XXX How are you going to test for directories? */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000980#ifdef RISCOS
981 {
982 static struct filedescr fd = {"", "", PKG_DIRECTORY};
983 if (isdir(buf)) {
984 if (find_init_module(buf))
985 return &fd;
986 }
987 }
988#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000989#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000990#ifdef macintosh
991 fdp = PyMac_FindModuleExtension(buf, &len, name);
Jack Jansen4df3c522001-03-20 23:09:54 +0000992 if (fdp) {
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000993#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000994 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000995 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000996 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000997 PySys_WriteStderr("# trying %s\n", buf);
Jack Jansen4df3c522001-03-20 23:09:54 +0000998#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000999 fp = fopen(buf, fdp->mode);
Tim Peters50d8d372001-02-28 05:34:27 +00001000 if (fp != NULL) {
1001 if (case_ok(buf, len, namelen, name))
1002 break;
1003 else { /* continue search */
1004 fclose(fp);
1005 fp = NULL;
Barry Warsaw914a0b12001-02-02 19:12:16 +00001006 }
Barry Warsaw914a0b12001-02-02 19:12:16 +00001007 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001008 }
1009 if (fp != NULL)
1010 break;
1011 }
1012 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001013 PyErr_Format(PyExc_ImportError,
1014 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001015 return NULL;
1016 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001017 *p_fp = fp;
1018 return fdp;
1019}
1020
Tim Petersd1e87a82001-03-01 18:12:00 +00001021/* case_ok(char* buf, int len, int namelen, char* name)
1022 * The arguments here are tricky, best shown by example:
1023 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1024 * ^ ^ ^ ^
1025 * |--------------------- buf ---------------------|
1026 * |------------------- len ------------------|
1027 * |------ name -------|
1028 * |----- namelen -----|
1029 * buf is the full path, but len only counts up to (& exclusive of) the
1030 * extension. name is the module name, also exclusive of extension.
1031 *
1032 * We've already done a successful stat() or fopen() on buf, so know that
1033 * there's some match, possibly case-insensitive.
1034 *
Tim Peters50d8d372001-02-28 05:34:27 +00001035 * case_ok() is to return 1 if there's a case-sensitive match for
1036 * name, else 0. case_ok() is also to return 1 if envar PYTHONCASEOK
1037 * exists.
Tim Petersd1e87a82001-03-01 18:12:00 +00001038 *
Tim Peters50d8d372001-02-28 05:34:27 +00001039 * case_ok() is used to implement case-sensitive import semantics even
1040 * on platforms with case-insensitive filesystems. It's trivial to implement
1041 * for case-sensitive filesystems. It's pretty much a cross-platform
1042 * nightmare for systems with case-insensitive filesystems.
1043 */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001044
Tim Peters50d8d372001-02-28 05:34:27 +00001045/* First we may need a pile of platform-specific header files; the sequence
1046 * of #if's here should match the sequence in the body of case_ok().
1047 */
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001048#if defined(MS_WIN32) || defined(__CYGWIN__)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001049#include <windows.h>
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001050#ifdef __CYGWIN__
1051#include <sys/cygwin.h>
1052#endif
1053
Tim Peters50d8d372001-02-28 05:34:27 +00001054#elif defined(DJGPP)
1055#include <dir.h>
1056
1057#elif defined(macintosh)
1058#include <TextUtils.h>
1059#ifdef USE_GUSI1
1060#include "TFileSpec.h" /* for Path2FSSpec() */
1061#endif
1062
Tim Petersd1e87a82001-03-01 18:12:00 +00001063#elif defined(__MACH__) && defined(__APPLE__) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001064#include <sys/types.h>
1065#include <dirent.h>
1066
Tim Peters50d8d372001-02-28 05:34:27 +00001067#endif
1068
Guido van Rossum0980bd91998-02-13 17:18:36 +00001069static int
Tim Peters50d8d372001-02-28 05:34:27 +00001070case_ok(char *buf, int len, int namelen, char *name)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001071{
Tim Peters50d8d372001-02-28 05:34:27 +00001072/* Pick a platform-specific implementation; the sequence of #if's here should
1073 * match the sequence just above.
1074 */
1075
1076/* MS_WIN32 || __CYGWIN__ */
1077#if defined(MS_WIN32) || defined(__CYGWIN__)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001078 WIN32_FIND_DATA data;
1079 HANDLE h;
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001080#ifdef __CYGWIN__
1081 char tempbuf[MAX_PATH];
1082#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001083
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001084 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001085 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001086
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001087#ifdef __CYGWIN__
1088 cygwin32_conv_to_win32_path(buf, tempbuf);
1089 h = FindFirstFile(tempbuf, &data);
1090#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001091 h = FindFirstFile(buf, &data);
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001092#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001093 if (h == INVALID_HANDLE_VALUE) {
1094 PyErr_Format(PyExc_NameError,
1095 "Can't find file for module %.100s\n(filename %.300s)",
1096 name, buf);
1097 return 0;
1098 }
1099 FindClose(h);
Tim Peters50d8d372001-02-28 05:34:27 +00001100 return strncmp(data.cFileName, name, namelen) == 0;
1101
1102/* DJGPP */
1103#elif defined(DJGPP)
1104 struct ffblk ffblk;
1105 int done;
1106
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001107 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001108 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001109
1110 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
1111 if (done) {
Guido van Rossum0980bd91998-02-13 17:18:36 +00001112 PyErr_Format(PyExc_NameError,
Tim Peters50d8d372001-02-28 05:34:27 +00001113 "Can't find file for module %.100s\n(filename %.300s)",
Guido van Rossum0980bd91998-02-13 17:18:36 +00001114 name, buf);
1115 return 0;
1116 }
Tim Peters50d8d372001-02-28 05:34:27 +00001117 return strncmp(ffblk.ff_name, name, namelen) == 0;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001118
Tim Peters50d8d372001-02-28 05:34:27 +00001119/* macintosh */
1120#elif defined(macintosh)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001121 FSSpec fss;
1122 OSErr err;
Tim Peters50d8d372001-02-28 05:34:27 +00001123
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001124 if (Py_GETENV("PYTHONCASEOK") != NULL)
Tim Peters50d8d372001-02-28 05:34:27 +00001125 return 1;
1126
Guido van Rossumb33aa1a2000-04-24 15:08:18 +00001127#ifndef USE_GUSI1
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001128 err = FSMakeFSSpec(0, 0, Pstring(buf), &fss);
1129#else
1130 /* GUSI's Path2FSSpec() resolves all possible aliases nicely on
1131 the way, which is fine for all directories, but here we need
1132 the original name of the alias file (say, Dlg.ppc.slb, not
1133 toolboxmodules.ppc.slb). */
1134 char *colon;
1135 err = Path2FSSpec(buf, &fss);
1136 if (err == noErr) {
1137 colon = strrchr(buf, ':'); /* find filename */
1138 if (colon != NULL)
1139 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1140 Pstring(colon+1), &fss);
1141 else
1142 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1143 fss.name, &fss);
1144 }
1145#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001146 if (err) {
1147 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001148 "Can't find file for module %.100s\n(filename %.300s)",
1149 name, buf);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001150 return 0;
1151 }
Tim Peters50d8d372001-02-28 05:34:27 +00001152 return fss.name[0] >= namelen &&
1153 strncmp(name, (char *)fss.name+1, namelen) == 0;
1154
Tim Peters677898a2001-03-02 03:28:03 +00001155/* new-fangled macintosh (macosx) */
Tim Petersd1e87a82001-03-01 18:12:00 +00001156#elif defined(__MACH__) && defined(__APPLE__) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001157 DIR *dirp;
1158 struct dirent *dp;
Tim Petersd1e87a82001-03-01 18:12:00 +00001159 char dirname[MAXPATHLEN + 1];
1160 const int dirlen = len - namelen - 1; /* don't want trailing SEP */
Tim Peters430f5d42001-03-01 01:30:56 +00001161
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001162 if (Py_GETENV("PYTHONCASEOK") != NULL)
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001163 return 1;
1164
Tim Petersd1e87a82001-03-01 18:12:00 +00001165 /* Copy the dir component into dirname; substitute "." if empty */
1166 if (dirlen <= 0) {
1167 dirname[0] = '.';
1168 dirname[1] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001169 }
1170 else {
Tim Petersd1e87a82001-03-01 18:12:00 +00001171 assert(dirlen <= MAXPATHLEN);
1172 memcpy(dirname, buf, dirlen);
1173 dirname[dirlen] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001174 }
1175 /* Open the directory and search the entries for an exact match. */
Tim Petersd1e87a82001-03-01 18:12:00 +00001176 dirp = opendir(dirname);
Tim Peters430f5d42001-03-01 01:30:56 +00001177 if (dirp) {
Tim Peters677898a2001-03-02 03:28:03 +00001178 char *nameWithExt = buf + len - namelen;
Tim Peters430f5d42001-03-01 01:30:56 +00001179 while ((dp = readdir(dirp)) != NULL) {
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001180 const int thislen =
Tim Peters430f5d42001-03-01 01:30:56 +00001181#ifdef _DIRENT_HAVE_D_NAMELEN
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001182 dp->d_namlen;
Tim Peters430f5d42001-03-01 01:30:56 +00001183#else
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001184 strlen(dp->d_name);
Tim Peters430f5d42001-03-01 01:30:56 +00001185#endif
Tim Petersd1e87a82001-03-01 18:12:00 +00001186 if (thislen >= namelen &&
Tim Peters677898a2001-03-02 03:28:03 +00001187 strcmp(dp->d_name, nameWithExt) == 0) {
Tim Peters430f5d42001-03-01 01:30:56 +00001188 (void)closedir(dirp);
1189 return 1; /* Found */
1190 }
1191 }
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001192 (void)closedir(dirp);
Tim Peters430f5d42001-03-01 01:30:56 +00001193 }
Tim Peters430f5d42001-03-01 01:30:56 +00001194 return 0 ; /* Not found */
Tim Peters430f5d42001-03-01 01:30:56 +00001195
Tim Peters50d8d372001-02-28 05:34:27 +00001196/* assuming it's a case-sensitive filesystem, so there's nothing to do! */
1197#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001198 return 1;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001199
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001200#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001201}
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001202
Guido van Rossum0980bd91998-02-13 17:18:36 +00001203
Guido van Rossum197346f1997-10-31 18:38:52 +00001204#ifdef HAVE_STAT
1205/* Helper to look for __init__.py or __init__.py[co] in potential package */
1206static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001207find_init_module(char *buf)
Guido van Rossum197346f1997-10-31 18:38:52 +00001208{
Tim Peters0f9431f2001-07-05 03:47:53 +00001209 const size_t save_len = strlen(buf);
Fred Drake4c82b232000-06-30 16:18:57 +00001210 size_t i = save_len;
Tim Peters0f9431f2001-07-05 03:47:53 +00001211 char *pname; /* pointer to start of __init__ */
Guido van Rossum197346f1997-10-31 18:38:52 +00001212 struct stat statbuf;
1213
Tim Peters0f9431f2001-07-05 03:47:53 +00001214/* For calling case_ok(buf, len, namelen, name):
1215 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1216 * ^ ^ ^ ^
1217 * |--------------------- buf ---------------------|
1218 * |------------------- len ------------------|
1219 * |------ name -------|
1220 * |----- namelen -----|
1221 */
Guido van Rossum197346f1997-10-31 18:38:52 +00001222 if (save_len + 13 >= MAXPATHLEN)
1223 return 0;
1224 buf[i++] = SEP;
Tim Peters0f9431f2001-07-05 03:47:53 +00001225 pname = buf + i;
1226 strcpy(pname, "__init__.py");
Guido van Rossum197346f1997-10-31 18:38:52 +00001227 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001228 if (case_ok(buf,
1229 save_len + 9, /* len("/__init__") */
1230 8, /* len("__init__") */
1231 pname)) {
1232 buf[save_len] = '\0';
1233 return 1;
1234 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001235 }
Tim Peters0f9431f2001-07-05 03:47:53 +00001236 i += strlen(pname);
1237 strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum197346f1997-10-31 18:38:52 +00001238 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001239 if (case_ok(buf,
1240 save_len + 9, /* len("/__init__") */
1241 8, /* len("__init__") */
1242 pname)) {
1243 buf[save_len] = '\0';
1244 return 1;
1245 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001246 }
1247 buf[save_len] = '\0';
1248 return 0;
1249}
Guido van Rossum48a680c2001-03-02 06:34:14 +00001250
1251#else
1252
1253#ifdef RISCOS
1254static int
1255find_init_module(buf)
1256 char *buf;
1257{
1258 int save_len = strlen(buf);
1259 int i = save_len;
1260
1261 if (save_len + 13 >= MAXPATHLEN)
1262 return 0;
1263 buf[i++] = SEP;
1264 strcpy(buf+i, "__init__/py");
1265 if (isfile(buf)) {
1266 buf[save_len] = '\0';
1267 return 1;
1268 }
1269
1270 if (Py_OptimizeFlag)
1271 strcpy(buf+i, "o");
1272 else
1273 strcpy(buf+i, "c");
1274 if (isfile(buf)) {
1275 buf[save_len] = '\0';
1276 return 1;
1277 }
1278 buf[save_len] = '\0';
1279 return 0;
1280}
1281#endif /*RISCOS*/
1282
Guido van Rossum197346f1997-10-31 18:38:52 +00001283#endif /* HAVE_STAT */
1284
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001285
Tim Petersdbd9ba62000-07-09 03:09:57 +00001286static int init_builtin(char *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001287
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001288/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001289 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001290
Guido van Rossum79f25d91997-04-29 20:08:16 +00001291static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001292load_module(char *name, FILE *fp, char *buf, int type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001293{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001294 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001295 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001296 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001297
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001298 /* First check that there's an open file (if we need one) */
1299 switch (type) {
1300 case PY_SOURCE:
1301 case PY_COMPILED:
1302 if (fp == NULL) {
1303 PyErr_Format(PyExc_ValueError,
1304 "file object required for import (type code %d)",
1305 type);
1306 return NULL;
1307 }
1308 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001309
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001310 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001311
1312 case PY_SOURCE:
1313 m = load_source_module(name, buf, fp);
1314 break;
1315
1316 case PY_COMPILED:
1317 m = load_compiled_module(name, buf, fp);
1318 break;
1319
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001320#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001321 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001322 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001323 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001324#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001325
Jack Jansen9c96a921995-02-15 22:57:06 +00001326#ifdef macintosh
1327 case PY_RESOURCE:
1328 m = PyMac_LoadResourceModule(name, buf);
1329 break;
Guido van Rossum0f84a341998-08-06 13:36:01 +00001330 case PY_CODERESOURCE:
1331 m = PyMac_LoadCodeResourceModule(name, buf);
1332 break;
Jack Jansen9c96a921995-02-15 22:57:06 +00001333#endif
1334
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001335 case PKG_DIRECTORY:
1336 m = load_package(name, buf);
1337 break;
1338
1339 case C_BUILTIN:
1340 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001341 if (buf != NULL && buf[0] != '\0')
1342 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001343 if (type == C_BUILTIN)
1344 err = init_builtin(name);
1345 else
1346 err = PyImport_ImportFrozenModule(name);
1347 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001348 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001349 if (err == 0) {
1350 PyErr_Format(PyExc_ImportError,
1351 "Purported %s module %.200s not found",
1352 type == C_BUILTIN ?
1353 "builtin" : "frozen",
1354 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001355 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001356 }
1357 modules = PyImport_GetModuleDict();
1358 m = PyDict_GetItemString(modules, name);
1359 if (m == NULL) {
1360 PyErr_Format(
1361 PyExc_ImportError,
1362 "%s module %.200s not properly initialized",
1363 type == C_BUILTIN ?
1364 "builtin" : "frozen",
1365 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001366 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001367 }
1368 Py_INCREF(m);
1369 break;
1370
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001371 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001372 PyErr_Format(PyExc_ImportError,
1373 "Don't know how to import %.200s (type code %d)",
1374 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001375 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001376
1377 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001378
1379 return m;
1380}
1381
1382
1383/* Initialize a built-in module.
1384 Return 1 for succes, 0 if the module is not found, and -1 with
1385 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001386
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001387static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001388init_builtin(char *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001389{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001390 struct _inittab *p;
1391 PyObject *mod;
1392
1393 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
1394 return 1;
1395
Guido van Rossum771c6c81997-10-31 18:37:24 +00001396 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001397 if (strcmp(name, p->name) == 0) {
1398 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001399 PyErr_Format(PyExc_ImportError,
1400 "Cannot re-init internal module %.200s",
1401 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001402 return -1;
1403 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001404 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001405 PySys_WriteStderr("import %s # builtin\n", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001406 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001407 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001408 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001409 if (_PyImport_FixupExtension(name, name) == NULL)
1410 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001411 return 1;
1412 }
1413 }
1414 return 0;
1415}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001416
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001417
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001418/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001419
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001420static struct _frozen *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001421find_frozen(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001422{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001423 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001424
Guido van Rossum79f25d91997-04-29 20:08:16 +00001425 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001426 if (p->name == NULL)
1427 return NULL;
1428 if (strcmp(p->name, name) == 0)
1429 break;
1430 }
1431 return p;
1432}
1433
Guido van Rossum79f25d91997-04-29 20:08:16 +00001434static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001435get_frozen_object(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001436{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001437 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001438 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001439
1440 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001441 PyErr_Format(PyExc_ImportError,
1442 "No such frozen object named %.200s",
1443 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001444 return NULL;
1445 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001446 size = p->size;
1447 if (size < 0)
1448 size = -size;
1449 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001450}
1451
1452/* Initialize a frozen module.
1453 Return 1 for succes, 0 if the module is not found, and -1 with
1454 an exception set if the initialization failed.
1455 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001456
1457int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001458PyImport_ImportFrozenModule(char *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001459{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001460 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001461 PyObject *co;
1462 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001463 int ispackage;
1464 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001465
1466 if (p == NULL)
1467 return 0;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001468 size = p->size;
1469 ispackage = (size < 0);
1470 if (ispackage)
1471 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001472 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001473 PySys_WriteStderr("import %s # frozen%s\n",
Guido van Rossuma5568d31998-03-05 03:45:08 +00001474 name, ispackage ? " package" : "");
1475 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001476 if (co == NULL)
1477 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001478 if (!PyCode_Check(co)) {
1479 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001480 PyErr_Format(PyExc_TypeError,
1481 "frozen object %.200s is not a code object",
1482 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001483 return -1;
1484 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001485 if (ispackage) {
1486 /* Set __path__ to the package name */
1487 PyObject *d, *s;
1488 int err;
1489 m = PyImport_AddModule(name);
1490 if (m == NULL)
1491 return -1;
1492 d = PyModule_GetDict(m);
1493 s = PyString_InternFromString(name);
1494 if (s == NULL)
1495 return -1;
1496 err = PyDict_SetItemString(d, "__path__", s);
1497 Py_DECREF(s);
1498 if (err != 0)
1499 return err;
1500 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001501 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001502 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001503 if (m == NULL)
1504 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001505 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001506 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001507}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001508
1509
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001510/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001511 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001512
Guido van Rossum79f25d91997-04-29 20:08:16 +00001513PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001514PyImport_ImportModule(char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00001515{
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00001516 PyObject *pname;
1517 PyObject *result;
1518
1519 pname = PyString_FromString(name);
1520 result = PyImport_Import(pname);
1521 Py_DECREF(pname);
1522 return result;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001523}
1524
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001525/* Forward declarations for helper routines */
Tim Petersdbd9ba62000-07-09 03:09:57 +00001526static PyObject *get_parent(PyObject *globals, char *buf, int *p_buflen);
1527static PyObject *load_next(PyObject *mod, PyObject *altmod,
1528 char **p_name, char *buf, int *p_buflen);
1529static int mark_miss(char *name);
1530static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
1531 char *buf, int buflen, int recursive);
1532static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001533
1534/* The Magnum Opus of dotted-name import :-) */
1535
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001536static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001537import_module_ex(char *name, PyObject *globals, PyObject *locals,
1538 PyObject *fromlist)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001539{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001540 char buf[MAXPATHLEN+1];
1541 int buflen = 0;
1542 PyObject *parent, *head, *next, *tail;
1543
1544 parent = get_parent(globals, buf, &buflen);
1545 if (parent == NULL)
1546 return NULL;
1547
1548 head = load_next(parent, Py_None, &name, buf, &buflen);
1549 if (head == NULL)
1550 return NULL;
1551
1552 tail = head;
1553 Py_INCREF(tail);
1554 while (name) {
1555 next = load_next(tail, tail, &name, buf, &buflen);
1556 Py_DECREF(tail);
1557 if (next == NULL) {
1558 Py_DECREF(head);
1559 return NULL;
1560 }
1561 tail = next;
1562 }
1563
1564 if (fromlist != NULL) {
1565 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1566 fromlist = NULL;
1567 }
1568
1569 if (fromlist == NULL) {
1570 Py_DECREF(tail);
1571 return head;
1572 }
1573
1574 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001575 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001576 Py_DECREF(tail);
1577 return NULL;
1578 }
1579
1580 return tail;
1581}
1582
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001583PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001584PyImport_ImportModuleEx(char *name, PyObject *globals, PyObject *locals,
1585 PyObject *fromlist)
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001586{
1587 PyObject *result;
1588 lock_import();
Guido van Rossumd65911b1998-03-03 22:33:27 +00001589 result = import_module_ex(name, globals, locals, fromlist);
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001590 unlock_import();
1591 return result;
1592}
1593
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001594static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001595get_parent(PyObject *globals, char *buf, int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001596{
1597 static PyObject *namestr = NULL;
1598 static PyObject *pathstr = NULL;
1599 PyObject *modname, *modpath, *modules, *parent;
1600
1601 if (globals == NULL || !PyDict_Check(globals))
1602 return Py_None;
1603
1604 if (namestr == NULL) {
1605 namestr = PyString_InternFromString("__name__");
1606 if (namestr == NULL)
1607 return NULL;
1608 }
1609 if (pathstr == NULL) {
1610 pathstr = PyString_InternFromString("__path__");
1611 if (pathstr == NULL)
1612 return NULL;
1613 }
1614
1615 *buf = '\0';
1616 *p_buflen = 0;
1617 modname = PyDict_GetItem(globals, namestr);
1618 if (modname == NULL || !PyString_Check(modname))
1619 return Py_None;
1620
1621 modpath = PyDict_GetItem(globals, pathstr);
1622 if (modpath != NULL) {
1623 int len = PyString_GET_SIZE(modname);
1624 if (len > MAXPATHLEN) {
1625 PyErr_SetString(PyExc_ValueError,
1626 "Module name too long");
1627 return NULL;
1628 }
1629 strcpy(buf, PyString_AS_STRING(modname));
1630 *p_buflen = len;
1631 }
1632 else {
1633 char *start = PyString_AS_STRING(modname);
1634 char *lastdot = strrchr(start, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001635 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001636 if (lastdot == NULL)
1637 return Py_None;
1638 len = lastdot - start;
1639 if (len >= MAXPATHLEN) {
1640 PyErr_SetString(PyExc_ValueError,
1641 "Module name too long");
1642 return NULL;
1643 }
1644 strncpy(buf, start, len);
1645 buf[len] = '\0';
1646 *p_buflen = len;
1647 }
1648
1649 modules = PyImport_GetModuleDict();
1650 parent = PyDict_GetItemString(modules, buf);
1651 if (parent == NULL)
1652 parent = Py_None;
1653 return parent;
1654 /* We expect, but can't guarantee, if parent != None, that:
1655 - parent.__name__ == buf
1656 - parent.__dict__ is globals
1657 If this is violated... Who cares? */
1658}
1659
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001660/* altmod is either None or same as mod */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001661static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001662load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
1663 int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001664{
1665 char *name = *p_name;
1666 char *dot = strchr(name, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001667 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001668 char *p;
1669 PyObject *result;
1670
1671 if (dot == NULL) {
1672 *p_name = NULL;
1673 len = strlen(name);
1674 }
1675 else {
1676 *p_name = dot+1;
1677 len = dot-name;
1678 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00001679 if (len == 0) {
1680 PyErr_SetString(PyExc_ValueError,
1681 "Empty module name");
1682 return NULL;
1683 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001684
1685 p = buf + *p_buflen;
1686 if (p != buf)
1687 *p++ = '.';
1688 if (p+len-buf >= MAXPATHLEN) {
1689 PyErr_SetString(PyExc_ValueError,
1690 "Module name too long");
1691 return NULL;
1692 }
1693 strncpy(p, name, len);
1694 p[len] = '\0';
1695 *p_buflen = p+len-buf;
1696
1697 result = import_submodule(mod, p, buf);
1698 if (result == Py_None && altmod != mod) {
1699 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001700 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001701 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001702 if (result != NULL && result != Py_None) {
1703 if (mark_miss(buf) != 0) {
1704 Py_DECREF(result);
1705 return NULL;
1706 }
1707 strncpy(buf, name, len);
1708 buf[len] = '\0';
1709 *p_buflen = len;
1710 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001711 }
1712 if (result == NULL)
1713 return NULL;
1714
1715 if (result == Py_None) {
1716 Py_DECREF(result);
1717 PyErr_Format(PyExc_ImportError,
1718 "No module named %.200s", name);
1719 return NULL;
1720 }
1721
1722 return result;
1723}
1724
1725static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001726mark_miss(char *name)
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001727{
1728 PyObject *modules = PyImport_GetModuleDict();
1729 return PyDict_SetItemString(modules, name, Py_None);
1730}
1731
1732static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001733ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, int buflen,
1734 int recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001735{
1736 int i;
1737
1738 if (!PyObject_HasAttrString(mod, "__path__"))
1739 return 1;
1740
1741 for (i = 0; ; i++) {
1742 PyObject *item = PySequence_GetItem(fromlist, i);
1743 int hasit;
1744 if (item == NULL) {
1745 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1746 PyErr_Clear();
1747 return 1;
1748 }
1749 return 0;
1750 }
1751 if (!PyString_Check(item)) {
1752 PyErr_SetString(PyExc_TypeError,
1753 "Item in ``from list'' not a string");
1754 Py_DECREF(item);
1755 return 0;
1756 }
1757 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001758 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001759 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001760 /* See if the package defines __all__ */
1761 if (recursive)
1762 continue; /* Avoid endless recursion */
1763 all = PyObject_GetAttrString(mod, "__all__");
1764 if (all == NULL)
1765 PyErr_Clear();
1766 else {
1767 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1768 return 0;
1769 Py_DECREF(all);
1770 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001771 continue;
1772 }
1773 hasit = PyObject_HasAttr(mod, item);
1774 if (!hasit) {
1775 char *subname = PyString_AS_STRING(item);
1776 PyObject *submod;
1777 char *p;
1778 if (buflen + strlen(subname) >= MAXPATHLEN) {
1779 PyErr_SetString(PyExc_ValueError,
1780 "Module name too long");
1781 Py_DECREF(item);
1782 return 0;
1783 }
1784 p = buf + buflen;
1785 *p++ = '.';
1786 strcpy(p, subname);
1787 submod = import_submodule(mod, subname, buf);
1788 Py_XDECREF(submod);
1789 if (submod == NULL) {
1790 Py_DECREF(item);
1791 return 0;
1792 }
1793 }
1794 Py_DECREF(item);
1795 }
1796
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001797 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001798}
1799
1800static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001801import_submodule(PyObject *mod, char *subname, char *fullname)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001802{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001803 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossumf48f11c2001-07-23 13:27:49 +00001804 PyObject *m, *res = NULL;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001805
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001806 /* Require:
1807 if mod == None: subname == fullname
1808 else: mod.__name__ + "." + subname == fullname
1809 */
1810
Tim Peters50d8d372001-02-28 05:34:27 +00001811 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001812 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001813 }
1814 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001815 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001816 char buf[MAXPATHLEN+1];
1817 struct filedescr *fdp;
1818 FILE *fp = NULL;
1819
Guido van Rossum9c0afe51998-05-19 15:09:05 +00001820 if (mod == Py_None)
1821 path = NULL;
1822 else {
1823 path = PyObject_GetAttrString(mod, "__path__");
1824 if (path == NULL) {
1825 PyErr_Clear();
1826 Py_INCREF(Py_None);
1827 return Py_None;
1828 }
1829 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001830
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001831 buf[0] = '\0';
Guido van Rossumb68cd421998-07-01 17:36:26 +00001832 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1833 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001834 if (fdp == NULL) {
1835 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1836 return NULL;
1837 PyErr_Clear();
1838 Py_INCREF(Py_None);
1839 return Py_None;
1840 }
1841 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001842 if (fp)
1843 fclose(fp);
Guido van Rossumf48f11c2001-07-23 13:27:49 +00001844 if (mod != Py_None) {
1845 /* Irrespective of the success of this load, make a
1846 reference to it in the parent package module.
1847 A copy gets saved in the modules dictionary
1848 under the full name, so get a reference from
1849 there, if need be. (The exception is when
1850 the load failed with a SyntaxError -- then
1851 there's no trace in sys.modules. In that case,
1852 of course, do nothing extra.) */
1853 res = m;
1854 if (res == NULL)
1855 res = PyDict_GetItemString(modules, fullname);
1856 if (res != NULL &&
1857 PyObject_SetAttrString(mod, subname, res) < 0) {
1858 Py_XDECREF(m);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001859 m = NULL;
1860 }
1861 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001862 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001863
1864 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001865}
1866
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001867
1868/* Re-import a module of any kind and return its module object, WITH
1869 INCREMENTED REFERENCE COUNT */
1870
Guido van Rossum79f25d91997-04-29 20:08:16 +00001871PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001872PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001873{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001874 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001875 PyObject *path = NULL;
1876 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001877 char buf[MAXPATHLEN+1];
1878 struct filedescr *fdp;
1879 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001880
Guido van Rossum79f25d91997-04-29 20:08:16 +00001881 if (m == NULL || !PyModule_Check(m)) {
1882 PyErr_SetString(PyExc_TypeError,
1883 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001884 return NULL;
1885 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001886 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001887 if (name == NULL)
1888 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001889 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001890 PyErr_Format(PyExc_ImportError,
1891 "reload(): module %.200s not in sys.modules",
1892 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001893 return NULL;
1894 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001895 subname = strrchr(name, '.');
1896 if (subname == NULL)
1897 subname = name;
1898 else {
1899 PyObject *parentname, *parent;
1900 parentname = PyString_FromStringAndSize(name, (subname-name));
1901 if (parentname == NULL)
1902 return NULL;
1903 parent = PyDict_GetItem(modules, parentname);
Barry Warsaw38793331999-01-27 17:54:20 +00001904 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00001905 if (parent == NULL) {
1906 PyErr_Format(PyExc_ImportError,
1907 "reload(): parent %.200s not in sys.modules",
1908 name);
1909 return NULL;
1910 }
1911 subname++;
1912 path = PyObject_GetAttrString(parent, "__path__");
1913 if (path == NULL)
1914 PyErr_Clear();
1915 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001916 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001917 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1918 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001919 if (fdp == NULL)
1920 return NULL;
1921 m = load_module(name, fp, buf, fdp->type);
1922 if (fp)
1923 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001924 return m;
1925}
1926
1927
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001928/* Higher-level import emulator which emulates the "import" statement
1929 more accurately -- it invokes the __import__() function from the
1930 builtins of the current globals. This means that the import is
1931 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00001932 environment, e.g. by "rexec".
1933 A dummy list ["__doc__"] is passed as the 4th argument so that
1934 e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
1935 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001936
1937PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001938PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001939{
1940 static PyObject *silly_list = NULL;
1941 static PyObject *builtins_str = NULL;
1942 static PyObject *import_str = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001943 PyObject *globals = NULL;
1944 PyObject *import = NULL;
1945 PyObject *builtins = NULL;
1946 PyObject *r = NULL;
1947
1948 /* Initialize constant string objects */
1949 if (silly_list == NULL) {
1950 import_str = PyString_InternFromString("__import__");
1951 if (import_str == NULL)
1952 return NULL;
1953 builtins_str = PyString_InternFromString("__builtins__");
1954 if (builtins_str == NULL)
1955 return NULL;
1956 silly_list = Py_BuildValue("[s]", "__doc__");
1957 if (silly_list == NULL)
1958 return NULL;
1959 }
1960
1961 /* Get the builtins from current globals */
1962 globals = PyEval_GetGlobals();
Guido van Rossum85cd1d62001-02-20 21:43:24 +00001963 if (globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00001964 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001965 builtins = PyObject_GetItem(globals, builtins_str);
1966 if (builtins == NULL)
1967 goto err;
1968 }
1969 else {
1970 /* No globals -- use standard builtins, and fake globals */
1971 PyErr_Clear();
1972
Guido van Rossum85cd1d62001-02-20 21:43:24 +00001973 builtins = PyImport_ImportModuleEx("__builtin__",
1974 NULL, NULL, NULL);
1975 if (builtins == NULL)
1976 return NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001977 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1978 if (globals == NULL)
1979 goto err;
1980 }
1981
1982 /* Get the __import__ function from the builtins */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001983 if (PyDict_Check(builtins)) {
Fred Drakea76ba6e2001-03-06 06:31:15 +00001984 import = PyObject_GetItem(builtins, import_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001985 if (import == NULL)
1986 PyErr_SetObject(PyExc_KeyError, import_str);
1987 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001988 else
Fred Drakea76ba6e2001-03-06 06:31:15 +00001989 import = PyObject_GetAttr(builtins, import_str);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001990 if (import == NULL)
1991 goto err;
1992
1993 /* Call the _import__ function with the proper argument list */
1994 r = PyObject_CallFunction(import, "OOOO",
1995 module_name, globals, globals, silly_list);
1996
1997 err:
1998 Py_XDECREF(globals);
1999 Py_XDECREF(builtins);
2000 Py_XDECREF(import);
Tim Peters50d8d372001-02-28 05:34:27 +00002001
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002002 return r;
2003}
2004
2005
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002006/* Module 'imp' provides Python access to the primitives used for
2007 importing modules.
2008*/
2009
Guido van Rossum79f25d91997-04-29 20:08:16 +00002010static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002011imp_get_magic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002012{
2013 char buf[4];
2014
Guido van Rossum43713e52000-02-29 13:59:29 +00002015 if (!PyArg_ParseTuple(args, ":get_magic"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002016 return NULL;
Guido van Rossum96774c12000-05-01 20:19:08 +00002017 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
2018 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
2019 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
2020 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002021
Guido van Rossum79f25d91997-04-29 20:08:16 +00002022 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002023}
2024
Guido van Rossum79f25d91997-04-29 20:08:16 +00002025static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002026imp_get_suffixes(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002027{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002028 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002029 struct filedescr *fdp;
2030
Guido van Rossum43713e52000-02-29 13:59:29 +00002031 if (!PyArg_ParseTuple(args, ":get_suffixes"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002032 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002033 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002034 if (list == NULL)
2035 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002036 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
2037 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002038 fdp->suffix, fdp->mode, fdp->type);
2039 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002040 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002041 return NULL;
2042 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002043 if (PyList_Append(list, item) < 0) {
2044 Py_DECREF(list);
2045 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002046 return NULL;
2047 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002048 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002049 }
2050 return list;
2051}
2052
Guido van Rossum79f25d91997-04-29 20:08:16 +00002053static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002054call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002055{
Tim Petersdbd9ba62000-07-09 03:09:57 +00002056 extern int fclose(FILE *);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002057 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002058 struct filedescr *fdp;
2059 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002060 FILE *fp = NULL;
2061
2062 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002063 if (path == Py_None)
2064 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002065 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
2066 if (fdp == NULL)
2067 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002068 if (fp != NULL) {
2069 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
2070 if (fob == NULL) {
2071 fclose(fp);
2072 return NULL;
2073 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002074 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002075 else {
2076 fob = Py_None;
2077 Py_INCREF(fob);
Tim Peters50d8d372001-02-28 05:34:27 +00002078 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002079 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002080 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002081 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002082 return ret;
2083}
2084
Guido van Rossum79f25d91997-04-29 20:08:16 +00002085static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002086imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002087{
2088 char *name;
2089 PyObject *path = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002090 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002091 return NULL;
2092 return call_find_module(name, path);
2093}
2094
2095static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002096imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002097{
2098 char *name;
2099 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002100 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002101 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002102 return NULL;
2103 ret = init_builtin(name);
2104 if (ret < 0)
2105 return NULL;
2106 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002107 Py_INCREF(Py_None);
2108 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002109 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002110 m = PyImport_AddModule(name);
2111 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002112 return m;
2113}
2114
Guido van Rossum79f25d91997-04-29 20:08:16 +00002115static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002116imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002117{
2118 char *name;
2119 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002120 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002121 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002122 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002123 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002124 if (ret < 0)
2125 return NULL;
2126 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002127 Py_INCREF(Py_None);
2128 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002129 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002130 m = PyImport_AddModule(name);
2131 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002132 return m;
2133}
2134
Guido van Rossum79f25d91997-04-29 20:08:16 +00002135static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002136imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002137{
2138 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002139
Guido van Rossum43713e52000-02-29 13:59:29 +00002140 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002141 return NULL;
2142 return get_frozen_object(name);
2143}
2144
Guido van Rossum79f25d91997-04-29 20:08:16 +00002145static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002146imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002147{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002148 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002149 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002150 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002151 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002152}
2153
Guido van Rossum79f25d91997-04-29 20:08:16 +00002154static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002155imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002156{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002157 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002158 struct _frozen *p;
Guido van Rossum43713e52000-02-29 13:59:29 +00002159 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002160 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002161 p = find_frozen(name);
2162 return PyInt_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002163}
2164
2165static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002166get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002167{
2168 FILE *fp;
2169 if (fob == NULL) {
2170 fp = fopen(pathname, mode);
2171 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002172 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002173 }
2174 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002175 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002176 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002177 PyErr_SetString(PyExc_ValueError,
2178 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002179 }
2180 return fp;
2181}
2182
Guido van Rossum79f25d91997-04-29 20:08:16 +00002183static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002184imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002185{
2186 char *name;
2187 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002188 PyObject *fob = NULL;
2189 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002190 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002191 if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002192 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002193 return NULL;
2194 fp = get_file(pathname, fob, "rb");
2195 if (fp == NULL)
2196 return NULL;
2197 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002198 if (fob == NULL)
2199 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002200 return m;
2201}
2202
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002203#ifdef HAVE_DYNAMIC_LOADING
2204
Guido van Rossum79f25d91997-04-29 20:08:16 +00002205static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002206imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002207{
2208 char *name;
2209 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002210 PyObject *fob = NULL;
2211 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002212 FILE *fp = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002213 if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002214 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002215 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002216 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002217 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002218 if (fp == NULL)
2219 return NULL;
2220 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002221 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002222 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002223}
2224
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002225#endif /* HAVE_DYNAMIC_LOADING */
2226
Guido van Rossum79f25d91997-04-29 20:08:16 +00002227static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002228imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002229{
2230 char *name;
2231 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002232 PyObject *fob = NULL;
2233 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002234 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002235 if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002236 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002237 return NULL;
2238 fp = get_file(pathname, fob, "r");
2239 if (fp == NULL)
2240 return NULL;
2241 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002242 if (fob == NULL)
2243 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002244 return m;
2245}
2246
Jack Jansen9c96a921995-02-15 22:57:06 +00002247#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002248static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002249imp_load_resource(PyObject *self, PyObject *args)
Jack Jansen9c96a921995-02-15 22:57:06 +00002250{
2251 char *name;
2252 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002253 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002254
Guido van Rossum43713e52000-02-29 13:59:29 +00002255 if (!PyArg_ParseTuple(args, "ss:load_resource", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002256 return NULL;
2257 m = PyMac_LoadResourceModule(name, pathname);
2258 return m;
2259}
2260#endif /* macintosh */
2261
Guido van Rossum79f25d91997-04-29 20:08:16 +00002262static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002263imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002264{
2265 char *name;
2266 PyObject *fob;
2267 char *pathname;
2268 char *suffix; /* Unused */
2269 char *mode;
2270 int type;
2271 FILE *fp;
2272
Guido van Rossum43713e52000-02-29 13:59:29 +00002273 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002274 &name, &fob, &pathname,
2275 &suffix, &mode, &type))
2276 return NULL;
2277 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
2278 PyErr_Format(PyExc_ValueError,
2279 "invalid file open mode %.200s", mode);
2280 return NULL;
2281 }
2282 if (fob == Py_None)
2283 fp = NULL;
2284 else {
2285 if (!PyFile_Check(fob)) {
2286 PyErr_SetString(PyExc_ValueError,
2287 "load_module arg#2 should be a file or None");
2288 return NULL;
2289 }
2290 fp = get_file(pathname, fob, mode);
2291 if (fp == NULL)
2292 return NULL;
2293 }
2294 return load_module(name, fp, pathname, type);
2295}
2296
2297static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002298imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002299{
2300 char *name;
2301 char *pathname;
Guido van Rossum43713e52000-02-29 13:59:29 +00002302 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002303 return NULL;
2304 return load_package(name, pathname);
2305}
2306
2307static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002308imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002309{
2310 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002311 if (!PyArg_ParseTuple(args, "s:new_module", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002312 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002313 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002314}
2315
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002316/* Doc strings */
2317
2318static char doc_imp[] = "\
2319This module provides the components needed to build your own\n\
2320__import__ function. Undocumented functions are obsolete.\n\
2321";
2322
2323static char doc_find_module[] = "\
2324find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
2325Search for a module. If path is omitted or None, search for a\n\
2326built-in, frozen or special module and continue search in sys.path.\n\
2327The module name cannot contain '.'; to search for a submodule of a\n\
2328package, pass the submodule name and the package's __path__.\
2329";
2330
2331static char doc_load_module[] = "\
2332load_module(name, file, filename, (suffix, mode, type)) -> module\n\
2333Load a module, given information returned by find_module().\n\
2334The module name must include the full package name, if any.\
2335";
2336
2337static char doc_get_magic[] = "\
2338get_magic() -> string\n\
2339Return the magic number for .pyc or .pyo files.\
2340";
2341
2342static char doc_get_suffixes[] = "\
2343get_suffixes() -> [(suffix, mode, type), ...]\n\
2344Return a list of (suffix, mode, type) tuples describing the files\n\
2345that find_module() looks for.\
2346";
2347
2348static char doc_new_module[] = "\
2349new_module(name) -> module\n\
2350Create a new module. Do not enter it in sys.modules.\n\
2351The module name must include the full package name, if any.\
2352";
2353
Tim Peters69232342001-08-30 05:16:13 +00002354static char doc_lock_held[] = "\
2355lock_held() -> 0 or 1\n\
2356Return 1 if the import lock is currently held.\n\
2357On platforms without threads, return 0.\
2358";
2359
Guido van Rossum79f25d91997-04-29 20:08:16 +00002360static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002361 {"find_module", imp_find_module, 1, doc_find_module},
2362 {"get_magic", imp_get_magic, 1, doc_get_magic},
2363 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2364 {"load_module", imp_load_module, 1, doc_load_module},
2365 {"new_module", imp_new_module, 1, doc_new_module},
Tim Peters69232342001-08-30 05:16:13 +00002366 {"lock_held", imp_lock_held, 1, doc_lock_held},
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002367 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002368 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002369 {"init_builtin", imp_init_builtin, 1},
2370 {"init_frozen", imp_init_frozen, 1},
2371 {"is_builtin", imp_is_builtin, 1},
2372 {"is_frozen", imp_is_frozen, 1},
2373 {"load_compiled", imp_load_compiled, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002374#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002375 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002376#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002377 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002378#ifdef macintosh
2379 {"load_resource", imp_load_resource, 1},
2380#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002381 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002382 {NULL, NULL} /* sentinel */
2383};
2384
Guido van Rossum1a8791e1998-08-04 22:46:29 +00002385static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002386setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002387{
2388 PyObject *v;
2389 int err;
2390
2391 v = PyInt_FromLong((long)value);
2392 err = PyDict_SetItemString(d, name, v);
2393 Py_XDECREF(v);
2394 return err;
2395}
2396
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002397void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002398initimp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002399{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002400 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002401
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002402 m = Py_InitModule4("imp", imp_methods, doc_imp,
2403 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002404 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002405
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002406 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2407 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2408 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2409 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2410 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2411 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2412 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2413 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00002414 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002415
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002416 failure:
2417 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002418}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002419
2420
Guido van Rossumb18618d2000-05-03 23:44:39 +00002421/* API for embedding applications that want to add their own entries
2422 to the table of built-in modules. This should normally be called
2423 *before* Py_Initialize(). When the table resize fails, -1 is
2424 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002425
2426 After a similar function by Just van Rossum. */
2427
2428int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002429PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002430{
2431 static struct _inittab *our_copy = NULL;
2432 struct _inittab *p;
2433 int i, n;
2434
2435 /* Count the number of entries in both tables */
2436 for (n = 0; newtab[n].name != NULL; n++)
2437 ;
2438 if (n == 0)
2439 return 0; /* Nothing to do */
2440 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2441 ;
2442
2443 /* Allocate new memory for the combined table */
Guido van Rossumb18618d2000-05-03 23:44:39 +00002444 p = our_copy;
2445 PyMem_RESIZE(p, struct _inittab, i+n+1);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002446 if (p == NULL)
2447 return -1;
2448
2449 /* Copy the tables into the new memory */
2450 if (our_copy != PyImport_Inittab)
2451 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2452 PyImport_Inittab = our_copy = p;
2453 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
2454
2455 return 0;
2456}
2457
2458/* Shorthand to add a single entry given a name and a function */
2459
2460int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002461PyImport_AppendInittab(char *name, void (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002462{
2463 struct _inittab newtab[2];
2464
2465 memset(newtab, '\0', sizeof newtab);
2466
2467 newtab[0].name = name;
2468 newtab[0].initfunc = initfunc;
2469
2470 return PyImport_ExtendInittab(newtab);
2471}