blob: 74437246325fd83e694079ffc93b80db6cc8efe3 [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 Rossum79f25d91997-04-29 20:08:16 +00001792 PyObject *m;
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 Rossum17fc85f1997-09-06 18:52:03 +00001832 if (m != NULL && mod != Py_None) {
1833 if (PyObject_SetAttrString(mod, subname, m) < 0) {
1834 Py_DECREF(m);
1835 m = NULL;
1836 }
1837 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001838 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001839
1840 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001841}
1842
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001843
1844/* Re-import a module of any kind and return its module object, WITH
1845 INCREMENTED REFERENCE COUNT */
1846
Guido van Rossum79f25d91997-04-29 20:08:16 +00001847PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001848PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001849{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001850 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001851 PyObject *path = NULL;
1852 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001853 char buf[MAXPATHLEN+1];
1854 struct filedescr *fdp;
1855 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001856
Guido van Rossum79f25d91997-04-29 20:08:16 +00001857 if (m == NULL || !PyModule_Check(m)) {
1858 PyErr_SetString(PyExc_TypeError,
1859 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001860 return NULL;
1861 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001862 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001863 if (name == NULL)
1864 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001865 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001866 PyErr_Format(PyExc_ImportError,
1867 "reload(): module %.200s not in sys.modules",
1868 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001869 return NULL;
1870 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001871 subname = strrchr(name, '.');
1872 if (subname == NULL)
1873 subname = name;
1874 else {
1875 PyObject *parentname, *parent;
1876 parentname = PyString_FromStringAndSize(name, (subname-name));
1877 if (parentname == NULL)
1878 return NULL;
1879 parent = PyDict_GetItem(modules, parentname);
Barry Warsaw38793331999-01-27 17:54:20 +00001880 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00001881 if (parent == NULL) {
1882 PyErr_Format(PyExc_ImportError,
1883 "reload(): parent %.200s not in sys.modules",
1884 name);
1885 return NULL;
1886 }
1887 subname++;
1888 path = PyObject_GetAttrString(parent, "__path__");
1889 if (path == NULL)
1890 PyErr_Clear();
1891 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001892 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001893 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1894 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001895 if (fdp == NULL)
1896 return NULL;
1897 m = load_module(name, fp, buf, fdp->type);
1898 if (fp)
1899 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001900 return m;
1901}
1902
1903
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001904/* Higher-level import emulator which emulates the "import" statement
1905 more accurately -- it invokes the __import__() function from the
1906 builtins of the current globals. This means that the import is
1907 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00001908 environment, e.g. by "rexec".
1909 A dummy list ["__doc__"] is passed as the 4th argument so that
1910 e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
1911 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001912
1913PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001914PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001915{
1916 static PyObject *silly_list = NULL;
1917 static PyObject *builtins_str = NULL;
1918 static PyObject *import_str = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001919 PyObject *globals = NULL;
1920 PyObject *import = NULL;
1921 PyObject *builtins = NULL;
1922 PyObject *r = NULL;
1923
1924 /* Initialize constant string objects */
1925 if (silly_list == NULL) {
1926 import_str = PyString_InternFromString("__import__");
1927 if (import_str == NULL)
1928 return NULL;
1929 builtins_str = PyString_InternFromString("__builtins__");
1930 if (builtins_str == NULL)
1931 return NULL;
1932 silly_list = Py_BuildValue("[s]", "__doc__");
1933 if (silly_list == NULL)
1934 return NULL;
1935 }
1936
1937 /* Get the builtins from current globals */
1938 globals = PyEval_GetGlobals();
Guido van Rossum85cd1d62001-02-20 21:43:24 +00001939 if (globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00001940 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001941 builtins = PyObject_GetItem(globals, builtins_str);
1942 if (builtins == NULL)
1943 goto err;
1944 }
1945 else {
1946 /* No globals -- use standard builtins, and fake globals */
1947 PyErr_Clear();
1948
Guido van Rossum85cd1d62001-02-20 21:43:24 +00001949 builtins = PyImport_ImportModuleEx("__builtin__",
1950 NULL, NULL, NULL);
1951 if (builtins == NULL)
1952 return NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001953 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1954 if (globals == NULL)
1955 goto err;
1956 }
1957
1958 /* Get the __import__ function from the builtins */
1959 if (PyDict_Check(builtins))
Fred Drakea76ba6e2001-03-06 06:31:15 +00001960 import = PyObject_GetItem(builtins, import_str);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001961 else
Fred Drakea76ba6e2001-03-06 06:31:15 +00001962 import = PyObject_GetAttr(builtins, import_str);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001963 if (import == NULL)
1964 goto err;
1965
1966 /* Call the _import__ function with the proper argument list */
1967 r = PyObject_CallFunction(import, "OOOO",
1968 module_name, globals, globals, silly_list);
1969
1970 err:
1971 Py_XDECREF(globals);
1972 Py_XDECREF(builtins);
1973 Py_XDECREF(import);
Tim Peters50d8d372001-02-28 05:34:27 +00001974
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001975 return r;
1976}
1977
1978
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001979/* Module 'imp' provides Python access to the primitives used for
1980 importing modules.
1981*/
1982
Guido van Rossum79f25d91997-04-29 20:08:16 +00001983static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001984imp_get_magic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001985{
1986 char buf[4];
1987
Guido van Rossum43713e52000-02-29 13:59:29 +00001988 if (!PyArg_ParseTuple(args, ":get_magic"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001989 return NULL;
Guido van Rossum96774c12000-05-01 20:19:08 +00001990 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
1991 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
1992 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
1993 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001994
Guido van Rossum79f25d91997-04-29 20:08:16 +00001995 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001996}
1997
Guido van Rossum79f25d91997-04-29 20:08:16 +00001998static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001999imp_get_suffixes(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002000{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002001 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002002 struct filedescr *fdp;
2003
Guido van Rossum43713e52000-02-29 13:59:29 +00002004 if (!PyArg_ParseTuple(args, ":get_suffixes"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002005 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002006 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002007 if (list == NULL)
2008 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002009 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
2010 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002011 fdp->suffix, fdp->mode, fdp->type);
2012 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002013 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002014 return NULL;
2015 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002016 if (PyList_Append(list, item) < 0) {
2017 Py_DECREF(list);
2018 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002019 return NULL;
2020 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002021 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002022 }
2023 return list;
2024}
2025
Guido van Rossum79f25d91997-04-29 20:08:16 +00002026static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002027call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002028{
Tim Petersdbd9ba62000-07-09 03:09:57 +00002029 extern int fclose(FILE *);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002030 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002031 struct filedescr *fdp;
2032 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002033 FILE *fp = NULL;
2034
2035 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002036 if (path == Py_None)
2037 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002038 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
2039 if (fdp == NULL)
2040 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002041 if (fp != NULL) {
2042 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
2043 if (fob == NULL) {
2044 fclose(fp);
2045 return NULL;
2046 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002047 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002048 else {
2049 fob = Py_None;
2050 Py_INCREF(fob);
Tim Peters50d8d372001-02-28 05:34:27 +00002051 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002052 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002053 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002054 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002055 return ret;
2056}
2057
Guido van Rossum79f25d91997-04-29 20:08:16 +00002058static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002059imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002060{
2061 char *name;
2062 PyObject *path = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002063 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002064 return NULL;
2065 return call_find_module(name, path);
2066}
2067
2068static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002069imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002070{
2071 char *name;
2072 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002073 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002074 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002075 return NULL;
2076 ret = init_builtin(name);
2077 if (ret < 0)
2078 return NULL;
2079 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002080 Py_INCREF(Py_None);
2081 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002082 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002083 m = PyImport_AddModule(name);
2084 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002085 return m;
2086}
2087
Guido van Rossum79f25d91997-04-29 20:08:16 +00002088static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002089imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002090{
2091 char *name;
2092 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002093 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002094 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002095 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002096 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002097 if (ret < 0)
2098 return NULL;
2099 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002100 Py_INCREF(Py_None);
2101 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002102 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002103 m = PyImport_AddModule(name);
2104 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002105 return m;
2106}
2107
Guido van Rossum79f25d91997-04-29 20:08:16 +00002108static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002109imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002110{
2111 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002112
Guido van Rossum43713e52000-02-29 13:59:29 +00002113 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002114 return NULL;
2115 return get_frozen_object(name);
2116}
2117
Guido van Rossum79f25d91997-04-29 20:08:16 +00002118static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002119imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002120{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002121 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002122 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002123 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002124 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002125}
2126
Guido van Rossum79f25d91997-04-29 20:08:16 +00002127static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002128imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002129{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002130 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002131 struct _frozen *p;
Guido van Rossum43713e52000-02-29 13:59:29 +00002132 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002133 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002134 p = find_frozen(name);
2135 return PyInt_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002136}
2137
2138static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002139get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002140{
2141 FILE *fp;
2142 if (fob == NULL) {
2143 fp = fopen(pathname, mode);
2144 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002145 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002146 }
2147 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002148 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002149 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002150 PyErr_SetString(PyExc_ValueError,
2151 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002152 }
2153 return fp;
2154}
2155
Guido van Rossum79f25d91997-04-29 20:08:16 +00002156static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002157imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002158{
2159 char *name;
2160 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002161 PyObject *fob = NULL;
2162 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002163 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002164 if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002165 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002166 return NULL;
2167 fp = get_file(pathname, fob, "rb");
2168 if (fp == NULL)
2169 return NULL;
2170 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002171 if (fob == NULL)
2172 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002173 return m;
2174}
2175
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002176#ifdef HAVE_DYNAMIC_LOADING
2177
Guido van Rossum79f25d91997-04-29 20:08:16 +00002178static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002179imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002180{
2181 char *name;
2182 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002183 PyObject *fob = NULL;
2184 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002185 FILE *fp = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002186 if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002187 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002188 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002189 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002190 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002191 if (fp == NULL)
2192 return NULL;
2193 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002194 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002195 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002196}
2197
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002198#endif /* HAVE_DYNAMIC_LOADING */
2199
Guido van Rossum79f25d91997-04-29 20:08:16 +00002200static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002201imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002202{
2203 char *name;
2204 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002205 PyObject *fob = NULL;
2206 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002207 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002208 if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002209 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002210 return NULL;
2211 fp = get_file(pathname, fob, "r");
2212 if (fp == NULL)
2213 return NULL;
2214 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002215 if (fob == NULL)
2216 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002217 return m;
2218}
2219
Jack Jansen9c96a921995-02-15 22:57:06 +00002220#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002221static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002222imp_load_resource(PyObject *self, PyObject *args)
Jack Jansen9c96a921995-02-15 22:57:06 +00002223{
2224 char *name;
2225 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002226 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002227
Guido van Rossum43713e52000-02-29 13:59:29 +00002228 if (!PyArg_ParseTuple(args, "ss:load_resource", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002229 return NULL;
2230 m = PyMac_LoadResourceModule(name, pathname);
2231 return m;
2232}
2233#endif /* macintosh */
2234
Guido van Rossum79f25d91997-04-29 20:08:16 +00002235static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002236imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002237{
2238 char *name;
2239 PyObject *fob;
2240 char *pathname;
2241 char *suffix; /* Unused */
2242 char *mode;
2243 int type;
2244 FILE *fp;
2245
Guido van Rossum43713e52000-02-29 13:59:29 +00002246 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002247 &name, &fob, &pathname,
2248 &suffix, &mode, &type))
2249 return NULL;
2250 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
2251 PyErr_Format(PyExc_ValueError,
2252 "invalid file open mode %.200s", mode);
2253 return NULL;
2254 }
2255 if (fob == Py_None)
2256 fp = NULL;
2257 else {
2258 if (!PyFile_Check(fob)) {
2259 PyErr_SetString(PyExc_ValueError,
2260 "load_module arg#2 should be a file or None");
2261 return NULL;
2262 }
2263 fp = get_file(pathname, fob, mode);
2264 if (fp == NULL)
2265 return NULL;
2266 }
2267 return load_module(name, fp, pathname, type);
2268}
2269
2270static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002271imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002272{
2273 char *name;
2274 char *pathname;
Guido van Rossum43713e52000-02-29 13:59:29 +00002275 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002276 return NULL;
2277 return load_package(name, pathname);
2278}
2279
2280static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002281imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002282{
2283 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002284 if (!PyArg_ParseTuple(args, "s:new_module", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002285 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002286 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002287}
2288
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002289/* Doc strings */
2290
2291static char doc_imp[] = "\
2292This module provides the components needed to build your own\n\
2293__import__ function. Undocumented functions are obsolete.\n\
2294";
2295
2296static char doc_find_module[] = "\
2297find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
2298Search for a module. If path is omitted or None, search for a\n\
2299built-in, frozen or special module and continue search in sys.path.\n\
2300The module name cannot contain '.'; to search for a submodule of a\n\
2301package, pass the submodule name and the package's __path__.\
2302";
2303
2304static char doc_load_module[] = "\
2305load_module(name, file, filename, (suffix, mode, type)) -> module\n\
2306Load a module, given information returned by find_module().\n\
2307The module name must include the full package name, if any.\
2308";
2309
2310static char doc_get_magic[] = "\
2311get_magic() -> string\n\
2312Return the magic number for .pyc or .pyo files.\
2313";
2314
2315static char doc_get_suffixes[] = "\
2316get_suffixes() -> [(suffix, mode, type), ...]\n\
2317Return a list of (suffix, mode, type) tuples describing the files\n\
2318that find_module() looks for.\
2319";
2320
2321static char doc_new_module[] = "\
2322new_module(name) -> module\n\
2323Create a new module. Do not enter it in sys.modules.\n\
2324The module name must include the full package name, if any.\
2325";
2326
Guido van Rossum79f25d91997-04-29 20:08:16 +00002327static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002328 {"find_module", imp_find_module, 1, doc_find_module},
2329 {"get_magic", imp_get_magic, 1, doc_get_magic},
2330 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2331 {"load_module", imp_load_module, 1, doc_load_module},
2332 {"new_module", imp_new_module, 1, doc_new_module},
2333 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002334 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002335 {"init_builtin", imp_init_builtin, 1},
2336 {"init_frozen", imp_init_frozen, 1},
2337 {"is_builtin", imp_is_builtin, 1},
2338 {"is_frozen", imp_is_frozen, 1},
2339 {"load_compiled", imp_load_compiled, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002340#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002341 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002342#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002343 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002344#ifdef macintosh
2345 {"load_resource", imp_load_resource, 1},
2346#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002347 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002348 {NULL, NULL} /* sentinel */
2349};
2350
Guido van Rossum1a8791e1998-08-04 22:46:29 +00002351static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002352setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002353{
2354 PyObject *v;
2355 int err;
2356
2357 v = PyInt_FromLong((long)value);
2358 err = PyDict_SetItemString(d, name, v);
2359 Py_XDECREF(v);
2360 return err;
2361}
2362
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002363void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002364initimp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002365{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002366 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002367
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002368 m = Py_InitModule4("imp", imp_methods, doc_imp,
2369 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002370 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002371
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002372 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2373 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2374 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2375 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2376 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2377 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2378 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2379 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00002380 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002381
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002382 failure:
2383 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002384}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002385
2386
Guido van Rossumb18618d2000-05-03 23:44:39 +00002387/* API for embedding applications that want to add their own entries
2388 to the table of built-in modules. This should normally be called
2389 *before* Py_Initialize(). When the table resize fails, -1 is
2390 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002391
2392 After a similar function by Just van Rossum. */
2393
2394int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002395PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002396{
2397 static struct _inittab *our_copy = NULL;
2398 struct _inittab *p;
2399 int i, n;
2400
2401 /* Count the number of entries in both tables */
2402 for (n = 0; newtab[n].name != NULL; n++)
2403 ;
2404 if (n == 0)
2405 return 0; /* Nothing to do */
2406 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2407 ;
2408
2409 /* Allocate new memory for the combined table */
Guido van Rossumb18618d2000-05-03 23:44:39 +00002410 p = our_copy;
2411 PyMem_RESIZE(p, struct _inittab, i+n+1);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002412 if (p == NULL)
2413 return -1;
2414
2415 /* Copy the tables into the new memory */
2416 if (our_copy != PyImport_Inittab)
2417 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2418 PyImport_Inittab = our_copy = p;
2419 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
2420
2421 return 0;
2422}
2423
2424/* Shorthand to add a single entry given a name and a function */
2425
2426int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002427PyImport_AppendInittab(char *name, void (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002428{
2429 struct _inittab newtab[2];
2430
2431 memset(newtab, '\0', sizeof newtab);
2432
2433 newtab[0].name = name;
2434 newtab[0].initfunc = initfunc;
2435
2436 return PyImport_ExtendInittab(newtab);
2437}