blob: c5234ace617c5d08945c59a1b2b880bddcf928b6 [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
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000031extern time_t PyOS_GetLastModificationTime(char *, FILE *);
32 /* In getmtime.c */
Guido van Rossum21d335e1993-10-15 13:01:11 +000033
Guido van Rossum6c849691994-09-26 15:47:17 +000034/* Magic word to reject .pyc files generated by other Python versions */
Guido van Rossum7faeab31995-07-07 22:50:36 +000035/* Change for each incompatible change */
36/* The value of CR and LF is incorporated so if you ever read or write
37 a .pyc file in text mode the magic number will be wrong; also, the
38 Apple MPW compiler swaps their values, botching string constants */
39/* XXX Perhaps the magic number should be frozen and a version field
40 added to the .pyc file header? */
Guido van Rossumdd5db431997-01-17 21:06:11 +000041/* New way to come up with the magic number: (YEAR-1995), MONTH, DAY */
Tim Peters6d6c1a32001-08-02 04:15:00 +000042#define MAGIC (60717 | ((long)'\r'<<16) | ((long)'\n'<<24))
Guido van Rossum3ddee711991-12-16 13:06:34 +000043
Guido van Rossum96774c12000-05-01 20:19:08 +000044/* Magic word as global; note that _PyImport_Init() can change the
Jeremy Hylton9262b8a2000-06-30 04:59:17 +000045 value of this global to accommodate for alterations of how the
Guido van Rossum96774c12000-05-01 20:19:08 +000046 compiler works which are enabled by command line switches. */
47static long pyc_magic = MAGIC;
48
Guido van Rossum25ce5661997-08-02 03:10:38 +000049/* See _PyImport_FixupExtension() below */
50static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000051
Guido van Rossum771c6c81997-10-31 18:37:24 +000052/* This table is defined in config.c: */
53extern struct _inittab _PyImport_Inittab[];
54
55struct _inittab *PyImport_Inittab = _PyImport_Inittab;
Guido van Rossum66f1fa81991-04-03 19:03:52 +000056
Guido van Rossumed1170e1999-12-20 21:23:41 +000057/* these tables define the module suffixes that Python recognizes */
58struct filedescr * _PyImport_Filetab = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +000059
60#ifdef RISCOS
61static const struct filedescr _PyImport_StandardFiletab[] = {
62 {"/py", "r", PY_SOURCE},
63 {"/pyc", "rb", PY_COMPILED},
64 {0, 0}
65};
66#else
Guido van Rossumed1170e1999-12-20 21:23:41 +000067static const struct filedescr _PyImport_StandardFiletab[] = {
68 {".py", "r", PY_SOURCE},
Tim Petersc1731372001-08-04 08:12:36 +000069#ifdef MS_WIN32
70 {".pyw", "r", PY_SOURCE},
71#endif
Guido van Rossumed1170e1999-12-20 21:23:41 +000072 {".pyc", "rb", PY_COMPILED},
73 {0, 0}
74};
Guido van Rossum48a680c2001-03-02 06:34:14 +000075#endif
Guido van Rossumed1170e1999-12-20 21:23:41 +000076
Guido van Rossum1ae940a1995-01-02 19:04:15 +000077/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000078
79void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000080_PyImport_Init(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000081{
Guido van Rossumed1170e1999-12-20 21:23:41 +000082 const struct filedescr *scan;
83 struct filedescr *filetab;
84 int countD = 0;
85 int countS = 0;
86
87 /* prepare _PyImport_Filetab: copy entries from
88 _PyImport_DynLoadFiletab and _PyImport_StandardFiletab.
89 */
90 for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan)
91 ++countD;
92 for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan)
93 ++countS;
Guido van Rossumb18618d2000-05-03 23:44:39 +000094 filetab = PyMem_NEW(struct filedescr, countD + countS + 1);
Guido van Rossumed1170e1999-12-20 21:23:41 +000095 memcpy(filetab, _PyImport_DynLoadFiletab,
96 countD * sizeof(struct filedescr));
97 memcpy(filetab + countD, _PyImport_StandardFiletab,
98 countS * sizeof(struct filedescr));
99 filetab[countD + countS].suffix = NULL;
100
101 _PyImport_Filetab = filetab;
102
Guido van Rossum0824f631997-03-11 18:37:35 +0000103 if (Py_OptimizeFlag) {
Guido van Rossumed1170e1999-12-20 21:23:41 +0000104 /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */
105 for (; filetab->suffix != NULL; filetab++) {
Guido van Rossum48a680c2001-03-02 06:34:14 +0000106#ifndef RISCOS
Guido van Rossumed1170e1999-12-20 21:23:41 +0000107 if (strcmp(filetab->suffix, ".pyc") == 0)
108 filetab->suffix = ".pyo";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000109#else
110 if (strcmp(filetab->suffix, "/pyc") == 0)
111 filetab->suffix = "/pyo";
112#endif
Guido van Rossum0824f631997-03-11 18:37:35 +0000113 }
114 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000115
116 if (Py_UnicodeFlag) {
117 /* Fix the pyc_magic so that byte compiled code created
118 using the all-Unicode method doesn't interfere with
119 code created in normal operation mode. */
120 pyc_magic = MAGIC + 1;
121 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000122}
123
Guido van Rossum25ce5661997-08-02 03:10:38 +0000124void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000125_PyImport_Fini(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000126{
127 Py_XDECREF(extensions);
128 extensions = NULL;
Barry Warsaw84294482000-10-03 16:02:05 +0000129 PyMem_DEL(_PyImport_Filetab);
130 _PyImport_Filetab = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000131}
132
133
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000134/* Locking primitives to prevent parallel imports of the same module
135 in different threads to return with a partially loaded module.
136 These calls are serialized by the global interpreter lock. */
137
138#ifdef WITH_THREAD
139
Guido van Rossum49b56061998-10-01 20:42:43 +0000140#include "pythread.h"
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000141
Guido van Rossum65d5b571998-12-21 19:32:43 +0000142static PyThread_type_lock import_lock = 0;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000143static long import_lock_thread = -1;
144static int import_lock_level = 0;
145
146static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000147lock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000148{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000149 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000150 if (me == -1)
151 return; /* Too bad */
152 if (import_lock == NULL)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000153 import_lock = PyThread_allocate_lock();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000154 if (import_lock_thread == me) {
155 import_lock_level++;
156 return;
157 }
Guido van Rossum65d5b571998-12-21 19:32:43 +0000158 if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0)) {
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000159 PyThreadState *tstate = PyEval_SaveThread();
Guido van Rossum65d5b571998-12-21 19:32:43 +0000160 PyThread_acquire_lock(import_lock, 1);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000161 PyEval_RestoreThread(tstate);
162 }
163 import_lock_thread = me;
164 import_lock_level = 1;
165}
166
167static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000168unlock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000169{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000170 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000171 if (me == -1)
172 return; /* Too bad */
173 if (import_lock_thread != me)
174 Py_FatalError("unlock_import: not holding the import lock");
175 import_lock_level--;
176 if (import_lock_level == 0) {
177 import_lock_thread = -1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000178 PyThread_release_lock(import_lock);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000179 }
180}
181
182#else
183
184#define lock_import()
185#define unlock_import()
186
187#endif
188
Guido van Rossum25ce5661997-08-02 03:10:38 +0000189/* Helper for sys */
190
191PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000192PyImport_GetModuleDict(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000193{
194 PyInterpreterState *interp = PyThreadState_Get()->interp;
195 if (interp->modules == NULL)
196 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
197 return interp->modules;
198}
199
Guido van Rossum3f5da241990-12-20 15:06:42 +0000200
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000201/* List of names to clear in sys */
202static char* sys_deletes[] = {
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000203 "path", "argv", "ps1", "ps2", "exitfunc",
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000204 "exc_type", "exc_value", "exc_traceback",
205 "last_type", "last_value", "last_traceback",
206 NULL
207};
208
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000209static char* sys_files[] = {
210 "stdin", "__stdin__",
211 "stdout", "__stdout__",
212 "stderr", "__stderr__",
213 NULL
214};
215
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000216
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000217/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000218
Guido van Rossum3f5da241990-12-20 15:06:42 +0000219void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000220PyImport_Cleanup(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000221{
Guido van Rossum758eec01998-01-19 21:58:26 +0000222 int pos, ndone;
223 char *name;
224 PyObject *key, *value, *dict;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000225 PyInterpreterState *interp = PyThreadState_Get()->interp;
Guido van Rossum758eec01998-01-19 21:58:26 +0000226 PyObject *modules = interp->modules;
227
228 if (modules == NULL)
229 return; /* Already done */
230
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000231 /* Delete some special variables first. These are common
232 places where user values hide and people complain when their
233 destructors fail. Since the modules containing them are
234 deleted *last* of all, they would come too late in the normal
235 destruction order. Sigh. */
236
237 value = PyDict_GetItemString(modules, "__builtin__");
238 if (value != NULL && PyModule_Check(value)) {
239 dict = PyModule_GetDict(value);
240 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000241 PySys_WriteStderr("# clear __builtin__._\n");
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000242 PyDict_SetItemString(dict, "_", Py_None);
243 }
244 value = PyDict_GetItemString(modules, "sys");
245 if (value != NULL && PyModule_Check(value)) {
246 char **p;
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000247 PyObject *v;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000248 dict = PyModule_GetDict(value);
249 for (p = sys_deletes; *p != NULL; p++) {
250 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000251 PySys_WriteStderr("# clear sys.%s\n", *p);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000252 PyDict_SetItemString(dict, *p, Py_None);
253 }
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000254 for (p = sys_files; *p != NULL; p+=2) {
255 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000256 PySys_WriteStderr("# restore sys.%s\n", *p);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000257 v = PyDict_GetItemString(dict, *(p+1));
258 if (v == NULL)
259 v = Py_None;
260 PyDict_SetItemString(dict, *p, v);
261 }
262 }
263
264 /* First, delete __main__ */
265 value = PyDict_GetItemString(modules, "__main__");
266 if (value != NULL && PyModule_Check(value)) {
267 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000268 PySys_WriteStderr("# cleanup __main__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000269 _PyModule_Clear(value);
270 PyDict_SetItemString(modules, "__main__", Py_None);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000271 }
272
Guido van Rossum758eec01998-01-19 21:58:26 +0000273 /* The special treatment of __builtin__ here is because even
274 when it's not referenced as a module, its dictionary is
275 referenced by almost every module's __builtins__. Since
276 deleting a module clears its dictionary (even if there are
277 references left to it), we need to delete the __builtin__
278 module last. Likewise, we don't delete sys until the very
279 end because it is implicitly referenced (e.g. by print).
280
281 Also note that we 'delete' modules by replacing their entry
282 in the modules dict with None, rather than really deleting
283 them; this avoids a rehash of the modules dictionary and
284 also marks them as "non existent" so they won't be
285 re-imported. */
286
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000287 /* Next, repeatedly delete modules with a reference count of
Guido van Rossum758eec01998-01-19 21:58:26 +0000288 one (skipping __builtin__ and sys) and delete them */
289 do {
290 ndone = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000291 pos = 0;
Guido van Rossum758eec01998-01-19 21:58:26 +0000292 while (PyDict_Next(modules, &pos, &key, &value)) {
293 if (value->ob_refcnt != 1)
294 continue;
Guido van Rossum566373e1998-10-01 15:24:50 +0000295 if (PyString_Check(key) && PyModule_Check(value)) {
296 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000297 if (strcmp(name, "__builtin__") == 0)
298 continue;
299 if (strcmp(name, "sys") == 0)
300 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000301 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000302 PySys_WriteStderr(
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000303 "# cleanup[1] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000304 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000305 PyDict_SetItem(modules, key, Py_None);
306 ndone++;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000307 }
308 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000309 } while (ndone > 0);
310
Guido van Rossum758eec01998-01-19 21:58:26 +0000311 /* Next, delete all modules (still skipping __builtin__ and sys) */
312 pos = 0;
313 while (PyDict_Next(modules, &pos, &key, &value)) {
Guido van Rossum566373e1998-10-01 15:24:50 +0000314 if (PyString_Check(key) && PyModule_Check(value)) {
315 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000316 if (strcmp(name, "__builtin__") == 0)
317 continue;
318 if (strcmp(name, "sys") == 0)
319 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000320 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000321 PySys_WriteStderr("# cleanup[2] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000322 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000323 PyDict_SetItem(modules, key, Py_None);
324 }
325 }
326
327 /* Next, delete sys and __builtin__ (in that order) */
328 value = PyDict_GetItemString(modules, "sys");
329 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000330 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000331 PySys_WriteStderr("# cleanup sys\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000332 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000333 PyDict_SetItemString(modules, "sys", Py_None);
334 }
335 value = PyDict_GetItemString(modules, "__builtin__");
336 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000337 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000338 PySys_WriteStderr("# cleanup __builtin__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000339 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000340 PyDict_SetItemString(modules, "__builtin__", Py_None);
341 }
342
343 /* Finally, clear and delete the modules directory */
344 PyDict_Clear(modules);
345 interp->modules = NULL;
346 Py_DECREF(modules);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000347}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000348
349
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000350/* Helper for pythonrun.c -- return magic number */
351
352long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000353PyImport_GetMagicNumber(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000354{
Guido van Rossum96774c12000-05-01 20:19:08 +0000355 return pyc_magic;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000356}
357
358
Guido van Rossum25ce5661997-08-02 03:10:38 +0000359/* Magic for extension modules (built-in as well as dynamically
360 loaded). To prevent initializing an extension module more than
361 once, we keep a static dictionary 'extensions' keyed by module name
362 (for built-in modules) or by filename (for dynamically loaded
363 modules), containing these modules. A copy od the module's
364 dictionary is stored by calling _PyImport_FixupExtension()
365 immediately after the module initialization function succeeds. A
366 copy can be retrieved from there by calling
367 _PyImport_FindExtension(). */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000368
Guido van Rossum79f25d91997-04-29 20:08:16 +0000369PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000370_PyImport_FixupExtension(char *name, char *filename)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000371{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000372 PyObject *modules, *mod, *dict, *copy;
373 if (extensions == NULL) {
374 extensions = PyDict_New();
375 if (extensions == NULL)
376 return NULL;
377 }
378 modules = PyImport_GetModuleDict();
379 mod = PyDict_GetItemString(modules, name);
380 if (mod == NULL || !PyModule_Check(mod)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000381 PyErr_Format(PyExc_SystemError,
382 "_PyImport_FixupExtension: module %.200s not loaded", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000383 return NULL;
384 }
385 dict = PyModule_GetDict(mod);
386 if (dict == NULL)
387 return NULL;
388 copy = PyObject_CallMethod(dict, "copy", "");
389 if (copy == NULL)
390 return NULL;
391 PyDict_SetItemString(extensions, filename, copy);
392 Py_DECREF(copy);
393 return copy;
394}
395
396PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000397_PyImport_FindExtension(char *name, char *filename)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000398{
399 PyObject *dict, *mod, *mdict, *result;
400 if (extensions == NULL)
401 return NULL;
402 dict = PyDict_GetItemString(extensions, filename);
403 if (dict == NULL)
404 return NULL;
405 mod = PyImport_AddModule(name);
406 if (mod == NULL)
407 return NULL;
408 mdict = PyModule_GetDict(mod);
409 if (mdict == NULL)
410 return NULL;
411 result = PyObject_CallMethod(mdict, "update", "O", dict);
412 if (result == NULL)
413 return NULL;
414 Py_DECREF(result);
415 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000416 PySys_WriteStderr("import %s # previously loaded (%s)\n",
Guido van Rossum25ce5661997-08-02 03:10:38 +0000417 name, filename);
418 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000419}
420
421
422/* Get the module object corresponding to a module name.
423 First check the modules dictionary if there's one there,
424 if not, create a new one and insert in in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000425 Because the former action is most common, THIS DOES NOT RETURN A
426 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000427
Guido van Rossum79f25d91997-04-29 20:08:16 +0000428PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000429PyImport_AddModule(char *name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000430{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000431 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000432 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000433
Guido van Rossum25ce5661997-08-02 03:10:38 +0000434 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
Guido van Rossum79f25d91997-04-29 20:08:16 +0000435 PyModule_Check(m))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000436 return m;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000437 m = PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000438 if (m == NULL)
439 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000440 if (PyDict_SetItemString(modules, name, m) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000441 Py_DECREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000442 return NULL;
443 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000444 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000445
446 return m;
447}
448
449
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000450/* Execute a code object in a module and return the module object
451 WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000452
Guido van Rossum79f25d91997-04-29 20:08:16 +0000453PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000454PyImport_ExecCodeModule(char *name, PyObject *co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000455{
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000456 return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
457}
458
459PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000460PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname)
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000461{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000462 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000463 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000464
Guido van Rossum79f25d91997-04-29 20:08:16 +0000465 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000466 if (m == NULL)
467 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000468 d = PyModule_GetDict(m);
469 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
470 if (PyDict_SetItemString(d, "__builtins__",
471 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000472 return NULL;
473 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000474 /* Remember the filename as the __file__ attribute */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000475 v = NULL;
476 if (pathname != NULL) {
477 v = PyString_FromString(pathname);
478 if (v == NULL)
479 PyErr_Clear();
480 }
481 if (v == NULL) {
482 v = ((PyCodeObject *)co)->co_filename;
483 Py_INCREF(v);
484 }
485 if (PyDict_SetItemString(d, "__file__", v) != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000486 PyErr_Clear(); /* Not important enough to report */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000487 Py_DECREF(v);
488
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000489 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000490 if (v == NULL)
491 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000492 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000493
Guido van Rossum25ce5661997-08-02 03:10:38 +0000494 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000495 PyErr_Format(PyExc_ImportError,
496 "Loaded module %.200s not found in sys.modules",
497 name);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000498 return NULL;
499 }
500
Guido van Rossum79f25d91997-04-29 20:08:16 +0000501 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000502
503 return m;
504}
505
506
507/* Given a pathname for a Python source file, fill a buffer with the
508 pathname for the corresponding compiled file. Return the pathname
509 for the compiled file, or NULL if there's no space in the buffer.
510 Doesn't set an exception. */
511
512static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000513make_compiled_pathname(char *pathname, char *buf, size_t buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000514{
Tim Petersc1731372001-08-04 08:12:36 +0000515 size_t len = strlen(pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000516 if (len+2 > buflen)
517 return NULL;
Tim Petersc1731372001-08-04 08:12:36 +0000518
519#ifdef MS_WIN32
520 /* Treat .pyw as if it were .py. The case of ".pyw" must match
521 that used in _PyImport_StandardFiletab. */
522 if (len >= 4 && strcmp(&pathname[len-4], ".pyw") == 0)
523 --len; /* pretend 'w' isn't there */
524#endif
525 memcpy(buf, pathname, len);
526 buf[len] = Py_OptimizeFlag ? 'o' : 'c';
527 buf[len+1] = '\0';
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000528
529 return buf;
530}
531
532
533/* Given a pathname for a Python source file, its time of last
534 modification, and a pathname for a compiled file, check whether the
535 compiled file represents the same version of the source. If so,
536 return a FILE pointer for the compiled file, positioned just after
537 the header; if not, return NULL.
538 Doesn't set an exception. */
539
540static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000541check_compiled_module(char *pathname, long mtime, char *cpathname)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000542{
543 FILE *fp;
544 long magic;
545 long pyc_mtime;
546
547 fp = fopen(cpathname, "rb");
548 if (fp == NULL)
549 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000550 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000551 if (magic != pyc_magic) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000552 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000553 PySys_WriteStderr("# %s has bad magic\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000554 fclose(fp);
555 return NULL;
556 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000557 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000558 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000559 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000560 PySys_WriteStderr("# %s has bad mtime\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000561 fclose(fp);
562 return NULL;
563 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000564 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000565 PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000566 return fp;
567}
568
569
570/* Read a code object from a file and check it for validity */
571
Guido van Rossum79f25d91997-04-29 20:08:16 +0000572static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000573read_compiled_module(char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000574{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000575 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000576
Tim Petersd9b9ac82001-01-28 00:27:39 +0000577 co = PyMarshal_ReadLastObjectFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000578 /* Ugly: rd_object() may return NULL with or without error */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000579 if (co == NULL || !PyCode_Check(co)) {
580 if (!PyErr_Occurred())
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000581 PyErr_Format(PyExc_ImportError,
582 "Non-code object in %.200s", cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000583 Py_XDECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000584 return NULL;
585 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000586 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000587}
588
589
590/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000591 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000592
Guido van Rossum79f25d91997-04-29 20:08:16 +0000593static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000594load_compiled_module(char *name, char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000595{
596 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000597 PyCodeObject *co;
598 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000599
Guido van Rossum79f25d91997-04-29 20:08:16 +0000600 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000601 if (magic != pyc_magic) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000602 PyErr_Format(PyExc_ImportError,
603 "Bad magic number in %.200s", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000604 return NULL;
605 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000606 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000607 co = read_compiled_module(cpathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000608 if (co == NULL)
609 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000610 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000611 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000612 name, cpathname);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000613 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000614 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000615
616 return m;
617}
618
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000619/* Parse a source file and return the corresponding code object */
620
Guido van Rossum79f25d91997-04-29 20:08:16 +0000621static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000622parse_source_module(char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000623{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000624 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000625 node *n;
626
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000627 n = PyParser_SimpleParseFile(fp, pathname, Py_file_input);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000628 if (n == NULL)
629 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000630 co = PyNode_Compile(n, pathname);
631 PyNode_Free(n);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000632
633 return co;
634}
635
636
Guido van Rossum55a83382000-09-20 20:31:38 +0000637/* Helper to open a bytecode file for writing in exclusive mode */
638
639static FILE *
640open_exclusive(char *filename)
641{
642#if defined(O_EXCL)&&defined(O_CREAT)&&defined(O_WRONLY)&&defined(O_TRUNC)
643 /* Use O_EXCL to avoid a race condition when another process tries to
644 write the same file. When that happens, our open() call fails,
645 which is just fine (since it's only a cache).
646 XXX If the file exists and is writable but the directory is not
647 writable, the file will never be written. Oh well.
648 */
649 int fd;
650 (void) unlink(filename);
Tim Peters42c83af2000-09-29 04:03:10 +0000651 fd = open(filename, O_EXCL|O_CREAT|O_WRONLY|O_TRUNC
652#ifdef O_BINARY
653 |O_BINARY /* necessary for Windows */
654#endif
Tim Peters50d8d372001-02-28 05:34:27 +0000655
Tim Peters42c83af2000-09-29 04:03:10 +0000656 , 0666);
Guido van Rossum55a83382000-09-20 20:31:38 +0000657 if (fd < 0)
658 return NULL;
659 return fdopen(fd, "wb");
660#else
661 /* Best we can do -- on Windows this can't happen anyway */
662 return fopen(filename, "wb");
663#endif
664}
665
666
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000667/* Write a compiled module to a file, placing the time of last
668 modification of its source into the header.
669 Errors are ignored, if a write error occurs an attempt is made to
670 remove the file. */
671
672static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000673write_compiled_module(PyCodeObject *co, char *cpathname, long mtime)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000674{
675 FILE *fp;
676
Guido van Rossum55a83382000-09-20 20:31:38 +0000677 fp = open_exclusive(cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000678 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000679 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000680 PySys_WriteStderr(
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000681 "# can't create %s\n", cpathname);
682 return;
683 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000684 PyMarshal_WriteLongToFile(pyc_magic, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000685 /* First write a 0 for mtime */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000686 PyMarshal_WriteLongToFile(0L, fp);
687 PyMarshal_WriteObjectToFile((PyObject *)co, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000688 if (ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000689 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000690 PySys_WriteStderr("# can't write %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000691 /* Don't keep partial file */
692 fclose(fp);
693 (void) unlink(cpathname);
694 return;
695 }
696 /* Now write the true mtime */
697 fseek(fp, 4L, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000698 PyMarshal_WriteLongToFile(mtime, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000699 fflush(fp);
700 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000701 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000702 PySys_WriteStderr("# wrote %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000703#ifdef macintosh
Jack Jansencbf630f2000-07-11 21:59:16 +0000704 PyMac_setfiletype(cpathname, 'Pyth', 'PYC ');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000705#endif
706}
707
708
709/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000710 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
711 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000712
Guido van Rossum79f25d91997-04-29 20:08:16 +0000713static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000714load_source_module(char *name, char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000715{
Fred Drake4c82b232000-06-30 16:18:57 +0000716 time_t mtime;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000717 FILE *fpc;
718 char buf[MAXPATHLEN+1];
719 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000720 PyCodeObject *co;
721 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000722
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000723 mtime = PyOS_GetLastModificationTime(pathname, fp);
Fred Drakec63d3e92001-03-01 06:33:32 +0000724 if (mtime == (time_t)(-1))
Fred Drake4c82b232000-06-30 16:18:57 +0000725 return NULL;
726#if SIZEOF_TIME_T > 4
727 /* Python's .pyc timestamp handling presumes that the timestamp fits
728 in 4 bytes. This will be fine until sometime in the year 2038,
729 when a 4-byte signed time_t will overflow.
730 */
731 if (mtime >> 32) {
732 PyErr_SetString(PyExc_OverflowError,
Fred Drakec63d3e92001-03-01 06:33:32 +0000733 "modification time overflows a 4 byte field");
Fred Drake4c82b232000-06-30 16:18:57 +0000734 return NULL;
735 }
736#endif
Jeremy Hylton37832f02001-04-13 17:50:20 +0000737 cpathname = make_compiled_pathname(pathname, buf,
738 (size_t)MAXPATHLEN + 1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000739 if (cpathname != NULL &&
740 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000741 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000742 fclose(fpc);
743 if (co == NULL)
744 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000745 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000746 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000747 name, cpathname);
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000748 pathname = cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000749 }
750 else {
751 co = parse_source_module(pathname, fp);
752 if (co == NULL)
753 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000754 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000755 PySys_WriteStderr("import %s # from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000756 name, pathname);
757 write_compiled_module(co, cpathname, mtime);
758 }
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000759 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000760 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000761
762 return m;
763}
764
765
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000766/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +0000767static PyObject *load_module(char *, FILE *, char *, int);
768static struct filedescr *find_module(char *, PyObject *,
769 char *, size_t, FILE **);
770static struct _frozen *find_frozen(char *name);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000771
772/* Load a package and return its module object WITH INCREMENTED
773 REFERENCE COUNT */
774
775static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000776load_package(char *name, char *pathname)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000777{
778 PyObject *m, *d, *file, *path;
779 int err;
780 char buf[MAXPATHLEN+1];
781 FILE *fp = NULL;
782 struct filedescr *fdp;
783
784 m = PyImport_AddModule(name);
785 if (m == NULL)
786 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000787 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000788 PySys_WriteStderr("import %s # directory %s\n",
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000789 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000790 d = PyModule_GetDict(m);
791 file = PyString_FromString(pathname);
792 if (file == NULL)
793 return NULL;
794 path = Py_BuildValue("[O]", file);
795 if (path == NULL) {
796 Py_DECREF(file);
797 return NULL;
798 }
799 err = PyDict_SetItemString(d, "__file__", file);
800 if (err == 0)
801 err = PyDict_SetItemString(d, "__path__", path);
802 if (err != 0) {
803 m = NULL;
804 goto cleanup;
805 }
806 buf[0] = '\0';
807 fdp = find_module("__init__", path, buf, sizeof(buf), &fp);
808 if (fdp == NULL) {
809 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
810 PyErr_Clear();
811 }
812 else
813 m = NULL;
814 goto cleanup;
815 }
816 m = load_module(name, fp, buf, fdp->type);
817 if (fp != NULL)
818 fclose(fp);
819 cleanup:
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000820 Py_XDECREF(path);
821 Py_XDECREF(file);
822 return m;
823}
824
825
826/* Helper to test for built-in module */
827
828static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000829is_builtin(char *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000830{
831 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +0000832 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
833 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
834 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000835 return -1;
836 else
837 return 1;
838 }
839 }
840 return 0;
841}
842
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000843
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000844/* Search the path (default sys.path) for a module. Return the
845 corresponding filedescr struct, and (via return arguments) the
846 pathname and an open file. Return NULL if the module is not found. */
847
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000848#ifdef MS_COREDLL
Thomas Woutersb4bd21c2000-07-22 23:38:01 +0000849extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **,
850 char *, int);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000851#endif
852
Tim Peters50d8d372001-02-28 05:34:27 +0000853static int case_ok(char *, int, int, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000854static int find_init_module(char *); /* Forward */
Guido van Rossum197346f1997-10-31 18:38:52 +0000855
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000856static struct filedescr *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000857find_module(char *realname, PyObject *path, char *buf, size_t buflen,
858 FILE **p_fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000859{
Fred Drake4c82b232000-06-30 16:18:57 +0000860 int i, npath;
861 size_t len, namelen;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000862 struct _frozen *f;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000863 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000864 FILE *fp = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000865#ifndef RISCOS
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000866 struct stat statbuf;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000867#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000868 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
869 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
870 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossum0506a431998-08-11 15:07:39 +0000871 char name[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000872
Fred Drake4c82b232000-06-30 16:18:57 +0000873 if (strlen(realname) > MAXPATHLEN) {
874 PyErr_SetString(PyExc_OverflowError, "module name is too long");
875 return NULL;
876 }
Guido van Rossum0506a431998-08-11 15:07:39 +0000877 strcpy(name, realname);
878
879 if (path != NULL && PyString_Check(path)) {
880 /* Submodule of "frozen" package:
881 Set name to the fullname, path to NULL
882 and continue as "usual" */
883 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
884 PyErr_SetString(PyExc_ImportError,
885 "full frozen module name too long");
886 return NULL;
887 }
888 strcpy(buf, PyString_AsString(path));
889 strcat(buf, ".");
890 strcat(buf, name);
891 strcpy(name, buf);
892 path = NULL;
893 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000894 if (path == NULL) {
895 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000896 strcpy(buf, name);
897 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000898 }
Guido van Rossuma5568d31998-03-05 03:45:08 +0000899 if ((f = find_frozen(name)) != NULL) {
900 strcpy(buf, name);
901 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000902 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000903
Guido van Rossumac279101996-08-22 23:10:58 +0000904#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000905 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
906 if (fp != NULL) {
907 *p_fp = fp;
908 return fdp;
909 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000910#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000911 path = PySys_GetObject("path");
912 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000913 if (path == NULL || !PyList_Check(path)) {
914 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +0000915 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000916 return NULL;
917 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000918 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000919 namelen = strlen(name);
920 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000921 PyObject *v = PyList_GetItem(path, i);
922 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000923 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000924 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000925 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000926 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000927 strcpy(buf, PyString_AsString(v));
Fred Drake4c82b232000-06-30 16:18:57 +0000928 if (strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000929 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000930#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000931#ifdef INTERN_STRINGS
Tim Peters50d8d372001-02-28 05:34:27 +0000932 /*
Guido van Rossum741689d1997-08-12 14:53:39 +0000933 ** Speedup: each sys.path item is interned, and
934 ** FindResourceModule remembers which items refer to
935 ** folders (so we don't have to bother trying to look
Tim Peters50d8d372001-02-28 05:34:27 +0000936 ** into them for resources).
Guido van Rossum741689d1997-08-12 14:53:39 +0000937 */
938 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
939 v = PyList_GET_ITEM(path, i);
940#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000941 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000942 static struct filedescr resfiledescr =
943 {"", "", PY_RESOURCE};
Tim Peters50d8d372001-02-28 05:34:27 +0000944
Jack Jansen9c96a921995-02-15 22:57:06 +0000945 return &resfiledescr;
946 }
Guido van Rossum0f84a341998-08-06 13:36:01 +0000947 if (PyMac_FindCodeResourceModule((PyStringObject *)v, name, buf)) {
948 static struct filedescr resfiledescr =
949 {"", "", PY_CODERESOURCE};
Tim Peters50d8d372001-02-28 05:34:27 +0000950
Guido van Rossum0f84a341998-08-06 13:36:01 +0000951 return &resfiledescr;
952 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000953#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000954 if (len > 0 && buf[len-1] != SEP
955#ifdef ALTSEP
956 && buf[len-1] != ALTSEP
957#endif
958 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000959 buf[len++] = SEP;
Guido van Rossum215c3402000-11-13 17:26:32 +0000960 strcpy(buf+len, name);
961 len += namelen;
Tim Peters50d8d372001-02-28 05:34:27 +0000962
963 /* Check for package import (buf holds a directory name,
964 and there's an __init__ module in that directory */
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000965#ifdef HAVE_STAT
Tim Peterscab3f682001-04-29 22:21:25 +0000966 if (stat(buf, &statbuf) == 0 && /* it exists */
967 S_ISDIR(statbuf.st_mode) && /* it's a directory */
968 find_init_module(buf) && /* it has __init__.py */
969 case_ok(buf, len, namelen, name)) /* and case matches */
970 return &fd_package;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000971#else
972 /* XXX How are you going to test for directories? */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000973#ifdef RISCOS
974 {
975 static struct filedescr fd = {"", "", PKG_DIRECTORY};
976 if (isdir(buf)) {
977 if (find_init_module(buf))
978 return &fd;
979 }
980 }
981#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000982#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000983#ifdef macintosh
984 fdp = PyMac_FindModuleExtension(buf, &len, name);
Jack Jansen4df3c522001-03-20 23:09:54 +0000985 if (fdp) {
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000986#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000987 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000988 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000989 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000990 PySys_WriteStderr("# trying %s\n", buf);
Jack Jansen4df3c522001-03-20 23:09:54 +0000991#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000992 fp = fopen(buf, fdp->mode);
Tim Peters50d8d372001-02-28 05:34:27 +0000993 if (fp != NULL) {
994 if (case_ok(buf, len, namelen, name))
995 break;
996 else { /* continue search */
997 fclose(fp);
998 fp = NULL;
Barry Warsaw914a0b12001-02-02 19:12:16 +0000999 }
Barry Warsaw914a0b12001-02-02 19:12:16 +00001000 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001001 }
1002 if (fp != NULL)
1003 break;
1004 }
1005 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001006 PyErr_Format(PyExc_ImportError,
1007 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001008 return NULL;
1009 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001010 *p_fp = fp;
1011 return fdp;
1012}
1013
Tim Petersd1e87a82001-03-01 18:12:00 +00001014/* case_ok(char* buf, int len, int namelen, char* name)
1015 * The arguments here are tricky, best shown by example:
1016 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1017 * ^ ^ ^ ^
1018 * |--------------------- buf ---------------------|
1019 * |------------------- len ------------------|
1020 * |------ name -------|
1021 * |----- namelen -----|
1022 * buf is the full path, but len only counts up to (& exclusive of) the
1023 * extension. name is the module name, also exclusive of extension.
1024 *
1025 * We've already done a successful stat() or fopen() on buf, so know that
1026 * there's some match, possibly case-insensitive.
1027 *
Tim Peters50d8d372001-02-28 05:34:27 +00001028 * case_ok() is to return 1 if there's a case-sensitive match for
1029 * name, else 0. case_ok() is also to return 1 if envar PYTHONCASEOK
1030 * exists.
Tim Petersd1e87a82001-03-01 18:12:00 +00001031 *
Tim Peters50d8d372001-02-28 05:34:27 +00001032 * case_ok() is used to implement case-sensitive import semantics even
1033 * on platforms with case-insensitive filesystems. It's trivial to implement
1034 * for case-sensitive filesystems. It's pretty much a cross-platform
1035 * nightmare for systems with case-insensitive filesystems.
1036 */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001037
Tim Peters50d8d372001-02-28 05:34:27 +00001038/* First we may need a pile of platform-specific header files; the sequence
1039 * of #if's here should match the sequence in the body of case_ok().
1040 */
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001041#if defined(MS_WIN32) || defined(__CYGWIN__)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001042#include <windows.h>
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001043#ifdef __CYGWIN__
1044#include <sys/cygwin.h>
1045#endif
1046
Tim Peters50d8d372001-02-28 05:34:27 +00001047#elif defined(DJGPP)
1048#include <dir.h>
1049
1050#elif defined(macintosh)
1051#include <TextUtils.h>
1052#ifdef USE_GUSI1
1053#include "TFileSpec.h" /* for Path2FSSpec() */
1054#endif
1055
Tim Petersd1e87a82001-03-01 18:12:00 +00001056#elif defined(__MACH__) && defined(__APPLE__) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001057#include <sys/types.h>
1058#include <dirent.h>
1059
Tim Peters50d8d372001-02-28 05:34:27 +00001060#endif
1061
Guido van Rossum0980bd91998-02-13 17:18:36 +00001062static int
Tim Peters50d8d372001-02-28 05:34:27 +00001063case_ok(char *buf, int len, int namelen, char *name)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001064{
Tim Peters50d8d372001-02-28 05:34:27 +00001065/* Pick a platform-specific implementation; the sequence of #if's here should
1066 * match the sequence just above.
1067 */
1068
1069/* MS_WIN32 || __CYGWIN__ */
1070#if defined(MS_WIN32) || defined(__CYGWIN__)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001071 WIN32_FIND_DATA data;
1072 HANDLE h;
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001073#ifdef __CYGWIN__
1074 char tempbuf[MAX_PATH];
1075#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001076
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001077 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001078 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001079
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001080#ifdef __CYGWIN__
1081 cygwin32_conv_to_win32_path(buf, tempbuf);
1082 h = FindFirstFile(tempbuf, &data);
1083#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001084 h = FindFirstFile(buf, &data);
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001085#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001086 if (h == INVALID_HANDLE_VALUE) {
1087 PyErr_Format(PyExc_NameError,
1088 "Can't find file for module %.100s\n(filename %.300s)",
1089 name, buf);
1090 return 0;
1091 }
1092 FindClose(h);
Tim Peters50d8d372001-02-28 05:34:27 +00001093 return strncmp(data.cFileName, name, namelen) == 0;
1094
1095/* DJGPP */
1096#elif defined(DJGPP)
1097 struct ffblk ffblk;
1098 int done;
1099
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001100 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001101 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001102
1103 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
1104 if (done) {
Guido van Rossum0980bd91998-02-13 17:18:36 +00001105 PyErr_Format(PyExc_NameError,
Tim Peters50d8d372001-02-28 05:34:27 +00001106 "Can't find file for module %.100s\n(filename %.300s)",
Guido van Rossum0980bd91998-02-13 17:18:36 +00001107 name, buf);
1108 return 0;
1109 }
Tim Peters50d8d372001-02-28 05:34:27 +00001110 return strncmp(ffblk.ff_name, name, namelen) == 0;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001111
Tim Peters50d8d372001-02-28 05:34:27 +00001112/* macintosh */
1113#elif defined(macintosh)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001114 FSSpec fss;
1115 OSErr err;
Tim Peters50d8d372001-02-28 05:34:27 +00001116
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001117 if (Py_GETENV("PYTHONCASEOK") != NULL)
Tim Peters50d8d372001-02-28 05:34:27 +00001118 return 1;
1119
Guido van Rossumb33aa1a2000-04-24 15:08:18 +00001120#ifndef USE_GUSI1
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001121 err = FSMakeFSSpec(0, 0, Pstring(buf), &fss);
1122#else
1123 /* GUSI's Path2FSSpec() resolves all possible aliases nicely on
1124 the way, which is fine for all directories, but here we need
1125 the original name of the alias file (say, Dlg.ppc.slb, not
1126 toolboxmodules.ppc.slb). */
1127 char *colon;
1128 err = Path2FSSpec(buf, &fss);
1129 if (err == noErr) {
1130 colon = strrchr(buf, ':'); /* find filename */
1131 if (colon != NULL)
1132 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1133 Pstring(colon+1), &fss);
1134 else
1135 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1136 fss.name, &fss);
1137 }
1138#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001139 if (err) {
1140 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001141 "Can't find file for module %.100s\n(filename %.300s)",
1142 name, buf);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001143 return 0;
1144 }
Tim Peters50d8d372001-02-28 05:34:27 +00001145 return fss.name[0] >= namelen &&
1146 strncmp(name, (char *)fss.name+1, namelen) == 0;
1147
Tim Peters677898a2001-03-02 03:28:03 +00001148/* new-fangled macintosh (macosx) */
Tim Petersd1e87a82001-03-01 18:12:00 +00001149#elif defined(__MACH__) && defined(__APPLE__) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001150 DIR *dirp;
1151 struct dirent *dp;
Tim Petersd1e87a82001-03-01 18:12:00 +00001152 char dirname[MAXPATHLEN + 1];
1153 const int dirlen = len - namelen - 1; /* don't want trailing SEP */
Tim Peters430f5d42001-03-01 01:30:56 +00001154
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001155 if (Py_GETENV("PYTHONCASEOK") != NULL)
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001156 return 1;
1157
Tim Petersd1e87a82001-03-01 18:12:00 +00001158 /* Copy the dir component into dirname; substitute "." if empty */
1159 if (dirlen <= 0) {
1160 dirname[0] = '.';
1161 dirname[1] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001162 }
1163 else {
Tim Petersd1e87a82001-03-01 18:12:00 +00001164 assert(dirlen <= MAXPATHLEN);
1165 memcpy(dirname, buf, dirlen);
1166 dirname[dirlen] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001167 }
1168 /* Open the directory and search the entries for an exact match. */
Tim Petersd1e87a82001-03-01 18:12:00 +00001169 dirp = opendir(dirname);
Tim Peters430f5d42001-03-01 01:30:56 +00001170 if (dirp) {
Tim Peters677898a2001-03-02 03:28:03 +00001171 char *nameWithExt = buf + len - namelen;
Tim Peters430f5d42001-03-01 01:30:56 +00001172 while ((dp = readdir(dirp)) != NULL) {
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001173 const int thislen =
Tim Peters430f5d42001-03-01 01:30:56 +00001174#ifdef _DIRENT_HAVE_D_NAMELEN
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001175 dp->d_namlen;
Tim Peters430f5d42001-03-01 01:30:56 +00001176#else
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001177 strlen(dp->d_name);
Tim Peters430f5d42001-03-01 01:30:56 +00001178#endif
Tim Petersd1e87a82001-03-01 18:12:00 +00001179 if (thislen >= namelen &&
Tim Peters677898a2001-03-02 03:28:03 +00001180 strcmp(dp->d_name, nameWithExt) == 0) {
Tim Peters430f5d42001-03-01 01:30:56 +00001181 (void)closedir(dirp);
1182 return 1; /* Found */
1183 }
1184 }
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001185 (void)closedir(dirp);
Tim Peters430f5d42001-03-01 01:30:56 +00001186 }
Tim Peters430f5d42001-03-01 01:30:56 +00001187 return 0 ; /* Not found */
Tim Peters430f5d42001-03-01 01:30:56 +00001188
Tim Peters50d8d372001-02-28 05:34:27 +00001189/* assuming it's a case-sensitive filesystem, so there's nothing to do! */
1190#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001191 return 1;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001192
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001193#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001194}
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001195
Guido van Rossum0980bd91998-02-13 17:18:36 +00001196
Guido van Rossum197346f1997-10-31 18:38:52 +00001197#ifdef HAVE_STAT
1198/* Helper to look for __init__.py or __init__.py[co] in potential package */
1199static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001200find_init_module(char *buf)
Guido van Rossum197346f1997-10-31 18:38:52 +00001201{
Tim Peters0f9431f2001-07-05 03:47:53 +00001202 const size_t save_len = strlen(buf);
Fred Drake4c82b232000-06-30 16:18:57 +00001203 size_t i = save_len;
Tim Peters0f9431f2001-07-05 03:47:53 +00001204 char *pname; /* pointer to start of __init__ */
Guido van Rossum197346f1997-10-31 18:38:52 +00001205 struct stat statbuf;
1206
Tim Peters0f9431f2001-07-05 03:47:53 +00001207/* For calling case_ok(buf, len, namelen, name):
1208 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1209 * ^ ^ ^ ^
1210 * |--------------------- buf ---------------------|
1211 * |------------------- len ------------------|
1212 * |------ name -------|
1213 * |----- namelen -----|
1214 */
Guido van Rossum197346f1997-10-31 18:38:52 +00001215 if (save_len + 13 >= MAXPATHLEN)
1216 return 0;
1217 buf[i++] = SEP;
Tim Peters0f9431f2001-07-05 03:47:53 +00001218 pname = buf + i;
1219 strcpy(pname, "__init__.py");
Guido van Rossum197346f1997-10-31 18:38:52 +00001220 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001221 if (case_ok(buf,
1222 save_len + 9, /* len("/__init__") */
1223 8, /* len("__init__") */
1224 pname)) {
1225 buf[save_len] = '\0';
1226 return 1;
1227 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001228 }
Tim Peters0f9431f2001-07-05 03:47:53 +00001229 i += strlen(pname);
1230 strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum197346f1997-10-31 18:38:52 +00001231 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001232 if (case_ok(buf,
1233 save_len + 9, /* len("/__init__") */
1234 8, /* len("__init__") */
1235 pname)) {
1236 buf[save_len] = '\0';
1237 return 1;
1238 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001239 }
1240 buf[save_len] = '\0';
1241 return 0;
1242}
Guido van Rossum48a680c2001-03-02 06:34:14 +00001243
1244#else
1245
1246#ifdef RISCOS
1247static int
1248find_init_module(buf)
1249 char *buf;
1250{
1251 int save_len = strlen(buf);
1252 int i = save_len;
1253
1254 if (save_len + 13 >= MAXPATHLEN)
1255 return 0;
1256 buf[i++] = SEP;
1257 strcpy(buf+i, "__init__/py");
1258 if (isfile(buf)) {
1259 buf[save_len] = '\0';
1260 return 1;
1261 }
1262
1263 if (Py_OptimizeFlag)
1264 strcpy(buf+i, "o");
1265 else
1266 strcpy(buf+i, "c");
1267 if (isfile(buf)) {
1268 buf[save_len] = '\0';
1269 return 1;
1270 }
1271 buf[save_len] = '\0';
1272 return 0;
1273}
1274#endif /*RISCOS*/
1275
Guido van Rossum197346f1997-10-31 18:38:52 +00001276#endif /* HAVE_STAT */
1277
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001278
Tim Petersdbd9ba62000-07-09 03:09:57 +00001279static int init_builtin(char *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001280
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001281/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001282 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001283
Guido van Rossum79f25d91997-04-29 20:08:16 +00001284static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001285load_module(char *name, FILE *fp, char *buf, int type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001286{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001287 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001288 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001289 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001290
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001291 /* First check that there's an open file (if we need one) */
1292 switch (type) {
1293 case PY_SOURCE:
1294 case PY_COMPILED:
1295 if (fp == NULL) {
1296 PyErr_Format(PyExc_ValueError,
1297 "file object required for import (type code %d)",
1298 type);
1299 return NULL;
1300 }
1301 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001302
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001303 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001304
1305 case PY_SOURCE:
1306 m = load_source_module(name, buf, fp);
1307 break;
1308
1309 case PY_COMPILED:
1310 m = load_compiled_module(name, buf, fp);
1311 break;
1312
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001313#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001314 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001315 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001316 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001317#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001318
Jack Jansen9c96a921995-02-15 22:57:06 +00001319#ifdef macintosh
1320 case PY_RESOURCE:
1321 m = PyMac_LoadResourceModule(name, buf);
1322 break;
Guido van Rossum0f84a341998-08-06 13:36:01 +00001323 case PY_CODERESOURCE:
1324 m = PyMac_LoadCodeResourceModule(name, buf);
1325 break;
Jack Jansen9c96a921995-02-15 22:57:06 +00001326#endif
1327
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001328 case PKG_DIRECTORY:
1329 m = load_package(name, buf);
1330 break;
1331
1332 case C_BUILTIN:
1333 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001334 if (buf != NULL && buf[0] != '\0')
1335 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001336 if (type == C_BUILTIN)
1337 err = init_builtin(name);
1338 else
1339 err = PyImport_ImportFrozenModule(name);
1340 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001341 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001342 if (err == 0) {
1343 PyErr_Format(PyExc_ImportError,
1344 "Purported %s module %.200s not found",
1345 type == C_BUILTIN ?
1346 "builtin" : "frozen",
1347 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001348 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001349 }
1350 modules = PyImport_GetModuleDict();
1351 m = PyDict_GetItemString(modules, name);
1352 if (m == NULL) {
1353 PyErr_Format(
1354 PyExc_ImportError,
1355 "%s module %.200s not properly initialized",
1356 type == C_BUILTIN ?
1357 "builtin" : "frozen",
1358 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001359 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001360 }
1361 Py_INCREF(m);
1362 break;
1363
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001364 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001365 PyErr_Format(PyExc_ImportError,
1366 "Don't know how to import %.200s (type code %d)",
1367 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001368 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001369
1370 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001371
1372 return m;
1373}
1374
1375
1376/* Initialize a built-in module.
1377 Return 1 for succes, 0 if the module is not found, and -1 with
1378 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001379
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001380static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001381init_builtin(char *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001382{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001383 struct _inittab *p;
1384 PyObject *mod;
1385
1386 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
1387 return 1;
1388
Guido van Rossum771c6c81997-10-31 18:37:24 +00001389 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001390 if (strcmp(name, p->name) == 0) {
1391 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001392 PyErr_Format(PyExc_ImportError,
1393 "Cannot re-init internal module %.200s",
1394 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001395 return -1;
1396 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001397 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001398 PySys_WriteStderr("import %s # builtin\n", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001399 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001400 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001401 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001402 if (_PyImport_FixupExtension(name, name) == NULL)
1403 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001404 return 1;
1405 }
1406 }
1407 return 0;
1408}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001409
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001410
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001411/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001412
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001413static struct _frozen *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001414find_frozen(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001415{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001416 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001417
Guido van Rossum79f25d91997-04-29 20:08:16 +00001418 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001419 if (p->name == NULL)
1420 return NULL;
1421 if (strcmp(p->name, name) == 0)
1422 break;
1423 }
1424 return p;
1425}
1426
Guido van Rossum79f25d91997-04-29 20:08:16 +00001427static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001428get_frozen_object(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001429{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001430 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001431 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001432
1433 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001434 PyErr_Format(PyExc_ImportError,
1435 "No such frozen object named %.200s",
1436 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001437 return NULL;
1438 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001439 size = p->size;
1440 if (size < 0)
1441 size = -size;
1442 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001443}
1444
1445/* Initialize a frozen module.
1446 Return 1 for succes, 0 if the module is not found, and -1 with
1447 an exception set if the initialization failed.
1448 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001449
1450int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001451PyImport_ImportFrozenModule(char *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001452{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001453 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001454 PyObject *co;
1455 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001456 int ispackage;
1457 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001458
1459 if (p == NULL)
1460 return 0;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001461 size = p->size;
1462 ispackage = (size < 0);
1463 if (ispackage)
1464 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001465 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001466 PySys_WriteStderr("import %s # frozen%s\n",
Guido van Rossuma5568d31998-03-05 03:45:08 +00001467 name, ispackage ? " package" : "");
1468 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001469 if (co == NULL)
1470 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001471 if (!PyCode_Check(co)) {
1472 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001473 PyErr_Format(PyExc_TypeError,
1474 "frozen object %.200s is not a code object",
1475 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001476 return -1;
1477 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001478 if (ispackage) {
1479 /* Set __path__ to the package name */
1480 PyObject *d, *s;
1481 int err;
1482 m = PyImport_AddModule(name);
1483 if (m == NULL)
1484 return -1;
1485 d = PyModule_GetDict(m);
1486 s = PyString_InternFromString(name);
1487 if (s == NULL)
1488 return -1;
1489 err = PyDict_SetItemString(d, "__path__", s);
1490 Py_DECREF(s);
1491 if (err != 0)
1492 return err;
1493 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001494 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001495 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001496 if (m == NULL)
1497 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001498 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001499 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001500}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001501
1502
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001503/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001504 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001505
Guido van Rossum79f25d91997-04-29 20:08:16 +00001506PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001507PyImport_ImportModule(char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00001508{
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00001509 PyObject *pname;
1510 PyObject *result;
1511
1512 pname = PyString_FromString(name);
1513 result = PyImport_Import(pname);
1514 Py_DECREF(pname);
1515 return result;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001516}
1517
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001518/* Forward declarations for helper routines */
Tim Petersdbd9ba62000-07-09 03:09:57 +00001519static PyObject *get_parent(PyObject *globals, char *buf, int *p_buflen);
1520static PyObject *load_next(PyObject *mod, PyObject *altmod,
1521 char **p_name, char *buf, int *p_buflen);
1522static int mark_miss(char *name);
1523static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
1524 char *buf, int buflen, int recursive);
1525static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001526
1527/* The Magnum Opus of dotted-name import :-) */
1528
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001529static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001530import_module_ex(char *name, PyObject *globals, PyObject *locals,
1531 PyObject *fromlist)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001532{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001533 char buf[MAXPATHLEN+1];
1534 int buflen = 0;
1535 PyObject *parent, *head, *next, *tail;
1536
1537 parent = get_parent(globals, buf, &buflen);
1538 if (parent == NULL)
1539 return NULL;
1540
1541 head = load_next(parent, Py_None, &name, buf, &buflen);
1542 if (head == NULL)
1543 return NULL;
1544
1545 tail = head;
1546 Py_INCREF(tail);
1547 while (name) {
1548 next = load_next(tail, tail, &name, buf, &buflen);
1549 Py_DECREF(tail);
1550 if (next == NULL) {
1551 Py_DECREF(head);
1552 return NULL;
1553 }
1554 tail = next;
1555 }
1556
1557 if (fromlist != NULL) {
1558 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1559 fromlist = NULL;
1560 }
1561
1562 if (fromlist == NULL) {
1563 Py_DECREF(tail);
1564 return head;
1565 }
1566
1567 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001568 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001569 Py_DECREF(tail);
1570 return NULL;
1571 }
1572
1573 return tail;
1574}
1575
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001576PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001577PyImport_ImportModuleEx(char *name, PyObject *globals, PyObject *locals,
1578 PyObject *fromlist)
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001579{
1580 PyObject *result;
1581 lock_import();
Guido van Rossumd65911b1998-03-03 22:33:27 +00001582 result = import_module_ex(name, globals, locals, fromlist);
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001583 unlock_import();
1584 return result;
1585}
1586
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001587static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001588get_parent(PyObject *globals, char *buf, int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001589{
1590 static PyObject *namestr = NULL;
1591 static PyObject *pathstr = NULL;
1592 PyObject *modname, *modpath, *modules, *parent;
1593
1594 if (globals == NULL || !PyDict_Check(globals))
1595 return Py_None;
1596
1597 if (namestr == NULL) {
1598 namestr = PyString_InternFromString("__name__");
1599 if (namestr == NULL)
1600 return NULL;
1601 }
1602 if (pathstr == NULL) {
1603 pathstr = PyString_InternFromString("__path__");
1604 if (pathstr == NULL)
1605 return NULL;
1606 }
1607
1608 *buf = '\0';
1609 *p_buflen = 0;
1610 modname = PyDict_GetItem(globals, namestr);
1611 if (modname == NULL || !PyString_Check(modname))
1612 return Py_None;
1613
1614 modpath = PyDict_GetItem(globals, pathstr);
1615 if (modpath != NULL) {
1616 int len = PyString_GET_SIZE(modname);
1617 if (len > MAXPATHLEN) {
1618 PyErr_SetString(PyExc_ValueError,
1619 "Module name too long");
1620 return NULL;
1621 }
1622 strcpy(buf, PyString_AS_STRING(modname));
1623 *p_buflen = len;
1624 }
1625 else {
1626 char *start = PyString_AS_STRING(modname);
1627 char *lastdot = strrchr(start, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001628 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001629 if (lastdot == NULL)
1630 return Py_None;
1631 len = lastdot - start;
1632 if (len >= MAXPATHLEN) {
1633 PyErr_SetString(PyExc_ValueError,
1634 "Module name too long");
1635 return NULL;
1636 }
1637 strncpy(buf, start, len);
1638 buf[len] = '\0';
1639 *p_buflen = len;
1640 }
1641
1642 modules = PyImport_GetModuleDict();
1643 parent = PyDict_GetItemString(modules, buf);
1644 if (parent == NULL)
1645 parent = Py_None;
1646 return parent;
1647 /* We expect, but can't guarantee, if parent != None, that:
1648 - parent.__name__ == buf
1649 - parent.__dict__ is globals
1650 If this is violated... Who cares? */
1651}
1652
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001653/* altmod is either None or same as mod */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001654static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001655load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
1656 int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001657{
1658 char *name = *p_name;
1659 char *dot = strchr(name, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001660 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001661 char *p;
1662 PyObject *result;
1663
1664 if (dot == NULL) {
1665 *p_name = NULL;
1666 len = strlen(name);
1667 }
1668 else {
1669 *p_name = dot+1;
1670 len = dot-name;
1671 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00001672 if (len == 0) {
1673 PyErr_SetString(PyExc_ValueError,
1674 "Empty module name");
1675 return NULL;
1676 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001677
1678 p = buf + *p_buflen;
1679 if (p != buf)
1680 *p++ = '.';
1681 if (p+len-buf >= MAXPATHLEN) {
1682 PyErr_SetString(PyExc_ValueError,
1683 "Module name too long");
1684 return NULL;
1685 }
1686 strncpy(p, name, len);
1687 p[len] = '\0';
1688 *p_buflen = p+len-buf;
1689
1690 result = import_submodule(mod, p, buf);
1691 if (result == Py_None && altmod != mod) {
1692 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001693 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001694 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001695 if (result != NULL && result != Py_None) {
1696 if (mark_miss(buf) != 0) {
1697 Py_DECREF(result);
1698 return NULL;
1699 }
1700 strncpy(buf, name, len);
1701 buf[len] = '\0';
1702 *p_buflen = len;
1703 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001704 }
1705 if (result == NULL)
1706 return NULL;
1707
1708 if (result == Py_None) {
1709 Py_DECREF(result);
1710 PyErr_Format(PyExc_ImportError,
1711 "No module named %.200s", name);
1712 return NULL;
1713 }
1714
1715 return result;
1716}
1717
1718static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001719mark_miss(char *name)
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001720{
1721 PyObject *modules = PyImport_GetModuleDict();
1722 return PyDict_SetItemString(modules, name, Py_None);
1723}
1724
1725static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001726ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, int buflen,
1727 int recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001728{
1729 int i;
1730
1731 if (!PyObject_HasAttrString(mod, "__path__"))
1732 return 1;
1733
1734 for (i = 0; ; i++) {
1735 PyObject *item = PySequence_GetItem(fromlist, i);
1736 int hasit;
1737 if (item == NULL) {
1738 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1739 PyErr_Clear();
1740 return 1;
1741 }
1742 return 0;
1743 }
1744 if (!PyString_Check(item)) {
1745 PyErr_SetString(PyExc_TypeError,
1746 "Item in ``from list'' not a string");
1747 Py_DECREF(item);
1748 return 0;
1749 }
1750 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001751 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001752 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001753 /* See if the package defines __all__ */
1754 if (recursive)
1755 continue; /* Avoid endless recursion */
1756 all = PyObject_GetAttrString(mod, "__all__");
1757 if (all == NULL)
1758 PyErr_Clear();
1759 else {
1760 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1761 return 0;
1762 Py_DECREF(all);
1763 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001764 continue;
1765 }
1766 hasit = PyObject_HasAttr(mod, item);
1767 if (!hasit) {
1768 char *subname = PyString_AS_STRING(item);
1769 PyObject *submod;
1770 char *p;
1771 if (buflen + strlen(subname) >= MAXPATHLEN) {
1772 PyErr_SetString(PyExc_ValueError,
1773 "Module name too long");
1774 Py_DECREF(item);
1775 return 0;
1776 }
1777 p = buf + buflen;
1778 *p++ = '.';
1779 strcpy(p, subname);
1780 submod = import_submodule(mod, subname, buf);
1781 Py_XDECREF(submod);
1782 if (submod == NULL) {
1783 Py_DECREF(item);
1784 return 0;
1785 }
1786 }
1787 Py_DECREF(item);
1788 }
1789
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001790 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001791}
1792
1793static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001794import_submodule(PyObject *mod, char *subname, char *fullname)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001795{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001796 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossumf48f11c2001-07-23 13:27:49 +00001797 PyObject *m, *res = NULL;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001798
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001799 /* Require:
1800 if mod == None: subname == fullname
1801 else: mod.__name__ + "." + subname == fullname
1802 */
1803
Tim Peters50d8d372001-02-28 05:34:27 +00001804 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001805 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001806 }
1807 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001808 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001809 char buf[MAXPATHLEN+1];
1810 struct filedescr *fdp;
1811 FILE *fp = NULL;
1812
Guido van Rossum9c0afe51998-05-19 15:09:05 +00001813 if (mod == Py_None)
1814 path = NULL;
1815 else {
1816 path = PyObject_GetAttrString(mod, "__path__");
1817 if (path == NULL) {
1818 PyErr_Clear();
1819 Py_INCREF(Py_None);
1820 return Py_None;
1821 }
1822 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001823
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001824 buf[0] = '\0';
Guido van Rossumb68cd421998-07-01 17:36:26 +00001825 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1826 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001827 if (fdp == NULL) {
1828 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1829 return NULL;
1830 PyErr_Clear();
1831 Py_INCREF(Py_None);
1832 return Py_None;
1833 }
1834 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001835 if (fp)
1836 fclose(fp);
Guido van Rossumf48f11c2001-07-23 13:27:49 +00001837 if (mod != Py_None) {
1838 /* Irrespective of the success of this load, make a
1839 reference to it in the parent package module.
1840 A copy gets saved in the modules dictionary
1841 under the full name, so get a reference from
1842 there, if need be. (The exception is when
1843 the load failed with a SyntaxError -- then
1844 there's no trace in sys.modules. In that case,
1845 of course, do nothing extra.) */
1846 res = m;
1847 if (res == NULL)
1848 res = PyDict_GetItemString(modules, fullname);
1849 if (res != NULL &&
1850 PyObject_SetAttrString(mod, subname, res) < 0) {
1851 Py_XDECREF(m);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001852 m = NULL;
1853 }
1854 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001855 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001856
1857 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001858}
1859
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001860
1861/* Re-import a module of any kind and return its module object, WITH
1862 INCREMENTED REFERENCE COUNT */
1863
Guido van Rossum79f25d91997-04-29 20:08:16 +00001864PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001865PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001866{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001867 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001868 PyObject *path = NULL;
1869 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001870 char buf[MAXPATHLEN+1];
1871 struct filedescr *fdp;
1872 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001873
Guido van Rossum79f25d91997-04-29 20:08:16 +00001874 if (m == NULL || !PyModule_Check(m)) {
1875 PyErr_SetString(PyExc_TypeError,
1876 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001877 return NULL;
1878 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001879 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001880 if (name == NULL)
1881 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001882 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001883 PyErr_Format(PyExc_ImportError,
1884 "reload(): module %.200s not in sys.modules",
1885 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001886 return NULL;
1887 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001888 subname = strrchr(name, '.');
1889 if (subname == NULL)
1890 subname = name;
1891 else {
1892 PyObject *parentname, *parent;
1893 parentname = PyString_FromStringAndSize(name, (subname-name));
1894 if (parentname == NULL)
1895 return NULL;
1896 parent = PyDict_GetItem(modules, parentname);
Barry Warsaw38793331999-01-27 17:54:20 +00001897 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00001898 if (parent == NULL) {
1899 PyErr_Format(PyExc_ImportError,
1900 "reload(): parent %.200s not in sys.modules",
1901 name);
1902 return NULL;
1903 }
1904 subname++;
1905 path = PyObject_GetAttrString(parent, "__path__");
1906 if (path == NULL)
1907 PyErr_Clear();
1908 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001909 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001910 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1911 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001912 if (fdp == NULL)
1913 return NULL;
1914 m = load_module(name, fp, buf, fdp->type);
1915 if (fp)
1916 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001917 return m;
1918}
1919
1920
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001921/* Higher-level import emulator which emulates the "import" statement
1922 more accurately -- it invokes the __import__() function from the
1923 builtins of the current globals. This means that the import is
1924 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00001925 environment, e.g. by "rexec".
1926 A dummy list ["__doc__"] is passed as the 4th argument so that
1927 e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
1928 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001929
1930PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001931PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001932{
1933 static PyObject *silly_list = NULL;
1934 static PyObject *builtins_str = NULL;
1935 static PyObject *import_str = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001936 PyObject *globals = NULL;
1937 PyObject *import = NULL;
1938 PyObject *builtins = NULL;
1939 PyObject *r = NULL;
1940
1941 /* Initialize constant string objects */
1942 if (silly_list == NULL) {
1943 import_str = PyString_InternFromString("__import__");
1944 if (import_str == NULL)
1945 return NULL;
1946 builtins_str = PyString_InternFromString("__builtins__");
1947 if (builtins_str == NULL)
1948 return NULL;
1949 silly_list = Py_BuildValue("[s]", "__doc__");
1950 if (silly_list == NULL)
1951 return NULL;
1952 }
1953
1954 /* Get the builtins from current globals */
1955 globals = PyEval_GetGlobals();
Guido van Rossum85cd1d62001-02-20 21:43:24 +00001956 if (globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00001957 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001958 builtins = PyObject_GetItem(globals, builtins_str);
1959 if (builtins == NULL)
1960 goto err;
1961 }
1962 else {
1963 /* No globals -- use standard builtins, and fake globals */
1964 PyErr_Clear();
1965
Guido van Rossum85cd1d62001-02-20 21:43:24 +00001966 builtins = PyImport_ImportModuleEx("__builtin__",
1967 NULL, NULL, NULL);
1968 if (builtins == NULL)
1969 return NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001970 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1971 if (globals == NULL)
1972 goto err;
1973 }
1974
1975 /* Get the __import__ function from the builtins */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001976 if (PyDict_Check(builtins)) {
Fred Drakea76ba6e2001-03-06 06:31:15 +00001977 import = PyObject_GetItem(builtins, import_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001978 if (import == NULL)
1979 PyErr_SetObject(PyExc_KeyError, import_str);
1980 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001981 else
Fred Drakea76ba6e2001-03-06 06:31:15 +00001982 import = PyObject_GetAttr(builtins, import_str);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001983 if (import == NULL)
1984 goto err;
1985
1986 /* Call the _import__ function with the proper argument list */
1987 r = PyObject_CallFunction(import, "OOOO",
1988 module_name, globals, globals, silly_list);
1989
1990 err:
1991 Py_XDECREF(globals);
1992 Py_XDECREF(builtins);
1993 Py_XDECREF(import);
Tim Peters50d8d372001-02-28 05:34:27 +00001994
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001995 return r;
1996}
1997
1998
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001999/* Module 'imp' provides Python access to the primitives used for
2000 importing modules.
2001*/
2002
Guido van Rossum79f25d91997-04-29 20:08:16 +00002003static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002004imp_get_magic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002005{
2006 char buf[4];
2007
Guido van Rossum43713e52000-02-29 13:59:29 +00002008 if (!PyArg_ParseTuple(args, ":get_magic"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002009 return NULL;
Guido van Rossum96774c12000-05-01 20:19:08 +00002010 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
2011 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
2012 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
2013 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002014
Guido van Rossum79f25d91997-04-29 20:08:16 +00002015 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002016}
2017
Guido van Rossum79f25d91997-04-29 20:08:16 +00002018static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002019imp_get_suffixes(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002020{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002021 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002022 struct filedescr *fdp;
2023
Guido van Rossum43713e52000-02-29 13:59:29 +00002024 if (!PyArg_ParseTuple(args, ":get_suffixes"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002025 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002026 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002027 if (list == NULL)
2028 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002029 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
2030 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002031 fdp->suffix, fdp->mode, fdp->type);
2032 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002033 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002034 return NULL;
2035 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002036 if (PyList_Append(list, item) < 0) {
2037 Py_DECREF(list);
2038 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002039 return NULL;
2040 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002041 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002042 }
2043 return list;
2044}
2045
Guido van Rossum79f25d91997-04-29 20:08:16 +00002046static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002047call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002048{
Tim Petersdbd9ba62000-07-09 03:09:57 +00002049 extern int fclose(FILE *);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002050 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002051 struct filedescr *fdp;
2052 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002053 FILE *fp = NULL;
2054
2055 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002056 if (path == Py_None)
2057 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002058 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
2059 if (fdp == NULL)
2060 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002061 if (fp != NULL) {
2062 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
2063 if (fob == NULL) {
2064 fclose(fp);
2065 return NULL;
2066 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002067 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002068 else {
2069 fob = Py_None;
2070 Py_INCREF(fob);
Tim Peters50d8d372001-02-28 05:34:27 +00002071 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002072 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002073 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002074 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002075 return ret;
2076}
2077
Guido van Rossum79f25d91997-04-29 20:08:16 +00002078static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002079imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002080{
2081 char *name;
2082 PyObject *path = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002083 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002084 return NULL;
2085 return call_find_module(name, path);
2086}
2087
2088static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002089imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002090{
2091 char *name;
2092 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002093 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002094 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002095 return NULL;
2096 ret = init_builtin(name);
2097 if (ret < 0)
2098 return NULL;
2099 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002100 Py_INCREF(Py_None);
2101 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002102 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002103 m = PyImport_AddModule(name);
2104 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002105 return m;
2106}
2107
Guido van Rossum79f25d91997-04-29 20:08:16 +00002108static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002109imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002110{
2111 char *name;
2112 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002113 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002114 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002115 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002116 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002117 if (ret < 0)
2118 return NULL;
2119 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002120 Py_INCREF(Py_None);
2121 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002122 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002123 m = PyImport_AddModule(name);
2124 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002125 return m;
2126}
2127
Guido van Rossum79f25d91997-04-29 20:08:16 +00002128static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002129imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002130{
2131 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002132
Guido van Rossum43713e52000-02-29 13:59:29 +00002133 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002134 return NULL;
2135 return get_frozen_object(name);
2136}
2137
Guido van Rossum79f25d91997-04-29 20:08:16 +00002138static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002139imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002140{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002141 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002142 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002143 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002144 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002145}
2146
Guido van Rossum79f25d91997-04-29 20:08:16 +00002147static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002148imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002149{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002150 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002151 struct _frozen *p;
Guido van Rossum43713e52000-02-29 13:59:29 +00002152 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002153 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002154 p = find_frozen(name);
2155 return PyInt_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002156}
2157
2158static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002159get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002160{
2161 FILE *fp;
2162 if (fob == NULL) {
2163 fp = fopen(pathname, mode);
2164 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002165 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002166 }
2167 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002168 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002169 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002170 PyErr_SetString(PyExc_ValueError,
2171 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002172 }
2173 return fp;
2174}
2175
Guido van Rossum79f25d91997-04-29 20:08:16 +00002176static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002177imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002178{
2179 char *name;
2180 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002181 PyObject *fob = NULL;
2182 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002183 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002184 if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002185 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002186 return NULL;
2187 fp = get_file(pathname, fob, "rb");
2188 if (fp == NULL)
2189 return NULL;
2190 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002191 if (fob == NULL)
2192 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002193 return m;
2194}
2195
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002196#ifdef HAVE_DYNAMIC_LOADING
2197
Guido van Rossum79f25d91997-04-29 20:08:16 +00002198static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002199imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002200{
2201 char *name;
2202 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002203 PyObject *fob = NULL;
2204 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002205 FILE *fp = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002206 if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002207 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002208 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002209 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002210 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002211 if (fp == NULL)
2212 return NULL;
2213 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002214 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002215 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002216}
2217
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002218#endif /* HAVE_DYNAMIC_LOADING */
2219
Guido van Rossum79f25d91997-04-29 20:08:16 +00002220static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002221imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002222{
2223 char *name;
2224 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002225 PyObject *fob = NULL;
2226 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002227 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002228 if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002229 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002230 return NULL;
2231 fp = get_file(pathname, fob, "r");
2232 if (fp == NULL)
2233 return NULL;
2234 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002235 if (fob == NULL)
2236 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002237 return m;
2238}
2239
Jack Jansen9c96a921995-02-15 22:57:06 +00002240#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002241static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002242imp_load_resource(PyObject *self, PyObject *args)
Jack Jansen9c96a921995-02-15 22:57:06 +00002243{
2244 char *name;
2245 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002246 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002247
Guido van Rossum43713e52000-02-29 13:59:29 +00002248 if (!PyArg_ParseTuple(args, "ss:load_resource", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002249 return NULL;
2250 m = PyMac_LoadResourceModule(name, pathname);
2251 return m;
2252}
2253#endif /* macintosh */
2254
Guido van Rossum79f25d91997-04-29 20:08:16 +00002255static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002256imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002257{
2258 char *name;
2259 PyObject *fob;
2260 char *pathname;
2261 char *suffix; /* Unused */
2262 char *mode;
2263 int type;
2264 FILE *fp;
2265
Guido van Rossum43713e52000-02-29 13:59:29 +00002266 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002267 &name, &fob, &pathname,
2268 &suffix, &mode, &type))
2269 return NULL;
2270 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
2271 PyErr_Format(PyExc_ValueError,
2272 "invalid file open mode %.200s", mode);
2273 return NULL;
2274 }
2275 if (fob == Py_None)
2276 fp = NULL;
2277 else {
2278 if (!PyFile_Check(fob)) {
2279 PyErr_SetString(PyExc_ValueError,
2280 "load_module arg#2 should be a file or None");
2281 return NULL;
2282 }
2283 fp = get_file(pathname, fob, mode);
2284 if (fp == NULL)
2285 return NULL;
2286 }
2287 return load_module(name, fp, pathname, type);
2288}
2289
2290static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002291imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002292{
2293 char *name;
2294 char *pathname;
Guido van Rossum43713e52000-02-29 13:59:29 +00002295 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002296 return NULL;
2297 return load_package(name, pathname);
2298}
2299
2300static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002301imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002302{
2303 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002304 if (!PyArg_ParseTuple(args, "s:new_module", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002305 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002306 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002307}
2308
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002309/* Doc strings */
2310
2311static char doc_imp[] = "\
2312This module provides the components needed to build your own\n\
2313__import__ function. Undocumented functions are obsolete.\n\
2314";
2315
2316static char doc_find_module[] = "\
2317find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
2318Search for a module. If path is omitted or None, search for a\n\
2319built-in, frozen or special module and continue search in sys.path.\n\
2320The module name cannot contain '.'; to search for a submodule of a\n\
2321package, pass the submodule name and the package's __path__.\
2322";
2323
2324static char doc_load_module[] = "\
2325load_module(name, file, filename, (suffix, mode, type)) -> module\n\
2326Load a module, given information returned by find_module().\n\
2327The module name must include the full package name, if any.\
2328";
2329
2330static char doc_get_magic[] = "\
2331get_magic() -> string\n\
2332Return the magic number for .pyc or .pyo files.\
2333";
2334
2335static char doc_get_suffixes[] = "\
2336get_suffixes() -> [(suffix, mode, type), ...]\n\
2337Return a list of (suffix, mode, type) tuples describing the files\n\
2338that find_module() looks for.\
2339";
2340
2341static char doc_new_module[] = "\
2342new_module(name) -> module\n\
2343Create a new module. Do not enter it in sys.modules.\n\
2344The module name must include the full package name, if any.\
2345";
2346
Guido van Rossum79f25d91997-04-29 20:08:16 +00002347static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002348 {"find_module", imp_find_module, 1, doc_find_module},
2349 {"get_magic", imp_get_magic, 1, doc_get_magic},
2350 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2351 {"load_module", imp_load_module, 1, doc_load_module},
2352 {"new_module", imp_new_module, 1, doc_new_module},
2353 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002354 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002355 {"init_builtin", imp_init_builtin, 1},
2356 {"init_frozen", imp_init_frozen, 1},
2357 {"is_builtin", imp_is_builtin, 1},
2358 {"is_frozen", imp_is_frozen, 1},
2359 {"load_compiled", imp_load_compiled, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002360#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002361 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002362#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002363 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002364#ifdef macintosh
2365 {"load_resource", imp_load_resource, 1},
2366#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002367 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002368 {NULL, NULL} /* sentinel */
2369};
2370
Guido van Rossum1a8791e1998-08-04 22:46:29 +00002371static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002372setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002373{
2374 PyObject *v;
2375 int err;
2376
2377 v = PyInt_FromLong((long)value);
2378 err = PyDict_SetItemString(d, name, v);
2379 Py_XDECREF(v);
2380 return err;
2381}
2382
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002383void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002384initimp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002385{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002386 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002387
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002388 m = Py_InitModule4("imp", imp_methods, doc_imp,
2389 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002390 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002391
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002392 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2393 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2394 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2395 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2396 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2397 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2398 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2399 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00002400 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002401
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002402 failure:
2403 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002404}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002405
2406
Guido van Rossumb18618d2000-05-03 23:44:39 +00002407/* API for embedding applications that want to add their own entries
2408 to the table of built-in modules. This should normally be called
2409 *before* Py_Initialize(). When the table resize fails, -1 is
2410 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002411
2412 After a similar function by Just van Rossum. */
2413
2414int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002415PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002416{
2417 static struct _inittab *our_copy = NULL;
2418 struct _inittab *p;
2419 int i, n;
2420
2421 /* Count the number of entries in both tables */
2422 for (n = 0; newtab[n].name != NULL; n++)
2423 ;
2424 if (n == 0)
2425 return 0; /* Nothing to do */
2426 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2427 ;
2428
2429 /* Allocate new memory for the combined table */
Guido van Rossumb18618d2000-05-03 23:44:39 +00002430 p = our_copy;
2431 PyMem_RESIZE(p, struct _inittab, i+n+1);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002432 if (p == NULL)
2433 return -1;
2434
2435 /* Copy the tables into the new memory */
2436 if (our_copy != PyImport_Inittab)
2437 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2438 PyImport_Inittab = our_copy = p;
2439 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
2440
2441 return 0;
2442}
2443
2444/* Shorthand to add a single entry given a name and a function */
2445
2446int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002447PyImport_AppendInittab(char *name, void (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002448{
2449 struct _inittab newtab[2];
2450
2451 memset(newtab, '\0', sizeof newtab);
2452
2453 newtab[0].name = name;
2454 newtab[0].initfunc = initfunc;
2455
2456 return PyImport_ExtendInittab(newtab);
2457}