blob: 7f49e57699355f953c78258efb598841c909a7ba [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 */
Jeremy Hyltonb1cbc1e2001-02-02 20:13:24 +000046#define MAGIC (60202 | ((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
732 cpathname = make_compiled_pathname(pathname, buf, (size_t)MAXPATHLEN+1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000733 if (cpathname != NULL &&
734 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000735 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000736 fclose(fpc);
737 if (co == NULL)
738 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000739 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000740 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000741 name, cpathname);
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000742 pathname = cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000743 }
744 else {
745 co = parse_source_module(pathname, fp);
746 if (co == NULL)
747 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000748 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000749 PySys_WriteStderr("import %s # from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000750 name, pathname);
751 write_compiled_module(co, cpathname, mtime);
752 }
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000753 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000754 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000755
756 return m;
757}
758
759
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000760/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +0000761static PyObject *load_module(char *, FILE *, char *, int);
762static struct filedescr *find_module(char *, PyObject *,
763 char *, size_t, FILE **);
764static struct _frozen *find_frozen(char *name);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000765
766/* Load a package and return its module object WITH INCREMENTED
767 REFERENCE COUNT */
768
769static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000770load_package(char *name, char *pathname)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000771{
772 PyObject *m, *d, *file, *path;
773 int err;
774 char buf[MAXPATHLEN+1];
775 FILE *fp = NULL;
776 struct filedescr *fdp;
777
778 m = PyImport_AddModule(name);
779 if (m == NULL)
780 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000781 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000782 PySys_WriteStderr("import %s # directory %s\n",
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000783 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000784 d = PyModule_GetDict(m);
785 file = PyString_FromString(pathname);
786 if (file == NULL)
787 return NULL;
788 path = Py_BuildValue("[O]", file);
789 if (path == NULL) {
790 Py_DECREF(file);
791 return NULL;
792 }
793 err = PyDict_SetItemString(d, "__file__", file);
794 if (err == 0)
795 err = PyDict_SetItemString(d, "__path__", path);
796 if (err != 0) {
797 m = NULL;
798 goto cleanup;
799 }
800 buf[0] = '\0';
801 fdp = find_module("__init__", path, buf, sizeof(buf), &fp);
802 if (fdp == NULL) {
803 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
804 PyErr_Clear();
805 }
806 else
807 m = NULL;
808 goto cleanup;
809 }
810 m = load_module(name, fp, buf, fdp->type);
811 if (fp != NULL)
812 fclose(fp);
813 cleanup:
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000814 Py_XDECREF(path);
815 Py_XDECREF(file);
816 return m;
817}
818
819
820/* Helper to test for built-in module */
821
822static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000823is_builtin(char *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000824{
825 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +0000826 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
827 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
828 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000829 return -1;
830 else
831 return 1;
832 }
833 }
834 return 0;
835}
836
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000837
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000838/* Search the path (default sys.path) for a module. Return the
839 corresponding filedescr struct, and (via return arguments) the
840 pathname and an open file. Return NULL if the module is not found. */
841
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000842#ifdef MS_COREDLL
Thomas Woutersb4bd21c2000-07-22 23:38:01 +0000843extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **,
844 char *, int);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000845#endif
846
Tim Peters50d8d372001-02-28 05:34:27 +0000847static int case_ok(char *, int, int, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000848static int find_init_module(char *); /* Forward */
Guido van Rossum197346f1997-10-31 18:38:52 +0000849
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000850static struct filedescr *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000851find_module(char *realname, PyObject *path, char *buf, size_t buflen,
852 FILE **p_fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000853{
Fred Drake4c82b232000-06-30 16:18:57 +0000854 int i, npath;
855 size_t len, namelen;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000856 struct _frozen *f;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000857 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000858 FILE *fp = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000859#ifndef RISCOS
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000860 struct stat statbuf;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000861#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000862 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
863 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
864 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossum0506a431998-08-11 15:07:39 +0000865 char name[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000866
Fred Drake4c82b232000-06-30 16:18:57 +0000867 if (strlen(realname) > MAXPATHLEN) {
868 PyErr_SetString(PyExc_OverflowError, "module name is too long");
869 return NULL;
870 }
Guido van Rossum0506a431998-08-11 15:07:39 +0000871 strcpy(name, realname);
872
873 if (path != NULL && PyString_Check(path)) {
874 /* Submodule of "frozen" package:
875 Set name to the fullname, path to NULL
876 and continue as "usual" */
877 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
878 PyErr_SetString(PyExc_ImportError,
879 "full frozen module name too long");
880 return NULL;
881 }
882 strcpy(buf, PyString_AsString(path));
883 strcat(buf, ".");
884 strcat(buf, name);
885 strcpy(name, buf);
886 path = NULL;
887 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000888 if (path == NULL) {
889 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000890 strcpy(buf, name);
891 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000892 }
Guido van Rossuma5568d31998-03-05 03:45:08 +0000893 if ((f = find_frozen(name)) != NULL) {
894 strcpy(buf, name);
895 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000896 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000897
Guido van Rossumac279101996-08-22 23:10:58 +0000898#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000899 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
900 if (fp != NULL) {
901 *p_fp = fp;
902 return fdp;
903 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000904#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000905 path = PySys_GetObject("path");
906 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000907 if (path == NULL || !PyList_Check(path)) {
908 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +0000909 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000910 return NULL;
911 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000912 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000913 namelen = strlen(name);
914 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000915 PyObject *v = PyList_GetItem(path, i);
916 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000917 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000918 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000919 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000920 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000921 strcpy(buf, PyString_AsString(v));
Fred Drake4c82b232000-06-30 16:18:57 +0000922 if (strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000923 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000924#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000925#ifdef INTERN_STRINGS
Tim Peters50d8d372001-02-28 05:34:27 +0000926 /*
Guido van Rossum741689d1997-08-12 14:53:39 +0000927 ** Speedup: each sys.path item is interned, and
928 ** FindResourceModule remembers which items refer to
929 ** folders (so we don't have to bother trying to look
Tim Peters50d8d372001-02-28 05:34:27 +0000930 ** into them for resources).
Guido van Rossum741689d1997-08-12 14:53:39 +0000931 */
932 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
933 v = PyList_GET_ITEM(path, i);
934#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000935 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000936 static struct filedescr resfiledescr =
937 {"", "", PY_RESOURCE};
Tim Peters50d8d372001-02-28 05:34:27 +0000938
Jack Jansen9c96a921995-02-15 22:57:06 +0000939 return &resfiledescr;
940 }
Guido van Rossum0f84a341998-08-06 13:36:01 +0000941 if (PyMac_FindCodeResourceModule((PyStringObject *)v, name, buf)) {
942 static struct filedescr resfiledescr =
943 {"", "", PY_CODERESOURCE};
Tim Peters50d8d372001-02-28 05:34:27 +0000944
Guido van Rossum0f84a341998-08-06 13:36:01 +0000945 return &resfiledescr;
946 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000947#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000948 if (len > 0 && buf[len-1] != SEP
949#ifdef ALTSEP
950 && buf[len-1] != ALTSEP
951#endif
952 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000953 buf[len++] = SEP;
Guido van Rossum215c3402000-11-13 17:26:32 +0000954 strcpy(buf+len, name);
955 len += namelen;
Tim Peters50d8d372001-02-28 05:34:27 +0000956
957 /* Check for package import (buf holds a directory name,
958 and there's an __init__ module in that directory */
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000959#ifdef HAVE_STAT
Tim Peters50d8d372001-02-28 05:34:27 +0000960 if (stat(buf, &statbuf) == 0 &&
961 S_ISDIR(statbuf.st_mode) &&
962 find_init_module(buf)) {
963 if (case_ok(buf, len, namelen, name))
964 return &fd_package;
965 else
966 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000967 }
968#else
969 /* XXX How are you going to test for directories? */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000970#ifdef RISCOS
971 {
972 static struct filedescr fd = {"", "", PKG_DIRECTORY};
973 if (isdir(buf)) {
974 if (find_init_module(buf))
975 return &fd;
976 }
977 }
978#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000979#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000980#ifdef macintosh
981 fdp = PyMac_FindModuleExtension(buf, &len, name);
Jack Jansen4df3c522001-03-20 23:09:54 +0000982 if (fdp) {
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000983#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000984 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000985 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000986 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000987 PySys_WriteStderr("# trying %s\n", buf);
Jack Jansen4df3c522001-03-20 23:09:54 +0000988#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000989 fp = fopen(buf, fdp->mode);
Tim Peters50d8d372001-02-28 05:34:27 +0000990 if (fp != NULL) {
991 if (case_ok(buf, len, namelen, name))
992 break;
993 else { /* continue search */
994 fclose(fp);
995 fp = NULL;
Barry Warsaw914a0b12001-02-02 19:12:16 +0000996 }
Barry Warsaw914a0b12001-02-02 19:12:16 +0000997 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000998 }
999 if (fp != NULL)
1000 break;
1001 }
1002 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001003 PyErr_Format(PyExc_ImportError,
1004 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001005 return NULL;
1006 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001007 *p_fp = fp;
1008 return fdp;
1009}
1010
Tim Petersd1e87a82001-03-01 18:12:00 +00001011/* case_ok(char* buf, int len, int namelen, char* name)
1012 * The arguments here are tricky, best shown by example:
1013 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1014 * ^ ^ ^ ^
1015 * |--------------------- buf ---------------------|
1016 * |------------------- len ------------------|
1017 * |------ name -------|
1018 * |----- namelen -----|
1019 * buf is the full path, but len only counts up to (& exclusive of) the
1020 * extension. name is the module name, also exclusive of extension.
1021 *
1022 * We've already done a successful stat() or fopen() on buf, so know that
1023 * there's some match, possibly case-insensitive.
1024 *
Tim Peters50d8d372001-02-28 05:34:27 +00001025 * case_ok() is to return 1 if there's a case-sensitive match for
1026 * name, else 0. case_ok() is also to return 1 if envar PYTHONCASEOK
1027 * exists.
Tim Petersd1e87a82001-03-01 18:12:00 +00001028 *
Tim Peters50d8d372001-02-28 05:34:27 +00001029 * case_ok() is used to implement case-sensitive import semantics even
1030 * on platforms with case-insensitive filesystems. It's trivial to implement
1031 * for case-sensitive filesystems. It's pretty much a cross-platform
1032 * nightmare for systems with case-insensitive filesystems.
1033 */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001034
Tim Peters50d8d372001-02-28 05:34:27 +00001035/* First we may need a pile of platform-specific header files; the sequence
1036 * of #if's here should match the sequence in the body of case_ok().
1037 */
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001038#if defined(MS_WIN32) || defined(__CYGWIN__)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001039#include <windows.h>
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001040#ifdef __CYGWIN__
1041#include <sys/cygwin.h>
1042#endif
1043
Tim Peters50d8d372001-02-28 05:34:27 +00001044#elif defined(DJGPP)
1045#include <dir.h>
1046
1047#elif defined(macintosh)
1048#include <TextUtils.h>
1049#ifdef USE_GUSI1
1050#include "TFileSpec.h" /* for Path2FSSpec() */
1051#endif
1052
Tim Petersd1e87a82001-03-01 18:12:00 +00001053#elif defined(__MACH__) && defined(__APPLE__) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001054#include <sys/types.h>
1055#include <dirent.h>
1056
Tim Peters50d8d372001-02-28 05:34:27 +00001057#endif
1058
Guido van Rossum0980bd91998-02-13 17:18:36 +00001059static int
Tim Peters50d8d372001-02-28 05:34:27 +00001060case_ok(char *buf, int len, int namelen, char *name)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001061{
Tim Peters50d8d372001-02-28 05:34:27 +00001062/* Pick a platform-specific implementation; the sequence of #if's here should
1063 * match the sequence just above.
1064 */
1065
1066/* MS_WIN32 || __CYGWIN__ */
1067#if defined(MS_WIN32) || defined(__CYGWIN__)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001068 WIN32_FIND_DATA data;
1069 HANDLE h;
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001070#ifdef __CYGWIN__
1071 char tempbuf[MAX_PATH];
1072#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001073
Guido van Rossum0980bd91998-02-13 17:18:36 +00001074 if (getenv("PYTHONCASEOK") != NULL)
1075 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001076
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001077#ifdef __CYGWIN__
1078 cygwin32_conv_to_win32_path(buf, tempbuf);
1079 h = FindFirstFile(tempbuf, &data);
1080#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001081 h = FindFirstFile(buf, &data);
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001082#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001083 if (h == INVALID_HANDLE_VALUE) {
1084 PyErr_Format(PyExc_NameError,
1085 "Can't find file for module %.100s\n(filename %.300s)",
1086 name, buf);
1087 return 0;
1088 }
1089 FindClose(h);
Tim Peters50d8d372001-02-28 05:34:27 +00001090 return strncmp(data.cFileName, name, namelen) == 0;
1091
1092/* DJGPP */
1093#elif defined(DJGPP)
1094 struct ffblk ffblk;
1095 int done;
1096
1097 if (getenv("PYTHONCASEOK") != NULL)
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001098 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001099
1100 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
1101 if (done) {
Guido van Rossum0980bd91998-02-13 17:18:36 +00001102 PyErr_Format(PyExc_NameError,
Tim Peters50d8d372001-02-28 05:34:27 +00001103 "Can't find file for module %.100s\n(filename %.300s)",
Guido van Rossum0980bd91998-02-13 17:18:36 +00001104 name, buf);
1105 return 0;
1106 }
Tim Peters50d8d372001-02-28 05:34:27 +00001107 return strncmp(ffblk.ff_name, name, namelen) == 0;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001108
Tim Peters50d8d372001-02-28 05:34:27 +00001109/* macintosh */
1110#elif defined(macintosh)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001111 FSSpec fss;
1112 OSErr err;
Tim Peters50d8d372001-02-28 05:34:27 +00001113
1114 if (getenv("PYTHONCASEOK") != NULL)
1115 return 1;
1116
Guido van Rossumb33aa1a2000-04-24 15:08:18 +00001117#ifndef USE_GUSI1
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001118 err = FSMakeFSSpec(0, 0, Pstring(buf), &fss);
1119#else
1120 /* GUSI's Path2FSSpec() resolves all possible aliases nicely on
1121 the way, which is fine for all directories, but here we need
1122 the original name of the alias file (say, Dlg.ppc.slb, not
1123 toolboxmodules.ppc.slb). */
1124 char *colon;
1125 err = Path2FSSpec(buf, &fss);
1126 if (err == noErr) {
1127 colon = strrchr(buf, ':'); /* find filename */
1128 if (colon != NULL)
1129 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1130 Pstring(colon+1), &fss);
1131 else
1132 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1133 fss.name, &fss);
1134 }
1135#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001136 if (err) {
1137 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001138 "Can't find file for module %.100s\n(filename %.300s)",
1139 name, buf);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001140 return 0;
1141 }
Tim Peters50d8d372001-02-28 05:34:27 +00001142 return fss.name[0] >= namelen &&
1143 strncmp(name, (char *)fss.name+1, namelen) == 0;
1144
Tim Peters677898a2001-03-02 03:28:03 +00001145/* new-fangled macintosh (macosx) */
Tim Petersd1e87a82001-03-01 18:12:00 +00001146#elif defined(__MACH__) && defined(__APPLE__) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001147 DIR *dirp;
1148 struct dirent *dp;
Tim Petersd1e87a82001-03-01 18:12:00 +00001149 char dirname[MAXPATHLEN + 1];
1150 const int dirlen = len - namelen - 1; /* don't want trailing SEP */
Tim Peters430f5d42001-03-01 01:30:56 +00001151
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001152 if (getenv("PYTHONCASEOK") != NULL)
1153 return 1;
1154
Tim Petersd1e87a82001-03-01 18:12:00 +00001155 /* Copy the dir component into dirname; substitute "." if empty */
1156 if (dirlen <= 0) {
1157 dirname[0] = '.';
1158 dirname[1] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001159 }
1160 else {
Tim Petersd1e87a82001-03-01 18:12:00 +00001161 assert(dirlen <= MAXPATHLEN);
1162 memcpy(dirname, buf, dirlen);
1163 dirname[dirlen] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001164 }
1165 /* Open the directory and search the entries for an exact match. */
Tim Petersd1e87a82001-03-01 18:12:00 +00001166 dirp = opendir(dirname);
Tim Peters430f5d42001-03-01 01:30:56 +00001167 if (dirp) {
Tim Peters677898a2001-03-02 03:28:03 +00001168 char *nameWithExt = buf + len - namelen;
Tim Peters430f5d42001-03-01 01:30:56 +00001169 while ((dp = readdir(dirp)) != NULL) {
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001170 const int thislen =
Tim Peters430f5d42001-03-01 01:30:56 +00001171#ifdef _DIRENT_HAVE_D_NAMELEN
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001172 dp->d_namlen;
Tim Peters430f5d42001-03-01 01:30:56 +00001173#else
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001174 strlen(dp->d_name);
Tim Peters430f5d42001-03-01 01:30:56 +00001175#endif
Tim Petersd1e87a82001-03-01 18:12:00 +00001176 if (thislen >= namelen &&
Tim Peters677898a2001-03-02 03:28:03 +00001177 strcmp(dp->d_name, nameWithExt) == 0) {
Tim Peters430f5d42001-03-01 01:30:56 +00001178 (void)closedir(dirp);
1179 return 1; /* Found */
1180 }
1181 }
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001182 (void)closedir(dirp);
Tim Peters430f5d42001-03-01 01:30:56 +00001183 }
Tim Peters430f5d42001-03-01 01:30:56 +00001184 return 0 ; /* Not found */
Tim Peters430f5d42001-03-01 01:30:56 +00001185
Tim Peters50d8d372001-02-28 05:34:27 +00001186/* assuming it's a case-sensitive filesystem, so there's nothing to do! */
1187#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001188 return 1;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001189
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001190#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001191}
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001192
Guido van Rossum0980bd91998-02-13 17:18:36 +00001193
Guido van Rossum197346f1997-10-31 18:38:52 +00001194#ifdef HAVE_STAT
1195/* Helper to look for __init__.py or __init__.py[co] in potential package */
1196static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001197find_init_module(char *buf)
Guido van Rossum197346f1997-10-31 18:38:52 +00001198{
Fred Drake4c82b232000-06-30 16:18:57 +00001199 size_t save_len = strlen(buf);
1200 size_t i = save_len;
Guido van Rossum197346f1997-10-31 18:38:52 +00001201 struct stat statbuf;
1202
1203 if (save_len + 13 >= MAXPATHLEN)
1204 return 0;
1205 buf[i++] = SEP;
1206 strcpy(buf+i, "__init__.py");
1207 if (stat(buf, &statbuf) == 0) {
1208 buf[save_len] = '\0';
1209 return 1;
1210 }
1211 i += strlen(buf+i);
1212 if (Py_OptimizeFlag)
1213 strcpy(buf+i, "o");
1214 else
1215 strcpy(buf+i, "c");
1216 if (stat(buf, &statbuf) == 0) {
1217 buf[save_len] = '\0';
1218 return 1;
1219 }
1220 buf[save_len] = '\0';
1221 return 0;
1222}
Guido van Rossum48a680c2001-03-02 06:34:14 +00001223
1224#else
1225
1226#ifdef RISCOS
1227static int
1228find_init_module(buf)
1229 char *buf;
1230{
1231 int save_len = strlen(buf);
1232 int i = save_len;
1233
1234 if (save_len + 13 >= MAXPATHLEN)
1235 return 0;
1236 buf[i++] = SEP;
1237 strcpy(buf+i, "__init__/py");
1238 if (isfile(buf)) {
1239 buf[save_len] = '\0';
1240 return 1;
1241 }
1242
1243 if (Py_OptimizeFlag)
1244 strcpy(buf+i, "o");
1245 else
1246 strcpy(buf+i, "c");
1247 if (isfile(buf)) {
1248 buf[save_len] = '\0';
1249 return 1;
1250 }
1251 buf[save_len] = '\0';
1252 return 0;
1253}
1254#endif /*RISCOS*/
1255
Guido van Rossum197346f1997-10-31 18:38:52 +00001256#endif /* HAVE_STAT */
1257
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001258
Tim Petersdbd9ba62000-07-09 03:09:57 +00001259static int init_builtin(char *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001260
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001261/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001262 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001263
Guido van Rossum79f25d91997-04-29 20:08:16 +00001264static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001265load_module(char *name, FILE *fp, char *buf, int type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001266{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001267 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001268 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001269 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001270
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001271 /* First check that there's an open file (if we need one) */
1272 switch (type) {
1273 case PY_SOURCE:
1274 case PY_COMPILED:
1275 if (fp == NULL) {
1276 PyErr_Format(PyExc_ValueError,
1277 "file object required for import (type code %d)",
1278 type);
1279 return NULL;
1280 }
1281 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001282
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001283 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001284
1285 case PY_SOURCE:
1286 m = load_source_module(name, buf, fp);
1287 break;
1288
1289 case PY_COMPILED:
1290 m = load_compiled_module(name, buf, fp);
1291 break;
1292
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001293#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001294 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001295 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001296 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001297#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001298
Jack Jansen9c96a921995-02-15 22:57:06 +00001299#ifdef macintosh
1300 case PY_RESOURCE:
1301 m = PyMac_LoadResourceModule(name, buf);
1302 break;
Guido van Rossum0f84a341998-08-06 13:36:01 +00001303 case PY_CODERESOURCE:
1304 m = PyMac_LoadCodeResourceModule(name, buf);
1305 break;
Jack Jansen9c96a921995-02-15 22:57:06 +00001306#endif
1307
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001308 case PKG_DIRECTORY:
1309 m = load_package(name, buf);
1310 break;
1311
1312 case C_BUILTIN:
1313 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001314 if (buf != NULL && buf[0] != '\0')
1315 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001316 if (type == C_BUILTIN)
1317 err = init_builtin(name);
1318 else
1319 err = PyImport_ImportFrozenModule(name);
1320 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001321 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001322 if (err == 0) {
1323 PyErr_Format(PyExc_ImportError,
1324 "Purported %s module %.200s not found",
1325 type == C_BUILTIN ?
1326 "builtin" : "frozen",
1327 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001328 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001329 }
1330 modules = PyImport_GetModuleDict();
1331 m = PyDict_GetItemString(modules, name);
1332 if (m == NULL) {
1333 PyErr_Format(
1334 PyExc_ImportError,
1335 "%s module %.200s not properly initialized",
1336 type == C_BUILTIN ?
1337 "builtin" : "frozen",
1338 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001339 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001340 }
1341 Py_INCREF(m);
1342 break;
1343
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001344 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001345 PyErr_Format(PyExc_ImportError,
1346 "Don't know how to import %.200s (type code %d)",
1347 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001348 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001349
1350 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001351
1352 return m;
1353}
1354
1355
1356/* Initialize a built-in module.
1357 Return 1 for succes, 0 if the module is not found, and -1 with
1358 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001359
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001360static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001361init_builtin(char *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001362{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001363 struct _inittab *p;
1364 PyObject *mod;
1365
1366 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
1367 return 1;
1368
Guido van Rossum771c6c81997-10-31 18:37:24 +00001369 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001370 if (strcmp(name, p->name) == 0) {
1371 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001372 PyErr_Format(PyExc_ImportError,
1373 "Cannot re-init internal module %.200s",
1374 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001375 return -1;
1376 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001377 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001378 PySys_WriteStderr("import %s # builtin\n", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001379 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001380 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001381 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001382 if (_PyImport_FixupExtension(name, name) == NULL)
1383 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001384 return 1;
1385 }
1386 }
1387 return 0;
1388}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001389
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001390
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001391/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001392
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001393static struct _frozen *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001394find_frozen(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001395{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001396 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001397
Guido van Rossum79f25d91997-04-29 20:08:16 +00001398 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001399 if (p->name == NULL)
1400 return NULL;
1401 if (strcmp(p->name, name) == 0)
1402 break;
1403 }
1404 return p;
1405}
1406
Guido van Rossum79f25d91997-04-29 20:08:16 +00001407static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001408get_frozen_object(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001409{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001410 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001411 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001412
1413 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001414 PyErr_Format(PyExc_ImportError,
1415 "No such frozen object named %.200s",
1416 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001417 return NULL;
1418 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001419 size = p->size;
1420 if (size < 0)
1421 size = -size;
1422 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001423}
1424
1425/* Initialize a frozen module.
1426 Return 1 for succes, 0 if the module is not found, and -1 with
1427 an exception set if the initialization failed.
1428 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001429
1430int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001431PyImport_ImportFrozenModule(char *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001432{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001433 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001434 PyObject *co;
1435 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001436 int ispackage;
1437 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001438
1439 if (p == NULL)
1440 return 0;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001441 size = p->size;
1442 ispackage = (size < 0);
1443 if (ispackage)
1444 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001445 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001446 PySys_WriteStderr("import %s # frozen%s\n",
Guido van Rossuma5568d31998-03-05 03:45:08 +00001447 name, ispackage ? " package" : "");
1448 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001449 if (co == NULL)
1450 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001451 if (!PyCode_Check(co)) {
1452 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001453 PyErr_Format(PyExc_TypeError,
1454 "frozen object %.200s is not a code object",
1455 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001456 return -1;
1457 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001458 if (ispackage) {
1459 /* Set __path__ to the package name */
1460 PyObject *d, *s;
1461 int err;
1462 m = PyImport_AddModule(name);
1463 if (m == NULL)
1464 return -1;
1465 d = PyModule_GetDict(m);
1466 s = PyString_InternFromString(name);
1467 if (s == NULL)
1468 return -1;
1469 err = PyDict_SetItemString(d, "__path__", s);
1470 Py_DECREF(s);
1471 if (err != 0)
1472 return err;
1473 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001474 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001475 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001476 if (m == NULL)
1477 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001478 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001479 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001480}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001481
1482
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001483/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001484 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001485
Guido van Rossum79f25d91997-04-29 20:08:16 +00001486PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001487PyImport_ImportModule(char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00001488{
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00001489 PyObject *pname;
1490 PyObject *result;
1491
1492 pname = PyString_FromString(name);
1493 result = PyImport_Import(pname);
1494 Py_DECREF(pname);
1495 return result;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001496}
1497
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001498/* Forward declarations for helper routines */
Tim Petersdbd9ba62000-07-09 03:09:57 +00001499static PyObject *get_parent(PyObject *globals, char *buf, int *p_buflen);
1500static PyObject *load_next(PyObject *mod, PyObject *altmod,
1501 char **p_name, char *buf, int *p_buflen);
1502static int mark_miss(char *name);
1503static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
1504 char *buf, int buflen, int recursive);
1505static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001506
1507/* The Magnum Opus of dotted-name import :-) */
1508
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001509static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001510import_module_ex(char *name, PyObject *globals, PyObject *locals,
1511 PyObject *fromlist)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001512{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001513 char buf[MAXPATHLEN+1];
1514 int buflen = 0;
1515 PyObject *parent, *head, *next, *tail;
1516
1517 parent = get_parent(globals, buf, &buflen);
1518 if (parent == NULL)
1519 return NULL;
1520
1521 head = load_next(parent, Py_None, &name, buf, &buflen);
1522 if (head == NULL)
1523 return NULL;
1524
1525 tail = head;
1526 Py_INCREF(tail);
1527 while (name) {
1528 next = load_next(tail, tail, &name, buf, &buflen);
1529 Py_DECREF(tail);
1530 if (next == NULL) {
1531 Py_DECREF(head);
1532 return NULL;
1533 }
1534 tail = next;
1535 }
1536
1537 if (fromlist != NULL) {
1538 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1539 fromlist = NULL;
1540 }
1541
1542 if (fromlist == NULL) {
1543 Py_DECREF(tail);
1544 return head;
1545 }
1546
1547 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001548 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001549 Py_DECREF(tail);
1550 return NULL;
1551 }
1552
1553 return tail;
1554}
1555
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001556PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001557PyImport_ImportModuleEx(char *name, PyObject *globals, PyObject *locals,
1558 PyObject *fromlist)
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001559{
1560 PyObject *result;
1561 lock_import();
Guido van Rossumd65911b1998-03-03 22:33:27 +00001562 result = import_module_ex(name, globals, locals, fromlist);
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001563 unlock_import();
1564 return result;
1565}
1566
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001567static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001568get_parent(PyObject *globals, char *buf, int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001569{
1570 static PyObject *namestr = NULL;
1571 static PyObject *pathstr = NULL;
1572 PyObject *modname, *modpath, *modules, *parent;
1573
1574 if (globals == NULL || !PyDict_Check(globals))
1575 return Py_None;
1576
1577 if (namestr == NULL) {
1578 namestr = PyString_InternFromString("__name__");
1579 if (namestr == NULL)
1580 return NULL;
1581 }
1582 if (pathstr == NULL) {
1583 pathstr = PyString_InternFromString("__path__");
1584 if (pathstr == NULL)
1585 return NULL;
1586 }
1587
1588 *buf = '\0';
1589 *p_buflen = 0;
1590 modname = PyDict_GetItem(globals, namestr);
1591 if (modname == NULL || !PyString_Check(modname))
1592 return Py_None;
1593
1594 modpath = PyDict_GetItem(globals, pathstr);
1595 if (modpath != NULL) {
1596 int len = PyString_GET_SIZE(modname);
1597 if (len > MAXPATHLEN) {
1598 PyErr_SetString(PyExc_ValueError,
1599 "Module name too long");
1600 return NULL;
1601 }
1602 strcpy(buf, PyString_AS_STRING(modname));
1603 *p_buflen = len;
1604 }
1605 else {
1606 char *start = PyString_AS_STRING(modname);
1607 char *lastdot = strrchr(start, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001608 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001609 if (lastdot == NULL)
1610 return Py_None;
1611 len = lastdot - start;
1612 if (len >= MAXPATHLEN) {
1613 PyErr_SetString(PyExc_ValueError,
1614 "Module name too long");
1615 return NULL;
1616 }
1617 strncpy(buf, start, len);
1618 buf[len] = '\0';
1619 *p_buflen = len;
1620 }
1621
1622 modules = PyImport_GetModuleDict();
1623 parent = PyDict_GetItemString(modules, buf);
1624 if (parent == NULL)
1625 parent = Py_None;
1626 return parent;
1627 /* We expect, but can't guarantee, if parent != None, that:
1628 - parent.__name__ == buf
1629 - parent.__dict__ is globals
1630 If this is violated... Who cares? */
1631}
1632
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001633/* altmod is either None or same as mod */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001634static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001635load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
1636 int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001637{
1638 char *name = *p_name;
1639 char *dot = strchr(name, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001640 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001641 char *p;
1642 PyObject *result;
1643
1644 if (dot == NULL) {
1645 *p_name = NULL;
1646 len = strlen(name);
1647 }
1648 else {
1649 *p_name = dot+1;
1650 len = dot-name;
1651 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00001652 if (len == 0) {
1653 PyErr_SetString(PyExc_ValueError,
1654 "Empty module name");
1655 return NULL;
1656 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001657
1658 p = buf + *p_buflen;
1659 if (p != buf)
1660 *p++ = '.';
1661 if (p+len-buf >= MAXPATHLEN) {
1662 PyErr_SetString(PyExc_ValueError,
1663 "Module name too long");
1664 return NULL;
1665 }
1666 strncpy(p, name, len);
1667 p[len] = '\0';
1668 *p_buflen = p+len-buf;
1669
1670 result = import_submodule(mod, p, buf);
1671 if (result == Py_None && altmod != mod) {
1672 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001673 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001674 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001675 if (result != NULL && result != Py_None) {
1676 if (mark_miss(buf) != 0) {
1677 Py_DECREF(result);
1678 return NULL;
1679 }
1680 strncpy(buf, name, len);
1681 buf[len] = '\0';
1682 *p_buflen = len;
1683 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001684 }
1685 if (result == NULL)
1686 return NULL;
1687
1688 if (result == Py_None) {
1689 Py_DECREF(result);
1690 PyErr_Format(PyExc_ImportError,
1691 "No module named %.200s", name);
1692 return NULL;
1693 }
1694
1695 return result;
1696}
1697
1698static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001699mark_miss(char *name)
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001700{
1701 PyObject *modules = PyImport_GetModuleDict();
1702 return PyDict_SetItemString(modules, name, Py_None);
1703}
1704
1705static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001706ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, int buflen,
1707 int recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001708{
1709 int i;
1710
1711 if (!PyObject_HasAttrString(mod, "__path__"))
1712 return 1;
1713
1714 for (i = 0; ; i++) {
1715 PyObject *item = PySequence_GetItem(fromlist, i);
1716 int hasit;
1717 if (item == NULL) {
1718 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1719 PyErr_Clear();
1720 return 1;
1721 }
1722 return 0;
1723 }
1724 if (!PyString_Check(item)) {
1725 PyErr_SetString(PyExc_TypeError,
1726 "Item in ``from list'' not a string");
1727 Py_DECREF(item);
1728 return 0;
1729 }
1730 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001731 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001732 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001733 /* See if the package defines __all__ */
1734 if (recursive)
1735 continue; /* Avoid endless recursion */
1736 all = PyObject_GetAttrString(mod, "__all__");
1737 if (all == NULL)
1738 PyErr_Clear();
1739 else {
1740 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1741 return 0;
1742 Py_DECREF(all);
1743 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001744 continue;
1745 }
1746 hasit = PyObject_HasAttr(mod, item);
1747 if (!hasit) {
1748 char *subname = PyString_AS_STRING(item);
1749 PyObject *submod;
1750 char *p;
1751 if (buflen + strlen(subname) >= MAXPATHLEN) {
1752 PyErr_SetString(PyExc_ValueError,
1753 "Module name too long");
1754 Py_DECREF(item);
1755 return 0;
1756 }
1757 p = buf + buflen;
1758 *p++ = '.';
1759 strcpy(p, subname);
1760 submod = import_submodule(mod, subname, buf);
1761 Py_XDECREF(submod);
1762 if (submod == NULL) {
1763 Py_DECREF(item);
1764 return 0;
1765 }
1766 }
1767 Py_DECREF(item);
1768 }
1769
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001770 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001771}
1772
1773static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001774import_submodule(PyObject *mod, char *subname, char *fullname)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001775{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001776 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001777 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001778
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001779 /* Require:
1780 if mod == None: subname == fullname
1781 else: mod.__name__ + "." + subname == fullname
1782 */
1783
Tim Peters50d8d372001-02-28 05:34:27 +00001784 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001785 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001786 }
1787 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001788 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001789 char buf[MAXPATHLEN+1];
1790 struct filedescr *fdp;
1791 FILE *fp = NULL;
1792
Guido van Rossum9c0afe51998-05-19 15:09:05 +00001793 if (mod == Py_None)
1794 path = NULL;
1795 else {
1796 path = PyObject_GetAttrString(mod, "__path__");
1797 if (path == NULL) {
1798 PyErr_Clear();
1799 Py_INCREF(Py_None);
1800 return Py_None;
1801 }
1802 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001803
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001804 buf[0] = '\0';
Guido van Rossumb68cd421998-07-01 17:36:26 +00001805 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1806 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001807 if (fdp == NULL) {
1808 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1809 return NULL;
1810 PyErr_Clear();
1811 Py_INCREF(Py_None);
1812 return Py_None;
1813 }
1814 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001815 if (fp)
1816 fclose(fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001817 if (m != NULL && mod != Py_None) {
1818 if (PyObject_SetAttrString(mod, subname, m) < 0) {
1819 Py_DECREF(m);
1820 m = NULL;
1821 }
1822 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001823 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001824
1825 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001826}
1827
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001828
1829/* Re-import a module of any kind and return its module object, WITH
1830 INCREMENTED REFERENCE COUNT */
1831
Guido van Rossum79f25d91997-04-29 20:08:16 +00001832PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001833PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001834{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001835 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001836 PyObject *path = NULL;
1837 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001838 char buf[MAXPATHLEN+1];
1839 struct filedescr *fdp;
1840 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001841
Guido van Rossum79f25d91997-04-29 20:08:16 +00001842 if (m == NULL || !PyModule_Check(m)) {
1843 PyErr_SetString(PyExc_TypeError,
1844 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001845 return NULL;
1846 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001847 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001848 if (name == NULL)
1849 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001850 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001851 PyErr_Format(PyExc_ImportError,
1852 "reload(): module %.200s not in sys.modules",
1853 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001854 return NULL;
1855 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001856 subname = strrchr(name, '.');
1857 if (subname == NULL)
1858 subname = name;
1859 else {
1860 PyObject *parentname, *parent;
1861 parentname = PyString_FromStringAndSize(name, (subname-name));
1862 if (parentname == NULL)
1863 return NULL;
1864 parent = PyDict_GetItem(modules, parentname);
Barry Warsaw38793331999-01-27 17:54:20 +00001865 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00001866 if (parent == NULL) {
1867 PyErr_Format(PyExc_ImportError,
1868 "reload(): parent %.200s not in sys.modules",
1869 name);
1870 return NULL;
1871 }
1872 subname++;
1873 path = PyObject_GetAttrString(parent, "__path__");
1874 if (path == NULL)
1875 PyErr_Clear();
1876 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001877 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001878 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1879 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001880 if (fdp == NULL)
1881 return NULL;
1882 m = load_module(name, fp, buf, fdp->type);
1883 if (fp)
1884 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001885 return m;
1886}
1887
1888
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001889/* Higher-level import emulator which emulates the "import" statement
1890 more accurately -- it invokes the __import__() function from the
1891 builtins of the current globals. This means that the import is
1892 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00001893 environment, e.g. by "rexec".
1894 A dummy list ["__doc__"] is passed as the 4th argument so that
1895 e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
1896 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001897
1898PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001899PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001900{
1901 static PyObject *silly_list = NULL;
1902 static PyObject *builtins_str = NULL;
1903 static PyObject *import_str = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001904 PyObject *globals = NULL;
1905 PyObject *import = NULL;
1906 PyObject *builtins = NULL;
1907 PyObject *r = NULL;
1908
1909 /* Initialize constant string objects */
1910 if (silly_list == NULL) {
1911 import_str = PyString_InternFromString("__import__");
1912 if (import_str == NULL)
1913 return NULL;
1914 builtins_str = PyString_InternFromString("__builtins__");
1915 if (builtins_str == NULL)
1916 return NULL;
1917 silly_list = Py_BuildValue("[s]", "__doc__");
1918 if (silly_list == NULL)
1919 return NULL;
1920 }
1921
1922 /* Get the builtins from current globals */
1923 globals = PyEval_GetGlobals();
Guido van Rossum85cd1d62001-02-20 21:43:24 +00001924 if (globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00001925 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001926 builtins = PyObject_GetItem(globals, builtins_str);
1927 if (builtins == NULL)
1928 goto err;
1929 }
1930 else {
1931 /* No globals -- use standard builtins, and fake globals */
1932 PyErr_Clear();
1933
Guido van Rossum85cd1d62001-02-20 21:43:24 +00001934 builtins = PyImport_ImportModuleEx("__builtin__",
1935 NULL, NULL, NULL);
1936 if (builtins == NULL)
1937 return NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001938 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1939 if (globals == NULL)
1940 goto err;
1941 }
1942
1943 /* Get the __import__ function from the builtins */
1944 if (PyDict_Check(builtins))
Fred Drakea76ba6e2001-03-06 06:31:15 +00001945 import = PyObject_GetItem(builtins, import_str);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001946 else
Fred Drakea76ba6e2001-03-06 06:31:15 +00001947 import = PyObject_GetAttr(builtins, import_str);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001948 if (import == NULL)
1949 goto err;
1950
1951 /* Call the _import__ function with the proper argument list */
1952 r = PyObject_CallFunction(import, "OOOO",
1953 module_name, globals, globals, silly_list);
1954
1955 err:
1956 Py_XDECREF(globals);
1957 Py_XDECREF(builtins);
1958 Py_XDECREF(import);
Tim Peters50d8d372001-02-28 05:34:27 +00001959
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001960 return r;
1961}
1962
1963
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001964/* Module 'imp' provides Python access to the primitives used for
1965 importing modules.
1966*/
1967
Guido van Rossum79f25d91997-04-29 20:08:16 +00001968static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001969imp_get_magic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001970{
1971 char buf[4];
1972
Guido van Rossum43713e52000-02-29 13:59:29 +00001973 if (!PyArg_ParseTuple(args, ":get_magic"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001974 return NULL;
Guido van Rossum96774c12000-05-01 20:19:08 +00001975 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
1976 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
1977 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
1978 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001979
Guido van Rossum79f25d91997-04-29 20:08:16 +00001980 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001981}
1982
Guido van Rossum79f25d91997-04-29 20:08:16 +00001983static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001984imp_get_suffixes(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001985{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001986 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001987 struct filedescr *fdp;
1988
Guido van Rossum43713e52000-02-29 13:59:29 +00001989 if (!PyArg_ParseTuple(args, ":get_suffixes"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001990 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001991 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001992 if (list == NULL)
1993 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001994 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
1995 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001996 fdp->suffix, fdp->mode, fdp->type);
1997 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001998 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001999 return NULL;
2000 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002001 if (PyList_Append(list, item) < 0) {
2002 Py_DECREF(list);
2003 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002004 return NULL;
2005 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002006 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002007 }
2008 return list;
2009}
2010
Guido van Rossum79f25d91997-04-29 20:08:16 +00002011static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002012call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002013{
Tim Petersdbd9ba62000-07-09 03:09:57 +00002014 extern int fclose(FILE *);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002015 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002016 struct filedescr *fdp;
2017 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002018 FILE *fp = NULL;
2019
2020 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002021 if (path == Py_None)
2022 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002023 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
2024 if (fdp == NULL)
2025 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002026 if (fp != NULL) {
2027 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
2028 if (fob == NULL) {
2029 fclose(fp);
2030 return NULL;
2031 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002032 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002033 else {
2034 fob = Py_None;
2035 Py_INCREF(fob);
Tim Peters50d8d372001-02-28 05:34:27 +00002036 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002037 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002038 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002039 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002040 return ret;
2041}
2042
Guido van Rossum79f25d91997-04-29 20:08:16 +00002043static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002044imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002045{
2046 char *name;
2047 PyObject *path = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002048 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002049 return NULL;
2050 return call_find_module(name, path);
2051}
2052
2053static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002054imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002055{
2056 char *name;
2057 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002058 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002059 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002060 return NULL;
2061 ret = init_builtin(name);
2062 if (ret < 0)
2063 return NULL;
2064 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002065 Py_INCREF(Py_None);
2066 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002067 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002068 m = PyImport_AddModule(name);
2069 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002070 return m;
2071}
2072
Guido van Rossum79f25d91997-04-29 20:08:16 +00002073static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002074imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002075{
2076 char *name;
2077 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002078 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002079 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002080 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002081 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002082 if (ret < 0)
2083 return NULL;
2084 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002085 Py_INCREF(Py_None);
2086 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002087 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002088 m = PyImport_AddModule(name);
2089 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002090 return m;
2091}
2092
Guido van Rossum79f25d91997-04-29 20:08:16 +00002093static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002094imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002095{
2096 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002097
Guido van Rossum43713e52000-02-29 13:59:29 +00002098 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002099 return NULL;
2100 return get_frozen_object(name);
2101}
2102
Guido van Rossum79f25d91997-04-29 20:08:16 +00002103static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002104imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002105{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002106 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002107 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002108 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002109 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002110}
2111
Guido van Rossum79f25d91997-04-29 20:08:16 +00002112static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002113imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002114{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002115 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002116 struct _frozen *p;
Guido van Rossum43713e52000-02-29 13:59:29 +00002117 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002118 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002119 p = find_frozen(name);
2120 return PyInt_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002121}
2122
2123static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002124get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002125{
2126 FILE *fp;
2127 if (fob == NULL) {
2128 fp = fopen(pathname, mode);
2129 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002130 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002131 }
2132 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002133 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002134 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002135 PyErr_SetString(PyExc_ValueError,
2136 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002137 }
2138 return fp;
2139}
2140
Guido van Rossum79f25d91997-04-29 20:08:16 +00002141static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002142imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002143{
2144 char *name;
2145 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002146 PyObject *fob = NULL;
2147 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002148 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002149 if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002150 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002151 return NULL;
2152 fp = get_file(pathname, fob, "rb");
2153 if (fp == NULL)
2154 return NULL;
2155 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002156 if (fob == NULL)
2157 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002158 return m;
2159}
2160
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002161#ifdef HAVE_DYNAMIC_LOADING
2162
Guido van Rossum79f25d91997-04-29 20:08:16 +00002163static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002164imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002165{
2166 char *name;
2167 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002168 PyObject *fob = NULL;
2169 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002170 FILE *fp = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002171 if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002172 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002173 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002174 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002175 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002176 if (fp == NULL)
2177 return NULL;
2178 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002179 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002180 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002181}
2182
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002183#endif /* HAVE_DYNAMIC_LOADING */
2184
Guido van Rossum79f25d91997-04-29 20:08:16 +00002185static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002186imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002187{
2188 char *name;
2189 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002190 PyObject *fob = NULL;
2191 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002192 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002193 if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002194 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002195 return NULL;
2196 fp = get_file(pathname, fob, "r");
2197 if (fp == NULL)
2198 return NULL;
2199 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002200 if (fob == NULL)
2201 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002202 return m;
2203}
2204
Jack Jansen9c96a921995-02-15 22:57:06 +00002205#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002206static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002207imp_load_resource(PyObject *self, PyObject *args)
Jack Jansen9c96a921995-02-15 22:57:06 +00002208{
2209 char *name;
2210 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002211 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002212
Guido van Rossum43713e52000-02-29 13:59:29 +00002213 if (!PyArg_ParseTuple(args, "ss:load_resource", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002214 return NULL;
2215 m = PyMac_LoadResourceModule(name, pathname);
2216 return m;
2217}
2218#endif /* macintosh */
2219
Guido van Rossum79f25d91997-04-29 20:08:16 +00002220static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002221imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002222{
2223 char *name;
2224 PyObject *fob;
2225 char *pathname;
2226 char *suffix; /* Unused */
2227 char *mode;
2228 int type;
2229 FILE *fp;
2230
Guido van Rossum43713e52000-02-29 13:59:29 +00002231 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002232 &name, &fob, &pathname,
2233 &suffix, &mode, &type))
2234 return NULL;
2235 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
2236 PyErr_Format(PyExc_ValueError,
2237 "invalid file open mode %.200s", mode);
2238 return NULL;
2239 }
2240 if (fob == Py_None)
2241 fp = NULL;
2242 else {
2243 if (!PyFile_Check(fob)) {
2244 PyErr_SetString(PyExc_ValueError,
2245 "load_module arg#2 should be a file or None");
2246 return NULL;
2247 }
2248 fp = get_file(pathname, fob, mode);
2249 if (fp == NULL)
2250 return NULL;
2251 }
2252 return load_module(name, fp, pathname, type);
2253}
2254
2255static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002256imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002257{
2258 char *name;
2259 char *pathname;
Guido van Rossum43713e52000-02-29 13:59:29 +00002260 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002261 return NULL;
2262 return load_package(name, pathname);
2263}
2264
2265static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002266imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002267{
2268 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002269 if (!PyArg_ParseTuple(args, "s:new_module", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002270 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002271 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002272}
2273
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002274/* Doc strings */
2275
2276static char doc_imp[] = "\
2277This module provides the components needed to build your own\n\
2278__import__ function. Undocumented functions are obsolete.\n\
2279";
2280
2281static char doc_find_module[] = "\
2282find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
2283Search for a module. If path is omitted or None, search for a\n\
2284built-in, frozen or special module and continue search in sys.path.\n\
2285The module name cannot contain '.'; to search for a submodule of a\n\
2286package, pass the submodule name and the package's __path__.\
2287";
2288
2289static char doc_load_module[] = "\
2290load_module(name, file, filename, (suffix, mode, type)) -> module\n\
2291Load a module, given information returned by find_module().\n\
2292The module name must include the full package name, if any.\
2293";
2294
2295static char doc_get_magic[] = "\
2296get_magic() -> string\n\
2297Return the magic number for .pyc or .pyo files.\
2298";
2299
2300static char doc_get_suffixes[] = "\
2301get_suffixes() -> [(suffix, mode, type), ...]\n\
2302Return a list of (suffix, mode, type) tuples describing the files\n\
2303that find_module() looks for.\
2304";
2305
2306static char doc_new_module[] = "\
2307new_module(name) -> module\n\
2308Create a new module. Do not enter it in sys.modules.\n\
2309The module name must include the full package name, if any.\
2310";
2311
Guido van Rossum79f25d91997-04-29 20:08:16 +00002312static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002313 {"find_module", imp_find_module, 1, doc_find_module},
2314 {"get_magic", imp_get_magic, 1, doc_get_magic},
2315 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2316 {"load_module", imp_load_module, 1, doc_load_module},
2317 {"new_module", imp_new_module, 1, doc_new_module},
2318 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002319 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002320 {"init_builtin", imp_init_builtin, 1},
2321 {"init_frozen", imp_init_frozen, 1},
2322 {"is_builtin", imp_is_builtin, 1},
2323 {"is_frozen", imp_is_frozen, 1},
2324 {"load_compiled", imp_load_compiled, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002325#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002326 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002327#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002328 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002329#ifdef macintosh
2330 {"load_resource", imp_load_resource, 1},
2331#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002332 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002333 {NULL, NULL} /* sentinel */
2334};
2335
Guido van Rossum1a8791e1998-08-04 22:46:29 +00002336static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002337setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002338{
2339 PyObject *v;
2340 int err;
2341
2342 v = PyInt_FromLong((long)value);
2343 err = PyDict_SetItemString(d, name, v);
2344 Py_XDECREF(v);
2345 return err;
2346}
2347
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002348void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002349initimp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002350{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002351 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002352
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002353 m = Py_InitModule4("imp", imp_methods, doc_imp,
2354 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002355 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002356
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002357 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2358 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2359 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2360 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2361 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2362 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2363 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2364 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00002365 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002366
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002367 failure:
2368 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002369}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002370
2371
Guido van Rossumb18618d2000-05-03 23:44:39 +00002372/* API for embedding applications that want to add their own entries
2373 to the table of built-in modules. This should normally be called
2374 *before* Py_Initialize(). When the table resize fails, -1 is
2375 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002376
2377 After a similar function by Just van Rossum. */
2378
2379int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002380PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002381{
2382 static struct _inittab *our_copy = NULL;
2383 struct _inittab *p;
2384 int i, n;
2385
2386 /* Count the number of entries in both tables */
2387 for (n = 0; newtab[n].name != NULL; n++)
2388 ;
2389 if (n == 0)
2390 return 0; /* Nothing to do */
2391 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2392 ;
2393
2394 /* Allocate new memory for the combined table */
Guido van Rossumb18618d2000-05-03 23:44:39 +00002395 p = our_copy;
2396 PyMem_RESIZE(p, struct _inittab, i+n+1);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002397 if (p == NULL)
2398 return -1;
2399
2400 /* Copy the tables into the new memory */
2401 if (our_copy != PyImport_Inittab)
2402 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2403 PyImport_Inittab = our_copy = p;
2404 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
2405
2406 return 0;
2407}
2408
2409/* Shorthand to add a single entry given a name and a function */
2410
2411int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002412PyImport_AppendInittab(char *name, void (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002413{
2414 struct _inittab newtab[2];
2415
2416 memset(newtab, '\0', sizeof newtab);
2417
2418 newtab[0].name = name;
2419 newtab[0].initfunc = initfunc;
2420
2421 return PyImport_ExtendInittab(newtab);
2422}