blob: 456a5be6ff7a8fc9d8a451a19f3454e23abbdaea [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Module definition and import implementation */
3
Guido van Rossum79f25d91997-04-29 20:08:16 +00004#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00005
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00006#include "node.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00007#include "token.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00008#include "errcode.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +00009#include "marshal.h"
10#include "compile.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000011#include "eval.h"
Guido van Rossumd8bac6d1992-02-26 15:19:13 +000012#include "osdefs.h"
Guido van Rossum1ae940a1995-01-02 19:04:15 +000013#include "importdl.h"
Jack Jansen9c96a921995-02-15 22:57:06 +000014#ifdef macintosh
15#include "macglue.h"
16#endif
Guido van Rossumc405b7b1991-06-04 19:39:42 +000017
Guido van Rossum80bb9651996-12-05 23:27:02 +000018#ifdef HAVE_UNISTD_H
19#include <unistd.h>
20#endif
21
Guido van Rossum55a83382000-09-20 20:31:38 +000022#ifdef HAVE_FCNTL_H
23#include <fcntl.h>
24#endif
25
Guido van Rossum595d7ba1997-12-05 21:45:29 +000026#if defined(PYCC_VACPP)
27/* VisualAge C/C++ Failed to Define MountType Field in sys/stat.h */
28#define S_IFMT (S_IFDIR|S_IFCHR|S_IFREG)
29#endif
30
Guido van Rossumaee0bad1997-09-05 07:33:22 +000031#ifndef S_ISDIR
32#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
33#endif
34
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000035extern time_t PyOS_GetLastModificationTime(char *, FILE *);
36 /* In getmtime.c */
Guido van Rossum21d335e1993-10-15 13:01:11 +000037
Guido van Rossum6c849691994-09-26 15:47:17 +000038/* Magic word to reject .pyc files generated by other Python versions */
Guido van Rossum7faeab31995-07-07 22:50:36 +000039/* Change for each incompatible change */
40/* The value of CR and LF is incorporated so if you ever read or write
41 a .pyc file in text mode the magic number will be wrong; also, the
42 Apple MPW compiler swaps their values, botching string constants */
43/* XXX Perhaps the magic number should be frozen and a version field
44 added to the .pyc file header? */
Guido van Rossumdd5db431997-01-17 21:06:11 +000045/* New way to come up with the magic number: (YEAR-1995), MONTH, DAY */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +000046#define MAGIC (60420 | ((long)'\r'<<16) | ((long)'\n'<<24))
Guido van Rossum3ddee711991-12-16 13:06:34 +000047
Guido van Rossum96774c12000-05-01 20:19:08 +000048/* Magic word as global; note that _PyImport_Init() can change the
Jeremy Hylton9262b8a2000-06-30 04:59:17 +000049 value of this global to accommodate for alterations of how the
Guido van Rossum96774c12000-05-01 20:19:08 +000050 compiler works which are enabled by command line switches. */
51static long pyc_magic = MAGIC;
52
Guido van Rossum25ce5661997-08-02 03:10:38 +000053/* See _PyImport_FixupExtension() below */
54static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000055
Guido van Rossum771c6c81997-10-31 18:37:24 +000056/* This table is defined in config.c: */
57extern struct _inittab _PyImport_Inittab[];
58
59struct _inittab *PyImport_Inittab = _PyImport_Inittab;
Guido van Rossum66f1fa81991-04-03 19:03:52 +000060
Guido van Rossumed1170e1999-12-20 21:23:41 +000061/* these tables define the module suffixes that Python recognizes */
62struct filedescr * _PyImport_Filetab = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +000063
64#ifdef RISCOS
65static const struct filedescr _PyImport_StandardFiletab[] = {
66 {"/py", "r", PY_SOURCE},
67 {"/pyc", "rb", PY_COMPILED},
68 {0, 0}
69};
70#else
Guido van Rossumed1170e1999-12-20 21:23:41 +000071static const struct filedescr _PyImport_StandardFiletab[] = {
72 {".py", "r", PY_SOURCE},
73 {".pyc", "rb", PY_COMPILED},
74 {0, 0}
75};
Guido van Rossum48a680c2001-03-02 06:34:14 +000076#endif
Guido van Rossumed1170e1999-12-20 21:23:41 +000077
Guido van Rossum1ae940a1995-01-02 19:04:15 +000078/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000079
80void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000081_PyImport_Init(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000082{
Guido van Rossumed1170e1999-12-20 21:23:41 +000083 const struct filedescr *scan;
84 struct filedescr *filetab;
85 int countD = 0;
86 int countS = 0;
87
88 /* prepare _PyImport_Filetab: copy entries from
89 _PyImport_DynLoadFiletab and _PyImport_StandardFiletab.
90 */
91 for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan)
92 ++countD;
93 for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan)
94 ++countS;
Guido van Rossumb18618d2000-05-03 23:44:39 +000095 filetab = PyMem_NEW(struct filedescr, countD + countS + 1);
Guido van Rossumed1170e1999-12-20 21:23:41 +000096 memcpy(filetab, _PyImport_DynLoadFiletab,
97 countD * sizeof(struct filedescr));
98 memcpy(filetab + countD, _PyImport_StandardFiletab,
99 countS * sizeof(struct filedescr));
100 filetab[countD + countS].suffix = NULL;
101
102 _PyImport_Filetab = filetab;
103
Guido van Rossum0824f631997-03-11 18:37:35 +0000104 if (Py_OptimizeFlag) {
Guido van Rossumed1170e1999-12-20 21:23:41 +0000105 /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */
106 for (; filetab->suffix != NULL; filetab++) {
Guido van Rossum48a680c2001-03-02 06:34:14 +0000107#ifndef RISCOS
Guido van Rossumed1170e1999-12-20 21:23:41 +0000108 if (strcmp(filetab->suffix, ".pyc") == 0)
109 filetab->suffix = ".pyo";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000110#else
111 if (strcmp(filetab->suffix, "/pyc") == 0)
112 filetab->suffix = "/pyo";
113#endif
Guido van Rossum0824f631997-03-11 18:37:35 +0000114 }
115 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000116
117 if (Py_UnicodeFlag) {
118 /* Fix the pyc_magic so that byte compiled code created
119 using the all-Unicode method doesn't interfere with
120 code created in normal operation mode. */
121 pyc_magic = MAGIC + 1;
122 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000123}
124
Guido van Rossum25ce5661997-08-02 03:10:38 +0000125void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000126_PyImport_Fini(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000127{
128 Py_XDECREF(extensions);
129 extensions = NULL;
Barry Warsaw84294482000-10-03 16:02:05 +0000130 PyMem_DEL(_PyImport_Filetab);
131 _PyImport_Filetab = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000132}
133
134
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000135/* Locking primitives to prevent parallel imports of the same module
136 in different threads to return with a partially loaded module.
137 These calls are serialized by the global interpreter lock. */
138
139#ifdef WITH_THREAD
140
Guido van Rossum49b56061998-10-01 20:42:43 +0000141#include "pythread.h"
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000142
Guido van Rossum65d5b571998-12-21 19:32:43 +0000143static PyThread_type_lock import_lock = 0;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000144static long import_lock_thread = -1;
145static int import_lock_level = 0;
146
147static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000148lock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000149{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000150 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000151 if (me == -1)
152 return; /* Too bad */
153 if (import_lock == NULL)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000154 import_lock = PyThread_allocate_lock();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000155 if (import_lock_thread == me) {
156 import_lock_level++;
157 return;
158 }
Guido van Rossum65d5b571998-12-21 19:32:43 +0000159 if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0)) {
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000160 PyThreadState *tstate = PyEval_SaveThread();
Guido van Rossum65d5b571998-12-21 19:32:43 +0000161 PyThread_acquire_lock(import_lock, 1);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000162 PyEval_RestoreThread(tstate);
163 }
164 import_lock_thread = me;
165 import_lock_level = 1;
166}
167
168static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000169unlock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000170{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000171 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000172 if (me == -1)
173 return; /* Too bad */
174 if (import_lock_thread != me)
175 Py_FatalError("unlock_import: not holding the import lock");
176 import_lock_level--;
177 if (import_lock_level == 0) {
178 import_lock_thread = -1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000179 PyThread_release_lock(import_lock);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000180 }
181}
182
183#else
184
185#define lock_import()
186#define unlock_import()
187
188#endif
189
Guido van Rossum25ce5661997-08-02 03:10:38 +0000190/* Helper for sys */
191
192PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000193PyImport_GetModuleDict(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000194{
195 PyInterpreterState *interp = PyThreadState_Get()->interp;
196 if (interp->modules == NULL)
197 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
198 return interp->modules;
199}
200
Guido van Rossum3f5da241990-12-20 15:06:42 +0000201
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000202/* List of names to clear in sys */
203static char* sys_deletes[] = {
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000204 "path", "argv", "ps1", "ps2", "exitfunc",
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000205 "exc_type", "exc_value", "exc_traceback",
206 "last_type", "last_value", "last_traceback",
207 NULL
208};
209
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000210static char* sys_files[] = {
211 "stdin", "__stdin__",
212 "stdout", "__stdout__",
213 "stderr", "__stderr__",
214 NULL
215};
216
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000217
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000218/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000219
Guido van Rossum3f5da241990-12-20 15:06:42 +0000220void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000221PyImport_Cleanup(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000222{
Guido van Rossum758eec01998-01-19 21:58:26 +0000223 int pos, ndone;
224 char *name;
225 PyObject *key, *value, *dict;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000226 PyInterpreterState *interp = PyThreadState_Get()->interp;
Guido van Rossum758eec01998-01-19 21:58:26 +0000227 PyObject *modules = interp->modules;
228
229 if (modules == NULL)
230 return; /* Already done */
231
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000232 /* Delete some special variables first. These are common
233 places where user values hide and people complain when their
234 destructors fail. Since the modules containing them are
235 deleted *last* of all, they would come too late in the normal
236 destruction order. Sigh. */
237
238 value = PyDict_GetItemString(modules, "__builtin__");
239 if (value != NULL && PyModule_Check(value)) {
240 dict = PyModule_GetDict(value);
241 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000242 PySys_WriteStderr("# clear __builtin__._\n");
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000243 PyDict_SetItemString(dict, "_", Py_None);
244 }
245 value = PyDict_GetItemString(modules, "sys");
246 if (value != NULL && PyModule_Check(value)) {
247 char **p;
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000248 PyObject *v;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000249 dict = PyModule_GetDict(value);
250 for (p = sys_deletes; *p != NULL; p++) {
251 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000252 PySys_WriteStderr("# clear sys.%s\n", *p);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000253 PyDict_SetItemString(dict, *p, Py_None);
254 }
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000255 for (p = sys_files; *p != NULL; p+=2) {
256 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000257 PySys_WriteStderr("# restore sys.%s\n", *p);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000258 v = PyDict_GetItemString(dict, *(p+1));
259 if (v == NULL)
260 v = Py_None;
261 PyDict_SetItemString(dict, *p, v);
262 }
263 }
264
265 /* First, delete __main__ */
266 value = PyDict_GetItemString(modules, "__main__");
267 if (value != NULL && PyModule_Check(value)) {
268 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000269 PySys_WriteStderr("# cleanup __main__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000270 _PyModule_Clear(value);
271 PyDict_SetItemString(modules, "__main__", Py_None);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000272 }
273
Guido van Rossum758eec01998-01-19 21:58:26 +0000274 /* The special treatment of __builtin__ here is because even
275 when it's not referenced as a module, its dictionary is
276 referenced by almost every module's __builtins__. Since
277 deleting a module clears its dictionary (even if there are
278 references left to it), we need to delete the __builtin__
279 module last. Likewise, we don't delete sys until the very
280 end because it is implicitly referenced (e.g. by print).
281
282 Also note that we 'delete' modules by replacing their entry
283 in the modules dict with None, rather than really deleting
284 them; this avoids a rehash of the modules dictionary and
285 also marks them as "non existent" so they won't be
286 re-imported. */
287
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000288 /* Next, repeatedly delete modules with a reference count of
Guido van Rossum758eec01998-01-19 21:58:26 +0000289 one (skipping __builtin__ and sys) and delete them */
290 do {
291 ndone = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000292 pos = 0;
Guido van Rossum758eec01998-01-19 21:58:26 +0000293 while (PyDict_Next(modules, &pos, &key, &value)) {
294 if (value->ob_refcnt != 1)
295 continue;
Guido van Rossum566373e1998-10-01 15:24:50 +0000296 if (PyString_Check(key) && PyModule_Check(value)) {
297 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000298 if (strcmp(name, "__builtin__") == 0)
299 continue;
300 if (strcmp(name, "sys") == 0)
301 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000302 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000303 PySys_WriteStderr(
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000304 "# cleanup[1] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000305 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000306 PyDict_SetItem(modules, key, Py_None);
307 ndone++;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000308 }
309 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000310 } while (ndone > 0);
311
Guido van Rossum758eec01998-01-19 21:58:26 +0000312 /* Next, delete all modules (still skipping __builtin__ and sys) */
313 pos = 0;
314 while (PyDict_Next(modules, &pos, &key, &value)) {
Guido van Rossum566373e1998-10-01 15:24:50 +0000315 if (PyString_Check(key) && PyModule_Check(value)) {
316 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000317 if (strcmp(name, "__builtin__") == 0)
318 continue;
319 if (strcmp(name, "sys") == 0)
320 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000321 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000322 PySys_WriteStderr("# cleanup[2] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000323 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000324 PyDict_SetItem(modules, key, Py_None);
325 }
326 }
327
328 /* Next, delete sys and __builtin__ (in that order) */
329 value = PyDict_GetItemString(modules, "sys");
330 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000331 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000332 PySys_WriteStderr("# cleanup sys\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000333 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000334 PyDict_SetItemString(modules, "sys", Py_None);
335 }
336 value = PyDict_GetItemString(modules, "__builtin__");
337 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000338 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000339 PySys_WriteStderr("# cleanup __builtin__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000340 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000341 PyDict_SetItemString(modules, "__builtin__", Py_None);
342 }
343
344 /* Finally, clear and delete the modules directory */
345 PyDict_Clear(modules);
346 interp->modules = NULL;
347 Py_DECREF(modules);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000348}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000349
350
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000351/* Helper for pythonrun.c -- return magic number */
352
353long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000354PyImport_GetMagicNumber(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000355{
Guido van Rossum96774c12000-05-01 20:19:08 +0000356 return pyc_magic;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000357}
358
359
Guido van Rossum25ce5661997-08-02 03:10:38 +0000360/* Magic for extension modules (built-in as well as dynamically
361 loaded). To prevent initializing an extension module more than
362 once, we keep a static dictionary 'extensions' keyed by module name
363 (for built-in modules) or by filename (for dynamically loaded
364 modules), containing these modules. A copy od the module's
365 dictionary is stored by calling _PyImport_FixupExtension()
366 immediately after the module initialization function succeeds. A
367 copy can be retrieved from there by calling
368 _PyImport_FindExtension(). */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000369
Guido van Rossum79f25d91997-04-29 20:08:16 +0000370PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000371_PyImport_FixupExtension(char *name, char *filename)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000372{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000373 PyObject *modules, *mod, *dict, *copy;
374 if (extensions == NULL) {
375 extensions = PyDict_New();
376 if (extensions == NULL)
377 return NULL;
378 }
379 modules = PyImport_GetModuleDict();
380 mod = PyDict_GetItemString(modules, name);
381 if (mod == NULL || !PyModule_Check(mod)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000382 PyErr_Format(PyExc_SystemError,
383 "_PyImport_FixupExtension: module %.200s not loaded", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000384 return NULL;
385 }
386 dict = PyModule_GetDict(mod);
387 if (dict == NULL)
388 return NULL;
389 copy = PyObject_CallMethod(dict, "copy", "");
390 if (copy == NULL)
391 return NULL;
392 PyDict_SetItemString(extensions, filename, copy);
393 Py_DECREF(copy);
394 return copy;
395}
396
397PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000398_PyImport_FindExtension(char *name, char *filename)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000399{
400 PyObject *dict, *mod, *mdict, *result;
401 if (extensions == NULL)
402 return NULL;
403 dict = PyDict_GetItemString(extensions, filename);
404 if (dict == NULL)
405 return NULL;
406 mod = PyImport_AddModule(name);
407 if (mod == NULL)
408 return NULL;
409 mdict = PyModule_GetDict(mod);
410 if (mdict == NULL)
411 return NULL;
412 result = PyObject_CallMethod(mdict, "update", "O", dict);
413 if (result == NULL)
414 return NULL;
415 Py_DECREF(result);
416 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000417 PySys_WriteStderr("import %s # previously loaded (%s)\n",
Guido van Rossum25ce5661997-08-02 03:10:38 +0000418 name, filename);
419 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000420}
421
422
423/* Get the module object corresponding to a module name.
424 First check the modules dictionary if there's one there,
425 if not, create a new one and insert in in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000426 Because the former action is most common, THIS DOES NOT RETURN A
427 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000428
Guido van Rossum79f25d91997-04-29 20:08:16 +0000429PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000430PyImport_AddModule(char *name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000431{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000432 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000433 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000434
Guido van Rossum25ce5661997-08-02 03:10:38 +0000435 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
Guido van Rossum79f25d91997-04-29 20:08:16 +0000436 PyModule_Check(m))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000437 return m;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000438 m = PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000439 if (m == NULL)
440 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000441 if (PyDict_SetItemString(modules, name, m) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000442 Py_DECREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000443 return NULL;
444 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000445 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000446
447 return m;
448}
449
450
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000451/* Execute a code object in a module and return the module object
452 WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000453
Guido van Rossum79f25d91997-04-29 20:08:16 +0000454PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000455PyImport_ExecCodeModule(char *name, PyObject *co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000456{
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000457 return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
458}
459
460PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000461PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname)
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000462{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000463 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000464 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000465
Guido van Rossum79f25d91997-04-29 20:08:16 +0000466 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000467 if (m == NULL)
468 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000469 d = PyModule_GetDict(m);
470 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
471 if (PyDict_SetItemString(d, "__builtins__",
472 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000473 return NULL;
474 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000475 /* Remember the filename as the __file__ attribute */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000476 v = NULL;
477 if (pathname != NULL) {
478 v = PyString_FromString(pathname);
479 if (v == NULL)
480 PyErr_Clear();
481 }
482 if (v == NULL) {
483 v = ((PyCodeObject *)co)->co_filename;
484 Py_INCREF(v);
485 }
486 if (PyDict_SetItemString(d, "__file__", v) != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000487 PyErr_Clear(); /* Not important enough to report */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000488 Py_DECREF(v);
489
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000490 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000491 if (v == NULL)
492 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000493 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000494
Guido van Rossum25ce5661997-08-02 03:10:38 +0000495 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000496 PyErr_Format(PyExc_ImportError,
497 "Loaded module %.200s not found in sys.modules",
498 name);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000499 return NULL;
500 }
501
Guido van Rossum79f25d91997-04-29 20:08:16 +0000502 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000503
504 return m;
505}
506
507
508/* Given a pathname for a Python source file, fill a buffer with the
509 pathname for the corresponding compiled file. Return the pathname
510 for the compiled file, or NULL if there's no space in the buffer.
511 Doesn't set an exception. */
512
513static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000514make_compiled_pathname(char *pathname, char *buf, size_t buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000515{
Fred Drake4c82b232000-06-30 16:18:57 +0000516 size_t len;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000517
518 len = strlen(pathname);
519 if (len+2 > buflen)
520 return NULL;
521 strcpy(buf, pathname);
Guido van Rossum0824f631997-03-11 18:37:35 +0000522 strcpy(buf+len, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000523
524 return buf;
525}
526
527
528/* Given a pathname for a Python source file, its time of last
529 modification, and a pathname for a compiled file, check whether the
530 compiled file represents the same version of the source. If so,
531 return a FILE pointer for the compiled file, positioned just after
532 the header; if not, return NULL.
533 Doesn't set an exception. */
534
535static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000536check_compiled_module(char *pathname, long mtime, char *cpathname)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000537{
538 FILE *fp;
539 long magic;
540 long pyc_mtime;
541
542 fp = fopen(cpathname, "rb");
543 if (fp == NULL)
544 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000545 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000546 if (magic != pyc_magic) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000547 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000548 PySys_WriteStderr("# %s has bad magic\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000549 fclose(fp);
550 return NULL;
551 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000552 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000553 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000554 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000555 PySys_WriteStderr("# %s has bad mtime\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000556 fclose(fp);
557 return NULL;
558 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000559 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000560 PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000561 return fp;
562}
563
564
565/* Read a code object from a file and check it for validity */
566
Guido van Rossum79f25d91997-04-29 20:08:16 +0000567static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000568read_compiled_module(char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000569{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000570 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000571
Tim Petersd9b9ac82001-01-28 00:27:39 +0000572 co = PyMarshal_ReadLastObjectFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000573 /* Ugly: rd_object() may return NULL with or without error */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000574 if (co == NULL || !PyCode_Check(co)) {
575 if (!PyErr_Occurred())
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000576 PyErr_Format(PyExc_ImportError,
577 "Non-code object in %.200s", cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000578 Py_XDECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000579 return NULL;
580 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000581 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000582}
583
584
585/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000586 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000587
Guido van Rossum79f25d91997-04-29 20:08:16 +0000588static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000589load_compiled_module(char *name, char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000590{
591 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000592 PyCodeObject *co;
593 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000594
Guido van Rossum79f25d91997-04-29 20:08:16 +0000595 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000596 if (magic != pyc_magic) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000597 PyErr_Format(PyExc_ImportError,
598 "Bad magic number in %.200s", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000599 return NULL;
600 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000601 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000602 co = read_compiled_module(cpathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000603 if (co == NULL)
604 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000605 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000606 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000607 name, cpathname);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000608 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000609 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000610
611 return m;
612}
613
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000614/* Parse a source file and return the corresponding code object */
615
Guido van Rossum79f25d91997-04-29 20:08:16 +0000616static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000617parse_source_module(char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000618{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000619 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000620 node *n;
621
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000622 n = PyParser_SimpleParseFile(fp, pathname, Py_file_input);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000623 if (n == NULL)
624 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000625 co = PyNode_Compile(n, pathname);
626 PyNode_Free(n);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000627
628 return co;
629}
630
631
Guido van Rossum55a83382000-09-20 20:31:38 +0000632/* Helper to open a bytecode file for writing in exclusive mode */
633
634static FILE *
635open_exclusive(char *filename)
636{
637#if defined(O_EXCL)&&defined(O_CREAT)&&defined(O_WRONLY)&&defined(O_TRUNC)
638 /* Use O_EXCL to avoid a race condition when another process tries to
639 write the same file. When that happens, our open() call fails,
640 which is just fine (since it's only a cache).
641 XXX If the file exists and is writable but the directory is not
642 writable, the file will never be written. Oh well.
643 */
644 int fd;
645 (void) unlink(filename);
Tim Peters42c83af2000-09-29 04:03:10 +0000646 fd = open(filename, O_EXCL|O_CREAT|O_WRONLY|O_TRUNC
647#ifdef O_BINARY
648 |O_BINARY /* necessary for Windows */
649#endif
Tim Peters50d8d372001-02-28 05:34:27 +0000650
Tim Peters42c83af2000-09-29 04:03:10 +0000651 , 0666);
Guido van Rossum55a83382000-09-20 20:31:38 +0000652 if (fd < 0)
653 return NULL;
654 return fdopen(fd, "wb");
655#else
656 /* Best we can do -- on Windows this can't happen anyway */
657 return fopen(filename, "wb");
658#endif
659}
660
661
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000662/* Write a compiled module to a file, placing the time of last
663 modification of its source into the header.
664 Errors are ignored, if a write error occurs an attempt is made to
665 remove the file. */
666
667static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000668write_compiled_module(PyCodeObject *co, char *cpathname, long mtime)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000669{
670 FILE *fp;
671
Guido van Rossum55a83382000-09-20 20:31:38 +0000672 fp = open_exclusive(cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000673 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000674 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000675 PySys_WriteStderr(
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000676 "# can't create %s\n", cpathname);
677 return;
678 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000679 PyMarshal_WriteLongToFile(pyc_magic, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000680 /* First write a 0 for mtime */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000681 PyMarshal_WriteLongToFile(0L, fp);
682 PyMarshal_WriteObjectToFile((PyObject *)co, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000683 if (ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000684 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000685 PySys_WriteStderr("# can't write %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000686 /* Don't keep partial file */
687 fclose(fp);
688 (void) unlink(cpathname);
689 return;
690 }
691 /* Now write the true mtime */
692 fseek(fp, 4L, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000693 PyMarshal_WriteLongToFile(mtime, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000694 fflush(fp);
695 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000696 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000697 PySys_WriteStderr("# wrote %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000698#ifdef macintosh
Jack Jansencbf630f2000-07-11 21:59:16 +0000699 PyMac_setfiletype(cpathname, 'Pyth', 'PYC ');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000700#endif
701}
702
703
704/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000705 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
706 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000707
Guido van Rossum79f25d91997-04-29 20:08:16 +0000708static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000709load_source_module(char *name, char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000710{
Fred Drake4c82b232000-06-30 16:18:57 +0000711 time_t mtime;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000712 FILE *fpc;
713 char buf[MAXPATHLEN+1];
714 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000715 PyCodeObject *co;
716 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000717
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000718 mtime = PyOS_GetLastModificationTime(pathname, fp);
Fred Drakec63d3e92001-03-01 06:33:32 +0000719 if (mtime == (time_t)(-1))
Fred Drake4c82b232000-06-30 16:18:57 +0000720 return NULL;
721#if SIZEOF_TIME_T > 4
722 /* Python's .pyc timestamp handling presumes that the timestamp fits
723 in 4 bytes. This will be fine until sometime in the year 2038,
724 when a 4-byte signed time_t will overflow.
725 */
726 if (mtime >> 32) {
727 PyErr_SetString(PyExc_OverflowError,
Fred Drakec63d3e92001-03-01 06:33:32 +0000728 "modification time overflows a 4 byte field");
Fred Drake4c82b232000-06-30 16:18:57 +0000729 return NULL;
730 }
731#endif
Jeremy Hylton37832f02001-04-13 17:50:20 +0000732 cpathname = make_compiled_pathname(pathname, buf,
733 (size_t)MAXPATHLEN + 1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000734 if (cpathname != NULL &&
735 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000736 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000737 fclose(fpc);
738 if (co == NULL)
739 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000740 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000741 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000742 name, cpathname);
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000743 pathname = cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000744 }
745 else {
746 co = parse_source_module(pathname, fp);
747 if (co == NULL)
748 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000749 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000750 PySys_WriteStderr("import %s # from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000751 name, pathname);
752 write_compiled_module(co, cpathname, mtime);
753 }
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000754 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000755 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000756
757 return m;
758}
759
760
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000761/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +0000762static PyObject *load_module(char *, FILE *, char *, int);
763static struct filedescr *find_module(char *, PyObject *,
764 char *, size_t, FILE **);
765static struct _frozen *find_frozen(char *name);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000766
767/* Load a package and return its module object WITH INCREMENTED
768 REFERENCE COUNT */
769
770static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000771load_package(char *name, char *pathname)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000772{
773 PyObject *m, *d, *file, *path;
774 int err;
775 char buf[MAXPATHLEN+1];
776 FILE *fp = NULL;
777 struct filedescr *fdp;
778
779 m = PyImport_AddModule(name);
780 if (m == NULL)
781 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000782 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000783 PySys_WriteStderr("import %s # directory %s\n",
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000784 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000785 d = PyModule_GetDict(m);
786 file = PyString_FromString(pathname);
787 if (file == NULL)
788 return NULL;
789 path = Py_BuildValue("[O]", file);
790 if (path == NULL) {
791 Py_DECREF(file);
792 return NULL;
793 }
794 err = PyDict_SetItemString(d, "__file__", file);
795 if (err == 0)
796 err = PyDict_SetItemString(d, "__path__", path);
797 if (err != 0) {
798 m = NULL;
799 goto cleanup;
800 }
801 buf[0] = '\0';
802 fdp = find_module("__init__", path, buf, sizeof(buf), &fp);
803 if (fdp == NULL) {
804 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
805 PyErr_Clear();
806 }
807 else
808 m = NULL;
809 goto cleanup;
810 }
811 m = load_module(name, fp, buf, fdp->type);
812 if (fp != NULL)
813 fclose(fp);
814 cleanup:
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000815 Py_XDECREF(path);
816 Py_XDECREF(file);
817 return m;
818}
819
820
821/* Helper to test for built-in module */
822
823static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000824is_builtin(char *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000825{
826 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +0000827 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
828 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
829 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000830 return -1;
831 else
832 return 1;
833 }
834 }
835 return 0;
836}
837
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000838
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000839/* Search the path (default sys.path) for a module. Return the
840 corresponding filedescr struct, and (via return arguments) the
841 pathname and an open file. Return NULL if the module is not found. */
842
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000843#ifdef MS_COREDLL
Thomas Woutersb4bd21c2000-07-22 23:38:01 +0000844extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **,
845 char *, int);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000846#endif
847
Tim Peters50d8d372001-02-28 05:34:27 +0000848static int case_ok(char *, int, int, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000849static int find_init_module(char *); /* Forward */
Guido van Rossum197346f1997-10-31 18:38:52 +0000850
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000851static struct filedescr *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000852find_module(char *realname, PyObject *path, char *buf, size_t buflen,
853 FILE **p_fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000854{
Fred Drake4c82b232000-06-30 16:18:57 +0000855 int i, npath;
856 size_t len, namelen;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000857 struct _frozen *f;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000858 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000859 FILE *fp = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000860#ifndef RISCOS
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000861 struct stat statbuf;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000862#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000863 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
864 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
865 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossum0506a431998-08-11 15:07:39 +0000866 char name[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000867
Fred Drake4c82b232000-06-30 16:18:57 +0000868 if (strlen(realname) > MAXPATHLEN) {
869 PyErr_SetString(PyExc_OverflowError, "module name is too long");
870 return NULL;
871 }
Guido van Rossum0506a431998-08-11 15:07:39 +0000872 strcpy(name, realname);
873
874 if (path != NULL && PyString_Check(path)) {
875 /* Submodule of "frozen" package:
876 Set name to the fullname, path to NULL
877 and continue as "usual" */
878 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
879 PyErr_SetString(PyExc_ImportError,
880 "full frozen module name too long");
881 return NULL;
882 }
883 strcpy(buf, PyString_AsString(path));
884 strcat(buf, ".");
885 strcat(buf, name);
886 strcpy(name, buf);
887 path = NULL;
888 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000889 if (path == NULL) {
890 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000891 strcpy(buf, name);
892 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000893 }
Guido van Rossuma5568d31998-03-05 03:45:08 +0000894 if ((f = find_frozen(name)) != NULL) {
895 strcpy(buf, name);
896 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000897 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000898
Guido van Rossumac279101996-08-22 23:10:58 +0000899#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000900 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
901 if (fp != NULL) {
902 *p_fp = fp;
903 return fdp;
904 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000905#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000906 path = PySys_GetObject("path");
907 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000908 if (path == NULL || !PyList_Check(path)) {
909 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +0000910 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000911 return NULL;
912 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000913 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000914 namelen = strlen(name);
915 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000916 PyObject *v = PyList_GetItem(path, i);
917 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000918 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000919 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000920 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000921 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000922 strcpy(buf, PyString_AsString(v));
Fred Drake4c82b232000-06-30 16:18:57 +0000923 if (strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000924 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000925#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000926#ifdef INTERN_STRINGS
Tim Peters50d8d372001-02-28 05:34:27 +0000927 /*
Guido van Rossum741689d1997-08-12 14:53:39 +0000928 ** Speedup: each sys.path item is interned, and
929 ** FindResourceModule remembers which items refer to
930 ** folders (so we don't have to bother trying to look
Tim Peters50d8d372001-02-28 05:34:27 +0000931 ** into them for resources).
Guido van Rossum741689d1997-08-12 14:53:39 +0000932 */
933 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
934 v = PyList_GET_ITEM(path, i);
935#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000936 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000937 static struct filedescr resfiledescr =
938 {"", "", PY_RESOURCE};
Tim Peters50d8d372001-02-28 05:34:27 +0000939
Jack Jansen9c96a921995-02-15 22:57:06 +0000940 return &resfiledescr;
941 }
Guido van Rossum0f84a341998-08-06 13:36:01 +0000942 if (PyMac_FindCodeResourceModule((PyStringObject *)v, name, buf)) {
943 static struct filedescr resfiledescr =
944 {"", "", PY_CODERESOURCE};
Tim Peters50d8d372001-02-28 05:34:27 +0000945
Guido van Rossum0f84a341998-08-06 13:36:01 +0000946 return &resfiledescr;
947 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000948#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000949 if (len > 0 && buf[len-1] != SEP
950#ifdef ALTSEP
951 && buf[len-1] != ALTSEP
952#endif
953 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000954 buf[len++] = SEP;
Guido van Rossum215c3402000-11-13 17:26:32 +0000955 strcpy(buf+len, name);
956 len += namelen;
Tim Peters50d8d372001-02-28 05:34:27 +0000957
958 /* Check for package import (buf holds a directory name,
959 and there's an __init__ module in that directory */
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000960#ifdef HAVE_STAT
Tim Peterscab3f682001-04-29 22:21:25 +0000961 if (stat(buf, &statbuf) == 0 && /* it exists */
962 S_ISDIR(statbuf.st_mode) && /* it's a directory */
963 find_init_module(buf) && /* it has __init__.py */
964 case_ok(buf, len, namelen, name)) /* and case matches */
965 return &fd_package;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000966#else
967 /* XXX How are you going to test for directories? */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000968#ifdef RISCOS
969 {
970 static struct filedescr fd = {"", "", PKG_DIRECTORY};
971 if (isdir(buf)) {
972 if (find_init_module(buf))
973 return &fd;
974 }
975 }
976#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000977#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000978#ifdef macintosh
979 fdp = PyMac_FindModuleExtension(buf, &len, name);
Jack Jansen4df3c522001-03-20 23:09:54 +0000980 if (fdp) {
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000981#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000982 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000983 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000984 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000985 PySys_WriteStderr("# trying %s\n", buf);
Jack Jansen4df3c522001-03-20 23:09:54 +0000986#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000987 fp = fopen(buf, fdp->mode);
Tim Peters50d8d372001-02-28 05:34:27 +0000988 if (fp != NULL) {
989 if (case_ok(buf, len, namelen, name))
990 break;
991 else { /* continue search */
992 fclose(fp);
993 fp = NULL;
Barry Warsaw914a0b12001-02-02 19:12:16 +0000994 }
Barry Warsaw914a0b12001-02-02 19:12:16 +0000995 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000996 }
997 if (fp != NULL)
998 break;
999 }
1000 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001001 PyErr_Format(PyExc_ImportError,
1002 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001003 return NULL;
1004 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001005 *p_fp = fp;
1006 return fdp;
1007}
1008
Tim Petersd1e87a82001-03-01 18:12:00 +00001009/* case_ok(char* buf, int len, int namelen, char* name)
1010 * The arguments here are tricky, best shown by example:
1011 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1012 * ^ ^ ^ ^
1013 * |--------------------- buf ---------------------|
1014 * |------------------- len ------------------|
1015 * |------ name -------|
1016 * |----- namelen -----|
1017 * buf is the full path, but len only counts up to (& exclusive of) the
1018 * extension. name is the module name, also exclusive of extension.
1019 *
1020 * We've already done a successful stat() or fopen() on buf, so know that
1021 * there's some match, possibly case-insensitive.
1022 *
Tim Peters50d8d372001-02-28 05:34:27 +00001023 * case_ok() is to return 1 if there's a case-sensitive match for
1024 * name, else 0. case_ok() is also to return 1 if envar PYTHONCASEOK
1025 * exists.
Tim Petersd1e87a82001-03-01 18:12:00 +00001026 *
Tim Peters50d8d372001-02-28 05:34:27 +00001027 * case_ok() is used to implement case-sensitive import semantics even
1028 * on platforms with case-insensitive filesystems. It's trivial to implement
1029 * for case-sensitive filesystems. It's pretty much a cross-platform
1030 * nightmare for systems with case-insensitive filesystems.
1031 */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001032
Tim Peters50d8d372001-02-28 05:34:27 +00001033/* First we may need a pile of platform-specific header files; the sequence
1034 * of #if's here should match the sequence in the body of case_ok().
1035 */
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001036#if defined(MS_WIN32) || defined(__CYGWIN__)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001037#include <windows.h>
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001038#ifdef __CYGWIN__
1039#include <sys/cygwin.h>
1040#endif
1041
Tim Peters50d8d372001-02-28 05:34:27 +00001042#elif defined(DJGPP)
1043#include <dir.h>
1044
1045#elif defined(macintosh)
1046#include <TextUtils.h>
1047#ifdef USE_GUSI1
1048#include "TFileSpec.h" /* for Path2FSSpec() */
1049#endif
1050
Tim Petersd1e87a82001-03-01 18:12:00 +00001051#elif defined(__MACH__) && defined(__APPLE__) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001052#include <sys/types.h>
1053#include <dirent.h>
1054
Tim Peters50d8d372001-02-28 05:34:27 +00001055#endif
1056
Guido van Rossum0980bd91998-02-13 17:18:36 +00001057static int
Tim Peters50d8d372001-02-28 05:34:27 +00001058case_ok(char *buf, int len, int namelen, char *name)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001059{
Tim Peters50d8d372001-02-28 05:34:27 +00001060/* Pick a platform-specific implementation; the sequence of #if's here should
1061 * match the sequence just above.
1062 */
1063
1064/* MS_WIN32 || __CYGWIN__ */
1065#if defined(MS_WIN32) || defined(__CYGWIN__)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001066 WIN32_FIND_DATA data;
1067 HANDLE h;
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001068#ifdef __CYGWIN__
1069 char tempbuf[MAX_PATH];
1070#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001071
Guido van Rossum0980bd91998-02-13 17:18:36 +00001072 if (getenv("PYTHONCASEOK") != NULL)
1073 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001074
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001075#ifdef __CYGWIN__
1076 cygwin32_conv_to_win32_path(buf, tempbuf);
1077 h = FindFirstFile(tempbuf, &data);
1078#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001079 h = FindFirstFile(buf, &data);
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001080#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001081 if (h == INVALID_HANDLE_VALUE) {
1082 PyErr_Format(PyExc_NameError,
1083 "Can't find file for module %.100s\n(filename %.300s)",
1084 name, buf);
1085 return 0;
1086 }
1087 FindClose(h);
Tim Peters50d8d372001-02-28 05:34:27 +00001088 return strncmp(data.cFileName, name, namelen) == 0;
1089
1090/* DJGPP */
1091#elif defined(DJGPP)
1092 struct ffblk ffblk;
1093 int done;
1094
1095 if (getenv("PYTHONCASEOK") != NULL)
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001096 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001097
1098 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
1099 if (done) {
Guido van Rossum0980bd91998-02-13 17:18:36 +00001100 PyErr_Format(PyExc_NameError,
Tim Peters50d8d372001-02-28 05:34:27 +00001101 "Can't find file for module %.100s\n(filename %.300s)",
Guido van Rossum0980bd91998-02-13 17:18:36 +00001102 name, buf);
1103 return 0;
1104 }
Tim Peters50d8d372001-02-28 05:34:27 +00001105 return strncmp(ffblk.ff_name, name, namelen) == 0;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001106
Tim Peters50d8d372001-02-28 05:34:27 +00001107/* macintosh */
1108#elif defined(macintosh)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001109 FSSpec fss;
1110 OSErr err;
Tim Peters50d8d372001-02-28 05:34:27 +00001111
1112 if (getenv("PYTHONCASEOK") != NULL)
1113 return 1;
1114
Guido van Rossumb33aa1a2000-04-24 15:08:18 +00001115#ifndef USE_GUSI1
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001116 err = FSMakeFSSpec(0, 0, Pstring(buf), &fss);
1117#else
1118 /* GUSI's Path2FSSpec() resolves all possible aliases nicely on
1119 the way, which is fine for all directories, but here we need
1120 the original name of the alias file (say, Dlg.ppc.slb, not
1121 toolboxmodules.ppc.slb). */
1122 char *colon;
1123 err = Path2FSSpec(buf, &fss);
1124 if (err == noErr) {
1125 colon = strrchr(buf, ':'); /* find filename */
1126 if (colon != NULL)
1127 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1128 Pstring(colon+1), &fss);
1129 else
1130 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1131 fss.name, &fss);
1132 }
1133#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001134 if (err) {
1135 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001136 "Can't find file for module %.100s\n(filename %.300s)",
1137 name, buf);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001138 return 0;
1139 }
Tim Peters50d8d372001-02-28 05:34:27 +00001140 return fss.name[0] >= namelen &&
1141 strncmp(name, (char *)fss.name+1, namelen) == 0;
1142
Tim Peters677898a2001-03-02 03:28:03 +00001143/* new-fangled macintosh (macosx) */
Tim Petersd1e87a82001-03-01 18:12:00 +00001144#elif defined(__MACH__) && defined(__APPLE__) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001145 DIR *dirp;
1146 struct dirent *dp;
Tim Petersd1e87a82001-03-01 18:12:00 +00001147 char dirname[MAXPATHLEN + 1];
1148 const int dirlen = len - namelen - 1; /* don't want trailing SEP */
Tim Peters430f5d42001-03-01 01:30:56 +00001149
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001150 if (getenv("PYTHONCASEOK") != NULL)
1151 return 1;
1152
Tim Petersd1e87a82001-03-01 18:12:00 +00001153 /* Copy the dir component into dirname; substitute "." if empty */
1154 if (dirlen <= 0) {
1155 dirname[0] = '.';
1156 dirname[1] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001157 }
1158 else {
Tim Petersd1e87a82001-03-01 18:12:00 +00001159 assert(dirlen <= MAXPATHLEN);
1160 memcpy(dirname, buf, dirlen);
1161 dirname[dirlen] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001162 }
1163 /* Open the directory and search the entries for an exact match. */
Tim Petersd1e87a82001-03-01 18:12:00 +00001164 dirp = opendir(dirname);
Tim Peters430f5d42001-03-01 01:30:56 +00001165 if (dirp) {
Tim Peters677898a2001-03-02 03:28:03 +00001166 char *nameWithExt = buf + len - namelen;
Tim Peters430f5d42001-03-01 01:30:56 +00001167 while ((dp = readdir(dirp)) != NULL) {
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001168 const int thislen =
Tim Peters430f5d42001-03-01 01:30:56 +00001169#ifdef _DIRENT_HAVE_D_NAMELEN
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001170 dp->d_namlen;
Tim Peters430f5d42001-03-01 01:30:56 +00001171#else
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001172 strlen(dp->d_name);
Tim Peters430f5d42001-03-01 01:30:56 +00001173#endif
Tim Petersd1e87a82001-03-01 18:12:00 +00001174 if (thislen >= namelen &&
Tim Peters677898a2001-03-02 03:28:03 +00001175 strcmp(dp->d_name, nameWithExt) == 0) {
Tim Peters430f5d42001-03-01 01:30:56 +00001176 (void)closedir(dirp);
1177 return 1; /* Found */
1178 }
1179 }
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001180 (void)closedir(dirp);
Tim Peters430f5d42001-03-01 01:30:56 +00001181 }
Tim Peters430f5d42001-03-01 01:30:56 +00001182 return 0 ; /* Not found */
Tim Peters430f5d42001-03-01 01:30:56 +00001183
Tim Peters50d8d372001-02-28 05:34:27 +00001184/* assuming it's a case-sensitive filesystem, so there's nothing to do! */
1185#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001186 return 1;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001187
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001188#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001189}
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001190
Guido van Rossum0980bd91998-02-13 17:18:36 +00001191
Guido van Rossum197346f1997-10-31 18:38:52 +00001192#ifdef HAVE_STAT
1193/* Helper to look for __init__.py or __init__.py[co] in potential package */
1194static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001195find_init_module(char *buf)
Guido van Rossum197346f1997-10-31 18:38:52 +00001196{
Tim Peters0f9431f2001-07-05 03:47:53 +00001197 const size_t save_len = strlen(buf);
Fred Drake4c82b232000-06-30 16:18:57 +00001198 size_t i = save_len;
Tim Peters0f9431f2001-07-05 03:47:53 +00001199 char *pname; /* pointer to start of __init__ */
Guido van Rossum197346f1997-10-31 18:38:52 +00001200 struct stat statbuf;
1201
Tim Peters0f9431f2001-07-05 03:47:53 +00001202/* For calling case_ok(buf, len, namelen, name):
1203 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1204 * ^ ^ ^ ^
1205 * |--------------------- buf ---------------------|
1206 * |------------------- len ------------------|
1207 * |------ name -------|
1208 * |----- namelen -----|
1209 */
Guido van Rossum197346f1997-10-31 18:38:52 +00001210 if (save_len + 13 >= MAXPATHLEN)
1211 return 0;
1212 buf[i++] = SEP;
Tim Peters0f9431f2001-07-05 03:47:53 +00001213 pname = buf + i;
1214 strcpy(pname, "__init__.py");
Guido van Rossum197346f1997-10-31 18:38:52 +00001215 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001216 if (case_ok(buf,
1217 save_len + 9, /* len("/__init__") */
1218 8, /* len("__init__") */
1219 pname)) {
1220 buf[save_len] = '\0';
1221 return 1;
1222 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001223 }
Tim Peters0f9431f2001-07-05 03:47:53 +00001224 i += strlen(pname);
1225 strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum197346f1997-10-31 18:38:52 +00001226 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001227 if (case_ok(buf,
1228 save_len + 9, /* len("/__init__") */
1229 8, /* len("__init__") */
1230 pname)) {
1231 buf[save_len] = '\0';
1232 return 1;
1233 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001234 }
1235 buf[save_len] = '\0';
1236 return 0;
1237}
Guido van Rossum48a680c2001-03-02 06:34:14 +00001238
1239#else
1240
1241#ifdef RISCOS
1242static int
1243find_init_module(buf)
1244 char *buf;
1245{
1246 int save_len = strlen(buf);
1247 int i = save_len;
1248
1249 if (save_len + 13 >= MAXPATHLEN)
1250 return 0;
1251 buf[i++] = SEP;
1252 strcpy(buf+i, "__init__/py");
1253 if (isfile(buf)) {
1254 buf[save_len] = '\0';
1255 return 1;
1256 }
1257
1258 if (Py_OptimizeFlag)
1259 strcpy(buf+i, "o");
1260 else
1261 strcpy(buf+i, "c");
1262 if (isfile(buf)) {
1263 buf[save_len] = '\0';
1264 return 1;
1265 }
1266 buf[save_len] = '\0';
1267 return 0;
1268}
1269#endif /*RISCOS*/
1270
Guido van Rossum197346f1997-10-31 18:38:52 +00001271#endif /* HAVE_STAT */
1272
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001273
Tim Petersdbd9ba62000-07-09 03:09:57 +00001274static int init_builtin(char *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001275
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001276/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001277 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001278
Guido van Rossum79f25d91997-04-29 20:08:16 +00001279static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001280load_module(char *name, FILE *fp, char *buf, int type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001281{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001282 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001283 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001284 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001285
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001286 /* First check that there's an open file (if we need one) */
1287 switch (type) {
1288 case PY_SOURCE:
1289 case PY_COMPILED:
1290 if (fp == NULL) {
1291 PyErr_Format(PyExc_ValueError,
1292 "file object required for import (type code %d)",
1293 type);
1294 return NULL;
1295 }
1296 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001297
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001298 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001299
1300 case PY_SOURCE:
1301 m = load_source_module(name, buf, fp);
1302 break;
1303
1304 case PY_COMPILED:
1305 m = load_compiled_module(name, buf, fp);
1306 break;
1307
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001308#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001309 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001310 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001311 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001312#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001313
Jack Jansen9c96a921995-02-15 22:57:06 +00001314#ifdef macintosh
1315 case PY_RESOURCE:
1316 m = PyMac_LoadResourceModule(name, buf);
1317 break;
Guido van Rossum0f84a341998-08-06 13:36:01 +00001318 case PY_CODERESOURCE:
1319 m = PyMac_LoadCodeResourceModule(name, buf);
1320 break;
Jack Jansen9c96a921995-02-15 22:57:06 +00001321#endif
1322
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001323 case PKG_DIRECTORY:
1324 m = load_package(name, buf);
1325 break;
1326
1327 case C_BUILTIN:
1328 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001329 if (buf != NULL && buf[0] != '\0')
1330 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001331 if (type == C_BUILTIN)
1332 err = init_builtin(name);
1333 else
1334 err = PyImport_ImportFrozenModule(name);
1335 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001336 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001337 if (err == 0) {
1338 PyErr_Format(PyExc_ImportError,
1339 "Purported %s module %.200s not found",
1340 type == C_BUILTIN ?
1341 "builtin" : "frozen",
1342 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001343 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001344 }
1345 modules = PyImport_GetModuleDict();
1346 m = PyDict_GetItemString(modules, name);
1347 if (m == NULL) {
1348 PyErr_Format(
1349 PyExc_ImportError,
1350 "%s module %.200s not properly initialized",
1351 type == C_BUILTIN ?
1352 "builtin" : "frozen",
1353 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001354 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001355 }
1356 Py_INCREF(m);
1357 break;
1358
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001359 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001360 PyErr_Format(PyExc_ImportError,
1361 "Don't know how to import %.200s (type code %d)",
1362 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001363 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001364
1365 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001366
1367 return m;
1368}
1369
1370
1371/* Initialize a built-in module.
1372 Return 1 for succes, 0 if the module is not found, and -1 with
1373 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001374
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001375static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001376init_builtin(char *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001377{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001378 struct _inittab *p;
1379 PyObject *mod;
1380
1381 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
1382 return 1;
1383
Guido van Rossum771c6c81997-10-31 18:37:24 +00001384 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001385 if (strcmp(name, p->name) == 0) {
1386 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001387 PyErr_Format(PyExc_ImportError,
1388 "Cannot re-init internal module %.200s",
1389 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001390 return -1;
1391 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001392 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001393 PySys_WriteStderr("import %s # builtin\n", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001394 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001395 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001396 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001397 if (_PyImport_FixupExtension(name, name) == NULL)
1398 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001399 return 1;
1400 }
1401 }
1402 return 0;
1403}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001404
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001405
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001406/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001407
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001408static struct _frozen *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001409find_frozen(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001410{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001411 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001412
Guido van Rossum79f25d91997-04-29 20:08:16 +00001413 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001414 if (p->name == NULL)
1415 return NULL;
1416 if (strcmp(p->name, name) == 0)
1417 break;
1418 }
1419 return p;
1420}
1421
Guido van Rossum79f25d91997-04-29 20:08:16 +00001422static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001423get_frozen_object(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001424{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001425 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001426 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001427
1428 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001429 PyErr_Format(PyExc_ImportError,
1430 "No such frozen object named %.200s",
1431 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001432 return NULL;
1433 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001434 size = p->size;
1435 if (size < 0)
1436 size = -size;
1437 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001438}
1439
1440/* Initialize a frozen module.
1441 Return 1 for succes, 0 if the module is not found, and -1 with
1442 an exception set if the initialization failed.
1443 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001444
1445int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001446PyImport_ImportFrozenModule(char *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001447{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001448 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001449 PyObject *co;
1450 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001451 int ispackage;
1452 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001453
1454 if (p == NULL)
1455 return 0;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001456 size = p->size;
1457 ispackage = (size < 0);
1458 if (ispackage)
1459 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001460 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001461 PySys_WriteStderr("import %s # frozen%s\n",
Guido van Rossuma5568d31998-03-05 03:45:08 +00001462 name, ispackage ? " package" : "");
1463 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001464 if (co == NULL)
1465 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001466 if (!PyCode_Check(co)) {
1467 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001468 PyErr_Format(PyExc_TypeError,
1469 "frozen object %.200s is not a code object",
1470 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001471 return -1;
1472 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001473 if (ispackage) {
1474 /* Set __path__ to the package name */
1475 PyObject *d, *s;
1476 int err;
1477 m = PyImport_AddModule(name);
1478 if (m == NULL)
1479 return -1;
1480 d = PyModule_GetDict(m);
1481 s = PyString_InternFromString(name);
1482 if (s == NULL)
1483 return -1;
1484 err = PyDict_SetItemString(d, "__path__", s);
1485 Py_DECREF(s);
1486 if (err != 0)
1487 return err;
1488 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001489 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001490 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001491 if (m == NULL)
1492 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001493 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001494 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001495}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001496
1497
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001498/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001499 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001500
Guido van Rossum79f25d91997-04-29 20:08:16 +00001501PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001502PyImport_ImportModule(char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00001503{
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00001504 PyObject *pname;
1505 PyObject *result;
1506
1507 pname = PyString_FromString(name);
1508 result = PyImport_Import(pname);
1509 Py_DECREF(pname);
1510 return result;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001511}
1512
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001513/* Forward declarations for helper routines */
Tim Petersdbd9ba62000-07-09 03:09:57 +00001514static PyObject *get_parent(PyObject *globals, char *buf, int *p_buflen);
1515static PyObject *load_next(PyObject *mod, PyObject *altmod,
1516 char **p_name, char *buf, int *p_buflen);
1517static int mark_miss(char *name);
1518static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
1519 char *buf, int buflen, int recursive);
1520static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001521
1522/* The Magnum Opus of dotted-name import :-) */
1523
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001524static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001525import_module_ex(char *name, PyObject *globals, PyObject *locals,
1526 PyObject *fromlist)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001527{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001528 char buf[MAXPATHLEN+1];
1529 int buflen = 0;
1530 PyObject *parent, *head, *next, *tail;
1531
1532 parent = get_parent(globals, buf, &buflen);
1533 if (parent == NULL)
1534 return NULL;
1535
1536 head = load_next(parent, Py_None, &name, buf, &buflen);
1537 if (head == NULL)
1538 return NULL;
1539
1540 tail = head;
1541 Py_INCREF(tail);
1542 while (name) {
1543 next = load_next(tail, tail, &name, buf, &buflen);
1544 Py_DECREF(tail);
1545 if (next == NULL) {
1546 Py_DECREF(head);
1547 return NULL;
1548 }
1549 tail = next;
1550 }
1551
1552 if (fromlist != NULL) {
1553 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1554 fromlist = NULL;
1555 }
1556
1557 if (fromlist == NULL) {
1558 Py_DECREF(tail);
1559 return head;
1560 }
1561
1562 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001563 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001564 Py_DECREF(tail);
1565 return NULL;
1566 }
1567
1568 return tail;
1569}
1570
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001571PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001572PyImport_ImportModuleEx(char *name, PyObject *globals, PyObject *locals,
1573 PyObject *fromlist)
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001574{
1575 PyObject *result;
1576 lock_import();
Guido van Rossumd65911b1998-03-03 22:33:27 +00001577 result = import_module_ex(name, globals, locals, fromlist);
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001578 unlock_import();
1579 return result;
1580}
1581
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001582static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001583get_parent(PyObject *globals, char *buf, int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001584{
1585 static PyObject *namestr = NULL;
1586 static PyObject *pathstr = NULL;
1587 PyObject *modname, *modpath, *modules, *parent;
1588
1589 if (globals == NULL || !PyDict_Check(globals))
1590 return Py_None;
1591
1592 if (namestr == NULL) {
1593 namestr = PyString_InternFromString("__name__");
1594 if (namestr == NULL)
1595 return NULL;
1596 }
1597 if (pathstr == NULL) {
1598 pathstr = PyString_InternFromString("__path__");
1599 if (pathstr == NULL)
1600 return NULL;
1601 }
1602
1603 *buf = '\0';
1604 *p_buflen = 0;
1605 modname = PyDict_GetItem(globals, namestr);
1606 if (modname == NULL || !PyString_Check(modname))
1607 return Py_None;
1608
1609 modpath = PyDict_GetItem(globals, pathstr);
1610 if (modpath != NULL) {
1611 int len = PyString_GET_SIZE(modname);
1612 if (len > MAXPATHLEN) {
1613 PyErr_SetString(PyExc_ValueError,
1614 "Module name too long");
1615 return NULL;
1616 }
1617 strcpy(buf, PyString_AS_STRING(modname));
1618 *p_buflen = len;
1619 }
1620 else {
1621 char *start = PyString_AS_STRING(modname);
1622 char *lastdot = strrchr(start, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001623 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001624 if (lastdot == NULL)
1625 return Py_None;
1626 len = lastdot - start;
1627 if (len >= MAXPATHLEN) {
1628 PyErr_SetString(PyExc_ValueError,
1629 "Module name too long");
1630 return NULL;
1631 }
1632 strncpy(buf, start, len);
1633 buf[len] = '\0';
1634 *p_buflen = len;
1635 }
1636
1637 modules = PyImport_GetModuleDict();
1638 parent = PyDict_GetItemString(modules, buf);
1639 if (parent == NULL)
1640 parent = Py_None;
1641 return parent;
1642 /* We expect, but can't guarantee, if parent != None, that:
1643 - parent.__name__ == buf
1644 - parent.__dict__ is globals
1645 If this is violated... Who cares? */
1646}
1647
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001648/* altmod is either None or same as mod */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001649static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001650load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
1651 int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001652{
1653 char *name = *p_name;
1654 char *dot = strchr(name, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001655 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001656 char *p;
1657 PyObject *result;
1658
1659 if (dot == NULL) {
1660 *p_name = NULL;
1661 len = strlen(name);
1662 }
1663 else {
1664 *p_name = dot+1;
1665 len = dot-name;
1666 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00001667 if (len == 0) {
1668 PyErr_SetString(PyExc_ValueError,
1669 "Empty module name");
1670 return NULL;
1671 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001672
1673 p = buf + *p_buflen;
1674 if (p != buf)
1675 *p++ = '.';
1676 if (p+len-buf >= MAXPATHLEN) {
1677 PyErr_SetString(PyExc_ValueError,
1678 "Module name too long");
1679 return NULL;
1680 }
1681 strncpy(p, name, len);
1682 p[len] = '\0';
1683 *p_buflen = p+len-buf;
1684
1685 result = import_submodule(mod, p, buf);
1686 if (result == Py_None && altmod != mod) {
1687 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001688 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001689 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001690 if (result != NULL && result != Py_None) {
1691 if (mark_miss(buf) != 0) {
1692 Py_DECREF(result);
1693 return NULL;
1694 }
1695 strncpy(buf, name, len);
1696 buf[len] = '\0';
1697 *p_buflen = len;
1698 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001699 }
1700 if (result == NULL)
1701 return NULL;
1702
1703 if (result == Py_None) {
1704 Py_DECREF(result);
1705 PyErr_Format(PyExc_ImportError,
1706 "No module named %.200s", name);
1707 return NULL;
1708 }
1709
1710 return result;
1711}
1712
1713static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001714mark_miss(char *name)
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001715{
1716 PyObject *modules = PyImport_GetModuleDict();
1717 return PyDict_SetItemString(modules, name, Py_None);
1718}
1719
1720static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001721ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, int buflen,
1722 int recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001723{
1724 int i;
1725
1726 if (!PyObject_HasAttrString(mod, "__path__"))
1727 return 1;
1728
1729 for (i = 0; ; i++) {
1730 PyObject *item = PySequence_GetItem(fromlist, i);
1731 int hasit;
1732 if (item == NULL) {
1733 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1734 PyErr_Clear();
1735 return 1;
1736 }
1737 return 0;
1738 }
1739 if (!PyString_Check(item)) {
1740 PyErr_SetString(PyExc_TypeError,
1741 "Item in ``from list'' not a string");
1742 Py_DECREF(item);
1743 return 0;
1744 }
1745 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001746 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001747 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001748 /* See if the package defines __all__ */
1749 if (recursive)
1750 continue; /* Avoid endless recursion */
1751 all = PyObject_GetAttrString(mod, "__all__");
1752 if (all == NULL)
1753 PyErr_Clear();
1754 else {
1755 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1756 return 0;
1757 Py_DECREF(all);
1758 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001759 continue;
1760 }
1761 hasit = PyObject_HasAttr(mod, item);
1762 if (!hasit) {
1763 char *subname = PyString_AS_STRING(item);
1764 PyObject *submod;
1765 char *p;
1766 if (buflen + strlen(subname) >= MAXPATHLEN) {
1767 PyErr_SetString(PyExc_ValueError,
1768 "Module name too long");
1769 Py_DECREF(item);
1770 return 0;
1771 }
1772 p = buf + buflen;
1773 *p++ = '.';
1774 strcpy(p, subname);
1775 submod = import_submodule(mod, subname, buf);
1776 Py_XDECREF(submod);
1777 if (submod == NULL) {
1778 Py_DECREF(item);
1779 return 0;
1780 }
1781 }
1782 Py_DECREF(item);
1783 }
1784
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001785 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001786}
1787
1788static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001789import_submodule(PyObject *mod, char *subname, char *fullname)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001790{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001791 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossumf48f11c2001-07-23 13:27:49 +00001792 PyObject *m, *res = NULL;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001793
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001794 /* Require:
1795 if mod == None: subname == fullname
1796 else: mod.__name__ + "." + subname == fullname
1797 */
1798
Tim Peters50d8d372001-02-28 05:34:27 +00001799 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001800 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001801 }
1802 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001803 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001804 char buf[MAXPATHLEN+1];
1805 struct filedescr *fdp;
1806 FILE *fp = NULL;
1807
Guido van Rossum9c0afe51998-05-19 15:09:05 +00001808 if (mod == Py_None)
1809 path = NULL;
1810 else {
1811 path = PyObject_GetAttrString(mod, "__path__");
1812 if (path == NULL) {
1813 PyErr_Clear();
1814 Py_INCREF(Py_None);
1815 return Py_None;
1816 }
1817 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001818
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001819 buf[0] = '\0';
Guido van Rossumb68cd421998-07-01 17:36:26 +00001820 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1821 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001822 if (fdp == NULL) {
1823 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1824 return NULL;
1825 PyErr_Clear();
1826 Py_INCREF(Py_None);
1827 return Py_None;
1828 }
1829 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001830 if (fp)
1831 fclose(fp);
Guido van Rossumf48f11c2001-07-23 13:27:49 +00001832 if (mod != Py_None) {
1833 /* Irrespective of the success of this load, make a
1834 reference to it in the parent package module.
1835 A copy gets saved in the modules dictionary
1836 under the full name, so get a reference from
1837 there, if need be. (The exception is when
1838 the load failed with a SyntaxError -- then
1839 there's no trace in sys.modules. In that case,
1840 of course, do nothing extra.) */
1841 res = m;
1842 if (res == NULL)
1843 res = PyDict_GetItemString(modules, fullname);
1844 if (res != NULL &&
1845 PyObject_SetAttrString(mod, subname, res) < 0) {
1846 Py_XDECREF(m);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001847 m = NULL;
1848 }
1849 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001850 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001851
1852 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001853}
1854
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001855
1856/* Re-import a module of any kind and return its module object, WITH
1857 INCREMENTED REFERENCE COUNT */
1858
Guido van Rossum79f25d91997-04-29 20:08:16 +00001859PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001860PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001861{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001862 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001863 PyObject *path = NULL;
1864 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001865 char buf[MAXPATHLEN+1];
1866 struct filedescr *fdp;
1867 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001868
Guido van Rossum79f25d91997-04-29 20:08:16 +00001869 if (m == NULL || !PyModule_Check(m)) {
1870 PyErr_SetString(PyExc_TypeError,
1871 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001872 return NULL;
1873 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001874 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001875 if (name == NULL)
1876 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001877 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001878 PyErr_Format(PyExc_ImportError,
1879 "reload(): module %.200s not in sys.modules",
1880 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001881 return NULL;
1882 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001883 subname = strrchr(name, '.');
1884 if (subname == NULL)
1885 subname = name;
1886 else {
1887 PyObject *parentname, *parent;
1888 parentname = PyString_FromStringAndSize(name, (subname-name));
1889 if (parentname == NULL)
1890 return NULL;
1891 parent = PyDict_GetItem(modules, parentname);
Barry Warsaw38793331999-01-27 17:54:20 +00001892 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00001893 if (parent == NULL) {
1894 PyErr_Format(PyExc_ImportError,
1895 "reload(): parent %.200s not in sys.modules",
1896 name);
1897 return NULL;
1898 }
1899 subname++;
1900 path = PyObject_GetAttrString(parent, "__path__");
1901 if (path == NULL)
1902 PyErr_Clear();
1903 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001904 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001905 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1906 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001907 if (fdp == NULL)
1908 return NULL;
1909 m = load_module(name, fp, buf, fdp->type);
1910 if (fp)
1911 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001912 return m;
1913}
1914
1915
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001916/* Higher-level import emulator which emulates the "import" statement
1917 more accurately -- it invokes the __import__() function from the
1918 builtins of the current globals. This means that the import is
1919 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00001920 environment, e.g. by "rexec".
1921 A dummy list ["__doc__"] is passed as the 4th argument so that
1922 e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
1923 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001924
1925PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001926PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001927{
1928 static PyObject *silly_list = NULL;
1929 static PyObject *builtins_str = NULL;
1930 static PyObject *import_str = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001931 PyObject *globals = NULL;
1932 PyObject *import = NULL;
1933 PyObject *builtins = NULL;
1934 PyObject *r = NULL;
1935
1936 /* Initialize constant string objects */
1937 if (silly_list == NULL) {
1938 import_str = PyString_InternFromString("__import__");
1939 if (import_str == NULL)
1940 return NULL;
1941 builtins_str = PyString_InternFromString("__builtins__");
1942 if (builtins_str == NULL)
1943 return NULL;
1944 silly_list = Py_BuildValue("[s]", "__doc__");
1945 if (silly_list == NULL)
1946 return NULL;
1947 }
1948
1949 /* Get the builtins from current globals */
1950 globals = PyEval_GetGlobals();
Guido van Rossum85cd1d62001-02-20 21:43:24 +00001951 if (globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00001952 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001953 builtins = PyObject_GetItem(globals, builtins_str);
1954 if (builtins == NULL)
1955 goto err;
1956 }
1957 else {
1958 /* No globals -- use standard builtins, and fake globals */
1959 PyErr_Clear();
1960
Guido van Rossum85cd1d62001-02-20 21:43:24 +00001961 builtins = PyImport_ImportModuleEx("__builtin__",
1962 NULL, NULL, NULL);
1963 if (builtins == NULL)
1964 return NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001965 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1966 if (globals == NULL)
1967 goto err;
1968 }
1969
1970 /* Get the __import__ function from the builtins */
1971 if (PyDict_Check(builtins))
Fred Drakea76ba6e2001-03-06 06:31:15 +00001972 import = PyObject_GetItem(builtins, import_str);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001973 else
Fred Drakea76ba6e2001-03-06 06:31:15 +00001974 import = PyObject_GetAttr(builtins, import_str);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001975 if (import == NULL)
1976 goto err;
1977
1978 /* Call the _import__ function with the proper argument list */
1979 r = PyObject_CallFunction(import, "OOOO",
1980 module_name, globals, globals, silly_list);
1981
1982 err:
1983 Py_XDECREF(globals);
1984 Py_XDECREF(builtins);
1985 Py_XDECREF(import);
Tim Peters50d8d372001-02-28 05:34:27 +00001986
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001987 return r;
1988}
1989
1990
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001991/* Module 'imp' provides Python access to the primitives used for
1992 importing modules.
1993*/
1994
Guido van Rossum79f25d91997-04-29 20:08:16 +00001995static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001996imp_get_magic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001997{
1998 char buf[4];
1999
Guido van Rossum43713e52000-02-29 13:59:29 +00002000 if (!PyArg_ParseTuple(args, ":get_magic"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002001 return NULL;
Guido van Rossum96774c12000-05-01 20:19:08 +00002002 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
2003 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
2004 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
2005 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002006
Guido van Rossum79f25d91997-04-29 20:08:16 +00002007 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002008}
2009
Guido van Rossum79f25d91997-04-29 20:08:16 +00002010static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002011imp_get_suffixes(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002012{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002013 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002014 struct filedescr *fdp;
2015
Guido van Rossum43713e52000-02-29 13:59:29 +00002016 if (!PyArg_ParseTuple(args, ":get_suffixes"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002017 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002018 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002019 if (list == NULL)
2020 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002021 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
2022 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002023 fdp->suffix, fdp->mode, fdp->type);
2024 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002025 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002026 return NULL;
2027 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002028 if (PyList_Append(list, item) < 0) {
2029 Py_DECREF(list);
2030 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002031 return NULL;
2032 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002033 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002034 }
2035 return list;
2036}
2037
Guido van Rossum79f25d91997-04-29 20:08:16 +00002038static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002039call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002040{
Tim Petersdbd9ba62000-07-09 03:09:57 +00002041 extern int fclose(FILE *);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002042 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002043 struct filedescr *fdp;
2044 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002045 FILE *fp = NULL;
2046
2047 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002048 if (path == Py_None)
2049 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002050 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
2051 if (fdp == NULL)
2052 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002053 if (fp != NULL) {
2054 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
2055 if (fob == NULL) {
2056 fclose(fp);
2057 return NULL;
2058 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002059 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002060 else {
2061 fob = Py_None;
2062 Py_INCREF(fob);
Tim Peters50d8d372001-02-28 05:34:27 +00002063 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002064 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002065 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002066 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002067 return ret;
2068}
2069
Guido van Rossum79f25d91997-04-29 20:08:16 +00002070static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002071imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002072{
2073 char *name;
2074 PyObject *path = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002075 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002076 return NULL;
2077 return call_find_module(name, path);
2078}
2079
2080static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002081imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002082{
2083 char *name;
2084 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002085 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002086 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002087 return NULL;
2088 ret = init_builtin(name);
2089 if (ret < 0)
2090 return NULL;
2091 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002092 Py_INCREF(Py_None);
2093 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002094 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002095 m = PyImport_AddModule(name);
2096 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002097 return m;
2098}
2099
Guido van Rossum79f25d91997-04-29 20:08:16 +00002100static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002101imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002102{
2103 char *name;
2104 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002105 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002106 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002107 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002108 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002109 if (ret < 0)
2110 return NULL;
2111 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002112 Py_INCREF(Py_None);
2113 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002114 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002115 m = PyImport_AddModule(name);
2116 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002117 return m;
2118}
2119
Guido van Rossum79f25d91997-04-29 20:08:16 +00002120static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002121imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002122{
2123 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002124
Guido van Rossum43713e52000-02-29 13:59:29 +00002125 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002126 return NULL;
2127 return get_frozen_object(name);
2128}
2129
Guido van Rossum79f25d91997-04-29 20:08:16 +00002130static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002131imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002132{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002133 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002134 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002135 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002136 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002137}
2138
Guido van Rossum79f25d91997-04-29 20:08:16 +00002139static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002140imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002141{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002142 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002143 struct _frozen *p;
Guido van Rossum43713e52000-02-29 13:59:29 +00002144 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002145 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002146 p = find_frozen(name);
2147 return PyInt_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002148}
2149
2150static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002151get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002152{
2153 FILE *fp;
2154 if (fob == NULL) {
2155 fp = fopen(pathname, mode);
2156 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002157 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002158 }
2159 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002160 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002161 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002162 PyErr_SetString(PyExc_ValueError,
2163 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002164 }
2165 return fp;
2166}
2167
Guido van Rossum79f25d91997-04-29 20:08:16 +00002168static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002169imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002170{
2171 char *name;
2172 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002173 PyObject *fob = NULL;
2174 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002175 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002176 if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002177 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002178 return NULL;
2179 fp = get_file(pathname, fob, "rb");
2180 if (fp == NULL)
2181 return NULL;
2182 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002183 if (fob == NULL)
2184 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002185 return m;
2186}
2187
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002188#ifdef HAVE_DYNAMIC_LOADING
2189
Guido van Rossum79f25d91997-04-29 20:08:16 +00002190static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002191imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002192{
2193 char *name;
2194 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002195 PyObject *fob = NULL;
2196 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002197 FILE *fp = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002198 if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002199 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002200 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002201 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002202 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002203 if (fp == NULL)
2204 return NULL;
2205 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002206 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002207 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002208}
2209
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002210#endif /* HAVE_DYNAMIC_LOADING */
2211
Guido van Rossum79f25d91997-04-29 20:08:16 +00002212static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002213imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002214{
2215 char *name;
2216 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002217 PyObject *fob = NULL;
2218 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002219 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002220 if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002221 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002222 return NULL;
2223 fp = get_file(pathname, fob, "r");
2224 if (fp == NULL)
2225 return NULL;
2226 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002227 if (fob == NULL)
2228 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002229 return m;
2230}
2231
Jack Jansen9c96a921995-02-15 22:57:06 +00002232#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002233static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002234imp_load_resource(PyObject *self, PyObject *args)
Jack Jansen9c96a921995-02-15 22:57:06 +00002235{
2236 char *name;
2237 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002238 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002239
Guido van Rossum43713e52000-02-29 13:59:29 +00002240 if (!PyArg_ParseTuple(args, "ss:load_resource", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002241 return NULL;
2242 m = PyMac_LoadResourceModule(name, pathname);
2243 return m;
2244}
2245#endif /* macintosh */
2246
Guido van Rossum79f25d91997-04-29 20:08:16 +00002247static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002248imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002249{
2250 char *name;
2251 PyObject *fob;
2252 char *pathname;
2253 char *suffix; /* Unused */
2254 char *mode;
2255 int type;
2256 FILE *fp;
2257
Guido van Rossum43713e52000-02-29 13:59:29 +00002258 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002259 &name, &fob, &pathname,
2260 &suffix, &mode, &type))
2261 return NULL;
2262 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
2263 PyErr_Format(PyExc_ValueError,
2264 "invalid file open mode %.200s", mode);
2265 return NULL;
2266 }
2267 if (fob == Py_None)
2268 fp = NULL;
2269 else {
2270 if (!PyFile_Check(fob)) {
2271 PyErr_SetString(PyExc_ValueError,
2272 "load_module arg#2 should be a file or None");
2273 return NULL;
2274 }
2275 fp = get_file(pathname, fob, mode);
2276 if (fp == NULL)
2277 return NULL;
2278 }
2279 return load_module(name, fp, pathname, type);
2280}
2281
2282static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002283imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002284{
2285 char *name;
2286 char *pathname;
Guido van Rossum43713e52000-02-29 13:59:29 +00002287 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002288 return NULL;
2289 return load_package(name, pathname);
2290}
2291
2292static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002293imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002294{
2295 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002296 if (!PyArg_ParseTuple(args, "s:new_module", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002297 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002298 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002299}
2300
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002301/* Doc strings */
2302
2303static char doc_imp[] = "\
2304This module provides the components needed to build your own\n\
2305__import__ function. Undocumented functions are obsolete.\n\
2306";
2307
2308static char doc_find_module[] = "\
2309find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
2310Search for a module. If path is omitted or None, search for a\n\
2311built-in, frozen or special module and continue search in sys.path.\n\
2312The module name cannot contain '.'; to search for a submodule of a\n\
2313package, pass the submodule name and the package's __path__.\
2314";
2315
2316static char doc_load_module[] = "\
2317load_module(name, file, filename, (suffix, mode, type)) -> module\n\
2318Load a module, given information returned by find_module().\n\
2319The module name must include the full package name, if any.\
2320";
2321
2322static char doc_get_magic[] = "\
2323get_magic() -> string\n\
2324Return the magic number for .pyc or .pyo files.\
2325";
2326
2327static char doc_get_suffixes[] = "\
2328get_suffixes() -> [(suffix, mode, type), ...]\n\
2329Return a list of (suffix, mode, type) tuples describing the files\n\
2330that find_module() looks for.\
2331";
2332
2333static char doc_new_module[] = "\
2334new_module(name) -> module\n\
2335Create a new module. Do not enter it in sys.modules.\n\
2336The module name must include the full package name, if any.\
2337";
2338
Guido van Rossum79f25d91997-04-29 20:08:16 +00002339static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002340 {"find_module", imp_find_module, 1, doc_find_module},
2341 {"get_magic", imp_get_magic, 1, doc_get_magic},
2342 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2343 {"load_module", imp_load_module, 1, doc_load_module},
2344 {"new_module", imp_new_module, 1, doc_new_module},
2345 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002346 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002347 {"init_builtin", imp_init_builtin, 1},
2348 {"init_frozen", imp_init_frozen, 1},
2349 {"is_builtin", imp_is_builtin, 1},
2350 {"is_frozen", imp_is_frozen, 1},
2351 {"load_compiled", imp_load_compiled, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002352#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002353 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002354#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002355 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002356#ifdef macintosh
2357 {"load_resource", imp_load_resource, 1},
2358#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002359 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002360 {NULL, NULL} /* sentinel */
2361};
2362
Guido van Rossum1a8791e1998-08-04 22:46:29 +00002363static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002364setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002365{
2366 PyObject *v;
2367 int err;
2368
2369 v = PyInt_FromLong((long)value);
2370 err = PyDict_SetItemString(d, name, v);
2371 Py_XDECREF(v);
2372 return err;
2373}
2374
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002375void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002376initimp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002377{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002378 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002379
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002380 m = Py_InitModule4("imp", imp_methods, doc_imp,
2381 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002382 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002383
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002384 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2385 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2386 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2387 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2388 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2389 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2390 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2391 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00002392 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002393
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002394 failure:
2395 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002396}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002397
2398
Guido van Rossumb18618d2000-05-03 23:44:39 +00002399/* API for embedding applications that want to add their own entries
2400 to the table of built-in modules. This should normally be called
2401 *before* Py_Initialize(). When the table resize fails, -1 is
2402 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002403
2404 After a similar function by Just van Rossum. */
2405
2406int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002407PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002408{
2409 static struct _inittab *our_copy = NULL;
2410 struct _inittab *p;
2411 int i, n;
2412
2413 /* Count the number of entries in both tables */
2414 for (n = 0; newtab[n].name != NULL; n++)
2415 ;
2416 if (n == 0)
2417 return 0; /* Nothing to do */
2418 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2419 ;
2420
2421 /* Allocate new memory for the combined table */
Guido van Rossumb18618d2000-05-03 23:44:39 +00002422 p = our_copy;
2423 PyMem_RESIZE(p, struct _inittab, i+n+1);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002424 if (p == NULL)
2425 return -1;
2426
2427 /* Copy the tables into the new memory */
2428 if (our_copy != PyImport_Inittab)
2429 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2430 PyImport_Inittab = our_copy = p;
2431 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
2432
2433 return 0;
2434}
2435
2436/* Shorthand to add a single entry given a name and a function */
2437
2438int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002439PyImport_AppendInittab(char *name, void (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002440{
2441 struct _inittab newtab[2];
2442
2443 memset(newtab, '\0', sizeof newtab);
2444
2445 newtab[0].name = name;
2446 newtab[0].initfunc = initfunc;
2447
2448 return PyImport_ExtendInittab(newtab);
2449}