blob: 2c15d1050c84266d9c953d315c19962d0711d4e5 [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 */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +000046#define MAGIC (60420 | ((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},
73 {".pyc", "rb", PY_COMPILED},
74 {0, 0}
75};
Guido van Rossum48a680c2001-03-02 06:34:14 +000076#endif
Guido van Rossumed1170e1999-12-20 21:23:41 +000077
Guido van Rossum1ae940a1995-01-02 19:04:15 +000078/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000079
80void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000081_PyImport_Init(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000082{
Guido van Rossumed1170e1999-12-20 21:23:41 +000083 const struct filedescr *scan;
84 struct filedescr *filetab;
85 int countD = 0;
86 int countS = 0;
87
88 /* prepare _PyImport_Filetab: copy entries from
89 _PyImport_DynLoadFiletab and _PyImport_StandardFiletab.
90 */
91 for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan)
92 ++countD;
93 for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan)
94 ++countS;
Guido van Rossumb18618d2000-05-03 23:44:39 +000095 filetab = PyMem_NEW(struct filedescr, countD + countS + 1);
Guido van Rossumed1170e1999-12-20 21:23:41 +000096 memcpy(filetab, _PyImport_DynLoadFiletab,
97 countD * sizeof(struct filedescr));
98 memcpy(filetab + countD, _PyImport_StandardFiletab,
99 countS * sizeof(struct filedescr));
100 filetab[countD + countS].suffix = NULL;
101
102 _PyImport_Filetab = filetab;
103
Guido van Rossum0824f631997-03-11 18:37:35 +0000104 if (Py_OptimizeFlag) {
Guido van Rossumed1170e1999-12-20 21:23:41 +0000105 /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */
106 for (; filetab->suffix != NULL; filetab++) {
Guido van Rossum48a680c2001-03-02 06:34:14 +0000107#ifndef RISCOS
Guido van Rossumed1170e1999-12-20 21:23:41 +0000108 if (strcmp(filetab->suffix, ".pyc") == 0)
109 filetab->suffix = ".pyo";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000110#else
111 if (strcmp(filetab->suffix, "/pyc") == 0)
112 filetab->suffix = "/pyo";
113#endif
Guido van Rossum0824f631997-03-11 18:37:35 +0000114 }
115 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000116
117 if (Py_UnicodeFlag) {
118 /* Fix the pyc_magic so that byte compiled code created
119 using the all-Unicode method doesn't interfere with
120 code created in normal operation mode. */
121 pyc_magic = MAGIC + 1;
122 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000123}
124
Guido van Rossum25ce5661997-08-02 03:10:38 +0000125void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000126_PyImport_Fini(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000127{
128 Py_XDECREF(extensions);
129 extensions = NULL;
Barry Warsaw84294482000-10-03 16:02:05 +0000130 PyMem_DEL(_PyImport_Filetab);
131 _PyImport_Filetab = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000132}
133
134
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000135/* Locking primitives to prevent parallel imports of the same module
136 in different threads to return with a partially loaded module.
137 These calls are serialized by the global interpreter lock. */
138
139#ifdef WITH_THREAD
140
Guido van Rossum49b56061998-10-01 20:42:43 +0000141#include "pythread.h"
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000142
Guido van Rossum65d5b571998-12-21 19:32:43 +0000143static PyThread_type_lock import_lock = 0;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000144static long import_lock_thread = -1;
145static int import_lock_level = 0;
146
147static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000148lock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000149{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000150 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000151 if (me == -1)
152 return; /* Too bad */
153 if (import_lock == NULL)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000154 import_lock = PyThread_allocate_lock();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000155 if (import_lock_thread == me) {
156 import_lock_level++;
157 return;
158 }
Guido van Rossum65d5b571998-12-21 19:32:43 +0000159 if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0)) {
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000160 PyThreadState *tstate = PyEval_SaveThread();
Guido van Rossum65d5b571998-12-21 19:32:43 +0000161 PyThread_acquire_lock(import_lock, 1);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000162 PyEval_RestoreThread(tstate);
163 }
164 import_lock_thread = me;
165 import_lock_level = 1;
166}
167
168static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000169unlock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000170{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000171 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000172 if (me == -1)
173 return; /* Too bad */
174 if (import_lock_thread != me)
175 Py_FatalError("unlock_import: not holding the import lock");
176 import_lock_level--;
177 if (import_lock_level == 0) {
178 import_lock_thread = -1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000179 PyThread_release_lock(import_lock);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000180 }
181}
182
183#else
184
185#define lock_import()
186#define unlock_import()
187
188#endif
189
Guido van Rossum25ce5661997-08-02 03:10:38 +0000190/* Helper for sys */
191
192PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000193PyImport_GetModuleDict(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000194{
195 PyInterpreterState *interp = PyThreadState_Get()->interp;
196 if (interp->modules == NULL)
197 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
198 return interp->modules;
199}
200
Guido van Rossum3f5da241990-12-20 15:06:42 +0000201
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000202/* List of names to clear in sys */
203static char* sys_deletes[] = {
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000204 "path", "argv", "ps1", "ps2", "exitfunc",
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000205 "exc_type", "exc_value", "exc_traceback",
206 "last_type", "last_value", "last_traceback",
207 NULL
208};
209
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000210static char* sys_files[] = {
211 "stdin", "__stdin__",
212 "stdout", "__stdout__",
213 "stderr", "__stderr__",
214 NULL
215};
216
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000217
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000218/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000219
Guido van Rossum3f5da241990-12-20 15:06:42 +0000220void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000221PyImport_Cleanup(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000222{
Guido van Rossum758eec01998-01-19 21:58:26 +0000223 int pos, ndone;
224 char *name;
225 PyObject *key, *value, *dict;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000226 PyInterpreterState *interp = PyThreadState_Get()->interp;
Guido van Rossum758eec01998-01-19 21:58:26 +0000227 PyObject *modules = interp->modules;
228
229 if (modules == NULL)
230 return; /* Already done */
231
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000232 /* Delete some special variables first. These are common
233 places where user values hide and people complain when their
234 destructors fail. Since the modules containing them are
235 deleted *last* of all, they would come too late in the normal
236 destruction order. Sigh. */
237
238 value = PyDict_GetItemString(modules, "__builtin__");
239 if (value != NULL && PyModule_Check(value)) {
240 dict = PyModule_GetDict(value);
241 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000242 PySys_WriteStderr("# clear __builtin__._\n");
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000243 PyDict_SetItemString(dict, "_", Py_None);
244 }
245 value = PyDict_GetItemString(modules, "sys");
246 if (value != NULL && PyModule_Check(value)) {
247 char **p;
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000248 PyObject *v;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000249 dict = PyModule_GetDict(value);
250 for (p = sys_deletes; *p != NULL; p++) {
251 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000252 PySys_WriteStderr("# clear sys.%s\n", *p);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000253 PyDict_SetItemString(dict, *p, Py_None);
254 }
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000255 for (p = sys_files; *p != NULL; p+=2) {
256 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000257 PySys_WriteStderr("# restore sys.%s\n", *p);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000258 v = PyDict_GetItemString(dict, *(p+1));
259 if (v == NULL)
260 v = Py_None;
261 PyDict_SetItemString(dict, *p, v);
262 }
263 }
264
265 /* First, delete __main__ */
266 value = PyDict_GetItemString(modules, "__main__");
267 if (value != NULL && PyModule_Check(value)) {
268 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000269 PySys_WriteStderr("# cleanup __main__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000270 _PyModule_Clear(value);
271 PyDict_SetItemString(modules, "__main__", Py_None);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000272 }
273
Guido van Rossum758eec01998-01-19 21:58:26 +0000274 /* The special treatment of __builtin__ here is because even
275 when it's not referenced as a module, its dictionary is
276 referenced by almost every module's __builtins__. Since
277 deleting a module clears its dictionary (even if there are
278 references left to it), we need to delete the __builtin__
279 module last. Likewise, we don't delete sys until the very
280 end because it is implicitly referenced (e.g. by print).
281
282 Also note that we 'delete' modules by replacing their entry
283 in the modules dict with None, rather than really deleting
284 them; this avoids a rehash of the modules dictionary and
285 also marks them as "non existent" so they won't be
286 re-imported. */
287
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000288 /* Next, repeatedly delete modules with a reference count of
Guido van Rossum758eec01998-01-19 21:58:26 +0000289 one (skipping __builtin__ and sys) and delete them */
290 do {
291 ndone = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000292 pos = 0;
Guido van Rossum758eec01998-01-19 21:58:26 +0000293 while (PyDict_Next(modules, &pos, &key, &value)) {
294 if (value->ob_refcnt != 1)
295 continue;
Guido van Rossum566373e1998-10-01 15:24:50 +0000296 if (PyString_Check(key) && PyModule_Check(value)) {
297 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000298 if (strcmp(name, "__builtin__") == 0)
299 continue;
300 if (strcmp(name, "sys") == 0)
301 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000302 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000303 PySys_WriteStderr(
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000304 "# cleanup[1] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000305 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000306 PyDict_SetItem(modules, key, Py_None);
307 ndone++;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000308 }
309 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000310 } while (ndone > 0);
311
Guido van Rossum758eec01998-01-19 21:58:26 +0000312 /* Next, delete all modules (still skipping __builtin__ and sys) */
313 pos = 0;
314 while (PyDict_Next(modules, &pos, &key, &value)) {
Guido van Rossum566373e1998-10-01 15:24:50 +0000315 if (PyString_Check(key) && PyModule_Check(value)) {
316 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000317 if (strcmp(name, "__builtin__") == 0)
318 continue;
319 if (strcmp(name, "sys") == 0)
320 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000321 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000322 PySys_WriteStderr("# cleanup[2] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000323 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000324 PyDict_SetItem(modules, key, Py_None);
325 }
326 }
327
328 /* Next, delete sys and __builtin__ (in that order) */
329 value = PyDict_GetItemString(modules, "sys");
330 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000331 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000332 PySys_WriteStderr("# cleanup sys\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000333 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000334 PyDict_SetItemString(modules, "sys", Py_None);
335 }
336 value = PyDict_GetItemString(modules, "__builtin__");
337 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000338 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000339 PySys_WriteStderr("# cleanup __builtin__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000340 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000341 PyDict_SetItemString(modules, "__builtin__", Py_None);
342 }
343
344 /* Finally, clear and delete the modules directory */
345 PyDict_Clear(modules);
346 interp->modules = NULL;
347 Py_DECREF(modules);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000348}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000349
350
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000351/* Helper for pythonrun.c -- return magic number */
352
353long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000354PyImport_GetMagicNumber(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000355{
Guido van Rossum96774c12000-05-01 20:19:08 +0000356 return pyc_magic;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000357}
358
359
Guido van Rossum25ce5661997-08-02 03:10:38 +0000360/* Magic for extension modules (built-in as well as dynamically
361 loaded). To prevent initializing an extension module more than
362 once, we keep a static dictionary 'extensions' keyed by module name
363 (for built-in modules) or by filename (for dynamically loaded
364 modules), containing these modules. A copy od the module's
365 dictionary is stored by calling _PyImport_FixupExtension()
366 immediately after the module initialization function succeeds. A
367 copy can be retrieved from there by calling
368 _PyImport_FindExtension(). */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000369
Guido van Rossum79f25d91997-04-29 20:08:16 +0000370PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000371_PyImport_FixupExtension(char *name, char *filename)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000372{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000373 PyObject *modules, *mod, *dict, *copy;
374 if (extensions == NULL) {
375 extensions = PyDict_New();
376 if (extensions == NULL)
377 return NULL;
378 }
379 modules = PyImport_GetModuleDict();
380 mod = PyDict_GetItemString(modules, name);
381 if (mod == NULL || !PyModule_Check(mod)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000382 PyErr_Format(PyExc_SystemError,
383 "_PyImport_FixupExtension: module %.200s not loaded", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000384 return NULL;
385 }
386 dict = PyModule_GetDict(mod);
387 if (dict == NULL)
388 return NULL;
389 copy = PyObject_CallMethod(dict, "copy", "");
390 if (copy == NULL)
391 return NULL;
392 PyDict_SetItemString(extensions, filename, copy);
393 Py_DECREF(copy);
394 return copy;
395}
396
397PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000398_PyImport_FindExtension(char *name, char *filename)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000399{
400 PyObject *dict, *mod, *mdict, *result;
401 if (extensions == NULL)
402 return NULL;
403 dict = PyDict_GetItemString(extensions, filename);
404 if (dict == NULL)
405 return NULL;
406 mod = PyImport_AddModule(name);
407 if (mod == NULL)
408 return NULL;
409 mdict = PyModule_GetDict(mod);
410 if (mdict == NULL)
411 return NULL;
412 result = PyObject_CallMethod(mdict, "update", "O", dict);
413 if (result == NULL)
414 return NULL;
415 Py_DECREF(result);
416 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000417 PySys_WriteStderr("import %s # previously loaded (%s)\n",
Guido van Rossum25ce5661997-08-02 03:10:38 +0000418 name, filename);
419 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000420}
421
422
423/* Get the module object corresponding to a module name.
424 First check the modules dictionary if there's one there,
425 if not, create a new one and insert in in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000426 Because the former action is most common, THIS DOES NOT RETURN A
427 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000428
Guido van Rossum79f25d91997-04-29 20:08:16 +0000429PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000430PyImport_AddModule(char *name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000431{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000432 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000433 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000434
Guido van Rossum25ce5661997-08-02 03:10:38 +0000435 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
Guido van Rossum79f25d91997-04-29 20:08:16 +0000436 PyModule_Check(m))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000437 return m;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000438 m = PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000439 if (m == NULL)
440 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000441 if (PyDict_SetItemString(modules, name, m) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000442 Py_DECREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000443 return NULL;
444 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000445 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000446
447 return m;
448}
449
450
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000451/* Execute a code object in a module and return the module object
452 WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000453
Guido van Rossum79f25d91997-04-29 20:08:16 +0000454PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000455PyImport_ExecCodeModule(char *name, PyObject *co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000456{
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000457 return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
458}
459
460PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000461PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname)
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000462{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000463 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000464 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000465
Guido van Rossum79f25d91997-04-29 20:08:16 +0000466 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000467 if (m == NULL)
468 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000469 d = PyModule_GetDict(m);
470 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
471 if (PyDict_SetItemString(d, "__builtins__",
472 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000473 return NULL;
474 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000475 /* Remember the filename as the __file__ attribute */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000476 v = NULL;
477 if (pathname != NULL) {
478 v = PyString_FromString(pathname);
479 if (v == NULL)
480 PyErr_Clear();
481 }
482 if (v == NULL) {
483 v = ((PyCodeObject *)co)->co_filename;
484 Py_INCREF(v);
485 }
486 if (PyDict_SetItemString(d, "__file__", v) != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000487 PyErr_Clear(); /* Not important enough to report */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000488 Py_DECREF(v);
489
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000490 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000491 if (v == NULL)
492 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000493 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000494
Guido van Rossum25ce5661997-08-02 03:10:38 +0000495 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000496 PyErr_Format(PyExc_ImportError,
497 "Loaded module %.200s not found in sys.modules",
498 name);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000499 return NULL;
500 }
501
Guido van Rossum79f25d91997-04-29 20:08:16 +0000502 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000503
504 return m;
505}
506
507
508/* Given a pathname for a Python source file, fill a buffer with the
509 pathname for the corresponding compiled file. Return the pathname
510 for the compiled file, or NULL if there's no space in the buffer.
511 Doesn't set an exception. */
512
513static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000514make_compiled_pathname(char *pathname, char *buf, size_t buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000515{
Fred Drake4c82b232000-06-30 16:18:57 +0000516 size_t len;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000517
518 len = strlen(pathname);
519 if (len+2 > buflen)
520 return NULL;
521 strcpy(buf, pathname);
Guido van Rossum0824f631997-03-11 18:37:35 +0000522 strcpy(buf+len, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000523
524 return buf;
525}
526
527
528/* Given a pathname for a Python source file, its time of last
529 modification, and a pathname for a compiled file, check whether the
530 compiled file represents the same version of the source. If so,
531 return a FILE pointer for the compiled file, positioned just after
532 the header; if not, return NULL.
533 Doesn't set an exception. */
534
535static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000536check_compiled_module(char *pathname, long mtime, char *cpathname)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000537{
538 FILE *fp;
539 long magic;
540 long pyc_mtime;
541
542 fp = fopen(cpathname, "rb");
543 if (fp == NULL)
544 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000545 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000546 if (magic != pyc_magic) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000547 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000548 PySys_WriteStderr("# %s has bad magic\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000549 fclose(fp);
550 return NULL;
551 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000552 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000553 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000554 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000555 PySys_WriteStderr("# %s has bad mtime\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000556 fclose(fp);
557 return NULL;
558 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000559 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000560 PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000561 return fp;
562}
563
564
565/* Read a code object from a file and check it for validity */
566
Guido van Rossum79f25d91997-04-29 20:08:16 +0000567static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000568read_compiled_module(char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000569{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000570 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000571
Tim Petersd9b9ac82001-01-28 00:27:39 +0000572 co = PyMarshal_ReadLastObjectFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000573 /* Ugly: rd_object() may return NULL with or without error */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000574 if (co == NULL || !PyCode_Check(co)) {
575 if (!PyErr_Occurred())
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000576 PyErr_Format(PyExc_ImportError,
577 "Non-code object in %.200s", cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000578 Py_XDECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000579 return NULL;
580 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000581 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000582}
583
584
585/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000586 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000587
Guido van Rossum79f25d91997-04-29 20:08:16 +0000588static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000589load_compiled_module(char *name, char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000590{
591 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000592 PyCodeObject *co;
593 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000594
Guido van Rossum79f25d91997-04-29 20:08:16 +0000595 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000596 if (magic != pyc_magic) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000597 PyErr_Format(PyExc_ImportError,
598 "Bad magic number in %.200s", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000599 return NULL;
600 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000601 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000602 co = read_compiled_module(cpathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000603 if (co == NULL)
604 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000605 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000606 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000607 name, cpathname);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000608 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000609 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000610
611 return m;
612}
613
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000614/* Parse a source file and return the corresponding code object */
615
Guido van Rossum79f25d91997-04-29 20:08:16 +0000616static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000617parse_source_module(char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000618{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000619 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000620 node *n;
621
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000622 n = PyParser_SimpleParseFile(fp, pathname, Py_file_input);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000623 if (n == NULL)
624 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000625 co = PyNode_Compile(n, pathname);
626 PyNode_Free(n);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000627
628 return co;
629}
630
631
Guido van Rossum55a83382000-09-20 20:31:38 +0000632/* Helper to open a bytecode file for writing in exclusive mode */
633
634static FILE *
635open_exclusive(char *filename)
636{
637#if defined(O_EXCL)&&defined(O_CREAT)&&defined(O_WRONLY)&&defined(O_TRUNC)
638 /* Use O_EXCL to avoid a race condition when another process tries to
639 write the same file. When that happens, our open() call fails,
640 which is just fine (since it's only a cache).
641 XXX If the file exists and is writable but the directory is not
642 writable, the file will never be written. Oh well.
643 */
644 int fd;
645 (void) unlink(filename);
Tim Peters42c83af2000-09-29 04:03:10 +0000646 fd = open(filename, O_EXCL|O_CREAT|O_WRONLY|O_TRUNC
647#ifdef O_BINARY
648 |O_BINARY /* necessary for Windows */
649#endif
Tim Peters50d8d372001-02-28 05:34:27 +0000650
Tim Peters42c83af2000-09-29 04:03:10 +0000651 , 0666);
Guido van Rossum55a83382000-09-20 20:31:38 +0000652 if (fd < 0)
653 return NULL;
654 return fdopen(fd, "wb");
655#else
656 /* Best we can do -- on Windows this can't happen anyway */
657 return fopen(filename, "wb");
658#endif
659}
660
661
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000662/* Write a compiled module to a file, placing the time of last
663 modification of its source into the header.
664 Errors are ignored, if a write error occurs an attempt is made to
665 remove the file. */
666
667static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000668write_compiled_module(PyCodeObject *co, char *cpathname, long mtime)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000669{
670 FILE *fp;
671
Guido van Rossum55a83382000-09-20 20:31:38 +0000672 fp = open_exclusive(cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000673 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000674 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000675 PySys_WriteStderr(
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000676 "# can't create %s\n", cpathname);
677 return;
678 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000679 PyMarshal_WriteLongToFile(pyc_magic, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000680 /* First write a 0 for mtime */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000681 PyMarshal_WriteLongToFile(0L, fp);
682 PyMarshal_WriteObjectToFile((PyObject *)co, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000683 if (ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000684 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000685 PySys_WriteStderr("# can't write %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000686 /* Don't keep partial file */
687 fclose(fp);
688 (void) unlink(cpathname);
689 return;
690 }
691 /* Now write the true mtime */
692 fseek(fp, 4L, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000693 PyMarshal_WriteLongToFile(mtime, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000694 fflush(fp);
695 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000696 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000697 PySys_WriteStderr("# wrote %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000698#ifdef macintosh
Jack Jansencbf630f2000-07-11 21:59:16 +0000699 PyMac_setfiletype(cpathname, 'Pyth', 'PYC ');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000700#endif
701}
702
703
704/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000705 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
706 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000707
Guido van Rossum79f25d91997-04-29 20:08:16 +0000708static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000709load_source_module(char *name, char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000710{
Fred Drake4c82b232000-06-30 16:18:57 +0000711 time_t mtime;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000712 FILE *fpc;
713 char buf[MAXPATHLEN+1];
714 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000715 PyCodeObject *co;
716 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000717
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000718 mtime = PyOS_GetLastModificationTime(pathname, fp);
Fred Drakec63d3e92001-03-01 06:33:32 +0000719 if (mtime == (time_t)(-1))
Fred Drake4c82b232000-06-30 16:18:57 +0000720 return NULL;
721#if SIZEOF_TIME_T > 4
722 /* Python's .pyc timestamp handling presumes that the timestamp fits
723 in 4 bytes. This will be fine until sometime in the year 2038,
724 when a 4-byte signed time_t will overflow.
725 */
726 if (mtime >> 32) {
727 PyErr_SetString(PyExc_OverflowError,
Fred Drakec63d3e92001-03-01 06:33:32 +0000728 "modification time overflows a 4 byte field");
Fred Drake4c82b232000-06-30 16:18:57 +0000729 return NULL;
730 }
731#endif
Jeremy Hylton37832f02001-04-13 17:50:20 +0000732 cpathname = make_compiled_pathname(pathname, buf,
733 (size_t)MAXPATHLEN + 1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000734 if (cpathname != NULL &&
735 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000736 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000737 fclose(fpc);
738 if (co == NULL)
739 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000740 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000741 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000742 name, cpathname);
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000743 pathname = cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000744 }
745 else {
746 co = parse_source_module(pathname, fp);
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 # from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000751 name, pathname);
752 write_compiled_module(co, cpathname, mtime);
753 }
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000754 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000755 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000756
757 return m;
758}
759
760
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000761/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +0000762static PyObject *load_module(char *, FILE *, char *, int);
763static struct filedescr *find_module(char *, PyObject *,
764 char *, size_t, FILE **);
765static struct _frozen *find_frozen(char *name);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000766
767/* Load a package and return its module object WITH INCREMENTED
768 REFERENCE COUNT */
769
770static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000771load_package(char *name, char *pathname)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000772{
773 PyObject *m, *d, *file, *path;
774 int err;
775 char buf[MAXPATHLEN+1];
776 FILE *fp = NULL;
777 struct filedescr *fdp;
778
779 m = PyImport_AddModule(name);
780 if (m == NULL)
781 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000782 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000783 PySys_WriteStderr("import %s # directory %s\n",
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000784 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000785 d = PyModule_GetDict(m);
786 file = PyString_FromString(pathname);
787 if (file == NULL)
788 return NULL;
789 path = Py_BuildValue("[O]", file);
790 if (path == NULL) {
791 Py_DECREF(file);
792 return NULL;
793 }
794 err = PyDict_SetItemString(d, "__file__", file);
795 if (err == 0)
796 err = PyDict_SetItemString(d, "__path__", path);
797 if (err != 0) {
798 m = NULL;
799 goto cleanup;
800 }
801 buf[0] = '\0';
802 fdp = find_module("__init__", path, buf, sizeof(buf), &fp);
803 if (fdp == NULL) {
804 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
805 PyErr_Clear();
806 }
807 else
808 m = NULL;
809 goto cleanup;
810 }
811 m = load_module(name, fp, buf, fdp->type);
812 if (fp != NULL)
813 fclose(fp);
814 cleanup:
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000815 Py_XDECREF(path);
816 Py_XDECREF(file);
817 return m;
818}
819
820
821/* Helper to test for built-in module */
822
823static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000824is_builtin(char *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000825{
826 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +0000827 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
828 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
829 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000830 return -1;
831 else
832 return 1;
833 }
834 }
835 return 0;
836}
837
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000838
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000839/* Search the path (default sys.path) for a module. Return the
840 corresponding filedescr struct, and (via return arguments) the
841 pathname and an open file. Return NULL if the module is not found. */
842
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000843#ifdef MS_COREDLL
Thomas Woutersb4bd21c2000-07-22 23:38:01 +0000844extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **,
845 char *, int);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000846#endif
847
Tim Peters50d8d372001-02-28 05:34:27 +0000848static int case_ok(char *, int, int, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000849static int find_init_module(char *); /* Forward */
Guido van Rossum197346f1997-10-31 18:38:52 +0000850
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000851static struct filedescr *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000852find_module(char *realname, PyObject *path, char *buf, size_t buflen,
853 FILE **p_fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000854{
Fred Drake4c82b232000-06-30 16:18:57 +0000855 int i, npath;
856 size_t len, namelen;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000857 struct _frozen *f;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000858 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000859 FILE *fp = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000860#ifndef RISCOS
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000861 struct stat statbuf;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000862#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000863 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
864 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
865 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossum0506a431998-08-11 15:07:39 +0000866 char name[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000867
Fred Drake4c82b232000-06-30 16:18:57 +0000868 if (strlen(realname) > MAXPATHLEN) {
869 PyErr_SetString(PyExc_OverflowError, "module name is too long");
870 return NULL;
871 }
Guido van Rossum0506a431998-08-11 15:07:39 +0000872 strcpy(name, realname);
873
874 if (path != NULL && PyString_Check(path)) {
875 /* Submodule of "frozen" package:
876 Set name to the fullname, path to NULL
877 and continue as "usual" */
878 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
879 PyErr_SetString(PyExc_ImportError,
880 "full frozen module name too long");
881 return NULL;
882 }
883 strcpy(buf, PyString_AsString(path));
884 strcat(buf, ".");
885 strcat(buf, name);
886 strcpy(name, buf);
887 path = NULL;
888 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000889 if (path == NULL) {
890 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000891 strcpy(buf, name);
892 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000893 }
Guido van Rossuma5568d31998-03-05 03:45:08 +0000894 if ((f = find_frozen(name)) != NULL) {
895 strcpy(buf, name);
896 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000897 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000898
Guido van Rossumac279101996-08-22 23:10:58 +0000899#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000900 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
901 if (fp != NULL) {
902 *p_fp = fp;
903 return fdp;
904 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000905#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000906 path = PySys_GetObject("path");
907 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000908 if (path == NULL || !PyList_Check(path)) {
909 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +0000910 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000911 return NULL;
912 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000913 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000914 namelen = strlen(name);
915 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000916 PyObject *v = PyList_GetItem(path, i);
917 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000918 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000919 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000920 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000921 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000922 strcpy(buf, PyString_AsString(v));
Fred Drake4c82b232000-06-30 16:18:57 +0000923 if (strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000924 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000925#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000926#ifdef INTERN_STRINGS
Tim Peters50d8d372001-02-28 05:34:27 +0000927 /*
Guido van Rossum741689d1997-08-12 14:53:39 +0000928 ** Speedup: each sys.path item is interned, and
929 ** FindResourceModule remembers which items refer to
930 ** folders (so we don't have to bother trying to look
Tim Peters50d8d372001-02-28 05:34:27 +0000931 ** into them for resources).
Guido van Rossum741689d1997-08-12 14:53:39 +0000932 */
933 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
934 v = PyList_GET_ITEM(path, i);
935#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000936 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000937 static struct filedescr resfiledescr =
938 {"", "", PY_RESOURCE};
Tim Peters50d8d372001-02-28 05:34:27 +0000939
Jack Jansen9c96a921995-02-15 22:57:06 +0000940 return &resfiledescr;
941 }
Guido van Rossum0f84a341998-08-06 13:36:01 +0000942 if (PyMac_FindCodeResourceModule((PyStringObject *)v, name, buf)) {
943 static struct filedescr resfiledescr =
944 {"", "", PY_CODERESOURCE};
Tim Peters50d8d372001-02-28 05:34:27 +0000945
Guido van Rossum0f84a341998-08-06 13:36:01 +0000946 return &resfiledescr;
947 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000948#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000949 if (len > 0 && buf[len-1] != SEP
950#ifdef ALTSEP
951 && buf[len-1] != ALTSEP
952#endif
953 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000954 buf[len++] = SEP;
Guido van Rossum215c3402000-11-13 17:26:32 +0000955 strcpy(buf+len, name);
956 len += namelen;
Tim Peters50d8d372001-02-28 05:34:27 +0000957
958 /* Check for package import (buf holds a directory name,
959 and there's an __init__ module in that directory */
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000960#ifdef HAVE_STAT
Tim Peters50d8d372001-02-28 05:34:27 +0000961 if (stat(buf, &statbuf) == 0 &&
962 S_ISDIR(statbuf.st_mode) &&
963 find_init_module(buf)) {
964 if (case_ok(buf, len, namelen, name))
965 return &fd_package;
966 else
967 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000968 }
969#else
970 /* XXX How are you going to test for directories? */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000971#ifdef RISCOS
972 {
973 static struct filedescr fd = {"", "", PKG_DIRECTORY};
974 if (isdir(buf)) {
975 if (find_init_module(buf))
976 return &fd;
977 }
978 }
979#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000980#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000981#ifdef macintosh
982 fdp = PyMac_FindModuleExtension(buf, &len, name);
Jack Jansen4df3c522001-03-20 23:09:54 +0000983 if (fdp) {
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000984#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000985 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000986 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000987 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000988 PySys_WriteStderr("# trying %s\n", buf);
Jack Jansen4df3c522001-03-20 23:09:54 +0000989#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000990 fp = fopen(buf, fdp->mode);
Tim Peters50d8d372001-02-28 05:34:27 +0000991 if (fp != NULL) {
992 if (case_ok(buf, len, namelen, name))
993 break;
994 else { /* continue search */
995 fclose(fp);
996 fp = NULL;
Barry Warsaw914a0b12001-02-02 19:12:16 +0000997 }
Barry Warsaw914a0b12001-02-02 19:12:16 +0000998 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000999 }
1000 if (fp != NULL)
1001 break;
1002 }
1003 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001004 PyErr_Format(PyExc_ImportError,
1005 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001006 return NULL;
1007 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001008 *p_fp = fp;
1009 return fdp;
1010}
1011
Tim Petersd1e87a82001-03-01 18:12:00 +00001012/* case_ok(char* buf, int len, int namelen, char* name)
1013 * The arguments here are tricky, best shown by example:
1014 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1015 * ^ ^ ^ ^
1016 * |--------------------- buf ---------------------|
1017 * |------------------- len ------------------|
1018 * |------ name -------|
1019 * |----- namelen -----|
1020 * buf is the full path, but len only counts up to (& exclusive of) the
1021 * extension. name is the module name, also exclusive of extension.
1022 *
1023 * We've already done a successful stat() or fopen() on buf, so know that
1024 * there's some match, possibly case-insensitive.
1025 *
Tim Peters50d8d372001-02-28 05:34:27 +00001026 * case_ok() is to return 1 if there's a case-sensitive match for
1027 * name, else 0. case_ok() is also to return 1 if envar PYTHONCASEOK
1028 * exists.
Tim Petersd1e87a82001-03-01 18:12:00 +00001029 *
Tim Peters50d8d372001-02-28 05:34:27 +00001030 * case_ok() is used to implement case-sensitive import semantics even
1031 * on platforms with case-insensitive filesystems. It's trivial to implement
1032 * for case-sensitive filesystems. It's pretty much a cross-platform
1033 * nightmare for systems with case-insensitive filesystems.
1034 */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001035
Tim Peters50d8d372001-02-28 05:34:27 +00001036/* First we may need a pile of platform-specific header files; the sequence
1037 * of #if's here should match the sequence in the body of case_ok().
1038 */
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001039#if defined(MS_WIN32) || defined(__CYGWIN__)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001040#include <windows.h>
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001041#ifdef __CYGWIN__
1042#include <sys/cygwin.h>
1043#endif
1044
Tim Peters50d8d372001-02-28 05:34:27 +00001045#elif defined(DJGPP)
1046#include <dir.h>
1047
1048#elif defined(macintosh)
1049#include <TextUtils.h>
1050#ifdef USE_GUSI1
1051#include "TFileSpec.h" /* for Path2FSSpec() */
1052#endif
1053
Tim Petersd1e87a82001-03-01 18:12:00 +00001054#elif defined(__MACH__) && defined(__APPLE__) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001055#include <sys/types.h>
1056#include <dirent.h>
1057
Tim Peters50d8d372001-02-28 05:34:27 +00001058#endif
1059
Guido van Rossum0980bd91998-02-13 17:18:36 +00001060static int
Tim Peters50d8d372001-02-28 05:34:27 +00001061case_ok(char *buf, int len, int namelen, char *name)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001062{
Tim Peters50d8d372001-02-28 05:34:27 +00001063/* Pick a platform-specific implementation; the sequence of #if's here should
1064 * match the sequence just above.
1065 */
1066
1067/* MS_WIN32 || __CYGWIN__ */
1068#if defined(MS_WIN32) || defined(__CYGWIN__)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001069 WIN32_FIND_DATA data;
1070 HANDLE h;
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001071#ifdef __CYGWIN__
1072 char tempbuf[MAX_PATH];
1073#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001074
Guido van Rossum0980bd91998-02-13 17:18:36 +00001075 if (getenv("PYTHONCASEOK") != NULL)
1076 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001077
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001078#ifdef __CYGWIN__
1079 cygwin32_conv_to_win32_path(buf, tempbuf);
1080 h = FindFirstFile(tempbuf, &data);
1081#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001082 h = FindFirstFile(buf, &data);
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001083#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001084 if (h == INVALID_HANDLE_VALUE) {
1085 PyErr_Format(PyExc_NameError,
1086 "Can't find file for module %.100s\n(filename %.300s)",
1087 name, buf);
1088 return 0;
1089 }
1090 FindClose(h);
Tim Peters50d8d372001-02-28 05:34:27 +00001091 return strncmp(data.cFileName, name, namelen) == 0;
1092
1093/* DJGPP */
1094#elif defined(DJGPP)
1095 struct ffblk ffblk;
1096 int done;
1097
1098 if (getenv("PYTHONCASEOK") != NULL)
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001099 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001100
1101 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
1102 if (done) {
Guido van Rossum0980bd91998-02-13 17:18:36 +00001103 PyErr_Format(PyExc_NameError,
Tim Peters50d8d372001-02-28 05:34:27 +00001104 "Can't find file for module %.100s\n(filename %.300s)",
Guido van Rossum0980bd91998-02-13 17:18:36 +00001105 name, buf);
1106 return 0;
1107 }
Tim Peters50d8d372001-02-28 05:34:27 +00001108 return strncmp(ffblk.ff_name, name, namelen) == 0;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001109
Tim Peters50d8d372001-02-28 05:34:27 +00001110/* macintosh */
1111#elif defined(macintosh)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001112 FSSpec fss;
1113 OSErr err;
Tim Peters50d8d372001-02-28 05:34:27 +00001114
1115 if (getenv("PYTHONCASEOK") != NULL)
1116 return 1;
1117
Guido van Rossumb33aa1a2000-04-24 15:08:18 +00001118#ifndef USE_GUSI1
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001119 err = FSMakeFSSpec(0, 0, Pstring(buf), &fss);
1120#else
1121 /* GUSI's Path2FSSpec() resolves all possible aliases nicely on
1122 the way, which is fine for all directories, but here we need
1123 the original name of the alias file (say, Dlg.ppc.slb, not
1124 toolboxmodules.ppc.slb). */
1125 char *colon;
1126 err = Path2FSSpec(buf, &fss);
1127 if (err == noErr) {
1128 colon = strrchr(buf, ':'); /* find filename */
1129 if (colon != NULL)
1130 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1131 Pstring(colon+1), &fss);
1132 else
1133 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1134 fss.name, &fss);
1135 }
1136#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001137 if (err) {
1138 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001139 "Can't find file for module %.100s\n(filename %.300s)",
1140 name, buf);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001141 return 0;
1142 }
Tim Peters50d8d372001-02-28 05:34:27 +00001143 return fss.name[0] >= namelen &&
1144 strncmp(name, (char *)fss.name+1, namelen) == 0;
1145
Tim Peters677898a2001-03-02 03:28:03 +00001146/* new-fangled macintosh (macosx) */
Tim Petersd1e87a82001-03-01 18:12:00 +00001147#elif defined(__MACH__) && defined(__APPLE__) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001148 DIR *dirp;
1149 struct dirent *dp;
Tim Petersd1e87a82001-03-01 18:12:00 +00001150 char dirname[MAXPATHLEN + 1];
1151 const int dirlen = len - namelen - 1; /* don't want trailing SEP */
Tim Peters430f5d42001-03-01 01:30:56 +00001152
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001153 if (getenv("PYTHONCASEOK") != NULL)
1154 return 1;
1155
Tim Petersd1e87a82001-03-01 18:12:00 +00001156 /* Copy the dir component into dirname; substitute "." if empty */
1157 if (dirlen <= 0) {
1158 dirname[0] = '.';
1159 dirname[1] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001160 }
1161 else {
Tim Petersd1e87a82001-03-01 18:12:00 +00001162 assert(dirlen <= MAXPATHLEN);
1163 memcpy(dirname, buf, dirlen);
1164 dirname[dirlen] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001165 }
1166 /* Open the directory and search the entries for an exact match. */
Tim Petersd1e87a82001-03-01 18:12:00 +00001167 dirp = opendir(dirname);
Tim Peters430f5d42001-03-01 01:30:56 +00001168 if (dirp) {
Tim Peters677898a2001-03-02 03:28:03 +00001169 char *nameWithExt = buf + len - namelen;
Tim Peters430f5d42001-03-01 01:30:56 +00001170 while ((dp = readdir(dirp)) != NULL) {
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001171 const int thislen =
Tim Peters430f5d42001-03-01 01:30:56 +00001172#ifdef _DIRENT_HAVE_D_NAMELEN
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001173 dp->d_namlen;
Tim Peters430f5d42001-03-01 01:30:56 +00001174#else
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001175 strlen(dp->d_name);
Tim Peters430f5d42001-03-01 01:30:56 +00001176#endif
Tim Petersd1e87a82001-03-01 18:12:00 +00001177 if (thislen >= namelen &&
Tim Peters677898a2001-03-02 03:28:03 +00001178 strcmp(dp->d_name, nameWithExt) == 0) {
Tim Peters430f5d42001-03-01 01:30:56 +00001179 (void)closedir(dirp);
1180 return 1; /* Found */
1181 }
1182 }
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001183 (void)closedir(dirp);
Tim Peters430f5d42001-03-01 01:30:56 +00001184 }
Tim Peters430f5d42001-03-01 01:30:56 +00001185 return 0 ; /* Not found */
Tim Peters430f5d42001-03-01 01:30:56 +00001186
Tim Peters50d8d372001-02-28 05:34:27 +00001187/* assuming it's a case-sensitive filesystem, so there's nothing to do! */
1188#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001189 return 1;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001190
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001191#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001192}
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001193
Guido van Rossum0980bd91998-02-13 17:18:36 +00001194
Guido van Rossum197346f1997-10-31 18:38:52 +00001195#ifdef HAVE_STAT
1196/* Helper to look for __init__.py or __init__.py[co] in potential package */
1197static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001198find_init_module(char *buf)
Guido van Rossum197346f1997-10-31 18:38:52 +00001199{
Fred Drake4c82b232000-06-30 16:18:57 +00001200 size_t save_len = strlen(buf);
1201 size_t i = save_len;
Guido van Rossum197346f1997-10-31 18:38:52 +00001202 struct stat statbuf;
1203
1204 if (save_len + 13 >= MAXPATHLEN)
1205 return 0;
1206 buf[i++] = SEP;
1207 strcpy(buf+i, "__init__.py");
1208 if (stat(buf, &statbuf) == 0) {
1209 buf[save_len] = '\0';
1210 return 1;
1211 }
1212 i += strlen(buf+i);
1213 if (Py_OptimizeFlag)
1214 strcpy(buf+i, "o");
1215 else
1216 strcpy(buf+i, "c");
1217 if (stat(buf, &statbuf) == 0) {
1218 buf[save_len] = '\0';
1219 return 1;
1220 }
1221 buf[save_len] = '\0';
1222 return 0;
1223}
Guido van Rossum48a680c2001-03-02 06:34:14 +00001224
1225#else
1226
1227#ifdef RISCOS
1228static int
1229find_init_module(buf)
1230 char *buf;
1231{
1232 int save_len = strlen(buf);
1233 int i = save_len;
1234
1235 if (save_len + 13 >= MAXPATHLEN)
1236 return 0;
1237 buf[i++] = SEP;
1238 strcpy(buf+i, "__init__/py");
1239 if (isfile(buf)) {
1240 buf[save_len] = '\0';
1241 return 1;
1242 }
1243
1244 if (Py_OptimizeFlag)
1245 strcpy(buf+i, "o");
1246 else
1247 strcpy(buf+i, "c");
1248 if (isfile(buf)) {
1249 buf[save_len] = '\0';
1250 return 1;
1251 }
1252 buf[save_len] = '\0';
1253 return 0;
1254}
1255#endif /*RISCOS*/
1256
Guido van Rossum197346f1997-10-31 18:38:52 +00001257#endif /* HAVE_STAT */
1258
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001259
Tim Petersdbd9ba62000-07-09 03:09:57 +00001260static int init_builtin(char *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001261
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001262/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001263 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001264
Guido van Rossum79f25d91997-04-29 20:08:16 +00001265static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001266load_module(char *name, FILE *fp, char *buf, int type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001267{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001268 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001269 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001270 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001271
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001272 /* First check that there's an open file (if we need one) */
1273 switch (type) {
1274 case PY_SOURCE:
1275 case PY_COMPILED:
1276 if (fp == NULL) {
1277 PyErr_Format(PyExc_ValueError,
1278 "file object required for import (type code %d)",
1279 type);
1280 return NULL;
1281 }
1282 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001283
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001284 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001285
1286 case PY_SOURCE:
1287 m = load_source_module(name, buf, fp);
1288 break;
1289
1290 case PY_COMPILED:
1291 m = load_compiled_module(name, buf, fp);
1292 break;
1293
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001294#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001295 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001296 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001297 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001298#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001299
Jack Jansen9c96a921995-02-15 22:57:06 +00001300#ifdef macintosh
1301 case PY_RESOURCE:
1302 m = PyMac_LoadResourceModule(name, buf);
1303 break;
Guido van Rossum0f84a341998-08-06 13:36:01 +00001304 case PY_CODERESOURCE:
1305 m = PyMac_LoadCodeResourceModule(name, buf);
1306 break;
Jack Jansen9c96a921995-02-15 22:57:06 +00001307#endif
1308
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001309 case PKG_DIRECTORY:
1310 m = load_package(name, buf);
1311 break;
1312
1313 case C_BUILTIN:
1314 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001315 if (buf != NULL && buf[0] != '\0')
1316 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001317 if (type == C_BUILTIN)
1318 err = init_builtin(name);
1319 else
1320 err = PyImport_ImportFrozenModule(name);
1321 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001322 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001323 if (err == 0) {
1324 PyErr_Format(PyExc_ImportError,
1325 "Purported %s module %.200s not found",
1326 type == C_BUILTIN ?
1327 "builtin" : "frozen",
1328 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001329 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001330 }
1331 modules = PyImport_GetModuleDict();
1332 m = PyDict_GetItemString(modules, name);
1333 if (m == NULL) {
1334 PyErr_Format(
1335 PyExc_ImportError,
1336 "%s module %.200s not properly initialized",
1337 type == C_BUILTIN ?
1338 "builtin" : "frozen",
1339 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001340 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001341 }
1342 Py_INCREF(m);
1343 break;
1344
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001345 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001346 PyErr_Format(PyExc_ImportError,
1347 "Don't know how to import %.200s (type code %d)",
1348 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001349 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001350
1351 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001352
1353 return m;
1354}
1355
1356
1357/* Initialize a built-in module.
1358 Return 1 for succes, 0 if the module is not found, and -1 with
1359 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001360
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001361static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001362init_builtin(char *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001363{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001364 struct _inittab *p;
1365 PyObject *mod;
1366
1367 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
1368 return 1;
1369
Guido van Rossum771c6c81997-10-31 18:37:24 +00001370 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001371 if (strcmp(name, p->name) == 0) {
1372 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001373 PyErr_Format(PyExc_ImportError,
1374 "Cannot re-init internal module %.200s",
1375 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001376 return -1;
1377 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001378 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001379 PySys_WriteStderr("import %s # builtin\n", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001380 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001381 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001382 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001383 if (_PyImport_FixupExtension(name, name) == NULL)
1384 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001385 return 1;
1386 }
1387 }
1388 return 0;
1389}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001390
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001391
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001392/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001393
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001394static struct _frozen *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001395find_frozen(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001396{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001397 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001398
Guido van Rossum79f25d91997-04-29 20:08:16 +00001399 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001400 if (p->name == NULL)
1401 return NULL;
1402 if (strcmp(p->name, name) == 0)
1403 break;
1404 }
1405 return p;
1406}
1407
Guido van Rossum79f25d91997-04-29 20:08:16 +00001408static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001409get_frozen_object(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001410{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001411 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001412 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001413
1414 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001415 PyErr_Format(PyExc_ImportError,
1416 "No such frozen object named %.200s",
1417 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001418 return NULL;
1419 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001420 size = p->size;
1421 if (size < 0)
1422 size = -size;
1423 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001424}
1425
1426/* Initialize a frozen module.
1427 Return 1 for succes, 0 if the module is not found, and -1 with
1428 an exception set if the initialization failed.
1429 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001430
1431int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001432PyImport_ImportFrozenModule(char *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001433{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001434 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001435 PyObject *co;
1436 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001437 int ispackage;
1438 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001439
1440 if (p == NULL)
1441 return 0;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001442 size = p->size;
1443 ispackage = (size < 0);
1444 if (ispackage)
1445 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001446 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001447 PySys_WriteStderr("import %s # frozen%s\n",
Guido van Rossuma5568d31998-03-05 03:45:08 +00001448 name, ispackage ? " package" : "");
1449 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001450 if (co == NULL)
1451 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001452 if (!PyCode_Check(co)) {
1453 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001454 PyErr_Format(PyExc_TypeError,
1455 "frozen object %.200s is not a code object",
1456 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001457 return -1;
1458 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001459 if (ispackage) {
1460 /* Set __path__ to the package name */
1461 PyObject *d, *s;
1462 int err;
1463 m = PyImport_AddModule(name);
1464 if (m == NULL)
1465 return -1;
1466 d = PyModule_GetDict(m);
1467 s = PyString_InternFromString(name);
1468 if (s == NULL)
1469 return -1;
1470 err = PyDict_SetItemString(d, "__path__", s);
1471 Py_DECREF(s);
1472 if (err != 0)
1473 return err;
1474 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001475 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001476 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001477 if (m == NULL)
1478 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001479 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001480 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001481}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001482
1483
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001484/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001485 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001486
Guido van Rossum79f25d91997-04-29 20:08:16 +00001487PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001488PyImport_ImportModule(char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00001489{
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00001490 PyObject *pname;
1491 PyObject *result;
1492
1493 pname = PyString_FromString(name);
1494 result = PyImport_Import(pname);
1495 Py_DECREF(pname);
1496 return result;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001497}
1498
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001499/* Forward declarations for helper routines */
Tim Petersdbd9ba62000-07-09 03:09:57 +00001500static PyObject *get_parent(PyObject *globals, char *buf, int *p_buflen);
1501static PyObject *load_next(PyObject *mod, PyObject *altmod,
1502 char **p_name, char *buf, int *p_buflen);
1503static int mark_miss(char *name);
1504static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
1505 char *buf, int buflen, int recursive);
1506static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001507
1508/* The Magnum Opus of dotted-name import :-) */
1509
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001510static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001511import_module_ex(char *name, PyObject *globals, PyObject *locals,
1512 PyObject *fromlist)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001513{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001514 char buf[MAXPATHLEN+1];
1515 int buflen = 0;
1516 PyObject *parent, *head, *next, *tail;
1517
1518 parent = get_parent(globals, buf, &buflen);
1519 if (parent == NULL)
1520 return NULL;
1521
1522 head = load_next(parent, Py_None, &name, buf, &buflen);
1523 if (head == NULL)
1524 return NULL;
1525
1526 tail = head;
1527 Py_INCREF(tail);
1528 while (name) {
1529 next = load_next(tail, tail, &name, buf, &buflen);
1530 Py_DECREF(tail);
1531 if (next == NULL) {
1532 Py_DECREF(head);
1533 return NULL;
1534 }
1535 tail = next;
1536 }
1537
1538 if (fromlist != NULL) {
1539 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1540 fromlist = NULL;
1541 }
1542
1543 if (fromlist == NULL) {
1544 Py_DECREF(tail);
1545 return head;
1546 }
1547
1548 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001549 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001550 Py_DECREF(tail);
1551 return NULL;
1552 }
1553
1554 return tail;
1555}
1556
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001557PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001558PyImport_ImportModuleEx(char *name, PyObject *globals, PyObject *locals,
1559 PyObject *fromlist)
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001560{
1561 PyObject *result;
1562 lock_import();
Guido van Rossumd65911b1998-03-03 22:33:27 +00001563 result = import_module_ex(name, globals, locals, fromlist);
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001564 unlock_import();
1565 return result;
1566}
1567
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001568static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001569get_parent(PyObject *globals, char *buf, int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001570{
1571 static PyObject *namestr = NULL;
1572 static PyObject *pathstr = NULL;
1573 PyObject *modname, *modpath, *modules, *parent;
1574
1575 if (globals == NULL || !PyDict_Check(globals))
1576 return Py_None;
1577
1578 if (namestr == NULL) {
1579 namestr = PyString_InternFromString("__name__");
1580 if (namestr == NULL)
1581 return NULL;
1582 }
1583 if (pathstr == NULL) {
1584 pathstr = PyString_InternFromString("__path__");
1585 if (pathstr == NULL)
1586 return NULL;
1587 }
1588
1589 *buf = '\0';
1590 *p_buflen = 0;
1591 modname = PyDict_GetItem(globals, namestr);
1592 if (modname == NULL || !PyString_Check(modname))
1593 return Py_None;
1594
1595 modpath = PyDict_GetItem(globals, pathstr);
1596 if (modpath != NULL) {
1597 int len = PyString_GET_SIZE(modname);
1598 if (len > MAXPATHLEN) {
1599 PyErr_SetString(PyExc_ValueError,
1600 "Module name too long");
1601 return NULL;
1602 }
1603 strcpy(buf, PyString_AS_STRING(modname));
1604 *p_buflen = len;
1605 }
1606 else {
1607 char *start = PyString_AS_STRING(modname);
1608 char *lastdot = strrchr(start, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001609 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001610 if (lastdot == NULL)
1611 return Py_None;
1612 len = lastdot - start;
1613 if (len >= MAXPATHLEN) {
1614 PyErr_SetString(PyExc_ValueError,
1615 "Module name too long");
1616 return NULL;
1617 }
1618 strncpy(buf, start, len);
1619 buf[len] = '\0';
1620 *p_buflen = len;
1621 }
1622
1623 modules = PyImport_GetModuleDict();
1624 parent = PyDict_GetItemString(modules, buf);
1625 if (parent == NULL)
1626 parent = Py_None;
1627 return parent;
1628 /* We expect, but can't guarantee, if parent != None, that:
1629 - parent.__name__ == buf
1630 - parent.__dict__ is globals
1631 If this is violated... Who cares? */
1632}
1633
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001634/* altmod is either None or same as mod */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001635static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001636load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
1637 int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001638{
1639 char *name = *p_name;
1640 char *dot = strchr(name, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001641 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001642 char *p;
1643 PyObject *result;
1644
1645 if (dot == NULL) {
1646 *p_name = NULL;
1647 len = strlen(name);
1648 }
1649 else {
1650 *p_name = dot+1;
1651 len = dot-name;
1652 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00001653 if (len == 0) {
1654 PyErr_SetString(PyExc_ValueError,
1655 "Empty module name");
1656 return NULL;
1657 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001658
1659 p = buf + *p_buflen;
1660 if (p != buf)
1661 *p++ = '.';
1662 if (p+len-buf >= MAXPATHLEN) {
1663 PyErr_SetString(PyExc_ValueError,
1664 "Module name too long");
1665 return NULL;
1666 }
1667 strncpy(p, name, len);
1668 p[len] = '\0';
1669 *p_buflen = p+len-buf;
1670
1671 result = import_submodule(mod, p, buf);
1672 if (result == Py_None && altmod != mod) {
1673 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001674 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001675 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001676 if (result != NULL && result != Py_None) {
1677 if (mark_miss(buf) != 0) {
1678 Py_DECREF(result);
1679 return NULL;
1680 }
1681 strncpy(buf, name, len);
1682 buf[len] = '\0';
1683 *p_buflen = len;
1684 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001685 }
1686 if (result == NULL)
1687 return NULL;
1688
1689 if (result == Py_None) {
1690 Py_DECREF(result);
1691 PyErr_Format(PyExc_ImportError,
1692 "No module named %.200s", name);
1693 return NULL;
1694 }
1695
1696 return result;
1697}
1698
1699static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001700mark_miss(char *name)
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001701{
1702 PyObject *modules = PyImport_GetModuleDict();
1703 return PyDict_SetItemString(modules, name, Py_None);
1704}
1705
1706static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001707ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, int buflen,
1708 int recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001709{
1710 int i;
1711
1712 if (!PyObject_HasAttrString(mod, "__path__"))
1713 return 1;
1714
1715 for (i = 0; ; i++) {
1716 PyObject *item = PySequence_GetItem(fromlist, i);
1717 int hasit;
1718 if (item == NULL) {
1719 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1720 PyErr_Clear();
1721 return 1;
1722 }
1723 return 0;
1724 }
1725 if (!PyString_Check(item)) {
1726 PyErr_SetString(PyExc_TypeError,
1727 "Item in ``from list'' not a string");
1728 Py_DECREF(item);
1729 return 0;
1730 }
1731 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001732 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001733 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001734 /* See if the package defines __all__ */
1735 if (recursive)
1736 continue; /* Avoid endless recursion */
1737 all = PyObject_GetAttrString(mod, "__all__");
1738 if (all == NULL)
1739 PyErr_Clear();
1740 else {
1741 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1742 return 0;
1743 Py_DECREF(all);
1744 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001745 continue;
1746 }
1747 hasit = PyObject_HasAttr(mod, item);
1748 if (!hasit) {
1749 char *subname = PyString_AS_STRING(item);
1750 PyObject *submod;
1751 char *p;
1752 if (buflen + strlen(subname) >= MAXPATHLEN) {
1753 PyErr_SetString(PyExc_ValueError,
1754 "Module name too long");
1755 Py_DECREF(item);
1756 return 0;
1757 }
1758 p = buf + buflen;
1759 *p++ = '.';
1760 strcpy(p, subname);
1761 submod = import_submodule(mod, subname, buf);
1762 Py_XDECREF(submod);
1763 if (submod == NULL) {
1764 Py_DECREF(item);
1765 return 0;
1766 }
1767 }
1768 Py_DECREF(item);
1769 }
1770
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001771 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001772}
1773
1774static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001775import_submodule(PyObject *mod, char *subname, char *fullname)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001776{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001777 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001778 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001779
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001780 /* Require:
1781 if mod == None: subname == fullname
1782 else: mod.__name__ + "." + subname == fullname
1783 */
1784
Tim Peters50d8d372001-02-28 05:34:27 +00001785 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001786 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001787 }
1788 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001789 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001790 char buf[MAXPATHLEN+1];
1791 struct filedescr *fdp;
1792 FILE *fp = NULL;
1793
Guido van Rossum9c0afe51998-05-19 15:09:05 +00001794 if (mod == Py_None)
1795 path = NULL;
1796 else {
1797 path = PyObject_GetAttrString(mod, "__path__");
1798 if (path == NULL) {
1799 PyErr_Clear();
1800 Py_INCREF(Py_None);
1801 return Py_None;
1802 }
1803 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001804
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001805 buf[0] = '\0';
Guido van Rossumb68cd421998-07-01 17:36:26 +00001806 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1807 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001808 if (fdp == NULL) {
1809 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1810 return NULL;
1811 PyErr_Clear();
1812 Py_INCREF(Py_None);
1813 return Py_None;
1814 }
1815 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001816 if (fp)
1817 fclose(fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001818 if (m != NULL && mod != Py_None) {
1819 if (PyObject_SetAttrString(mod, subname, m) < 0) {
1820 Py_DECREF(m);
1821 m = NULL;
1822 }
1823 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001824 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001825
1826 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001827}
1828
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001829
1830/* Re-import a module of any kind and return its module object, WITH
1831 INCREMENTED REFERENCE COUNT */
1832
Guido van Rossum79f25d91997-04-29 20:08:16 +00001833PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001834PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001835{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001836 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001837 PyObject *path = NULL;
1838 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001839 char buf[MAXPATHLEN+1];
1840 struct filedescr *fdp;
1841 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001842
Guido van Rossum79f25d91997-04-29 20:08:16 +00001843 if (m == NULL || !PyModule_Check(m)) {
1844 PyErr_SetString(PyExc_TypeError,
1845 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001846 return NULL;
1847 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001848 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001849 if (name == NULL)
1850 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001851 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001852 PyErr_Format(PyExc_ImportError,
1853 "reload(): module %.200s not in sys.modules",
1854 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001855 return NULL;
1856 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001857 subname = strrchr(name, '.');
1858 if (subname == NULL)
1859 subname = name;
1860 else {
1861 PyObject *parentname, *parent;
1862 parentname = PyString_FromStringAndSize(name, (subname-name));
1863 if (parentname == NULL)
1864 return NULL;
1865 parent = PyDict_GetItem(modules, parentname);
Barry Warsaw38793331999-01-27 17:54:20 +00001866 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00001867 if (parent == NULL) {
1868 PyErr_Format(PyExc_ImportError,
1869 "reload(): parent %.200s not in sys.modules",
1870 name);
1871 return NULL;
1872 }
1873 subname++;
1874 path = PyObject_GetAttrString(parent, "__path__");
1875 if (path == NULL)
1876 PyErr_Clear();
1877 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001878 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001879 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1880 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001881 if (fdp == NULL)
1882 return NULL;
1883 m = load_module(name, fp, buf, fdp->type);
1884 if (fp)
1885 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001886 return m;
1887}
1888
1889
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001890/* Higher-level import emulator which emulates the "import" statement
1891 more accurately -- it invokes the __import__() function from the
1892 builtins of the current globals. This means that the import is
1893 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00001894 environment, e.g. by "rexec".
1895 A dummy list ["__doc__"] is passed as the 4th argument so that
1896 e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
1897 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001898
1899PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001900PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001901{
1902 static PyObject *silly_list = NULL;
1903 static PyObject *builtins_str = NULL;
1904 static PyObject *import_str = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001905 PyObject *globals = NULL;
1906 PyObject *import = NULL;
1907 PyObject *builtins = NULL;
1908 PyObject *r = NULL;
1909
1910 /* Initialize constant string objects */
1911 if (silly_list == NULL) {
1912 import_str = PyString_InternFromString("__import__");
1913 if (import_str == NULL)
1914 return NULL;
1915 builtins_str = PyString_InternFromString("__builtins__");
1916 if (builtins_str == NULL)
1917 return NULL;
1918 silly_list = Py_BuildValue("[s]", "__doc__");
1919 if (silly_list == NULL)
1920 return NULL;
1921 }
1922
1923 /* Get the builtins from current globals */
1924 globals = PyEval_GetGlobals();
Guido van Rossum85cd1d62001-02-20 21:43:24 +00001925 if (globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00001926 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001927 builtins = PyObject_GetItem(globals, builtins_str);
1928 if (builtins == NULL)
1929 goto err;
1930 }
1931 else {
1932 /* No globals -- use standard builtins, and fake globals */
1933 PyErr_Clear();
1934
Guido van Rossum85cd1d62001-02-20 21:43:24 +00001935 builtins = PyImport_ImportModuleEx("__builtin__",
1936 NULL, NULL, NULL);
1937 if (builtins == NULL)
1938 return NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001939 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1940 if (globals == NULL)
1941 goto err;
1942 }
1943
1944 /* Get the __import__ function from the builtins */
1945 if (PyDict_Check(builtins))
Fred Drakea76ba6e2001-03-06 06:31:15 +00001946 import = PyObject_GetItem(builtins, import_str);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001947 else
Fred Drakea76ba6e2001-03-06 06:31:15 +00001948 import = PyObject_GetAttr(builtins, import_str);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001949 if (import == NULL)
1950 goto err;
1951
1952 /* Call the _import__ function with the proper argument list */
1953 r = PyObject_CallFunction(import, "OOOO",
1954 module_name, globals, globals, silly_list);
1955
1956 err:
1957 Py_XDECREF(globals);
1958 Py_XDECREF(builtins);
1959 Py_XDECREF(import);
Tim Peters50d8d372001-02-28 05:34:27 +00001960
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001961 return r;
1962}
1963
1964
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001965/* Module 'imp' provides Python access to the primitives used for
1966 importing modules.
1967*/
1968
Guido van Rossum79f25d91997-04-29 20:08:16 +00001969static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001970imp_get_magic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001971{
1972 char buf[4];
1973
Guido van Rossum43713e52000-02-29 13:59:29 +00001974 if (!PyArg_ParseTuple(args, ":get_magic"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001975 return NULL;
Guido van Rossum96774c12000-05-01 20:19:08 +00001976 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
1977 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
1978 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
1979 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001980
Guido van Rossum79f25d91997-04-29 20:08:16 +00001981 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001982}
1983
Guido van Rossum79f25d91997-04-29 20:08:16 +00001984static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001985imp_get_suffixes(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001986{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001987 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001988 struct filedescr *fdp;
1989
Guido van Rossum43713e52000-02-29 13:59:29 +00001990 if (!PyArg_ParseTuple(args, ":get_suffixes"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001991 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001992 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001993 if (list == NULL)
1994 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001995 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
1996 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001997 fdp->suffix, fdp->mode, fdp->type);
1998 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001999 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002000 return NULL;
2001 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002002 if (PyList_Append(list, item) < 0) {
2003 Py_DECREF(list);
2004 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002005 return NULL;
2006 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002007 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002008 }
2009 return list;
2010}
2011
Guido van Rossum79f25d91997-04-29 20:08:16 +00002012static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002013call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002014{
Tim Petersdbd9ba62000-07-09 03:09:57 +00002015 extern int fclose(FILE *);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002016 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002017 struct filedescr *fdp;
2018 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002019 FILE *fp = NULL;
2020
2021 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002022 if (path == Py_None)
2023 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002024 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
2025 if (fdp == NULL)
2026 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002027 if (fp != NULL) {
2028 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
2029 if (fob == NULL) {
2030 fclose(fp);
2031 return NULL;
2032 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002033 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002034 else {
2035 fob = Py_None;
2036 Py_INCREF(fob);
Tim Peters50d8d372001-02-28 05:34:27 +00002037 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002038 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002039 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002040 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002041 return ret;
2042}
2043
Guido van Rossum79f25d91997-04-29 20:08:16 +00002044static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002045imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002046{
2047 char *name;
2048 PyObject *path = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002049 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002050 return NULL;
2051 return call_find_module(name, path);
2052}
2053
2054static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002055imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002056{
2057 char *name;
2058 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002059 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002060 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002061 return NULL;
2062 ret = init_builtin(name);
2063 if (ret < 0)
2064 return NULL;
2065 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002066 Py_INCREF(Py_None);
2067 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002068 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002069 m = PyImport_AddModule(name);
2070 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002071 return m;
2072}
2073
Guido van Rossum79f25d91997-04-29 20:08:16 +00002074static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002075imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002076{
2077 char *name;
2078 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002079 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002080 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002081 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002082 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002083 if (ret < 0)
2084 return NULL;
2085 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002086 Py_INCREF(Py_None);
2087 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002088 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002089 m = PyImport_AddModule(name);
2090 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002091 return m;
2092}
2093
Guido van Rossum79f25d91997-04-29 20:08:16 +00002094static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002095imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002096{
2097 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002098
Guido van Rossum43713e52000-02-29 13:59:29 +00002099 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002100 return NULL;
2101 return get_frozen_object(name);
2102}
2103
Guido van Rossum79f25d91997-04-29 20:08:16 +00002104static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002105imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002106{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002107 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002108 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002109 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002110 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002111}
2112
Guido van Rossum79f25d91997-04-29 20:08:16 +00002113static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002114imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002115{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002116 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002117 struct _frozen *p;
Guido van Rossum43713e52000-02-29 13:59:29 +00002118 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002119 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002120 p = find_frozen(name);
2121 return PyInt_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002122}
2123
2124static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002125get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002126{
2127 FILE *fp;
2128 if (fob == NULL) {
2129 fp = fopen(pathname, mode);
2130 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002131 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002132 }
2133 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002134 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002135 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002136 PyErr_SetString(PyExc_ValueError,
2137 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002138 }
2139 return fp;
2140}
2141
Guido van Rossum79f25d91997-04-29 20:08:16 +00002142static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002143imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002144{
2145 char *name;
2146 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002147 PyObject *fob = NULL;
2148 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002149 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002150 if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002151 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002152 return NULL;
2153 fp = get_file(pathname, fob, "rb");
2154 if (fp == NULL)
2155 return NULL;
2156 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002157 if (fob == NULL)
2158 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002159 return m;
2160}
2161
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002162#ifdef HAVE_DYNAMIC_LOADING
2163
Guido van Rossum79f25d91997-04-29 20:08:16 +00002164static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002165imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002166{
2167 char *name;
2168 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002169 PyObject *fob = NULL;
2170 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002171 FILE *fp = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002172 if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002173 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002174 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002175 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002176 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002177 if (fp == NULL)
2178 return NULL;
2179 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002180 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002181 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002182}
2183
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002184#endif /* HAVE_DYNAMIC_LOADING */
2185
Guido van Rossum79f25d91997-04-29 20:08:16 +00002186static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002187imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002188{
2189 char *name;
2190 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002191 PyObject *fob = NULL;
2192 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002193 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002194 if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002195 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002196 return NULL;
2197 fp = get_file(pathname, fob, "r");
2198 if (fp == NULL)
2199 return NULL;
2200 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002201 if (fob == NULL)
2202 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002203 return m;
2204}
2205
Jack Jansen9c96a921995-02-15 22:57:06 +00002206#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002207static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002208imp_load_resource(PyObject *self, PyObject *args)
Jack Jansen9c96a921995-02-15 22:57:06 +00002209{
2210 char *name;
2211 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002212 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002213
Guido van Rossum43713e52000-02-29 13:59:29 +00002214 if (!PyArg_ParseTuple(args, "ss:load_resource", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002215 return NULL;
2216 m = PyMac_LoadResourceModule(name, pathname);
2217 return m;
2218}
2219#endif /* macintosh */
2220
Guido van Rossum79f25d91997-04-29 20:08:16 +00002221static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002222imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002223{
2224 char *name;
2225 PyObject *fob;
2226 char *pathname;
2227 char *suffix; /* Unused */
2228 char *mode;
2229 int type;
2230 FILE *fp;
2231
Guido van Rossum43713e52000-02-29 13:59:29 +00002232 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002233 &name, &fob, &pathname,
2234 &suffix, &mode, &type))
2235 return NULL;
2236 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
2237 PyErr_Format(PyExc_ValueError,
2238 "invalid file open mode %.200s", mode);
2239 return NULL;
2240 }
2241 if (fob == Py_None)
2242 fp = NULL;
2243 else {
2244 if (!PyFile_Check(fob)) {
2245 PyErr_SetString(PyExc_ValueError,
2246 "load_module arg#2 should be a file or None");
2247 return NULL;
2248 }
2249 fp = get_file(pathname, fob, mode);
2250 if (fp == NULL)
2251 return NULL;
2252 }
2253 return load_module(name, fp, pathname, type);
2254}
2255
2256static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002257imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002258{
2259 char *name;
2260 char *pathname;
Guido van Rossum43713e52000-02-29 13:59:29 +00002261 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002262 return NULL;
2263 return load_package(name, pathname);
2264}
2265
2266static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002267imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002268{
2269 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002270 if (!PyArg_ParseTuple(args, "s:new_module", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002271 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002272 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002273}
2274
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002275/* Doc strings */
2276
2277static char doc_imp[] = "\
2278This module provides the components needed to build your own\n\
2279__import__ function. Undocumented functions are obsolete.\n\
2280";
2281
2282static char doc_find_module[] = "\
2283find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
2284Search for a module. If path is omitted or None, search for a\n\
2285built-in, frozen or special module and continue search in sys.path.\n\
2286The module name cannot contain '.'; to search for a submodule of a\n\
2287package, pass the submodule name and the package's __path__.\
2288";
2289
2290static char doc_load_module[] = "\
2291load_module(name, file, filename, (suffix, mode, type)) -> module\n\
2292Load a module, given information returned by find_module().\n\
2293The module name must include the full package name, if any.\
2294";
2295
2296static char doc_get_magic[] = "\
2297get_magic() -> string\n\
2298Return the magic number for .pyc or .pyo files.\
2299";
2300
2301static char doc_get_suffixes[] = "\
2302get_suffixes() -> [(suffix, mode, type), ...]\n\
2303Return a list of (suffix, mode, type) tuples describing the files\n\
2304that find_module() looks for.\
2305";
2306
2307static char doc_new_module[] = "\
2308new_module(name) -> module\n\
2309Create a new module. Do not enter it in sys.modules.\n\
2310The module name must include the full package name, if any.\
2311";
2312
Guido van Rossum79f25d91997-04-29 20:08:16 +00002313static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002314 {"find_module", imp_find_module, 1, doc_find_module},
2315 {"get_magic", imp_get_magic, 1, doc_get_magic},
2316 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2317 {"load_module", imp_load_module, 1, doc_load_module},
2318 {"new_module", imp_new_module, 1, doc_new_module},
2319 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002320 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002321 {"init_builtin", imp_init_builtin, 1},
2322 {"init_frozen", imp_init_frozen, 1},
2323 {"is_builtin", imp_is_builtin, 1},
2324 {"is_frozen", imp_is_frozen, 1},
2325 {"load_compiled", imp_load_compiled, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002326#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002327 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002328#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002329 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002330#ifdef macintosh
2331 {"load_resource", imp_load_resource, 1},
2332#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002333 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002334 {NULL, NULL} /* sentinel */
2335};
2336
Guido van Rossum1a8791e1998-08-04 22:46:29 +00002337static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002338setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002339{
2340 PyObject *v;
2341 int err;
2342
2343 v = PyInt_FromLong((long)value);
2344 err = PyDict_SetItemString(d, name, v);
2345 Py_XDECREF(v);
2346 return err;
2347}
2348
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002349void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002350initimp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002351{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002352 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002353
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002354 m = Py_InitModule4("imp", imp_methods, doc_imp,
2355 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002356 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002357
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002358 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2359 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2360 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2361 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2362 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2363 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2364 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2365 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00002366 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002367
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002368 failure:
2369 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002370}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002371
2372
Guido van Rossumb18618d2000-05-03 23:44:39 +00002373/* API for embedding applications that want to add their own entries
2374 to the table of built-in modules. This should normally be called
2375 *before* Py_Initialize(). When the table resize fails, -1 is
2376 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002377
2378 After a similar function by Just van Rossum. */
2379
2380int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002381PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002382{
2383 static struct _inittab *our_copy = NULL;
2384 struct _inittab *p;
2385 int i, n;
2386
2387 /* Count the number of entries in both tables */
2388 for (n = 0; newtab[n].name != NULL; n++)
2389 ;
2390 if (n == 0)
2391 return 0; /* Nothing to do */
2392 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2393 ;
2394
2395 /* Allocate new memory for the combined table */
Guido van Rossumb18618d2000-05-03 23:44:39 +00002396 p = our_copy;
2397 PyMem_RESIZE(p, struct _inittab, i+n+1);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002398 if (p == NULL)
2399 return -1;
2400
2401 /* Copy the tables into the new memory */
2402 if (our_copy != PyImport_Inittab)
2403 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2404 PyImport_Inittab = our_copy = p;
2405 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
2406
2407 return 0;
2408}
2409
2410/* Shorthand to add a single entry given a name and a function */
2411
2412int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002413PyImport_AppendInittab(char *name, void (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002414{
2415 struct _inittab newtab[2];
2416
2417 memset(newtab, '\0', sizeof newtab);
2418
2419 newtab[0].name = name;
2420 newtab[0].initfunc = initfunc;
2421
2422 return PyImport_ExtendInittab(newtab);
2423}