blob: 8e08164d98e7e442bca91b37adb15a58a9bf9725 [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
Guido van Rossum595d7ba1997-12-05 21:45:29 +000026#if defined(PYCC_VACPP)
27/* VisualAge C/C++ Failed to Define MountType Field in sys/stat.h */
28#define S_IFMT (S_IFDIR|S_IFCHR|S_IFREG)
29#endif
30
Guido van Rossumaee0bad1997-09-05 07:33:22 +000031#ifndef S_ISDIR
32#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
33#endif
34
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000035extern time_t PyOS_GetLastModificationTime(char *, FILE *);
36 /* In getmtime.c */
Guido van Rossum21d335e1993-10-15 13:01:11 +000037
Guido van Rossum6c849691994-09-26 15:47:17 +000038/* Magic word to reject .pyc files generated by other Python versions */
Guido van Rossum7faeab31995-07-07 22:50:36 +000039/* Change for each incompatible change */
40/* The value of CR and LF is incorporated so if you ever read or write
41 a .pyc file in text mode the magic number will be wrong; also, the
42 Apple MPW compiler swaps their values, botching string constants */
43/* XXX Perhaps the magic number should be frozen and a version field
44 added to the .pyc file header? */
Guido van Rossumdd5db431997-01-17 21:06:11 +000045/* New way to come up with the magic number: (YEAR-1995), MONTH, DAY */
Tim Peters6d6c1a32001-08-02 04:15:00 +000046#define MAGIC (60717 | ((long)'\r'<<16) | ((long)'\n'<<24))
Guido van Rossum3ddee711991-12-16 13:06:34 +000047
Guido van Rossum96774c12000-05-01 20:19:08 +000048/* Magic word as global; note that _PyImport_Init() can change the
Jeremy Hylton9262b8a2000-06-30 04:59:17 +000049 value of this global to accommodate for alterations of how the
Guido van Rossum96774c12000-05-01 20:19:08 +000050 compiler works which are enabled by command line switches. */
51static long pyc_magic = MAGIC;
52
Guido van Rossum25ce5661997-08-02 03:10:38 +000053/* See _PyImport_FixupExtension() below */
54static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000055
Guido van Rossum771c6c81997-10-31 18:37:24 +000056/* This table is defined in config.c: */
57extern struct _inittab _PyImport_Inittab[];
58
59struct _inittab *PyImport_Inittab = _PyImport_Inittab;
Guido van Rossum66f1fa81991-04-03 19:03:52 +000060
Guido van Rossumed1170e1999-12-20 21:23:41 +000061/* these tables define the module suffixes that Python recognizes */
62struct filedescr * _PyImport_Filetab = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +000063
64#ifdef RISCOS
65static const struct filedescr _PyImport_StandardFiletab[] = {
66 {"/py", "r", PY_SOURCE},
67 {"/pyc", "rb", PY_COMPILED},
68 {0, 0}
69};
70#else
Guido van Rossumed1170e1999-12-20 21:23:41 +000071static const struct filedescr _PyImport_StandardFiletab[] = {
72 {".py", "r", PY_SOURCE},
Tim Petersc1731372001-08-04 08:12:36 +000073#ifdef MS_WIN32
74 {".pyw", "r", PY_SOURCE},
75#endif
Guido van Rossumed1170e1999-12-20 21:23:41 +000076 {".pyc", "rb", PY_COMPILED},
77 {0, 0}
78};
Guido van Rossum48a680c2001-03-02 06:34:14 +000079#endif
Guido van Rossumed1170e1999-12-20 21:23:41 +000080
Guido van Rossum1ae940a1995-01-02 19:04:15 +000081/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000082
83void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000084_PyImport_Init(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000085{
Guido van Rossumed1170e1999-12-20 21:23:41 +000086 const struct filedescr *scan;
87 struct filedescr *filetab;
88 int countD = 0;
89 int countS = 0;
90
91 /* prepare _PyImport_Filetab: copy entries from
92 _PyImport_DynLoadFiletab and _PyImport_StandardFiletab.
93 */
94 for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan)
95 ++countD;
96 for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan)
97 ++countS;
Guido van Rossumb18618d2000-05-03 23:44:39 +000098 filetab = PyMem_NEW(struct filedescr, countD + countS + 1);
Guido van Rossumed1170e1999-12-20 21:23:41 +000099 memcpy(filetab, _PyImport_DynLoadFiletab,
100 countD * sizeof(struct filedescr));
101 memcpy(filetab + countD, _PyImport_StandardFiletab,
102 countS * sizeof(struct filedescr));
103 filetab[countD + countS].suffix = NULL;
104
105 _PyImport_Filetab = filetab;
106
Guido van Rossum0824f631997-03-11 18:37:35 +0000107 if (Py_OptimizeFlag) {
Guido van Rossumed1170e1999-12-20 21:23:41 +0000108 /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */
109 for (; filetab->suffix != NULL; filetab++) {
Guido van Rossum48a680c2001-03-02 06:34:14 +0000110#ifndef RISCOS
Guido van Rossumed1170e1999-12-20 21:23:41 +0000111 if (strcmp(filetab->suffix, ".pyc") == 0)
112 filetab->suffix = ".pyo";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000113#else
114 if (strcmp(filetab->suffix, "/pyc") == 0)
115 filetab->suffix = "/pyo";
116#endif
Guido van Rossum0824f631997-03-11 18:37:35 +0000117 }
118 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000119
120 if (Py_UnicodeFlag) {
121 /* Fix the pyc_magic so that byte compiled code created
122 using the all-Unicode method doesn't interfere with
123 code created in normal operation mode. */
124 pyc_magic = MAGIC + 1;
125 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000126}
127
Guido van Rossum25ce5661997-08-02 03:10:38 +0000128void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000129_PyImport_Fini(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000130{
131 Py_XDECREF(extensions);
132 extensions = NULL;
Barry Warsaw84294482000-10-03 16:02:05 +0000133 PyMem_DEL(_PyImport_Filetab);
134 _PyImport_Filetab = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000135}
136
137
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000138/* Locking primitives to prevent parallel imports of the same module
139 in different threads to return with a partially loaded module.
140 These calls are serialized by the global interpreter lock. */
141
142#ifdef WITH_THREAD
143
Guido van Rossum49b56061998-10-01 20:42:43 +0000144#include "pythread.h"
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000145
Guido van Rossum65d5b571998-12-21 19:32:43 +0000146static PyThread_type_lock import_lock = 0;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000147static long import_lock_thread = -1;
148static int import_lock_level = 0;
149
150static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000151lock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000152{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000153 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000154 if (me == -1)
155 return; /* Too bad */
156 if (import_lock == NULL)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000157 import_lock = PyThread_allocate_lock();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000158 if (import_lock_thread == me) {
159 import_lock_level++;
160 return;
161 }
Guido van Rossum65d5b571998-12-21 19:32:43 +0000162 if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0)) {
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000163 PyThreadState *tstate = PyEval_SaveThread();
Guido van Rossum65d5b571998-12-21 19:32:43 +0000164 PyThread_acquire_lock(import_lock, 1);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000165 PyEval_RestoreThread(tstate);
166 }
167 import_lock_thread = me;
168 import_lock_level = 1;
169}
170
171static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000172unlock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000173{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000174 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000175 if (me == -1)
176 return; /* Too bad */
177 if (import_lock_thread != me)
178 Py_FatalError("unlock_import: not holding the import lock");
179 import_lock_level--;
180 if (import_lock_level == 0) {
181 import_lock_thread = -1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000182 PyThread_release_lock(import_lock);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000183 }
184}
185
186#else
187
188#define lock_import()
189#define unlock_import()
190
191#endif
192
Guido van Rossum25ce5661997-08-02 03:10:38 +0000193/* Helper for sys */
194
195PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000196PyImport_GetModuleDict(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000197{
198 PyInterpreterState *interp = PyThreadState_Get()->interp;
199 if (interp->modules == NULL)
200 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
201 return interp->modules;
202}
203
Guido van Rossum3f5da241990-12-20 15:06:42 +0000204
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000205/* List of names to clear in sys */
206static char* sys_deletes[] = {
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000207 "path", "argv", "ps1", "ps2", "exitfunc",
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000208 "exc_type", "exc_value", "exc_traceback",
209 "last_type", "last_value", "last_traceback",
210 NULL
211};
212
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000213static char* sys_files[] = {
214 "stdin", "__stdin__",
215 "stdout", "__stdout__",
216 "stderr", "__stderr__",
217 NULL
218};
219
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000220
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000221/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000222
Guido van Rossum3f5da241990-12-20 15:06:42 +0000223void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000224PyImport_Cleanup(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000225{
Guido van Rossum758eec01998-01-19 21:58:26 +0000226 int pos, ndone;
227 char *name;
228 PyObject *key, *value, *dict;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000229 PyInterpreterState *interp = PyThreadState_Get()->interp;
Guido van Rossum758eec01998-01-19 21:58:26 +0000230 PyObject *modules = interp->modules;
231
232 if (modules == NULL)
233 return; /* Already done */
234
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000235 /* Delete some special variables first. These are common
236 places where user values hide and people complain when their
237 destructors fail. Since the modules containing them are
238 deleted *last* of all, they would come too late in the normal
239 destruction order. Sigh. */
240
241 value = PyDict_GetItemString(modules, "__builtin__");
242 if (value != NULL && PyModule_Check(value)) {
243 dict = PyModule_GetDict(value);
244 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000245 PySys_WriteStderr("# clear __builtin__._\n");
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000246 PyDict_SetItemString(dict, "_", Py_None);
247 }
248 value = PyDict_GetItemString(modules, "sys");
249 if (value != NULL && PyModule_Check(value)) {
250 char **p;
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000251 PyObject *v;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000252 dict = PyModule_GetDict(value);
253 for (p = sys_deletes; *p != NULL; p++) {
254 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000255 PySys_WriteStderr("# clear sys.%s\n", *p);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000256 PyDict_SetItemString(dict, *p, Py_None);
257 }
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000258 for (p = sys_files; *p != NULL; p+=2) {
259 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000260 PySys_WriteStderr("# restore sys.%s\n", *p);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000261 v = PyDict_GetItemString(dict, *(p+1));
262 if (v == NULL)
263 v = Py_None;
264 PyDict_SetItemString(dict, *p, v);
265 }
266 }
267
268 /* First, delete __main__ */
269 value = PyDict_GetItemString(modules, "__main__");
270 if (value != NULL && PyModule_Check(value)) {
271 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000272 PySys_WriteStderr("# cleanup __main__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000273 _PyModule_Clear(value);
274 PyDict_SetItemString(modules, "__main__", Py_None);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000275 }
276
Guido van Rossum758eec01998-01-19 21:58:26 +0000277 /* The special treatment of __builtin__ here is because even
278 when it's not referenced as a module, its dictionary is
279 referenced by almost every module's __builtins__. Since
280 deleting a module clears its dictionary (even if there are
281 references left to it), we need to delete the __builtin__
282 module last. Likewise, we don't delete sys until the very
283 end because it is implicitly referenced (e.g. by print).
284
285 Also note that we 'delete' modules by replacing their entry
286 in the modules dict with None, rather than really deleting
287 them; this avoids a rehash of the modules dictionary and
288 also marks them as "non existent" so they won't be
289 re-imported. */
290
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000291 /* Next, repeatedly delete modules with a reference count of
Guido van Rossum758eec01998-01-19 21:58:26 +0000292 one (skipping __builtin__ and sys) and delete them */
293 do {
294 ndone = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000295 pos = 0;
Guido van Rossum758eec01998-01-19 21:58:26 +0000296 while (PyDict_Next(modules, &pos, &key, &value)) {
297 if (value->ob_refcnt != 1)
298 continue;
Guido van Rossum566373e1998-10-01 15:24:50 +0000299 if (PyString_Check(key) && PyModule_Check(value)) {
300 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000301 if (strcmp(name, "__builtin__") == 0)
302 continue;
303 if (strcmp(name, "sys") == 0)
304 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000305 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000306 PySys_WriteStderr(
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000307 "# cleanup[1] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000308 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000309 PyDict_SetItem(modules, key, Py_None);
310 ndone++;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000311 }
312 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000313 } while (ndone > 0);
314
Guido van Rossum758eec01998-01-19 21:58:26 +0000315 /* Next, delete all modules (still skipping __builtin__ and sys) */
316 pos = 0;
317 while (PyDict_Next(modules, &pos, &key, &value)) {
Guido van Rossum566373e1998-10-01 15:24:50 +0000318 if (PyString_Check(key) && PyModule_Check(value)) {
319 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000320 if (strcmp(name, "__builtin__") == 0)
321 continue;
322 if (strcmp(name, "sys") == 0)
323 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000324 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000325 PySys_WriteStderr("# cleanup[2] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000326 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000327 PyDict_SetItem(modules, key, Py_None);
328 }
329 }
330
331 /* Next, delete sys and __builtin__ (in that order) */
332 value = PyDict_GetItemString(modules, "sys");
333 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000334 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000335 PySys_WriteStderr("# cleanup sys\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000336 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000337 PyDict_SetItemString(modules, "sys", Py_None);
338 }
339 value = PyDict_GetItemString(modules, "__builtin__");
340 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000341 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000342 PySys_WriteStderr("# cleanup __builtin__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000343 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000344 PyDict_SetItemString(modules, "__builtin__", Py_None);
345 }
346
347 /* Finally, clear and delete the modules directory */
348 PyDict_Clear(modules);
349 interp->modules = NULL;
350 Py_DECREF(modules);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000351}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000352
353
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000354/* Helper for pythonrun.c -- return magic number */
355
356long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000357PyImport_GetMagicNumber(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000358{
Guido van Rossum96774c12000-05-01 20:19:08 +0000359 return pyc_magic;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000360}
361
362
Guido van Rossum25ce5661997-08-02 03:10:38 +0000363/* Magic for extension modules (built-in as well as dynamically
364 loaded). To prevent initializing an extension module more than
365 once, we keep a static dictionary 'extensions' keyed by module name
366 (for built-in modules) or by filename (for dynamically loaded
367 modules), containing these modules. A copy od the module's
368 dictionary is stored by calling _PyImport_FixupExtension()
369 immediately after the module initialization function succeeds. A
370 copy can be retrieved from there by calling
371 _PyImport_FindExtension(). */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000372
Guido van Rossum79f25d91997-04-29 20:08:16 +0000373PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000374_PyImport_FixupExtension(char *name, char *filename)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000375{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000376 PyObject *modules, *mod, *dict, *copy;
377 if (extensions == NULL) {
378 extensions = PyDict_New();
379 if (extensions == NULL)
380 return NULL;
381 }
382 modules = PyImport_GetModuleDict();
383 mod = PyDict_GetItemString(modules, name);
384 if (mod == NULL || !PyModule_Check(mod)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000385 PyErr_Format(PyExc_SystemError,
386 "_PyImport_FixupExtension: module %.200s not loaded", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000387 return NULL;
388 }
389 dict = PyModule_GetDict(mod);
390 if (dict == NULL)
391 return NULL;
392 copy = PyObject_CallMethod(dict, "copy", "");
393 if (copy == NULL)
394 return NULL;
395 PyDict_SetItemString(extensions, filename, copy);
396 Py_DECREF(copy);
397 return copy;
398}
399
400PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000401_PyImport_FindExtension(char *name, char *filename)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000402{
403 PyObject *dict, *mod, *mdict, *result;
404 if (extensions == NULL)
405 return NULL;
406 dict = PyDict_GetItemString(extensions, filename);
407 if (dict == NULL)
408 return NULL;
409 mod = PyImport_AddModule(name);
410 if (mod == NULL)
411 return NULL;
412 mdict = PyModule_GetDict(mod);
413 if (mdict == NULL)
414 return NULL;
415 result = PyObject_CallMethod(mdict, "update", "O", dict);
416 if (result == NULL)
417 return NULL;
418 Py_DECREF(result);
419 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000420 PySys_WriteStderr("import %s # previously loaded (%s)\n",
Guido van Rossum25ce5661997-08-02 03:10:38 +0000421 name, filename);
422 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000423}
424
425
426/* Get the module object corresponding to a module name.
427 First check the modules dictionary if there's one there,
428 if not, create a new one and insert in in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000429 Because the former action is most common, THIS DOES NOT RETURN A
430 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000431
Guido van Rossum79f25d91997-04-29 20:08:16 +0000432PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000433PyImport_AddModule(char *name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000434{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000435 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000436 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000437
Guido van Rossum25ce5661997-08-02 03:10:38 +0000438 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
Guido van Rossum79f25d91997-04-29 20:08:16 +0000439 PyModule_Check(m))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000440 return m;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000441 m = PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000442 if (m == NULL)
443 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000444 if (PyDict_SetItemString(modules, name, m) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000445 Py_DECREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000446 return NULL;
447 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000448 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000449
450 return m;
451}
452
453
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000454/* Execute a code object in a module and return the module object
455 WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000456
Guido van Rossum79f25d91997-04-29 20:08:16 +0000457PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000458PyImport_ExecCodeModule(char *name, PyObject *co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000459{
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000460 return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
461}
462
463PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000464PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname)
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000465{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000466 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000467 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000468
Guido van Rossum79f25d91997-04-29 20:08:16 +0000469 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000470 if (m == NULL)
471 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000472 d = PyModule_GetDict(m);
473 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
474 if (PyDict_SetItemString(d, "__builtins__",
475 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000476 return NULL;
477 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000478 /* Remember the filename as the __file__ attribute */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000479 v = NULL;
480 if (pathname != NULL) {
481 v = PyString_FromString(pathname);
482 if (v == NULL)
483 PyErr_Clear();
484 }
485 if (v == NULL) {
486 v = ((PyCodeObject *)co)->co_filename;
487 Py_INCREF(v);
488 }
489 if (PyDict_SetItemString(d, "__file__", v) != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000490 PyErr_Clear(); /* Not important enough to report */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000491 Py_DECREF(v);
492
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000493 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000494 if (v == NULL)
495 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000496 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000497
Guido van Rossum25ce5661997-08-02 03:10:38 +0000498 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000499 PyErr_Format(PyExc_ImportError,
500 "Loaded module %.200s not found in sys.modules",
501 name);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000502 return NULL;
503 }
504
Guido van Rossum79f25d91997-04-29 20:08:16 +0000505 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000506
507 return m;
508}
509
510
511/* Given a pathname for a Python source file, fill a buffer with the
512 pathname for the corresponding compiled file. Return the pathname
513 for the compiled file, or NULL if there's no space in the buffer.
514 Doesn't set an exception. */
515
516static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000517make_compiled_pathname(char *pathname, char *buf, size_t buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000518{
Tim Petersc1731372001-08-04 08:12:36 +0000519 size_t len = strlen(pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000520 if (len+2 > buflen)
521 return NULL;
Tim Petersc1731372001-08-04 08:12:36 +0000522
523#ifdef MS_WIN32
524 /* Treat .pyw as if it were .py. The case of ".pyw" must match
525 that used in _PyImport_StandardFiletab. */
526 if (len >= 4 && strcmp(&pathname[len-4], ".pyw") == 0)
527 --len; /* pretend 'w' isn't there */
528#endif
529 memcpy(buf, pathname, len);
530 buf[len] = Py_OptimizeFlag ? 'o' : 'c';
531 buf[len+1] = '\0';
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000532
533 return buf;
534}
535
536
537/* Given a pathname for a Python source file, its time of last
538 modification, and a pathname for a compiled file, check whether the
539 compiled file represents the same version of the source. If so,
540 return a FILE pointer for the compiled file, positioned just after
541 the header; if not, return NULL.
542 Doesn't set an exception. */
543
544static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000545check_compiled_module(char *pathname, long mtime, char *cpathname)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000546{
547 FILE *fp;
548 long magic;
549 long pyc_mtime;
550
551 fp = fopen(cpathname, "rb");
552 if (fp == NULL)
553 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000554 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000555 if (magic != pyc_magic) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000556 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000557 PySys_WriteStderr("# %s has bad magic\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000558 fclose(fp);
559 return NULL;
560 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000561 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000562 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000563 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000564 PySys_WriteStderr("# %s has bad mtime\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000565 fclose(fp);
566 return NULL;
567 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000568 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000569 PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000570 return fp;
571}
572
573
574/* Read a code object from a file and check it for validity */
575
Guido van Rossum79f25d91997-04-29 20:08:16 +0000576static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000577read_compiled_module(char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000578{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000579 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000580
Tim Petersd9b9ac82001-01-28 00:27:39 +0000581 co = PyMarshal_ReadLastObjectFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000582 /* Ugly: rd_object() may return NULL with or without error */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000583 if (co == NULL || !PyCode_Check(co)) {
584 if (!PyErr_Occurred())
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000585 PyErr_Format(PyExc_ImportError,
586 "Non-code object in %.200s", cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000587 Py_XDECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000588 return NULL;
589 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000590 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000591}
592
593
594/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000595 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000596
Guido van Rossum79f25d91997-04-29 20:08:16 +0000597static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000598load_compiled_module(char *name, char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000599{
600 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000601 PyCodeObject *co;
602 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000603
Guido van Rossum79f25d91997-04-29 20:08:16 +0000604 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000605 if (magic != pyc_magic) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000606 PyErr_Format(PyExc_ImportError,
607 "Bad magic number in %.200s", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000608 return NULL;
609 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000610 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000611 co = read_compiled_module(cpathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000612 if (co == NULL)
613 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000614 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000615 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000616 name, cpathname);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000617 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000618 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000619
620 return m;
621}
622
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000623/* Parse a source file and return the corresponding code object */
624
Guido van Rossum79f25d91997-04-29 20:08:16 +0000625static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000626parse_source_module(char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000627{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000628 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000629 node *n;
630
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000631 n = PyParser_SimpleParseFile(fp, pathname, Py_file_input);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000632 if (n == NULL)
633 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000634 co = PyNode_Compile(n, pathname);
635 PyNode_Free(n);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000636
637 return co;
638}
639
640
Guido van Rossum55a83382000-09-20 20:31:38 +0000641/* Helper to open a bytecode file for writing in exclusive mode */
642
643static FILE *
644open_exclusive(char *filename)
645{
646#if defined(O_EXCL)&&defined(O_CREAT)&&defined(O_WRONLY)&&defined(O_TRUNC)
647 /* Use O_EXCL to avoid a race condition when another process tries to
648 write the same file. When that happens, our open() call fails,
649 which is just fine (since it's only a cache).
650 XXX If the file exists and is writable but the directory is not
651 writable, the file will never be written. Oh well.
652 */
653 int fd;
654 (void) unlink(filename);
Tim Peters42c83af2000-09-29 04:03:10 +0000655 fd = open(filename, O_EXCL|O_CREAT|O_WRONLY|O_TRUNC
656#ifdef O_BINARY
657 |O_BINARY /* necessary for Windows */
658#endif
Tim Peters50d8d372001-02-28 05:34:27 +0000659
Tim Peters42c83af2000-09-29 04:03:10 +0000660 , 0666);
Guido van Rossum55a83382000-09-20 20:31:38 +0000661 if (fd < 0)
662 return NULL;
663 return fdopen(fd, "wb");
664#else
665 /* Best we can do -- on Windows this can't happen anyway */
666 return fopen(filename, "wb");
667#endif
668}
669
670
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000671/* Write a compiled module to a file, placing the time of last
672 modification of its source into the header.
673 Errors are ignored, if a write error occurs an attempt is made to
674 remove the file. */
675
676static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000677write_compiled_module(PyCodeObject *co, char *cpathname, long mtime)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000678{
679 FILE *fp;
680
Guido van Rossum55a83382000-09-20 20:31:38 +0000681 fp = open_exclusive(cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000682 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000683 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000684 PySys_WriteStderr(
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000685 "# can't create %s\n", cpathname);
686 return;
687 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000688 PyMarshal_WriteLongToFile(pyc_magic, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000689 /* First write a 0 for mtime */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000690 PyMarshal_WriteLongToFile(0L, fp);
691 PyMarshal_WriteObjectToFile((PyObject *)co, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000692 if (ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000693 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000694 PySys_WriteStderr("# can't write %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000695 /* Don't keep partial file */
696 fclose(fp);
697 (void) unlink(cpathname);
698 return;
699 }
700 /* Now write the true mtime */
701 fseek(fp, 4L, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000702 PyMarshal_WriteLongToFile(mtime, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000703 fflush(fp);
704 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000705 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000706 PySys_WriteStderr("# wrote %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000707#ifdef macintosh
Jack Jansencbf630f2000-07-11 21:59:16 +0000708 PyMac_setfiletype(cpathname, 'Pyth', 'PYC ');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000709#endif
710}
711
712
713/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000714 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
715 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000716
Guido van Rossum79f25d91997-04-29 20:08:16 +0000717static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000718load_source_module(char *name, char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000719{
Fred Drake4c82b232000-06-30 16:18:57 +0000720 time_t mtime;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000721 FILE *fpc;
722 char buf[MAXPATHLEN+1];
723 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000724 PyCodeObject *co;
725 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000726
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000727 mtime = PyOS_GetLastModificationTime(pathname, fp);
Fred Drakec63d3e92001-03-01 06:33:32 +0000728 if (mtime == (time_t)(-1))
Fred Drake4c82b232000-06-30 16:18:57 +0000729 return NULL;
730#if SIZEOF_TIME_T > 4
731 /* Python's .pyc timestamp handling presumes that the timestamp fits
732 in 4 bytes. This will be fine until sometime in the year 2038,
733 when a 4-byte signed time_t will overflow.
734 */
735 if (mtime >> 32) {
736 PyErr_SetString(PyExc_OverflowError,
Fred Drakec63d3e92001-03-01 06:33:32 +0000737 "modification time overflows a 4 byte field");
Fred Drake4c82b232000-06-30 16:18:57 +0000738 return NULL;
739 }
740#endif
Jeremy Hylton37832f02001-04-13 17:50:20 +0000741 cpathname = make_compiled_pathname(pathname, buf,
742 (size_t)MAXPATHLEN + 1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000743 if (cpathname != NULL &&
744 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000745 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000746 fclose(fpc);
747 if (co == NULL)
748 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000749 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000750 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000751 name, cpathname);
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000752 pathname = cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000753 }
754 else {
755 co = parse_source_module(pathname, fp);
756 if (co == NULL)
757 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000758 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000759 PySys_WriteStderr("import %s # from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000760 name, pathname);
761 write_compiled_module(co, cpathname, mtime);
762 }
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000763 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000764 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000765
766 return m;
767}
768
769
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000770/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +0000771static PyObject *load_module(char *, FILE *, char *, int);
772static struct filedescr *find_module(char *, PyObject *,
773 char *, size_t, FILE **);
774static struct _frozen *find_frozen(char *name);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000775
776/* Load a package and return its module object WITH INCREMENTED
777 REFERENCE COUNT */
778
779static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000780load_package(char *name, char *pathname)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000781{
782 PyObject *m, *d, *file, *path;
783 int err;
784 char buf[MAXPATHLEN+1];
785 FILE *fp = NULL;
786 struct filedescr *fdp;
787
788 m = PyImport_AddModule(name);
789 if (m == NULL)
790 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000791 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000792 PySys_WriteStderr("import %s # directory %s\n",
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000793 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000794 d = PyModule_GetDict(m);
795 file = PyString_FromString(pathname);
796 if (file == NULL)
797 return NULL;
798 path = Py_BuildValue("[O]", file);
799 if (path == NULL) {
800 Py_DECREF(file);
801 return NULL;
802 }
803 err = PyDict_SetItemString(d, "__file__", file);
804 if (err == 0)
805 err = PyDict_SetItemString(d, "__path__", path);
806 if (err != 0) {
807 m = NULL;
808 goto cleanup;
809 }
810 buf[0] = '\0';
811 fdp = find_module("__init__", path, buf, sizeof(buf), &fp);
812 if (fdp == NULL) {
813 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
814 PyErr_Clear();
815 }
816 else
817 m = NULL;
818 goto cleanup;
819 }
820 m = load_module(name, fp, buf, fdp->type);
821 if (fp != NULL)
822 fclose(fp);
823 cleanup:
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000824 Py_XDECREF(path);
825 Py_XDECREF(file);
826 return m;
827}
828
829
830/* Helper to test for built-in module */
831
832static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000833is_builtin(char *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000834{
835 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +0000836 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
837 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
838 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000839 return -1;
840 else
841 return 1;
842 }
843 }
844 return 0;
845}
846
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000847
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000848/* Search the path (default sys.path) for a module. Return the
849 corresponding filedescr struct, and (via return arguments) the
850 pathname and an open file. Return NULL if the module is not found. */
851
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000852#ifdef MS_COREDLL
Thomas Woutersb4bd21c2000-07-22 23:38:01 +0000853extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **,
854 char *, int);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000855#endif
856
Tim Peters50d8d372001-02-28 05:34:27 +0000857static int case_ok(char *, int, int, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000858static int find_init_module(char *); /* Forward */
Guido van Rossum197346f1997-10-31 18:38:52 +0000859
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000860static struct filedescr *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000861find_module(char *realname, PyObject *path, char *buf, size_t buflen,
862 FILE **p_fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000863{
Fred Drake4c82b232000-06-30 16:18:57 +0000864 int i, npath;
865 size_t len, namelen;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000866 struct _frozen *f;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000867 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000868 FILE *fp = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000869#ifndef RISCOS
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000870 struct stat statbuf;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000871#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000872 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
873 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
874 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossum0506a431998-08-11 15:07:39 +0000875 char name[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000876
Fred Drake4c82b232000-06-30 16:18:57 +0000877 if (strlen(realname) > MAXPATHLEN) {
878 PyErr_SetString(PyExc_OverflowError, "module name is too long");
879 return NULL;
880 }
Guido van Rossum0506a431998-08-11 15:07:39 +0000881 strcpy(name, realname);
882
883 if (path != NULL && PyString_Check(path)) {
884 /* Submodule of "frozen" package:
885 Set name to the fullname, path to NULL
886 and continue as "usual" */
887 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
888 PyErr_SetString(PyExc_ImportError,
889 "full frozen module name too long");
890 return NULL;
891 }
892 strcpy(buf, PyString_AsString(path));
893 strcat(buf, ".");
894 strcat(buf, name);
895 strcpy(name, buf);
896 path = NULL;
897 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000898 if (path == NULL) {
899 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000900 strcpy(buf, name);
901 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000902 }
Guido van Rossuma5568d31998-03-05 03:45:08 +0000903 if ((f = find_frozen(name)) != NULL) {
904 strcpy(buf, name);
905 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000906 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000907
Guido van Rossumac279101996-08-22 23:10:58 +0000908#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000909 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
910 if (fp != NULL) {
911 *p_fp = fp;
912 return fdp;
913 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000914#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000915 path = PySys_GetObject("path");
916 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000917 if (path == NULL || !PyList_Check(path)) {
918 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +0000919 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000920 return NULL;
921 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000922 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000923 namelen = strlen(name);
924 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000925 PyObject *v = PyList_GetItem(path, i);
926 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000927 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000928 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000929 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000930 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000931 strcpy(buf, PyString_AsString(v));
Fred Drake4c82b232000-06-30 16:18:57 +0000932 if (strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000933 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000934#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000935#ifdef INTERN_STRINGS
Tim Peters50d8d372001-02-28 05:34:27 +0000936 /*
Guido van Rossum741689d1997-08-12 14:53:39 +0000937 ** Speedup: each sys.path item is interned, and
938 ** FindResourceModule remembers which items refer to
939 ** folders (so we don't have to bother trying to look
Tim Peters50d8d372001-02-28 05:34:27 +0000940 ** into them for resources).
Guido van Rossum741689d1997-08-12 14:53:39 +0000941 */
942 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
943 v = PyList_GET_ITEM(path, i);
944#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000945 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000946 static struct filedescr resfiledescr =
947 {"", "", PY_RESOURCE};
Tim Peters50d8d372001-02-28 05:34:27 +0000948
Jack Jansen9c96a921995-02-15 22:57:06 +0000949 return &resfiledescr;
950 }
Guido van Rossum0f84a341998-08-06 13:36:01 +0000951 if (PyMac_FindCodeResourceModule((PyStringObject *)v, name, buf)) {
952 static struct filedescr resfiledescr =
953 {"", "", PY_CODERESOURCE};
Tim Peters50d8d372001-02-28 05:34:27 +0000954
Guido van Rossum0f84a341998-08-06 13:36:01 +0000955 return &resfiledescr;
956 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000957#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000958 if (len > 0 && buf[len-1] != SEP
959#ifdef ALTSEP
960 && buf[len-1] != ALTSEP
961#endif
962 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000963 buf[len++] = SEP;
Guido van Rossum215c3402000-11-13 17:26:32 +0000964 strcpy(buf+len, name);
965 len += namelen;
Tim Peters50d8d372001-02-28 05:34:27 +0000966
967 /* Check for package import (buf holds a directory name,
968 and there's an __init__ module in that directory */
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000969#ifdef HAVE_STAT
Tim Peterscab3f682001-04-29 22:21:25 +0000970 if (stat(buf, &statbuf) == 0 && /* it exists */
971 S_ISDIR(statbuf.st_mode) && /* it's a directory */
972 find_init_module(buf) && /* it has __init__.py */
973 case_ok(buf, len, namelen, name)) /* and case matches */
974 return &fd_package;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000975#else
976 /* XXX How are you going to test for directories? */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000977#ifdef RISCOS
978 {
979 static struct filedescr fd = {"", "", PKG_DIRECTORY};
980 if (isdir(buf)) {
981 if (find_init_module(buf))
982 return &fd;
983 }
984 }
985#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000986#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000987#ifdef macintosh
988 fdp = PyMac_FindModuleExtension(buf, &len, name);
Jack Jansen4df3c522001-03-20 23:09:54 +0000989 if (fdp) {
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000990#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000991 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000992 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000993 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000994 PySys_WriteStderr("# trying %s\n", buf);
Jack Jansen4df3c522001-03-20 23:09:54 +0000995#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000996 fp = fopen(buf, fdp->mode);
Tim Peters50d8d372001-02-28 05:34:27 +0000997 if (fp != NULL) {
998 if (case_ok(buf, len, namelen, name))
999 break;
1000 else { /* continue search */
1001 fclose(fp);
1002 fp = NULL;
Barry Warsaw914a0b12001-02-02 19:12:16 +00001003 }
Barry Warsaw914a0b12001-02-02 19:12:16 +00001004 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001005 }
1006 if (fp != NULL)
1007 break;
1008 }
1009 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001010 PyErr_Format(PyExc_ImportError,
1011 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001012 return NULL;
1013 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001014 *p_fp = fp;
1015 return fdp;
1016}
1017
Tim Petersd1e87a82001-03-01 18:12:00 +00001018/* case_ok(char* buf, int len, int namelen, char* name)
1019 * The arguments here are tricky, best shown by example:
1020 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1021 * ^ ^ ^ ^
1022 * |--------------------- buf ---------------------|
1023 * |------------------- len ------------------|
1024 * |------ name -------|
1025 * |----- namelen -----|
1026 * buf is the full path, but len only counts up to (& exclusive of) the
1027 * extension. name is the module name, also exclusive of extension.
1028 *
1029 * We've already done a successful stat() or fopen() on buf, so know that
1030 * there's some match, possibly case-insensitive.
1031 *
Tim Peters50d8d372001-02-28 05:34:27 +00001032 * case_ok() is to return 1 if there's a case-sensitive match for
1033 * name, else 0. case_ok() is also to return 1 if envar PYTHONCASEOK
1034 * exists.
Tim Petersd1e87a82001-03-01 18:12:00 +00001035 *
Tim Peters50d8d372001-02-28 05:34:27 +00001036 * case_ok() is used to implement case-sensitive import semantics even
1037 * on platforms with case-insensitive filesystems. It's trivial to implement
1038 * for case-sensitive filesystems. It's pretty much a cross-platform
1039 * nightmare for systems with case-insensitive filesystems.
1040 */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001041
Tim Peters50d8d372001-02-28 05:34:27 +00001042/* First we may need a pile of platform-specific header files; the sequence
1043 * of #if's here should match the sequence in the body of case_ok().
1044 */
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001045#if defined(MS_WIN32) || defined(__CYGWIN__)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001046#include <windows.h>
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001047#ifdef __CYGWIN__
1048#include <sys/cygwin.h>
1049#endif
1050
Tim Peters50d8d372001-02-28 05:34:27 +00001051#elif defined(DJGPP)
1052#include <dir.h>
1053
1054#elif defined(macintosh)
1055#include <TextUtils.h>
1056#ifdef USE_GUSI1
1057#include "TFileSpec.h" /* for Path2FSSpec() */
1058#endif
1059
Tim Petersd1e87a82001-03-01 18:12:00 +00001060#elif defined(__MACH__) && defined(__APPLE__) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001061#include <sys/types.h>
1062#include <dirent.h>
1063
Tim Peters50d8d372001-02-28 05:34:27 +00001064#endif
1065
Guido van Rossum0980bd91998-02-13 17:18:36 +00001066static int
Tim Peters50d8d372001-02-28 05:34:27 +00001067case_ok(char *buf, int len, int namelen, char *name)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001068{
Tim Peters50d8d372001-02-28 05:34:27 +00001069/* Pick a platform-specific implementation; the sequence of #if's here should
1070 * match the sequence just above.
1071 */
1072
1073/* MS_WIN32 || __CYGWIN__ */
1074#if defined(MS_WIN32) || defined(__CYGWIN__)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001075 WIN32_FIND_DATA data;
1076 HANDLE h;
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001077#ifdef __CYGWIN__
1078 char tempbuf[MAX_PATH];
1079#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001080
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001081 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001082 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001083
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001084#ifdef __CYGWIN__
1085 cygwin32_conv_to_win32_path(buf, tempbuf);
1086 h = FindFirstFile(tempbuf, &data);
1087#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001088 h = FindFirstFile(buf, &data);
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001089#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001090 if (h == INVALID_HANDLE_VALUE) {
1091 PyErr_Format(PyExc_NameError,
1092 "Can't find file for module %.100s\n(filename %.300s)",
1093 name, buf);
1094 return 0;
1095 }
1096 FindClose(h);
Tim Peters50d8d372001-02-28 05:34:27 +00001097 return strncmp(data.cFileName, name, namelen) == 0;
1098
1099/* DJGPP */
1100#elif defined(DJGPP)
1101 struct ffblk ffblk;
1102 int done;
1103
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001104 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001105 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001106
1107 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
1108 if (done) {
Guido van Rossum0980bd91998-02-13 17:18:36 +00001109 PyErr_Format(PyExc_NameError,
Tim Peters50d8d372001-02-28 05:34:27 +00001110 "Can't find file for module %.100s\n(filename %.300s)",
Guido van Rossum0980bd91998-02-13 17:18:36 +00001111 name, buf);
1112 return 0;
1113 }
Tim Peters50d8d372001-02-28 05:34:27 +00001114 return strncmp(ffblk.ff_name, name, namelen) == 0;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001115
Tim Peters50d8d372001-02-28 05:34:27 +00001116/* macintosh */
1117#elif defined(macintosh)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001118 FSSpec fss;
1119 OSErr err;
Tim Peters50d8d372001-02-28 05:34:27 +00001120
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001121 if (Py_GETENV("PYTHONCASEOK") != NULL)
Tim Peters50d8d372001-02-28 05:34:27 +00001122 return 1;
1123
Guido van Rossumb33aa1a2000-04-24 15:08:18 +00001124#ifndef USE_GUSI1
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001125 err = FSMakeFSSpec(0, 0, Pstring(buf), &fss);
1126#else
1127 /* GUSI's Path2FSSpec() resolves all possible aliases nicely on
1128 the way, which is fine for all directories, but here we need
1129 the original name of the alias file (say, Dlg.ppc.slb, not
1130 toolboxmodules.ppc.slb). */
1131 char *colon;
1132 err = Path2FSSpec(buf, &fss);
1133 if (err == noErr) {
1134 colon = strrchr(buf, ':'); /* find filename */
1135 if (colon != NULL)
1136 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1137 Pstring(colon+1), &fss);
1138 else
1139 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1140 fss.name, &fss);
1141 }
1142#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001143 if (err) {
1144 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001145 "Can't find file for module %.100s\n(filename %.300s)",
1146 name, buf);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001147 return 0;
1148 }
Tim Peters50d8d372001-02-28 05:34:27 +00001149 return fss.name[0] >= namelen &&
1150 strncmp(name, (char *)fss.name+1, namelen) == 0;
1151
Tim Peters677898a2001-03-02 03:28:03 +00001152/* new-fangled macintosh (macosx) */
Tim Petersd1e87a82001-03-01 18:12:00 +00001153#elif defined(__MACH__) && defined(__APPLE__) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001154 DIR *dirp;
1155 struct dirent *dp;
Tim Petersd1e87a82001-03-01 18:12:00 +00001156 char dirname[MAXPATHLEN + 1];
1157 const int dirlen = len - namelen - 1; /* don't want trailing SEP */
Tim Peters430f5d42001-03-01 01:30:56 +00001158
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001159 if (Py_GETENV("PYTHONCASEOK") != NULL)
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001160 return 1;
1161
Tim Petersd1e87a82001-03-01 18:12:00 +00001162 /* Copy the dir component into dirname; substitute "." if empty */
1163 if (dirlen <= 0) {
1164 dirname[0] = '.';
1165 dirname[1] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001166 }
1167 else {
Tim Petersd1e87a82001-03-01 18:12:00 +00001168 assert(dirlen <= MAXPATHLEN);
1169 memcpy(dirname, buf, dirlen);
1170 dirname[dirlen] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001171 }
1172 /* Open the directory and search the entries for an exact match. */
Tim Petersd1e87a82001-03-01 18:12:00 +00001173 dirp = opendir(dirname);
Tim Peters430f5d42001-03-01 01:30:56 +00001174 if (dirp) {
Tim Peters677898a2001-03-02 03:28:03 +00001175 char *nameWithExt = buf + len - namelen;
Tim Peters430f5d42001-03-01 01:30:56 +00001176 while ((dp = readdir(dirp)) != NULL) {
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001177 const int thislen =
Tim Peters430f5d42001-03-01 01:30:56 +00001178#ifdef _DIRENT_HAVE_D_NAMELEN
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001179 dp->d_namlen;
Tim Peters430f5d42001-03-01 01:30:56 +00001180#else
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001181 strlen(dp->d_name);
Tim Peters430f5d42001-03-01 01:30:56 +00001182#endif
Tim Petersd1e87a82001-03-01 18:12:00 +00001183 if (thislen >= namelen &&
Tim Peters677898a2001-03-02 03:28:03 +00001184 strcmp(dp->d_name, nameWithExt) == 0) {
Tim Peters430f5d42001-03-01 01:30:56 +00001185 (void)closedir(dirp);
1186 return 1; /* Found */
1187 }
1188 }
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001189 (void)closedir(dirp);
Tim Peters430f5d42001-03-01 01:30:56 +00001190 }
Tim Peters430f5d42001-03-01 01:30:56 +00001191 return 0 ; /* Not found */
Tim Peters430f5d42001-03-01 01:30:56 +00001192
Tim Peters50d8d372001-02-28 05:34:27 +00001193/* assuming it's a case-sensitive filesystem, so there's nothing to do! */
1194#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001195 return 1;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001196
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001197#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001198}
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001199
Guido van Rossum0980bd91998-02-13 17:18:36 +00001200
Guido van Rossum197346f1997-10-31 18:38:52 +00001201#ifdef HAVE_STAT
1202/* Helper to look for __init__.py or __init__.py[co] in potential package */
1203static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001204find_init_module(char *buf)
Guido van Rossum197346f1997-10-31 18:38:52 +00001205{
Tim Peters0f9431f2001-07-05 03:47:53 +00001206 const size_t save_len = strlen(buf);
Fred Drake4c82b232000-06-30 16:18:57 +00001207 size_t i = save_len;
Tim Peters0f9431f2001-07-05 03:47:53 +00001208 char *pname; /* pointer to start of __init__ */
Guido van Rossum197346f1997-10-31 18:38:52 +00001209 struct stat statbuf;
1210
Tim Peters0f9431f2001-07-05 03:47:53 +00001211/* For calling case_ok(buf, len, namelen, name):
1212 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1213 * ^ ^ ^ ^
1214 * |--------------------- buf ---------------------|
1215 * |------------------- len ------------------|
1216 * |------ name -------|
1217 * |----- namelen -----|
1218 */
Guido van Rossum197346f1997-10-31 18:38:52 +00001219 if (save_len + 13 >= MAXPATHLEN)
1220 return 0;
1221 buf[i++] = SEP;
Tim Peters0f9431f2001-07-05 03:47:53 +00001222 pname = buf + i;
1223 strcpy(pname, "__init__.py");
Guido van Rossum197346f1997-10-31 18:38:52 +00001224 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001225 if (case_ok(buf,
1226 save_len + 9, /* len("/__init__") */
1227 8, /* len("__init__") */
1228 pname)) {
1229 buf[save_len] = '\0';
1230 return 1;
1231 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001232 }
Tim Peters0f9431f2001-07-05 03:47:53 +00001233 i += strlen(pname);
1234 strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum197346f1997-10-31 18:38:52 +00001235 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001236 if (case_ok(buf,
1237 save_len + 9, /* len("/__init__") */
1238 8, /* len("__init__") */
1239 pname)) {
1240 buf[save_len] = '\0';
1241 return 1;
1242 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001243 }
1244 buf[save_len] = '\0';
1245 return 0;
1246}
Guido van Rossum48a680c2001-03-02 06:34:14 +00001247
1248#else
1249
1250#ifdef RISCOS
1251static int
1252find_init_module(buf)
1253 char *buf;
1254{
1255 int save_len = strlen(buf);
1256 int i = save_len;
1257
1258 if (save_len + 13 >= MAXPATHLEN)
1259 return 0;
1260 buf[i++] = SEP;
1261 strcpy(buf+i, "__init__/py");
1262 if (isfile(buf)) {
1263 buf[save_len] = '\0';
1264 return 1;
1265 }
1266
1267 if (Py_OptimizeFlag)
1268 strcpy(buf+i, "o");
1269 else
1270 strcpy(buf+i, "c");
1271 if (isfile(buf)) {
1272 buf[save_len] = '\0';
1273 return 1;
1274 }
1275 buf[save_len] = '\0';
1276 return 0;
1277}
1278#endif /*RISCOS*/
1279
Guido van Rossum197346f1997-10-31 18:38:52 +00001280#endif /* HAVE_STAT */
1281
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001282
Tim Petersdbd9ba62000-07-09 03:09:57 +00001283static int init_builtin(char *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001284
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001285/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001286 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001287
Guido van Rossum79f25d91997-04-29 20:08:16 +00001288static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001289load_module(char *name, FILE *fp, char *buf, int type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001290{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001291 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001292 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001293 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001294
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001295 /* First check that there's an open file (if we need one) */
1296 switch (type) {
1297 case PY_SOURCE:
1298 case PY_COMPILED:
1299 if (fp == NULL) {
1300 PyErr_Format(PyExc_ValueError,
1301 "file object required for import (type code %d)",
1302 type);
1303 return NULL;
1304 }
1305 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001306
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001307 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001308
1309 case PY_SOURCE:
1310 m = load_source_module(name, buf, fp);
1311 break;
1312
1313 case PY_COMPILED:
1314 m = load_compiled_module(name, buf, fp);
1315 break;
1316
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001317#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001318 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001319 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001320 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001321#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001322
Jack Jansen9c96a921995-02-15 22:57:06 +00001323#ifdef macintosh
1324 case PY_RESOURCE:
1325 m = PyMac_LoadResourceModule(name, buf);
1326 break;
Guido van Rossum0f84a341998-08-06 13:36:01 +00001327 case PY_CODERESOURCE:
1328 m = PyMac_LoadCodeResourceModule(name, buf);
1329 break;
Jack Jansen9c96a921995-02-15 22:57:06 +00001330#endif
1331
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001332 case PKG_DIRECTORY:
1333 m = load_package(name, buf);
1334 break;
1335
1336 case C_BUILTIN:
1337 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001338 if (buf != NULL && buf[0] != '\0')
1339 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001340 if (type == C_BUILTIN)
1341 err = init_builtin(name);
1342 else
1343 err = PyImport_ImportFrozenModule(name);
1344 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001345 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001346 if (err == 0) {
1347 PyErr_Format(PyExc_ImportError,
1348 "Purported %s module %.200s not found",
1349 type == C_BUILTIN ?
1350 "builtin" : "frozen",
1351 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001352 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001353 }
1354 modules = PyImport_GetModuleDict();
1355 m = PyDict_GetItemString(modules, name);
1356 if (m == NULL) {
1357 PyErr_Format(
1358 PyExc_ImportError,
1359 "%s module %.200s not properly initialized",
1360 type == C_BUILTIN ?
1361 "builtin" : "frozen",
1362 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001363 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001364 }
1365 Py_INCREF(m);
1366 break;
1367
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001368 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001369 PyErr_Format(PyExc_ImportError,
1370 "Don't know how to import %.200s (type code %d)",
1371 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001372 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001373
1374 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001375
1376 return m;
1377}
1378
1379
1380/* Initialize a built-in module.
1381 Return 1 for succes, 0 if the module is not found, and -1 with
1382 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001383
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001384static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001385init_builtin(char *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001386{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001387 struct _inittab *p;
1388 PyObject *mod;
1389
1390 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
1391 return 1;
1392
Guido van Rossum771c6c81997-10-31 18:37:24 +00001393 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001394 if (strcmp(name, p->name) == 0) {
1395 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001396 PyErr_Format(PyExc_ImportError,
1397 "Cannot re-init internal module %.200s",
1398 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001399 return -1;
1400 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001401 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001402 PySys_WriteStderr("import %s # builtin\n", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001403 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001404 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001405 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001406 if (_PyImport_FixupExtension(name, name) == NULL)
1407 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001408 return 1;
1409 }
1410 }
1411 return 0;
1412}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001413
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001414
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001415/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001416
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001417static struct _frozen *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001418find_frozen(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001419{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001420 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001421
Guido van Rossum79f25d91997-04-29 20:08:16 +00001422 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001423 if (p->name == NULL)
1424 return NULL;
1425 if (strcmp(p->name, name) == 0)
1426 break;
1427 }
1428 return p;
1429}
1430
Guido van Rossum79f25d91997-04-29 20:08:16 +00001431static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001432get_frozen_object(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001433{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001434 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001435 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001436
1437 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001438 PyErr_Format(PyExc_ImportError,
1439 "No such frozen object named %.200s",
1440 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001441 return NULL;
1442 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001443 size = p->size;
1444 if (size < 0)
1445 size = -size;
1446 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001447}
1448
1449/* Initialize a frozen module.
1450 Return 1 for succes, 0 if the module is not found, and -1 with
1451 an exception set if the initialization failed.
1452 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001453
1454int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001455PyImport_ImportFrozenModule(char *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001456{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001457 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001458 PyObject *co;
1459 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001460 int ispackage;
1461 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001462
1463 if (p == NULL)
1464 return 0;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001465 size = p->size;
1466 ispackage = (size < 0);
1467 if (ispackage)
1468 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001469 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001470 PySys_WriteStderr("import %s # frozen%s\n",
Guido van Rossuma5568d31998-03-05 03:45:08 +00001471 name, ispackage ? " package" : "");
1472 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001473 if (co == NULL)
1474 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001475 if (!PyCode_Check(co)) {
1476 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001477 PyErr_Format(PyExc_TypeError,
1478 "frozen object %.200s is not a code object",
1479 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001480 return -1;
1481 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001482 if (ispackage) {
1483 /* Set __path__ to the package name */
1484 PyObject *d, *s;
1485 int err;
1486 m = PyImport_AddModule(name);
1487 if (m == NULL)
1488 return -1;
1489 d = PyModule_GetDict(m);
1490 s = PyString_InternFromString(name);
1491 if (s == NULL)
1492 return -1;
1493 err = PyDict_SetItemString(d, "__path__", s);
1494 Py_DECREF(s);
1495 if (err != 0)
1496 return err;
1497 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001498 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001499 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001500 if (m == NULL)
1501 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001502 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001503 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001504}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001505
1506
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001507/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001508 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001509
Guido van Rossum79f25d91997-04-29 20:08:16 +00001510PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001511PyImport_ImportModule(char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00001512{
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00001513 PyObject *pname;
1514 PyObject *result;
1515
1516 pname = PyString_FromString(name);
1517 result = PyImport_Import(pname);
1518 Py_DECREF(pname);
1519 return result;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001520}
1521
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001522/* Forward declarations for helper routines */
Tim Petersdbd9ba62000-07-09 03:09:57 +00001523static PyObject *get_parent(PyObject *globals, char *buf, int *p_buflen);
1524static PyObject *load_next(PyObject *mod, PyObject *altmod,
1525 char **p_name, char *buf, int *p_buflen);
1526static int mark_miss(char *name);
1527static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
1528 char *buf, int buflen, int recursive);
1529static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001530
1531/* The Magnum Opus of dotted-name import :-) */
1532
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001533static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001534import_module_ex(char *name, PyObject *globals, PyObject *locals,
1535 PyObject *fromlist)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001536{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001537 char buf[MAXPATHLEN+1];
1538 int buflen = 0;
1539 PyObject *parent, *head, *next, *tail;
1540
1541 parent = get_parent(globals, buf, &buflen);
1542 if (parent == NULL)
1543 return NULL;
1544
1545 head = load_next(parent, Py_None, &name, buf, &buflen);
1546 if (head == NULL)
1547 return NULL;
1548
1549 tail = head;
1550 Py_INCREF(tail);
1551 while (name) {
1552 next = load_next(tail, tail, &name, buf, &buflen);
1553 Py_DECREF(tail);
1554 if (next == NULL) {
1555 Py_DECREF(head);
1556 return NULL;
1557 }
1558 tail = next;
1559 }
1560
1561 if (fromlist != NULL) {
1562 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1563 fromlist = NULL;
1564 }
1565
1566 if (fromlist == NULL) {
1567 Py_DECREF(tail);
1568 return head;
1569 }
1570
1571 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001572 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001573 Py_DECREF(tail);
1574 return NULL;
1575 }
1576
1577 return tail;
1578}
1579
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001580PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001581PyImport_ImportModuleEx(char *name, PyObject *globals, PyObject *locals,
1582 PyObject *fromlist)
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001583{
1584 PyObject *result;
1585 lock_import();
Guido van Rossumd65911b1998-03-03 22:33:27 +00001586 result = import_module_ex(name, globals, locals, fromlist);
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001587 unlock_import();
1588 return result;
1589}
1590
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001591static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001592get_parent(PyObject *globals, char *buf, int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001593{
1594 static PyObject *namestr = NULL;
1595 static PyObject *pathstr = NULL;
1596 PyObject *modname, *modpath, *modules, *parent;
1597
1598 if (globals == NULL || !PyDict_Check(globals))
1599 return Py_None;
1600
1601 if (namestr == NULL) {
1602 namestr = PyString_InternFromString("__name__");
1603 if (namestr == NULL)
1604 return NULL;
1605 }
1606 if (pathstr == NULL) {
1607 pathstr = PyString_InternFromString("__path__");
1608 if (pathstr == NULL)
1609 return NULL;
1610 }
1611
1612 *buf = '\0';
1613 *p_buflen = 0;
1614 modname = PyDict_GetItem(globals, namestr);
1615 if (modname == NULL || !PyString_Check(modname))
1616 return Py_None;
1617
1618 modpath = PyDict_GetItem(globals, pathstr);
1619 if (modpath != NULL) {
1620 int len = PyString_GET_SIZE(modname);
1621 if (len > MAXPATHLEN) {
1622 PyErr_SetString(PyExc_ValueError,
1623 "Module name too long");
1624 return NULL;
1625 }
1626 strcpy(buf, PyString_AS_STRING(modname));
1627 *p_buflen = len;
1628 }
1629 else {
1630 char *start = PyString_AS_STRING(modname);
1631 char *lastdot = strrchr(start, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001632 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001633 if (lastdot == NULL)
1634 return Py_None;
1635 len = lastdot - start;
1636 if (len >= MAXPATHLEN) {
1637 PyErr_SetString(PyExc_ValueError,
1638 "Module name too long");
1639 return NULL;
1640 }
1641 strncpy(buf, start, len);
1642 buf[len] = '\0';
1643 *p_buflen = len;
1644 }
1645
1646 modules = PyImport_GetModuleDict();
1647 parent = PyDict_GetItemString(modules, buf);
1648 if (parent == NULL)
1649 parent = Py_None;
1650 return parent;
1651 /* We expect, but can't guarantee, if parent != None, that:
1652 - parent.__name__ == buf
1653 - parent.__dict__ is globals
1654 If this is violated... Who cares? */
1655}
1656
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001657/* altmod is either None or same as mod */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001658static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001659load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
1660 int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001661{
1662 char *name = *p_name;
1663 char *dot = strchr(name, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001664 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001665 char *p;
1666 PyObject *result;
1667
1668 if (dot == NULL) {
1669 *p_name = NULL;
1670 len = strlen(name);
1671 }
1672 else {
1673 *p_name = dot+1;
1674 len = dot-name;
1675 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00001676 if (len == 0) {
1677 PyErr_SetString(PyExc_ValueError,
1678 "Empty module name");
1679 return NULL;
1680 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001681
1682 p = buf + *p_buflen;
1683 if (p != buf)
1684 *p++ = '.';
1685 if (p+len-buf >= MAXPATHLEN) {
1686 PyErr_SetString(PyExc_ValueError,
1687 "Module name too long");
1688 return NULL;
1689 }
1690 strncpy(p, name, len);
1691 p[len] = '\0';
1692 *p_buflen = p+len-buf;
1693
1694 result = import_submodule(mod, p, buf);
1695 if (result == Py_None && altmod != mod) {
1696 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001697 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001698 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001699 if (result != NULL && result != Py_None) {
1700 if (mark_miss(buf) != 0) {
1701 Py_DECREF(result);
1702 return NULL;
1703 }
1704 strncpy(buf, name, len);
1705 buf[len] = '\0';
1706 *p_buflen = len;
1707 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001708 }
1709 if (result == NULL)
1710 return NULL;
1711
1712 if (result == Py_None) {
1713 Py_DECREF(result);
1714 PyErr_Format(PyExc_ImportError,
1715 "No module named %.200s", name);
1716 return NULL;
1717 }
1718
1719 return result;
1720}
1721
1722static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001723mark_miss(char *name)
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001724{
1725 PyObject *modules = PyImport_GetModuleDict();
1726 return PyDict_SetItemString(modules, name, Py_None);
1727}
1728
1729static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001730ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, int buflen,
1731 int recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001732{
1733 int i;
1734
1735 if (!PyObject_HasAttrString(mod, "__path__"))
1736 return 1;
1737
1738 for (i = 0; ; i++) {
1739 PyObject *item = PySequence_GetItem(fromlist, i);
1740 int hasit;
1741 if (item == NULL) {
1742 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1743 PyErr_Clear();
1744 return 1;
1745 }
1746 return 0;
1747 }
1748 if (!PyString_Check(item)) {
1749 PyErr_SetString(PyExc_TypeError,
1750 "Item in ``from list'' not a string");
1751 Py_DECREF(item);
1752 return 0;
1753 }
1754 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001755 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001756 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001757 /* See if the package defines __all__ */
1758 if (recursive)
1759 continue; /* Avoid endless recursion */
1760 all = PyObject_GetAttrString(mod, "__all__");
1761 if (all == NULL)
1762 PyErr_Clear();
1763 else {
1764 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1765 return 0;
1766 Py_DECREF(all);
1767 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001768 continue;
1769 }
1770 hasit = PyObject_HasAttr(mod, item);
1771 if (!hasit) {
1772 char *subname = PyString_AS_STRING(item);
1773 PyObject *submod;
1774 char *p;
1775 if (buflen + strlen(subname) >= MAXPATHLEN) {
1776 PyErr_SetString(PyExc_ValueError,
1777 "Module name too long");
1778 Py_DECREF(item);
1779 return 0;
1780 }
1781 p = buf + buflen;
1782 *p++ = '.';
1783 strcpy(p, subname);
1784 submod = import_submodule(mod, subname, buf);
1785 Py_XDECREF(submod);
1786 if (submod == NULL) {
1787 Py_DECREF(item);
1788 return 0;
1789 }
1790 }
1791 Py_DECREF(item);
1792 }
1793
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001794 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001795}
1796
1797static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001798import_submodule(PyObject *mod, char *subname, char *fullname)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001799{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001800 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossumf48f11c2001-07-23 13:27:49 +00001801 PyObject *m, *res = NULL;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001802
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001803 /* Require:
1804 if mod == None: subname == fullname
1805 else: mod.__name__ + "." + subname == fullname
1806 */
1807
Tim Peters50d8d372001-02-28 05:34:27 +00001808 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001809 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001810 }
1811 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001812 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001813 char buf[MAXPATHLEN+1];
1814 struct filedescr *fdp;
1815 FILE *fp = NULL;
1816
Guido van Rossum9c0afe51998-05-19 15:09:05 +00001817 if (mod == Py_None)
1818 path = NULL;
1819 else {
1820 path = PyObject_GetAttrString(mod, "__path__");
1821 if (path == NULL) {
1822 PyErr_Clear();
1823 Py_INCREF(Py_None);
1824 return Py_None;
1825 }
1826 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001827
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001828 buf[0] = '\0';
Guido van Rossumb68cd421998-07-01 17:36:26 +00001829 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1830 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001831 if (fdp == NULL) {
1832 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1833 return NULL;
1834 PyErr_Clear();
1835 Py_INCREF(Py_None);
1836 return Py_None;
1837 }
1838 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001839 if (fp)
1840 fclose(fp);
Guido van Rossumf48f11c2001-07-23 13:27:49 +00001841 if (mod != Py_None) {
1842 /* Irrespective of the success of this load, make a
1843 reference to it in the parent package module.
1844 A copy gets saved in the modules dictionary
1845 under the full name, so get a reference from
1846 there, if need be. (The exception is when
1847 the load failed with a SyntaxError -- then
1848 there's no trace in sys.modules. In that case,
1849 of course, do nothing extra.) */
1850 res = m;
1851 if (res == NULL)
1852 res = PyDict_GetItemString(modules, fullname);
1853 if (res != NULL &&
1854 PyObject_SetAttrString(mod, subname, res) < 0) {
1855 Py_XDECREF(m);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001856 m = NULL;
1857 }
1858 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001859 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001860
1861 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001862}
1863
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001864
1865/* Re-import a module of any kind and return its module object, WITH
1866 INCREMENTED REFERENCE COUNT */
1867
Guido van Rossum79f25d91997-04-29 20:08:16 +00001868PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001869PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001870{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001871 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001872 PyObject *path = NULL;
1873 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001874 char buf[MAXPATHLEN+1];
1875 struct filedescr *fdp;
1876 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001877
Guido van Rossum79f25d91997-04-29 20:08:16 +00001878 if (m == NULL || !PyModule_Check(m)) {
1879 PyErr_SetString(PyExc_TypeError,
1880 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001881 return NULL;
1882 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001883 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001884 if (name == NULL)
1885 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001886 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001887 PyErr_Format(PyExc_ImportError,
1888 "reload(): module %.200s not in sys.modules",
1889 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001890 return NULL;
1891 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001892 subname = strrchr(name, '.');
1893 if (subname == NULL)
1894 subname = name;
1895 else {
1896 PyObject *parentname, *parent;
1897 parentname = PyString_FromStringAndSize(name, (subname-name));
1898 if (parentname == NULL)
1899 return NULL;
1900 parent = PyDict_GetItem(modules, parentname);
Barry Warsaw38793331999-01-27 17:54:20 +00001901 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00001902 if (parent == NULL) {
1903 PyErr_Format(PyExc_ImportError,
1904 "reload(): parent %.200s not in sys.modules",
1905 name);
1906 return NULL;
1907 }
1908 subname++;
1909 path = PyObject_GetAttrString(parent, "__path__");
1910 if (path == NULL)
1911 PyErr_Clear();
1912 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001913 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001914 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1915 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001916 if (fdp == NULL)
1917 return NULL;
1918 m = load_module(name, fp, buf, fdp->type);
1919 if (fp)
1920 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001921 return m;
1922}
1923
1924
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001925/* Higher-level import emulator which emulates the "import" statement
1926 more accurately -- it invokes the __import__() function from the
1927 builtins of the current globals. This means that the import is
1928 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00001929 environment, e.g. by "rexec".
1930 A dummy list ["__doc__"] is passed as the 4th argument so that
1931 e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
1932 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001933
1934PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001935PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001936{
1937 static PyObject *silly_list = NULL;
1938 static PyObject *builtins_str = NULL;
1939 static PyObject *import_str = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001940 PyObject *globals = NULL;
1941 PyObject *import = NULL;
1942 PyObject *builtins = NULL;
1943 PyObject *r = NULL;
1944
1945 /* Initialize constant string objects */
1946 if (silly_list == NULL) {
1947 import_str = PyString_InternFromString("__import__");
1948 if (import_str == NULL)
1949 return NULL;
1950 builtins_str = PyString_InternFromString("__builtins__");
1951 if (builtins_str == NULL)
1952 return NULL;
1953 silly_list = Py_BuildValue("[s]", "__doc__");
1954 if (silly_list == NULL)
1955 return NULL;
1956 }
1957
1958 /* Get the builtins from current globals */
1959 globals = PyEval_GetGlobals();
Guido van Rossum85cd1d62001-02-20 21:43:24 +00001960 if (globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00001961 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001962 builtins = PyObject_GetItem(globals, builtins_str);
1963 if (builtins == NULL)
1964 goto err;
1965 }
1966 else {
1967 /* No globals -- use standard builtins, and fake globals */
1968 PyErr_Clear();
1969
Guido van Rossum85cd1d62001-02-20 21:43:24 +00001970 builtins = PyImport_ImportModuleEx("__builtin__",
1971 NULL, NULL, NULL);
1972 if (builtins == NULL)
1973 return NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001974 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1975 if (globals == NULL)
1976 goto err;
1977 }
1978
1979 /* Get the __import__ function from the builtins */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001980 if (PyDict_Check(builtins)) {
Fred Drakea76ba6e2001-03-06 06:31:15 +00001981 import = PyObject_GetItem(builtins, import_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001982 if (import == NULL)
1983 PyErr_SetObject(PyExc_KeyError, import_str);
1984 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001985 else
Fred Drakea76ba6e2001-03-06 06:31:15 +00001986 import = PyObject_GetAttr(builtins, import_str);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001987 if (import == NULL)
1988 goto err;
1989
1990 /* Call the _import__ function with the proper argument list */
1991 r = PyObject_CallFunction(import, "OOOO",
1992 module_name, globals, globals, silly_list);
1993
1994 err:
1995 Py_XDECREF(globals);
1996 Py_XDECREF(builtins);
1997 Py_XDECREF(import);
Tim Peters50d8d372001-02-28 05:34:27 +00001998
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001999 return r;
2000}
2001
2002
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002003/* Module 'imp' provides Python access to the primitives used for
2004 importing modules.
2005*/
2006
Guido van Rossum79f25d91997-04-29 20:08:16 +00002007static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002008imp_get_magic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002009{
2010 char buf[4];
2011
Guido van Rossum43713e52000-02-29 13:59:29 +00002012 if (!PyArg_ParseTuple(args, ":get_magic"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002013 return NULL;
Guido van Rossum96774c12000-05-01 20:19:08 +00002014 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
2015 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
2016 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
2017 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002018
Guido van Rossum79f25d91997-04-29 20:08:16 +00002019 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002020}
2021
Guido van Rossum79f25d91997-04-29 20:08:16 +00002022static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002023imp_get_suffixes(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002024{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002025 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002026 struct filedescr *fdp;
2027
Guido van Rossum43713e52000-02-29 13:59:29 +00002028 if (!PyArg_ParseTuple(args, ":get_suffixes"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002029 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002030 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002031 if (list == NULL)
2032 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002033 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
2034 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002035 fdp->suffix, fdp->mode, fdp->type);
2036 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002037 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002038 return NULL;
2039 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002040 if (PyList_Append(list, item) < 0) {
2041 Py_DECREF(list);
2042 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002043 return NULL;
2044 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002045 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002046 }
2047 return list;
2048}
2049
Guido van Rossum79f25d91997-04-29 20:08:16 +00002050static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002051call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002052{
Tim Petersdbd9ba62000-07-09 03:09:57 +00002053 extern int fclose(FILE *);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002054 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002055 struct filedescr *fdp;
2056 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002057 FILE *fp = NULL;
2058
2059 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002060 if (path == Py_None)
2061 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002062 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
2063 if (fdp == NULL)
2064 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002065 if (fp != NULL) {
2066 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
2067 if (fob == NULL) {
2068 fclose(fp);
2069 return NULL;
2070 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002071 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002072 else {
2073 fob = Py_None;
2074 Py_INCREF(fob);
Tim Peters50d8d372001-02-28 05:34:27 +00002075 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002076 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002077 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002078 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002079 return ret;
2080}
2081
Guido van Rossum79f25d91997-04-29 20:08:16 +00002082static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002083imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002084{
2085 char *name;
2086 PyObject *path = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002087 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002088 return NULL;
2089 return call_find_module(name, path);
2090}
2091
2092static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002093imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002094{
2095 char *name;
2096 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002097 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002098 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002099 return NULL;
2100 ret = init_builtin(name);
2101 if (ret < 0)
2102 return NULL;
2103 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002104 Py_INCREF(Py_None);
2105 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002106 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002107 m = PyImport_AddModule(name);
2108 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002109 return m;
2110}
2111
Guido van Rossum79f25d91997-04-29 20:08:16 +00002112static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002113imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002114{
2115 char *name;
2116 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002117 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002118 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002119 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002120 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002121 if (ret < 0)
2122 return NULL;
2123 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002124 Py_INCREF(Py_None);
2125 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002126 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002127 m = PyImport_AddModule(name);
2128 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002129 return m;
2130}
2131
Guido van Rossum79f25d91997-04-29 20:08:16 +00002132static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002133imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002134{
2135 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002136
Guido van Rossum43713e52000-02-29 13:59:29 +00002137 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002138 return NULL;
2139 return get_frozen_object(name);
2140}
2141
Guido van Rossum79f25d91997-04-29 20:08:16 +00002142static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002143imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002144{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002145 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002146 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002147 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002148 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002149}
2150
Guido van Rossum79f25d91997-04-29 20:08:16 +00002151static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002152imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002153{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002154 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002155 struct _frozen *p;
Guido van Rossum43713e52000-02-29 13:59:29 +00002156 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002157 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002158 p = find_frozen(name);
2159 return PyInt_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002160}
2161
2162static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002163get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002164{
2165 FILE *fp;
2166 if (fob == NULL) {
2167 fp = fopen(pathname, mode);
2168 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002169 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002170 }
2171 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002172 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002173 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002174 PyErr_SetString(PyExc_ValueError,
2175 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002176 }
2177 return fp;
2178}
2179
Guido van Rossum79f25d91997-04-29 20:08:16 +00002180static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002181imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002182{
2183 char *name;
2184 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002185 PyObject *fob = NULL;
2186 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002187 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002188 if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002189 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002190 return NULL;
2191 fp = get_file(pathname, fob, "rb");
2192 if (fp == NULL)
2193 return NULL;
2194 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002195 if (fob == NULL)
2196 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002197 return m;
2198}
2199
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002200#ifdef HAVE_DYNAMIC_LOADING
2201
Guido van Rossum79f25d91997-04-29 20:08:16 +00002202static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002203imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002204{
2205 char *name;
2206 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002207 PyObject *fob = NULL;
2208 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002209 FILE *fp = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002210 if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002211 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002212 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002213 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002214 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002215 if (fp == NULL)
2216 return NULL;
2217 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002218 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002219 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002220}
2221
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002222#endif /* HAVE_DYNAMIC_LOADING */
2223
Guido van Rossum79f25d91997-04-29 20:08:16 +00002224static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002225imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002226{
2227 char *name;
2228 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002229 PyObject *fob = NULL;
2230 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002231 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002232 if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002233 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002234 return NULL;
2235 fp = get_file(pathname, fob, "r");
2236 if (fp == NULL)
2237 return NULL;
2238 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002239 if (fob == NULL)
2240 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002241 return m;
2242}
2243
Jack Jansen9c96a921995-02-15 22:57:06 +00002244#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002245static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002246imp_load_resource(PyObject *self, PyObject *args)
Jack Jansen9c96a921995-02-15 22:57:06 +00002247{
2248 char *name;
2249 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002250 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002251
Guido van Rossum43713e52000-02-29 13:59:29 +00002252 if (!PyArg_ParseTuple(args, "ss:load_resource", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002253 return NULL;
2254 m = PyMac_LoadResourceModule(name, pathname);
2255 return m;
2256}
2257#endif /* macintosh */
2258
Guido van Rossum79f25d91997-04-29 20:08:16 +00002259static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002260imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002261{
2262 char *name;
2263 PyObject *fob;
2264 char *pathname;
2265 char *suffix; /* Unused */
2266 char *mode;
2267 int type;
2268 FILE *fp;
2269
Guido van Rossum43713e52000-02-29 13:59:29 +00002270 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002271 &name, &fob, &pathname,
2272 &suffix, &mode, &type))
2273 return NULL;
2274 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
2275 PyErr_Format(PyExc_ValueError,
2276 "invalid file open mode %.200s", mode);
2277 return NULL;
2278 }
2279 if (fob == Py_None)
2280 fp = NULL;
2281 else {
2282 if (!PyFile_Check(fob)) {
2283 PyErr_SetString(PyExc_ValueError,
2284 "load_module arg#2 should be a file or None");
2285 return NULL;
2286 }
2287 fp = get_file(pathname, fob, mode);
2288 if (fp == NULL)
2289 return NULL;
2290 }
2291 return load_module(name, fp, pathname, type);
2292}
2293
2294static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002295imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002296{
2297 char *name;
2298 char *pathname;
Guido van Rossum43713e52000-02-29 13:59:29 +00002299 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002300 return NULL;
2301 return load_package(name, pathname);
2302}
2303
2304static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002305imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002306{
2307 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002308 if (!PyArg_ParseTuple(args, "s:new_module", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002309 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002310 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002311}
2312
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002313/* Doc strings */
2314
2315static char doc_imp[] = "\
2316This module provides the components needed to build your own\n\
2317__import__ function. Undocumented functions are obsolete.\n\
2318";
2319
2320static char doc_find_module[] = "\
2321find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
2322Search for a module. If path is omitted or None, search for a\n\
2323built-in, frozen or special module and continue search in sys.path.\n\
2324The module name cannot contain '.'; to search for a submodule of a\n\
2325package, pass the submodule name and the package's __path__.\
2326";
2327
2328static char doc_load_module[] = "\
2329load_module(name, file, filename, (suffix, mode, type)) -> module\n\
2330Load a module, given information returned by find_module().\n\
2331The module name must include the full package name, if any.\
2332";
2333
2334static char doc_get_magic[] = "\
2335get_magic() -> string\n\
2336Return the magic number for .pyc or .pyo files.\
2337";
2338
2339static char doc_get_suffixes[] = "\
2340get_suffixes() -> [(suffix, mode, type), ...]\n\
2341Return a list of (suffix, mode, type) tuples describing the files\n\
2342that find_module() looks for.\
2343";
2344
2345static char doc_new_module[] = "\
2346new_module(name) -> module\n\
2347Create a new module. Do not enter it in sys.modules.\n\
2348The module name must include the full package name, if any.\
2349";
2350
Guido van Rossum79f25d91997-04-29 20:08:16 +00002351static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002352 {"find_module", imp_find_module, 1, doc_find_module},
2353 {"get_magic", imp_get_magic, 1, doc_get_magic},
2354 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2355 {"load_module", imp_load_module, 1, doc_load_module},
2356 {"new_module", imp_new_module, 1, doc_new_module},
2357 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002358 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002359 {"init_builtin", imp_init_builtin, 1},
2360 {"init_frozen", imp_init_frozen, 1},
2361 {"is_builtin", imp_is_builtin, 1},
2362 {"is_frozen", imp_is_frozen, 1},
2363 {"load_compiled", imp_load_compiled, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002364#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002365 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002366#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002367 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002368#ifdef macintosh
2369 {"load_resource", imp_load_resource, 1},
2370#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002371 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002372 {NULL, NULL} /* sentinel */
2373};
2374
Guido van Rossum1a8791e1998-08-04 22:46:29 +00002375static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002376setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002377{
2378 PyObject *v;
2379 int err;
2380
2381 v = PyInt_FromLong((long)value);
2382 err = PyDict_SetItemString(d, name, v);
2383 Py_XDECREF(v);
2384 return err;
2385}
2386
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002387void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002388initimp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002389{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002390 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002391
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002392 m = Py_InitModule4("imp", imp_methods, doc_imp,
2393 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002394 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002395
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002396 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2397 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2398 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2399 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2400 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2401 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2402 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2403 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00002404 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002405
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002406 failure:
2407 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002408}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002409
2410
Guido van Rossumb18618d2000-05-03 23:44:39 +00002411/* API for embedding applications that want to add their own entries
2412 to the table of built-in modules. This should normally be called
2413 *before* Py_Initialize(). When the table resize fails, -1 is
2414 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002415
2416 After a similar function by Just van Rossum. */
2417
2418int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002419PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002420{
2421 static struct _inittab *our_copy = NULL;
2422 struct _inittab *p;
2423 int i, n;
2424
2425 /* Count the number of entries in both tables */
2426 for (n = 0; newtab[n].name != NULL; n++)
2427 ;
2428 if (n == 0)
2429 return 0; /* Nothing to do */
2430 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2431 ;
2432
2433 /* Allocate new memory for the combined table */
Guido van Rossumb18618d2000-05-03 23:44:39 +00002434 p = our_copy;
2435 PyMem_RESIZE(p, struct _inittab, i+n+1);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002436 if (p == NULL)
2437 return -1;
2438
2439 /* Copy the tables into the new memory */
2440 if (our_copy != PyImport_Inittab)
2441 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2442 PyImport_Inittab = our_copy = p;
2443 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
2444
2445 return 0;
2446}
2447
2448/* Shorthand to add a single entry given a name and a function */
2449
2450int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002451PyImport_AppendInittab(char *name, void (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002452{
2453 struct _inittab newtab[2];
2454
2455 memset(newtab, '\0', sizeof newtab);
2456
2457 newtab[0].name = name;
2458 newtab[0].initfunc = initfunc;
2459
2460 return PyImport_ExtendInittab(newtab);
2461}