blob: a97d0c66ece829dd4b33d2c0c1179e8749bec8f4 [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 Rossumaee0bad1997-09-05 07:33:22 +000022/* We expect that stat exists on most systems.
23 It's confirmed on Unix, Mac and Windows.
24 If you don't have it, add #define DONT_HAVE_STAT to your config.h. */
25#ifndef DONT_HAVE_STAT
26#define HAVE_STAT
27
Guido van Rossum2571cc81999-04-07 16:07:23 +000028#ifndef DONT_HAVE_SYS_TYPES_H
Guido van Rossumaee0bad1997-09-05 07:33:22 +000029#include <sys/types.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +000030#endif
Guido van Rossum55a83382000-09-20 20:31:38 +000031
Guido van Rossum2571cc81999-04-07 16:07:23 +000032#ifndef DONT_HAVE_SYS_STAT_H
Guido van Rossumaee0bad1997-09-05 07:33:22 +000033#include <sys/stat.h>
Guido van Rossum63e97ad2000-07-01 01:06:56 +000034#elif defined(HAVE_STAT_H)
35#include <stat.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +000036#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +000037
Guido van Rossum55a83382000-09-20 20:31:38 +000038#ifdef HAVE_FCNTL_H
39#include <fcntl.h>
40#endif
41
Guido van Rossum595d7ba1997-12-05 21:45:29 +000042#if defined(PYCC_VACPP)
43/* VisualAge C/C++ Failed to Define MountType Field in sys/stat.h */
44#define S_IFMT (S_IFDIR|S_IFCHR|S_IFREG)
45#endif
46
Guido van Rossumaee0bad1997-09-05 07:33:22 +000047#ifndef S_ISDIR
48#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
49#endif
50
51#endif
52
53
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000054extern time_t PyOS_GetLastModificationTime(char *, FILE *);
55 /* In getmtime.c */
Guido van Rossum21d335e1993-10-15 13:01:11 +000056
Guido van Rossum6c849691994-09-26 15:47:17 +000057/* Magic word to reject .pyc files generated by other Python versions */
Guido van Rossum7faeab31995-07-07 22:50:36 +000058/* Change for each incompatible change */
59/* The value of CR and LF is incorporated so if you ever read or write
60 a .pyc file in text mode the magic number will be wrong; also, the
61 Apple MPW compiler swaps their values, botching string constants */
62/* XXX Perhaps the magic number should be frozen and a version field
63 added to the .pyc file header? */
Guido van Rossumdd5db431997-01-17 21:06:11 +000064/* New way to come up with the magic number: (YEAR-1995), MONTH, DAY */
Thomas Woutersdd13e4f2000-08-27 20:31:27 +000065#define MAGIC (50823 | ((long)'\r'<<16) | ((long)'\n'<<24))
Guido van Rossum3ddee711991-12-16 13:06:34 +000066
Guido van Rossum96774c12000-05-01 20:19:08 +000067/* Magic word as global; note that _PyImport_Init() can change the
Jeremy Hylton9262b8a2000-06-30 04:59:17 +000068 value of this global to accommodate for alterations of how the
Guido van Rossum96774c12000-05-01 20:19:08 +000069 compiler works which are enabled by command line switches. */
70static long pyc_magic = MAGIC;
71
Guido van Rossum25ce5661997-08-02 03:10:38 +000072/* See _PyImport_FixupExtension() below */
73static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000074
Guido van Rossum771c6c81997-10-31 18:37:24 +000075/* This table is defined in config.c: */
76extern struct _inittab _PyImport_Inittab[];
77
78struct _inittab *PyImport_Inittab = _PyImport_Inittab;
Guido van Rossum66f1fa81991-04-03 19:03:52 +000079
Guido van Rossumed1170e1999-12-20 21:23:41 +000080/* these tables define the module suffixes that Python recognizes */
81struct filedescr * _PyImport_Filetab = NULL;
82static const struct filedescr _PyImport_StandardFiletab[] = {
83 {".py", "r", PY_SOURCE},
84 {".pyc", "rb", PY_COMPILED},
85 {0, 0}
86};
87
Guido van Rossum1ae940a1995-01-02 19:04:15 +000088/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000089
90void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000091_PyImport_Init(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000092{
Guido van Rossumed1170e1999-12-20 21:23:41 +000093 const struct filedescr *scan;
94 struct filedescr *filetab;
95 int countD = 0;
96 int countS = 0;
97
98 /* prepare _PyImport_Filetab: copy entries from
99 _PyImport_DynLoadFiletab and _PyImport_StandardFiletab.
100 */
101 for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan)
102 ++countD;
103 for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan)
104 ++countS;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000105 filetab = PyMem_NEW(struct filedescr, countD + countS + 1);
Guido van Rossumed1170e1999-12-20 21:23:41 +0000106 memcpy(filetab, _PyImport_DynLoadFiletab,
107 countD * sizeof(struct filedescr));
108 memcpy(filetab + countD, _PyImport_StandardFiletab,
109 countS * sizeof(struct filedescr));
110 filetab[countD + countS].suffix = NULL;
111
112 _PyImport_Filetab = filetab;
113
Guido van Rossum0824f631997-03-11 18:37:35 +0000114 if (Py_OptimizeFlag) {
Guido van Rossumed1170e1999-12-20 21:23:41 +0000115 /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */
116 for (; filetab->suffix != NULL; filetab++) {
117 if (strcmp(filetab->suffix, ".pyc") == 0)
118 filetab->suffix = ".pyo";
Guido van Rossum0824f631997-03-11 18:37:35 +0000119 }
120 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000121
122 if (Py_UnicodeFlag) {
123 /* Fix the pyc_magic so that byte compiled code created
124 using the all-Unicode method doesn't interfere with
125 code created in normal operation mode. */
126 pyc_magic = MAGIC + 1;
127 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000128}
129
Guido van Rossum25ce5661997-08-02 03:10:38 +0000130void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000131_PyImport_Fini(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000132{
133 Py_XDECREF(extensions);
134 extensions = NULL;
Barry Warsaw84294482000-10-03 16:02:05 +0000135 PyMem_DEL(_PyImport_Filetab);
136 _PyImport_Filetab = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000137}
138
139
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000140/* Locking primitives to prevent parallel imports of the same module
141 in different threads to return with a partially loaded module.
142 These calls are serialized by the global interpreter lock. */
143
144#ifdef WITH_THREAD
145
Guido van Rossum49b56061998-10-01 20:42:43 +0000146#include "pythread.h"
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000147
Guido van Rossum65d5b571998-12-21 19:32:43 +0000148static PyThread_type_lock import_lock = 0;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000149static long import_lock_thread = -1;
150static int import_lock_level = 0;
151
152static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000153lock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000154{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000155 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000156 if (me == -1)
157 return; /* Too bad */
158 if (import_lock == NULL)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000159 import_lock = PyThread_allocate_lock();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000160 if (import_lock_thread == me) {
161 import_lock_level++;
162 return;
163 }
Guido van Rossum65d5b571998-12-21 19:32:43 +0000164 if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0)) {
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000165 PyThreadState *tstate = PyEval_SaveThread();
Guido van Rossum65d5b571998-12-21 19:32:43 +0000166 PyThread_acquire_lock(import_lock, 1);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000167 PyEval_RestoreThread(tstate);
168 }
169 import_lock_thread = me;
170 import_lock_level = 1;
171}
172
173static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000174unlock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000175{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000176 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000177 if (me == -1)
178 return; /* Too bad */
179 if (import_lock_thread != me)
180 Py_FatalError("unlock_import: not holding the import lock");
181 import_lock_level--;
182 if (import_lock_level == 0) {
183 import_lock_thread = -1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000184 PyThread_release_lock(import_lock);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000185 }
186}
187
188#else
189
190#define lock_import()
191#define unlock_import()
192
193#endif
194
Guido van Rossum25ce5661997-08-02 03:10:38 +0000195/* Helper for sys */
196
197PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000198PyImport_GetModuleDict(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000199{
200 PyInterpreterState *interp = PyThreadState_Get()->interp;
201 if (interp->modules == NULL)
202 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
203 return interp->modules;
204}
205
Guido van Rossum3f5da241990-12-20 15:06:42 +0000206
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000207/* List of names to clear in sys */
208static char* sys_deletes[] = {
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000209 "path", "argv", "ps1", "ps2", "exitfunc",
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000210 "exc_type", "exc_value", "exc_traceback",
211 "last_type", "last_value", "last_traceback",
212 NULL
213};
214
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000215static char* sys_files[] = {
216 "stdin", "__stdin__",
217 "stdout", "__stdout__",
218 "stderr", "__stderr__",
219 NULL
220};
221
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000222
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000223/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000224
Guido van Rossum3f5da241990-12-20 15:06:42 +0000225void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000226PyImport_Cleanup(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000227{
Guido van Rossum758eec01998-01-19 21:58:26 +0000228 int pos, ndone;
229 char *name;
230 PyObject *key, *value, *dict;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000231 PyInterpreterState *interp = PyThreadState_Get()->interp;
Guido van Rossum758eec01998-01-19 21:58:26 +0000232 PyObject *modules = interp->modules;
233
234 if (modules == NULL)
235 return; /* Already done */
236
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000237 /* Delete some special variables first. These are common
238 places where user values hide and people complain when their
239 destructors fail. Since the modules containing them are
240 deleted *last* of all, they would come too late in the normal
241 destruction order. Sigh. */
242
243 value = PyDict_GetItemString(modules, "__builtin__");
244 if (value != NULL && PyModule_Check(value)) {
245 dict = PyModule_GetDict(value);
246 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000247 PySys_WriteStderr("# clear __builtin__._\n");
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000248 PyDict_SetItemString(dict, "_", Py_None);
249 }
250 value = PyDict_GetItemString(modules, "sys");
251 if (value != NULL && PyModule_Check(value)) {
252 char **p;
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000253 PyObject *v;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000254 dict = PyModule_GetDict(value);
255 for (p = sys_deletes; *p != NULL; p++) {
256 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000257 PySys_WriteStderr("# clear sys.%s\n", *p);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000258 PyDict_SetItemString(dict, *p, Py_None);
259 }
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000260 for (p = sys_files; *p != NULL; p+=2) {
261 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000262 PySys_WriteStderr("# restore sys.%s\n", *p);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000263 v = PyDict_GetItemString(dict, *(p+1));
264 if (v == NULL)
265 v = Py_None;
266 PyDict_SetItemString(dict, *p, v);
267 }
268 }
269
270 /* First, delete __main__ */
271 value = PyDict_GetItemString(modules, "__main__");
272 if (value != NULL && PyModule_Check(value)) {
273 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000274 PySys_WriteStderr("# cleanup __main__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000275 _PyModule_Clear(value);
276 PyDict_SetItemString(modules, "__main__", Py_None);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000277 }
278
Guido van Rossum758eec01998-01-19 21:58:26 +0000279 /* The special treatment of __builtin__ here is because even
280 when it's not referenced as a module, its dictionary is
281 referenced by almost every module's __builtins__. Since
282 deleting a module clears its dictionary (even if there are
283 references left to it), we need to delete the __builtin__
284 module last. Likewise, we don't delete sys until the very
285 end because it is implicitly referenced (e.g. by print).
286
287 Also note that we 'delete' modules by replacing their entry
288 in the modules dict with None, rather than really deleting
289 them; this avoids a rehash of the modules dictionary and
290 also marks them as "non existent" so they won't be
291 re-imported. */
292
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000293 /* Next, repeatedly delete modules with a reference count of
Guido van Rossum758eec01998-01-19 21:58:26 +0000294 one (skipping __builtin__ and sys) and delete them */
295 do {
296 ndone = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000297 pos = 0;
Guido van Rossum758eec01998-01-19 21:58:26 +0000298 while (PyDict_Next(modules, &pos, &key, &value)) {
299 if (value->ob_refcnt != 1)
300 continue;
Guido van Rossum566373e1998-10-01 15:24:50 +0000301 if (PyString_Check(key) && PyModule_Check(value)) {
302 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000303 if (strcmp(name, "__builtin__") == 0)
304 continue;
305 if (strcmp(name, "sys") == 0)
306 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000307 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000308 PySys_WriteStderr(
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000309 "# cleanup[1] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000310 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000311 PyDict_SetItem(modules, key, Py_None);
312 ndone++;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000313 }
314 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000315 } while (ndone > 0);
316
Guido van Rossum758eec01998-01-19 21:58:26 +0000317 /* Next, delete all modules (still skipping __builtin__ and sys) */
318 pos = 0;
319 while (PyDict_Next(modules, &pos, &key, &value)) {
Guido van Rossum566373e1998-10-01 15:24:50 +0000320 if (PyString_Check(key) && PyModule_Check(value)) {
321 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000322 if (strcmp(name, "__builtin__") == 0)
323 continue;
324 if (strcmp(name, "sys") == 0)
325 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000326 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000327 PySys_WriteStderr("# cleanup[2] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000328 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000329 PyDict_SetItem(modules, key, Py_None);
330 }
331 }
332
333 /* Next, delete sys and __builtin__ (in that order) */
334 value = PyDict_GetItemString(modules, "sys");
335 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000336 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000337 PySys_WriteStderr("# cleanup sys\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000338 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000339 PyDict_SetItemString(modules, "sys", Py_None);
340 }
341 value = PyDict_GetItemString(modules, "__builtin__");
342 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000343 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000344 PySys_WriteStderr("# cleanup __builtin__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000345 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000346 PyDict_SetItemString(modules, "__builtin__", Py_None);
347 }
348
349 /* Finally, clear and delete the modules directory */
350 PyDict_Clear(modules);
351 interp->modules = NULL;
352 Py_DECREF(modules);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000353}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000354
355
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000356/* Helper for pythonrun.c -- return magic number */
357
358long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000359PyImport_GetMagicNumber(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000360{
Guido van Rossum96774c12000-05-01 20:19:08 +0000361 return pyc_magic;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000362}
363
364
Guido van Rossum25ce5661997-08-02 03:10:38 +0000365/* Magic for extension modules (built-in as well as dynamically
366 loaded). To prevent initializing an extension module more than
367 once, we keep a static dictionary 'extensions' keyed by module name
368 (for built-in modules) or by filename (for dynamically loaded
369 modules), containing these modules. A copy od the module's
370 dictionary is stored by calling _PyImport_FixupExtension()
371 immediately after the module initialization function succeeds. A
372 copy can be retrieved from there by calling
373 _PyImport_FindExtension(). */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000374
Guido van Rossum79f25d91997-04-29 20:08:16 +0000375PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000376_PyImport_FixupExtension(char *name, char *filename)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000377{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000378 PyObject *modules, *mod, *dict, *copy;
379 if (extensions == NULL) {
380 extensions = PyDict_New();
381 if (extensions == NULL)
382 return NULL;
383 }
384 modules = PyImport_GetModuleDict();
385 mod = PyDict_GetItemString(modules, name);
386 if (mod == NULL || !PyModule_Check(mod)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000387 PyErr_Format(PyExc_SystemError,
388 "_PyImport_FixupExtension: module %.200s not loaded", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000389 return NULL;
390 }
391 dict = PyModule_GetDict(mod);
392 if (dict == NULL)
393 return NULL;
394 copy = PyObject_CallMethod(dict, "copy", "");
395 if (copy == NULL)
396 return NULL;
397 PyDict_SetItemString(extensions, filename, copy);
398 Py_DECREF(copy);
399 return copy;
400}
401
402PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000403_PyImport_FindExtension(char *name, char *filename)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000404{
405 PyObject *dict, *mod, *mdict, *result;
406 if (extensions == NULL)
407 return NULL;
408 dict = PyDict_GetItemString(extensions, filename);
409 if (dict == NULL)
410 return NULL;
411 mod = PyImport_AddModule(name);
412 if (mod == NULL)
413 return NULL;
414 mdict = PyModule_GetDict(mod);
415 if (mdict == NULL)
416 return NULL;
417 result = PyObject_CallMethod(mdict, "update", "O", dict);
418 if (result == NULL)
419 return NULL;
420 Py_DECREF(result);
421 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000422 PySys_WriteStderr("import %s # previously loaded (%s)\n",
Guido van Rossum25ce5661997-08-02 03:10:38 +0000423 name, filename);
424 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000425}
426
427
428/* Get the module object corresponding to a module name.
429 First check the modules dictionary if there's one there,
430 if not, create a new one and insert in in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000431 Because the former action is most common, THIS DOES NOT RETURN A
432 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000433
Guido van Rossum79f25d91997-04-29 20:08:16 +0000434PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000435PyImport_AddModule(char *name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000436{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000437 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000438 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000439
Guido van Rossum25ce5661997-08-02 03:10:38 +0000440 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
Guido van Rossum79f25d91997-04-29 20:08:16 +0000441 PyModule_Check(m))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000442 return m;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000443 m = PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000444 if (m == NULL)
445 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000446 if (PyDict_SetItemString(modules, name, m) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000447 Py_DECREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000448 return NULL;
449 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000450 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000451
452 return m;
453}
454
455
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000456/* Execute a code object in a module and return the module object
457 WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000458
Guido van Rossum79f25d91997-04-29 20:08:16 +0000459PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000460PyImport_ExecCodeModule(char *name, PyObject *co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000461{
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000462 return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
463}
464
465PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000466PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname)
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000467{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000468 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000469 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000470
Guido van Rossum79f25d91997-04-29 20:08:16 +0000471 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000472 if (m == NULL)
473 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000474 d = PyModule_GetDict(m);
475 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
476 if (PyDict_SetItemString(d, "__builtins__",
477 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000478 return NULL;
479 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000480 /* Remember the filename as the __file__ attribute */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000481 v = NULL;
482 if (pathname != NULL) {
483 v = PyString_FromString(pathname);
484 if (v == NULL)
485 PyErr_Clear();
486 }
487 if (v == NULL) {
488 v = ((PyCodeObject *)co)->co_filename;
489 Py_INCREF(v);
490 }
491 if (PyDict_SetItemString(d, "__file__", v) != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000492 PyErr_Clear(); /* Not important enough to report */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000493 Py_DECREF(v);
494
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000495 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000496 if (v == NULL)
497 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000498 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000499
Guido van Rossum25ce5661997-08-02 03:10:38 +0000500 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000501 PyErr_Format(PyExc_ImportError,
502 "Loaded module %.200s not found in sys.modules",
503 name);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000504 return NULL;
505 }
506
Guido van Rossum79f25d91997-04-29 20:08:16 +0000507 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000508
509 return m;
510}
511
512
513/* Given a pathname for a Python source file, fill a buffer with the
514 pathname for the corresponding compiled file. Return the pathname
515 for the compiled file, or NULL if there's no space in the buffer.
516 Doesn't set an exception. */
517
518static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000519make_compiled_pathname(char *pathname, char *buf, size_t buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000520{
Fred Drake4c82b232000-06-30 16:18:57 +0000521 size_t len;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000522
523 len = strlen(pathname);
524 if (len+2 > buflen)
525 return NULL;
526 strcpy(buf, pathname);
Guido van Rossum0824f631997-03-11 18:37:35 +0000527 strcpy(buf+len, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000528
529 return buf;
530}
531
532
533/* Given a pathname for a Python source file, its time of last
534 modification, and a pathname for a compiled file, check whether the
535 compiled file represents the same version of the source. If so,
536 return a FILE pointer for the compiled file, positioned just after
537 the header; if not, return NULL.
538 Doesn't set an exception. */
539
540static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000541check_compiled_module(char *pathname, long mtime, char *cpathname)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000542{
543 FILE *fp;
544 long magic;
545 long pyc_mtime;
546
547 fp = fopen(cpathname, "rb");
548 if (fp == NULL)
549 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000550 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000551 if (magic != pyc_magic) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000552 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000553 PySys_WriteStderr("# %s has bad magic\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000554 fclose(fp);
555 return NULL;
556 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000557 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000558 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000559 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000560 PySys_WriteStderr("# %s has bad mtime\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000561 fclose(fp);
562 return NULL;
563 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000564 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000565 PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000566 return fp;
567}
568
569
570/* Read a code object from a file and check it for validity */
571
Guido van Rossum79f25d91997-04-29 20:08:16 +0000572static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000573read_compiled_module(char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000574{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000575 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000576
Guido van Rossum79f25d91997-04-29 20:08:16 +0000577 co = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000578 /* Ugly: rd_object() may return NULL with or without error */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000579 if (co == NULL || !PyCode_Check(co)) {
580 if (!PyErr_Occurred())
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000581 PyErr_Format(PyExc_ImportError,
582 "Non-code object in %.200s", cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000583 Py_XDECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000584 return NULL;
585 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000586 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000587}
588
589
590/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000591 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000592
Guido van Rossum79f25d91997-04-29 20:08:16 +0000593static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000594load_compiled_module(char *name, char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000595{
596 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000597 PyCodeObject *co;
598 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000599
Guido van Rossum79f25d91997-04-29 20:08:16 +0000600 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000601 if (magic != pyc_magic) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000602 PyErr_Format(PyExc_ImportError,
603 "Bad magic number in %.200s", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000604 return NULL;
605 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000606 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000607 co = read_compiled_module(cpathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000608 if (co == NULL)
609 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000610 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000611 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000612 name, cpathname);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000613 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000614 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000615
616 return m;
617}
618
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000619/* Parse a source file and return the corresponding code object */
620
Guido van Rossum79f25d91997-04-29 20:08:16 +0000621static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000622parse_source_module(char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000623{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000624 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000625 node *n;
626
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000627 n = PyParser_SimpleParseFile(fp, pathname, Py_file_input);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000628 if (n == NULL)
629 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000630 co = PyNode_Compile(n, pathname);
631 PyNode_Free(n);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000632
633 return co;
634}
635
636
Guido van Rossum55a83382000-09-20 20:31:38 +0000637/* Helper to open a bytecode file for writing in exclusive mode */
638
639static FILE *
640open_exclusive(char *filename)
641{
642#if defined(O_EXCL)&&defined(O_CREAT)&&defined(O_WRONLY)&&defined(O_TRUNC)
643 /* Use O_EXCL to avoid a race condition when another process tries to
644 write the same file. When that happens, our open() call fails,
645 which is just fine (since it's only a cache).
646 XXX If the file exists and is writable but the directory is not
647 writable, the file will never be written. Oh well.
648 */
649 int fd;
650 (void) unlink(filename);
Tim Peters42c83af2000-09-29 04:03:10 +0000651 fd = open(filename, O_EXCL|O_CREAT|O_WRONLY|O_TRUNC
652#ifdef O_BINARY
653 |O_BINARY /* necessary for Windows */
654#endif
655
656 , 0666);
Guido van Rossum55a83382000-09-20 20:31:38 +0000657 if (fd < 0)
658 return NULL;
659 return fdopen(fd, "wb");
660#else
661 /* Best we can do -- on Windows this can't happen anyway */
662 return fopen(filename, "wb");
663#endif
664}
665
666
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000667/* Write a compiled module to a file, placing the time of last
668 modification of its source into the header.
669 Errors are ignored, if a write error occurs an attempt is made to
670 remove the file. */
671
672static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000673write_compiled_module(PyCodeObject *co, char *cpathname, long mtime)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000674{
675 FILE *fp;
676
Guido van Rossum55a83382000-09-20 20:31:38 +0000677 fp = open_exclusive(cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000678 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000679 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000680 PySys_WriteStderr(
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000681 "# can't create %s\n", cpathname);
682 return;
683 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000684 PyMarshal_WriteLongToFile(pyc_magic, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000685 /* First write a 0 for mtime */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000686 PyMarshal_WriteLongToFile(0L, fp);
687 PyMarshal_WriteObjectToFile((PyObject *)co, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000688 if (ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000689 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000690 PySys_WriteStderr("# can't write %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000691 /* Don't keep partial file */
692 fclose(fp);
693 (void) unlink(cpathname);
694 return;
695 }
696 /* Now write the true mtime */
697 fseek(fp, 4L, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000698 PyMarshal_WriteLongToFile(mtime, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000699 fflush(fp);
700 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000701 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000702 PySys_WriteStderr("# wrote %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000703#ifdef macintosh
Jack Jansencbf630f2000-07-11 21:59:16 +0000704 PyMac_setfiletype(cpathname, 'Pyth', 'PYC ');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000705#endif
706}
707
708
709/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000710 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
711 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000712
Guido van Rossum79f25d91997-04-29 20:08:16 +0000713static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000714load_source_module(char *name, char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000715{
Fred Drake4c82b232000-06-30 16:18:57 +0000716 time_t mtime;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000717 FILE *fpc;
718 char buf[MAXPATHLEN+1];
719 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000720 PyCodeObject *co;
721 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000722
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000723 mtime = PyOS_GetLastModificationTime(pathname, fp);
Fred Drake4c82b232000-06-30 16:18:57 +0000724 if (mtime == -1)
725 return NULL;
726#if SIZEOF_TIME_T > 4
727 /* Python's .pyc timestamp handling presumes that the timestamp fits
728 in 4 bytes. This will be fine until sometime in the year 2038,
729 when a 4-byte signed time_t will overflow.
730 */
731 if (mtime >> 32) {
732 PyErr_SetString(PyExc_OverflowError,
733 "modification time overflows a 4 bytes");
734 return NULL;
735 }
736#endif
737 cpathname = make_compiled_pathname(pathname, buf, (size_t)MAXPATHLEN+1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000738 if (cpathname != NULL &&
739 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000740 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000741 fclose(fpc);
742 if (co == NULL)
743 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000744 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000745 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000746 name, cpathname);
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000747 pathname = cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000748 }
749 else {
750 co = parse_source_module(pathname, fp);
751 if (co == NULL)
752 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000753 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000754 PySys_WriteStderr("import %s # from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000755 name, pathname);
756 write_compiled_module(co, cpathname, mtime);
757 }
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000758 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000759 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000760
761 return m;
762}
763
764
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000765/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +0000766static PyObject *load_module(char *, FILE *, char *, int);
767static struct filedescr *find_module(char *, PyObject *,
768 char *, size_t, FILE **);
769static struct _frozen *find_frozen(char *name);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000770
771/* Load a package and return its module object WITH INCREMENTED
772 REFERENCE COUNT */
773
774static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000775load_package(char *name, char *pathname)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000776{
777 PyObject *m, *d, *file, *path;
778 int err;
779 char buf[MAXPATHLEN+1];
780 FILE *fp = NULL;
781 struct filedescr *fdp;
782
783 m = PyImport_AddModule(name);
784 if (m == NULL)
785 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000786 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000787 PySys_WriteStderr("import %s # directory %s\n",
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000788 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000789 d = PyModule_GetDict(m);
790 file = PyString_FromString(pathname);
791 if (file == NULL)
792 return NULL;
793 path = Py_BuildValue("[O]", file);
794 if (path == NULL) {
795 Py_DECREF(file);
796 return NULL;
797 }
798 err = PyDict_SetItemString(d, "__file__", file);
799 if (err == 0)
800 err = PyDict_SetItemString(d, "__path__", path);
801 if (err != 0) {
802 m = NULL;
803 goto cleanup;
804 }
805 buf[0] = '\0';
806 fdp = find_module("__init__", path, buf, sizeof(buf), &fp);
807 if (fdp == NULL) {
808 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
809 PyErr_Clear();
810 }
811 else
812 m = NULL;
813 goto cleanup;
814 }
815 m = load_module(name, fp, buf, fdp->type);
816 if (fp != NULL)
817 fclose(fp);
818 cleanup:
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000819 Py_XDECREF(path);
820 Py_XDECREF(file);
821 return m;
822}
823
824
825/* Helper to test for built-in module */
826
827static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000828is_builtin(char *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000829{
830 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +0000831 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
832 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
833 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000834 return -1;
835 else
836 return 1;
837 }
838 }
839 return 0;
840}
841
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000842
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000843/* Search the path (default sys.path) for a module. Return the
844 corresponding filedescr struct, and (via return arguments) the
845 pathname and an open file. Return NULL if the module is not found. */
846
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000847#ifdef MS_COREDLL
Thomas Woutersb4bd21c2000-07-22 23:38:01 +0000848extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **,
849 char *, int);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000850#endif
851
Guido van Rossum0980bd91998-02-13 17:18:36 +0000852#ifdef CHECK_IMPORT_CASE
853static int check_case(char *, int, int, char *);
854#endif
855
Tim Petersdbd9ba62000-07-09 03:09:57 +0000856static int find_init_module(char *); /* Forward */
Guido van Rossum197346f1997-10-31 18:38:52 +0000857
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000858static struct filedescr *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000859find_module(char *realname, PyObject *path, char *buf, size_t buflen,
860 FILE **p_fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000861{
Fred Drake4c82b232000-06-30 16:18:57 +0000862 int i, npath;
863 size_t len, namelen;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000864 struct _frozen *f;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000865 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000866 FILE *fp = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000867 struct stat statbuf;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000868 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
869 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
870 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossum0506a431998-08-11 15:07:39 +0000871 char name[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000872
Fred Drake4c82b232000-06-30 16:18:57 +0000873 if (strlen(realname) > MAXPATHLEN) {
874 PyErr_SetString(PyExc_OverflowError, "module name is too long");
875 return NULL;
876 }
Guido van Rossum0506a431998-08-11 15:07:39 +0000877 strcpy(name, realname);
878
879 if (path != NULL && PyString_Check(path)) {
880 /* Submodule of "frozen" package:
881 Set name to the fullname, path to NULL
882 and continue as "usual" */
883 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
884 PyErr_SetString(PyExc_ImportError,
885 "full frozen module name too long");
886 return NULL;
887 }
888 strcpy(buf, PyString_AsString(path));
889 strcat(buf, ".");
890 strcat(buf, name);
891 strcpy(name, buf);
892 path = NULL;
893 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000894 if (path == NULL) {
895 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000896 strcpy(buf, name);
897 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000898 }
Guido van Rossuma5568d31998-03-05 03:45:08 +0000899 if ((f = find_frozen(name)) != NULL) {
900 strcpy(buf, name);
901 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000902 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000903
Guido van Rossumac279101996-08-22 23:10:58 +0000904#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000905 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
906 if (fp != NULL) {
907 *p_fp = fp;
908 return fdp;
909 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000910#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000911 path = PySys_GetObject("path");
912 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000913 if (path == NULL || !PyList_Check(path)) {
914 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +0000915 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000916 return NULL;
917 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000918 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000919 namelen = strlen(name);
920 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000921 PyObject *v = PyList_GetItem(path, i);
922 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000923 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000924 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000925 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000926 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000927 strcpy(buf, PyString_AsString(v));
Fred Drake4c82b232000-06-30 16:18:57 +0000928 if (strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000929 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000930#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000931#ifdef INTERN_STRINGS
932 /*
933 ** Speedup: each sys.path item is interned, and
934 ** FindResourceModule remembers which items refer to
935 ** folders (so we don't have to bother trying to look
936 ** into them for resources).
937 */
938 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
939 v = PyList_GET_ITEM(path, i);
940#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000941 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000942 static struct filedescr resfiledescr =
943 {"", "", PY_RESOURCE};
Jack Jansen9c96a921995-02-15 22:57:06 +0000944
945 return &resfiledescr;
946 }
Guido van Rossum0f84a341998-08-06 13:36:01 +0000947 if (PyMac_FindCodeResourceModule((PyStringObject *)v, name, buf)) {
948 static struct filedescr resfiledescr =
949 {"", "", PY_CODERESOURCE};
950
951 return &resfiledescr;
952 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000953#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000954 if (len > 0 && buf[len-1] != SEP
955#ifdef ALTSEP
956 && buf[len-1] != ALTSEP
957#endif
958 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000959 buf[len++] = SEP;
Guido van Rossum215c3402000-11-13 17:26:32 +0000960 strcpy(buf+len, name);
961 len += namelen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000962#ifdef HAVE_STAT
963 if (stat(buf, &statbuf) == 0) {
Guido van Rossum197346f1997-10-31 18:38:52 +0000964 if (S_ISDIR(statbuf.st_mode)) {
Guido van Rossum0980bd91998-02-13 17:18:36 +0000965 if (find_init_module(buf)) {
966#ifdef CHECK_IMPORT_CASE
967 if (!check_case(buf, len, namelen,
968 name))
969 return NULL;
970#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000971 return &fd_package;
Guido van Rossum0980bd91998-02-13 17:18:36 +0000972 }
Guido van Rossum197346f1997-10-31 18:38:52 +0000973 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000974 }
975#else
976 /* XXX How are you going to test for directories? */
977#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000978#ifdef macintosh
979 fdp = PyMac_FindModuleExtension(buf, &len, name);
980 if (fdp)
981 fp = fopen(buf, fdp->mode);
982#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000983 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000984 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000985 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000986 PySys_WriteStderr("# trying %s\n", buf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000987 fp = fopen(buf, fdp->mode);
988 if (fp != NULL)
989 break;
990 }
Guido van Rossum741689d1997-08-12 14:53:39 +0000991#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000992 if (fp != NULL)
993 break;
994 }
995 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000996 PyErr_Format(PyExc_ImportError,
997 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000998 return NULL;
999 }
Guido van Rossum0980bd91998-02-13 17:18:36 +00001000#ifdef CHECK_IMPORT_CASE
1001 if (!check_case(buf, len, namelen, name)) {
1002 fclose(fp);
1003 return NULL;
1004 }
1005#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001006
1007 *p_fp = fp;
1008 return fdp;
1009}
1010
Guido van Rossum0980bd91998-02-13 17:18:36 +00001011#ifdef CHECK_IMPORT_CASE
1012
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001013#if defined(MS_WIN32) || defined(__CYGWIN__)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001014#include <windows.h>
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001015#include <ctype.h>
1016
1017static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001018allcaps8x3(char *s)
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001019{
1020 /* Return 1 if s is an 8.3 filename in ALLCAPS */
1021 char c;
1022 char *dot = strchr(s, '.');
1023 char *end = strchr(s, '\0');
1024 if (dot != NULL) {
1025 if (dot-s > 8)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001026 return 0; /* More than 8 before '.' */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001027 if (end-dot > 4)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001028 return 0; /* More than 3 after '.' */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001029 end = strchr(dot+1, '.');
1030 if (end != NULL)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001031 return 0; /* More than one dot */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001032 }
1033 else if (end-s > 8)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001034 return 0; /* More than 8 and no dot */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001035 while ((c = *s++)) {
1036 if (islower(c))
1037 return 0;
1038 }
1039 return 1;
1040}
1041
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001042#ifdef __CYGWIN__
1043#include <sys/cygwin.h>
1044#endif
1045
Guido van Rossum0980bd91998-02-13 17:18:36 +00001046static int
1047check_case(char *buf, int len, int namelen, char *name)
1048{
1049 WIN32_FIND_DATA data;
1050 HANDLE h;
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001051#ifdef __CYGWIN__
1052 char tempbuf[MAX_PATH];
1053#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001054 if (getenv("PYTHONCASEOK") != NULL)
1055 return 1;
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001056#ifdef __CYGWIN__
1057 cygwin32_conv_to_win32_path(buf, tempbuf);
1058 h = FindFirstFile(tempbuf, &data);
1059#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001060 h = FindFirstFile(buf, &data);
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001061#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001062 if (h == INVALID_HANDLE_VALUE) {
1063 PyErr_Format(PyExc_NameError,
1064 "Can't find file for module %.100s\n(filename %.300s)",
1065 name, buf);
1066 return 0;
1067 }
1068 FindClose(h);
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001069 if (allcaps8x3(data.cFileName)) {
1070 /* Skip the test if the filename is ALL.CAPS. This can
1071 happen in certain circumstances beyond our control,
1072 e.g. when software is installed under NT on a FAT
1073 filesystem and then the same FAT filesystem is used
1074 under Windows 95. */
1075 return 1;
1076 }
Guido van Rossum0980bd91998-02-13 17:18:36 +00001077 if (strncmp(data.cFileName, name, namelen) != 0) {
1078 strcpy(buf+len-namelen, data.cFileName);
1079 PyErr_Format(PyExc_NameError,
1080 "Case mismatch for module name %.100s\n(filename %.300s)",
1081 name, buf);
1082 return 0;
1083 }
1084 return 1;
1085}
1086#endif /* MS_WIN32 */
1087
1088#ifdef macintosh
1089#include <TextUtils.h>
Guido van Rossumb33aa1a2000-04-24 15:08:18 +00001090#ifdef USE_GUSI1
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001091#include "TFileSpec.h" /* for Path2FSSpec() */
1092#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001093static int
1094check_case(char *buf, int len, int namelen, char *name)
1095{
1096 FSSpec fss;
1097 OSErr err;
Guido van Rossumb33aa1a2000-04-24 15:08:18 +00001098#ifndef USE_GUSI1
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001099 err = FSMakeFSSpec(0, 0, Pstring(buf), &fss);
1100#else
1101 /* GUSI's Path2FSSpec() resolves all possible aliases nicely on
1102 the way, which is fine for all directories, but here we need
1103 the original name of the alias file (say, Dlg.ppc.slb, not
1104 toolboxmodules.ppc.slb). */
1105 char *colon;
1106 err = Path2FSSpec(buf, &fss);
1107 if (err == noErr) {
1108 colon = strrchr(buf, ':'); /* find filename */
1109 if (colon != NULL)
1110 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1111 Pstring(colon+1), &fss);
1112 else
1113 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1114 fss.name, &fss);
1115 }
1116#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001117 if (err) {
1118 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001119 "Can't find file for module %.100s\n(filename %.300s)",
1120 name, buf);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001121 return 0;
1122 }
Guido van Rossum63e97ad2000-07-01 01:06:56 +00001123 if ( namelen > fss.name[0] || strncmp(name, (char *)fss.name+1, namelen) != 0 ) {
Guido van Rossum0980bd91998-02-13 17:18:36 +00001124 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001125 "Case mismatch for module name %.100s\n(filename %.300s)",
1126 name, fss.name);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001127 return 0;
1128 }
1129 return 1;
1130}
1131#endif /* macintosh */
1132
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001133#ifdef DJGPP
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001134#include <dir.h>
1135
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001136static int
1137check_case(char *buf, int len, int namelen, char *name)
1138{
1139 struct ffblk ffblk;
1140 int done;
1141
1142 if (getenv("PYTHONCASEOK") != NULL)
1143 return 1;
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001144 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001145 if (done) {
1146 PyErr_Format(PyExc_NameError,
1147 "Can't find file for module %.100s\n(filename %.300s)",
1148 name, buf);
1149 return 0;
1150 }
1151
1152 if (strncmp(ffblk.ff_name, name, namelen) != 0) {
1153 strcpy(buf+len-namelen, ffblk.ff_name);
1154 PyErr_Format(PyExc_NameError,
1155 "Case mismatch for module name %.100s\n(filename %.300s)",
1156 name, buf);
1157 return 0;
1158 }
1159 return 1;
1160}
1161#endif
1162
Guido van Rossum8766a771998-04-10 23:44:32 +00001163#endif /* CHECK_IMPORT_CASE */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001164
Guido van Rossum197346f1997-10-31 18:38:52 +00001165#ifdef HAVE_STAT
1166/* Helper to look for __init__.py or __init__.py[co] in potential package */
1167static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001168find_init_module(char *buf)
Guido van Rossum197346f1997-10-31 18:38:52 +00001169{
Fred Drake4c82b232000-06-30 16:18:57 +00001170 size_t save_len = strlen(buf);
1171 size_t i = save_len;
Guido van Rossum197346f1997-10-31 18:38:52 +00001172 struct stat statbuf;
1173
1174 if (save_len + 13 >= MAXPATHLEN)
1175 return 0;
1176 buf[i++] = SEP;
1177 strcpy(buf+i, "__init__.py");
1178 if (stat(buf, &statbuf) == 0) {
1179 buf[save_len] = '\0';
1180 return 1;
1181 }
1182 i += strlen(buf+i);
1183 if (Py_OptimizeFlag)
1184 strcpy(buf+i, "o");
1185 else
1186 strcpy(buf+i, "c");
1187 if (stat(buf, &statbuf) == 0) {
1188 buf[save_len] = '\0';
1189 return 1;
1190 }
1191 buf[save_len] = '\0';
1192 return 0;
1193}
1194#endif /* HAVE_STAT */
1195
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001196
Tim Petersdbd9ba62000-07-09 03:09:57 +00001197static int init_builtin(char *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001198
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001199/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001200 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001201
Guido van Rossum79f25d91997-04-29 20:08:16 +00001202static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001203load_module(char *name, FILE *fp, char *buf, int type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001204{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001205 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001206 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001207 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001208
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001209 /* First check that there's an open file (if we need one) */
1210 switch (type) {
1211 case PY_SOURCE:
1212 case PY_COMPILED:
1213 if (fp == NULL) {
1214 PyErr_Format(PyExc_ValueError,
1215 "file object required for import (type code %d)",
1216 type);
1217 return NULL;
1218 }
1219 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001220
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001221 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001222
1223 case PY_SOURCE:
1224 m = load_source_module(name, buf, fp);
1225 break;
1226
1227 case PY_COMPILED:
1228 m = load_compiled_module(name, buf, fp);
1229 break;
1230
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001231#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001232 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001233 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001234 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001235#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001236
Jack Jansen9c96a921995-02-15 22:57:06 +00001237#ifdef macintosh
1238 case PY_RESOURCE:
1239 m = PyMac_LoadResourceModule(name, buf);
1240 break;
Guido van Rossum0f84a341998-08-06 13:36:01 +00001241 case PY_CODERESOURCE:
1242 m = PyMac_LoadCodeResourceModule(name, buf);
1243 break;
Jack Jansen9c96a921995-02-15 22:57:06 +00001244#endif
1245
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001246 case PKG_DIRECTORY:
1247 m = load_package(name, buf);
1248 break;
1249
1250 case C_BUILTIN:
1251 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001252 if (buf != NULL && buf[0] != '\0')
1253 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001254 if (type == C_BUILTIN)
1255 err = init_builtin(name);
1256 else
1257 err = PyImport_ImportFrozenModule(name);
1258 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001259 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001260 if (err == 0) {
1261 PyErr_Format(PyExc_ImportError,
1262 "Purported %s module %.200s not found",
1263 type == C_BUILTIN ?
1264 "builtin" : "frozen",
1265 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001266 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001267 }
1268 modules = PyImport_GetModuleDict();
1269 m = PyDict_GetItemString(modules, name);
1270 if (m == NULL) {
1271 PyErr_Format(
1272 PyExc_ImportError,
1273 "%s module %.200s not properly initialized",
1274 type == C_BUILTIN ?
1275 "builtin" : "frozen",
1276 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001277 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001278 }
1279 Py_INCREF(m);
1280 break;
1281
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001282 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001283 PyErr_Format(PyExc_ImportError,
1284 "Don't know how to import %.200s (type code %d)",
1285 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001286 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001287
1288 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001289
1290 return m;
1291}
1292
1293
1294/* Initialize a built-in module.
1295 Return 1 for succes, 0 if the module is not found, and -1 with
1296 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001297
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001298static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001299init_builtin(char *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001300{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001301 struct _inittab *p;
1302 PyObject *mod;
1303
1304 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
1305 return 1;
1306
Guido van Rossum771c6c81997-10-31 18:37:24 +00001307 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001308 if (strcmp(name, p->name) == 0) {
1309 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001310 PyErr_Format(PyExc_ImportError,
1311 "Cannot re-init internal module %.200s",
1312 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001313 return -1;
1314 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001315 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001316 PySys_WriteStderr("import %s # builtin\n", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001317 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001318 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001319 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001320 if (_PyImport_FixupExtension(name, name) == NULL)
1321 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001322 return 1;
1323 }
1324 }
1325 return 0;
1326}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001327
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001328
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001329/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001330
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001331static struct _frozen *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001332find_frozen(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001333{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001334 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001335
Guido van Rossum79f25d91997-04-29 20:08:16 +00001336 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001337 if (p->name == NULL)
1338 return NULL;
1339 if (strcmp(p->name, name) == 0)
1340 break;
1341 }
1342 return p;
1343}
1344
Guido van Rossum79f25d91997-04-29 20:08:16 +00001345static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001346get_frozen_object(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001347{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001348 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001349 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001350
1351 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001352 PyErr_Format(PyExc_ImportError,
1353 "No such frozen object named %.200s",
1354 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001355 return NULL;
1356 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001357 size = p->size;
1358 if (size < 0)
1359 size = -size;
1360 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001361}
1362
1363/* Initialize a frozen module.
1364 Return 1 for succes, 0 if the module is not found, and -1 with
1365 an exception set if the initialization failed.
1366 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001367
1368int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001369PyImport_ImportFrozenModule(char *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001370{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001371 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001372 PyObject *co;
1373 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001374 int ispackage;
1375 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001376
1377 if (p == NULL)
1378 return 0;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001379 size = p->size;
1380 ispackage = (size < 0);
1381 if (ispackage)
1382 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001383 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001384 PySys_WriteStderr("import %s # frozen%s\n",
Guido van Rossuma5568d31998-03-05 03:45:08 +00001385 name, ispackage ? " package" : "");
1386 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001387 if (co == NULL)
1388 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001389 if (!PyCode_Check(co)) {
1390 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001391 PyErr_Format(PyExc_TypeError,
1392 "frozen object %.200s is not a code object",
1393 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001394 return -1;
1395 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001396 if (ispackage) {
1397 /* Set __path__ to the package name */
1398 PyObject *d, *s;
1399 int err;
1400 m = PyImport_AddModule(name);
1401 if (m == NULL)
1402 return -1;
1403 d = PyModule_GetDict(m);
1404 s = PyString_InternFromString(name);
1405 if (s == NULL)
1406 return -1;
1407 err = PyDict_SetItemString(d, "__path__", s);
1408 Py_DECREF(s);
1409 if (err != 0)
1410 return err;
1411 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001412 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001413 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001414 if (m == NULL)
1415 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001416 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001417 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001418}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001419
1420
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001421/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001422 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001423
Guido van Rossum79f25d91997-04-29 20:08:16 +00001424PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001425PyImport_ImportModule(char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00001426{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001427 static PyObject *fromlist = NULL;
1428 if (fromlist == NULL && strchr(name, '.') != NULL) {
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001429 fromlist = Py_BuildValue("(s)", "*");
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001430 if (fromlist == NULL)
1431 return NULL;
1432 }
1433 return PyImport_ImportModuleEx(name, NULL, NULL, fromlist);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001434}
1435
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001436/* Forward declarations for helper routines */
Tim Petersdbd9ba62000-07-09 03:09:57 +00001437static PyObject *get_parent(PyObject *globals, char *buf, int *p_buflen);
1438static PyObject *load_next(PyObject *mod, PyObject *altmod,
1439 char **p_name, char *buf, int *p_buflen);
1440static int mark_miss(char *name);
1441static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
1442 char *buf, int buflen, int recursive);
1443static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001444
1445/* The Magnum Opus of dotted-name import :-) */
1446
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001447static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001448import_module_ex(char *name, PyObject *globals, PyObject *locals,
1449 PyObject *fromlist)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001450{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001451 char buf[MAXPATHLEN+1];
1452 int buflen = 0;
1453 PyObject *parent, *head, *next, *tail;
1454
1455 parent = get_parent(globals, buf, &buflen);
1456 if (parent == NULL)
1457 return NULL;
1458
1459 head = load_next(parent, Py_None, &name, buf, &buflen);
1460 if (head == NULL)
1461 return NULL;
1462
1463 tail = head;
1464 Py_INCREF(tail);
1465 while (name) {
1466 next = load_next(tail, tail, &name, buf, &buflen);
1467 Py_DECREF(tail);
1468 if (next == NULL) {
1469 Py_DECREF(head);
1470 return NULL;
1471 }
1472 tail = next;
1473 }
1474
1475 if (fromlist != NULL) {
1476 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1477 fromlist = NULL;
1478 }
1479
1480 if (fromlist == NULL) {
1481 Py_DECREF(tail);
1482 return head;
1483 }
1484
1485 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001486 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001487 Py_DECREF(tail);
1488 return NULL;
1489 }
1490
1491 return tail;
1492}
1493
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001494PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001495PyImport_ImportModuleEx(char *name, PyObject *globals, PyObject *locals,
1496 PyObject *fromlist)
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001497{
1498 PyObject *result;
1499 lock_import();
Guido van Rossumd65911b1998-03-03 22:33:27 +00001500 result = import_module_ex(name, globals, locals, fromlist);
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001501 unlock_import();
1502 return result;
1503}
1504
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001505static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001506get_parent(PyObject *globals, char *buf, int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001507{
1508 static PyObject *namestr = NULL;
1509 static PyObject *pathstr = NULL;
1510 PyObject *modname, *modpath, *modules, *parent;
1511
1512 if (globals == NULL || !PyDict_Check(globals))
1513 return Py_None;
1514
1515 if (namestr == NULL) {
1516 namestr = PyString_InternFromString("__name__");
1517 if (namestr == NULL)
1518 return NULL;
1519 }
1520 if (pathstr == NULL) {
1521 pathstr = PyString_InternFromString("__path__");
1522 if (pathstr == NULL)
1523 return NULL;
1524 }
1525
1526 *buf = '\0';
1527 *p_buflen = 0;
1528 modname = PyDict_GetItem(globals, namestr);
1529 if (modname == NULL || !PyString_Check(modname))
1530 return Py_None;
1531
1532 modpath = PyDict_GetItem(globals, pathstr);
1533 if (modpath != NULL) {
1534 int len = PyString_GET_SIZE(modname);
1535 if (len > MAXPATHLEN) {
1536 PyErr_SetString(PyExc_ValueError,
1537 "Module name too long");
1538 return NULL;
1539 }
1540 strcpy(buf, PyString_AS_STRING(modname));
1541 *p_buflen = len;
1542 }
1543 else {
1544 char *start = PyString_AS_STRING(modname);
1545 char *lastdot = strrchr(start, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001546 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001547 if (lastdot == NULL)
1548 return Py_None;
1549 len = lastdot - start;
1550 if (len >= MAXPATHLEN) {
1551 PyErr_SetString(PyExc_ValueError,
1552 "Module name too long");
1553 return NULL;
1554 }
1555 strncpy(buf, start, len);
1556 buf[len] = '\0';
1557 *p_buflen = len;
1558 }
1559
1560 modules = PyImport_GetModuleDict();
1561 parent = PyDict_GetItemString(modules, buf);
1562 if (parent == NULL)
1563 parent = Py_None;
1564 return parent;
1565 /* We expect, but can't guarantee, if parent != None, that:
1566 - parent.__name__ == buf
1567 - parent.__dict__ is globals
1568 If this is violated... Who cares? */
1569}
1570
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001571/* altmod is either None or same as mod */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001572static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001573load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
1574 int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001575{
1576 char *name = *p_name;
1577 char *dot = strchr(name, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001578 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001579 char *p;
1580 PyObject *result;
1581
1582 if (dot == NULL) {
1583 *p_name = NULL;
1584 len = strlen(name);
1585 }
1586 else {
1587 *p_name = dot+1;
1588 len = dot-name;
1589 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00001590 if (len == 0) {
1591 PyErr_SetString(PyExc_ValueError,
1592 "Empty module name");
1593 return NULL;
1594 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001595
1596 p = buf + *p_buflen;
1597 if (p != buf)
1598 *p++ = '.';
1599 if (p+len-buf >= MAXPATHLEN) {
1600 PyErr_SetString(PyExc_ValueError,
1601 "Module name too long");
1602 return NULL;
1603 }
1604 strncpy(p, name, len);
1605 p[len] = '\0';
1606 *p_buflen = p+len-buf;
1607
1608 result = import_submodule(mod, p, buf);
1609 if (result == Py_None && altmod != mod) {
1610 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001611 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001612 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001613 if (result != NULL && result != Py_None) {
1614 if (mark_miss(buf) != 0) {
1615 Py_DECREF(result);
1616 return NULL;
1617 }
1618 strncpy(buf, name, len);
1619 buf[len] = '\0';
1620 *p_buflen = len;
1621 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001622 }
1623 if (result == NULL)
1624 return NULL;
1625
1626 if (result == Py_None) {
1627 Py_DECREF(result);
1628 PyErr_Format(PyExc_ImportError,
1629 "No module named %.200s", name);
1630 return NULL;
1631 }
1632
1633 return result;
1634}
1635
1636static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001637mark_miss(char *name)
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001638{
1639 PyObject *modules = PyImport_GetModuleDict();
1640 return PyDict_SetItemString(modules, name, Py_None);
1641}
1642
1643static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001644ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, int buflen,
1645 int recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001646{
1647 int i;
1648
1649 if (!PyObject_HasAttrString(mod, "__path__"))
1650 return 1;
1651
1652 for (i = 0; ; i++) {
1653 PyObject *item = PySequence_GetItem(fromlist, i);
1654 int hasit;
1655 if (item == NULL) {
1656 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1657 PyErr_Clear();
1658 return 1;
1659 }
1660 return 0;
1661 }
1662 if (!PyString_Check(item)) {
1663 PyErr_SetString(PyExc_TypeError,
1664 "Item in ``from list'' not a string");
1665 Py_DECREF(item);
1666 return 0;
1667 }
1668 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001669 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001670 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001671 /* See if the package defines __all__ */
1672 if (recursive)
1673 continue; /* Avoid endless recursion */
1674 all = PyObject_GetAttrString(mod, "__all__");
1675 if (all == NULL)
1676 PyErr_Clear();
1677 else {
1678 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1679 return 0;
1680 Py_DECREF(all);
1681 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001682 continue;
1683 }
1684 hasit = PyObject_HasAttr(mod, item);
1685 if (!hasit) {
1686 char *subname = PyString_AS_STRING(item);
1687 PyObject *submod;
1688 char *p;
1689 if (buflen + strlen(subname) >= MAXPATHLEN) {
1690 PyErr_SetString(PyExc_ValueError,
1691 "Module name too long");
1692 Py_DECREF(item);
1693 return 0;
1694 }
1695 p = buf + buflen;
1696 *p++ = '.';
1697 strcpy(p, subname);
1698 submod = import_submodule(mod, subname, buf);
1699 Py_XDECREF(submod);
1700 if (submod == NULL) {
1701 Py_DECREF(item);
1702 return 0;
1703 }
1704 }
1705 Py_DECREF(item);
1706 }
1707
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001708 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001709}
1710
1711static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001712import_submodule(PyObject *mod, char *subname, char *fullname)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001713{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001714 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001715 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001716
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001717 /* Require:
1718 if mod == None: subname == fullname
1719 else: mod.__name__ + "." + subname == fullname
1720 */
1721
1722 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001723 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001724 }
1725 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001726 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001727 char buf[MAXPATHLEN+1];
1728 struct filedescr *fdp;
1729 FILE *fp = NULL;
1730
Guido van Rossum9c0afe51998-05-19 15:09:05 +00001731 if (mod == Py_None)
1732 path = NULL;
1733 else {
1734 path = PyObject_GetAttrString(mod, "__path__");
1735 if (path == NULL) {
1736 PyErr_Clear();
1737 Py_INCREF(Py_None);
1738 return Py_None;
1739 }
1740 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001741
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001742 buf[0] = '\0';
Guido van Rossumb68cd421998-07-01 17:36:26 +00001743 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1744 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001745 if (fdp == NULL) {
1746 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1747 return NULL;
1748 PyErr_Clear();
1749 Py_INCREF(Py_None);
1750 return Py_None;
1751 }
1752 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001753 if (fp)
1754 fclose(fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001755 if (m != NULL && mod != Py_None) {
1756 if (PyObject_SetAttrString(mod, subname, m) < 0) {
1757 Py_DECREF(m);
1758 m = NULL;
1759 }
1760 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001761 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001762
1763 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001764}
1765
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001766
1767/* Re-import a module of any kind and return its module object, WITH
1768 INCREMENTED REFERENCE COUNT */
1769
Guido van Rossum79f25d91997-04-29 20:08:16 +00001770PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001771PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001772{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001773 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001774 PyObject *path = NULL;
1775 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001776 char buf[MAXPATHLEN+1];
1777 struct filedescr *fdp;
1778 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001779
Guido van Rossum79f25d91997-04-29 20:08:16 +00001780 if (m == NULL || !PyModule_Check(m)) {
1781 PyErr_SetString(PyExc_TypeError,
1782 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001783 return NULL;
1784 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001785 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001786 if (name == NULL)
1787 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001788 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001789 PyErr_Format(PyExc_ImportError,
1790 "reload(): module %.200s not in sys.modules",
1791 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001792 return NULL;
1793 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001794 subname = strrchr(name, '.');
1795 if (subname == NULL)
1796 subname = name;
1797 else {
1798 PyObject *parentname, *parent;
1799 parentname = PyString_FromStringAndSize(name, (subname-name));
1800 if (parentname == NULL)
1801 return NULL;
1802 parent = PyDict_GetItem(modules, parentname);
Barry Warsaw38793331999-01-27 17:54:20 +00001803 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00001804 if (parent == NULL) {
1805 PyErr_Format(PyExc_ImportError,
1806 "reload(): parent %.200s not in sys.modules",
1807 name);
1808 return NULL;
1809 }
1810 subname++;
1811 path = PyObject_GetAttrString(parent, "__path__");
1812 if (path == NULL)
1813 PyErr_Clear();
1814 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001815 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001816 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1817 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001818 if (fdp == NULL)
1819 return NULL;
1820 m = load_module(name, fp, buf, fdp->type);
1821 if (fp)
1822 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001823 return m;
1824}
1825
1826
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001827/* Higher-level import emulator which emulates the "import" statement
1828 more accurately -- it invokes the __import__() function from the
1829 builtins of the current globals. This means that the import is
1830 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00001831 environment, e.g. by "rexec".
1832 A dummy list ["__doc__"] is passed as the 4th argument so that
1833 e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
1834 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001835
1836PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001837PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001838{
1839 static PyObject *silly_list = NULL;
1840 static PyObject *builtins_str = NULL;
1841 static PyObject *import_str = NULL;
1842 static PyObject *standard_builtins = NULL;
1843 PyObject *globals = NULL;
1844 PyObject *import = NULL;
1845 PyObject *builtins = NULL;
1846 PyObject *r = NULL;
1847
1848 /* Initialize constant string objects */
1849 if (silly_list == NULL) {
1850 import_str = PyString_InternFromString("__import__");
1851 if (import_str == NULL)
1852 return NULL;
1853 builtins_str = PyString_InternFromString("__builtins__");
1854 if (builtins_str == NULL)
1855 return NULL;
1856 silly_list = Py_BuildValue("[s]", "__doc__");
1857 if (silly_list == NULL)
1858 return NULL;
1859 }
1860
1861 /* Get the builtins from current globals */
1862 globals = PyEval_GetGlobals();
1863 if(globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00001864 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001865 builtins = PyObject_GetItem(globals, builtins_str);
1866 if (builtins == NULL)
1867 goto err;
1868 }
1869 else {
1870 /* No globals -- use standard builtins, and fake globals */
1871 PyErr_Clear();
1872
1873 if (standard_builtins == NULL) {
1874 standard_builtins =
1875 PyImport_ImportModule("__builtin__");
1876 if (standard_builtins == NULL)
1877 return NULL;
1878 }
1879
1880 builtins = standard_builtins;
1881 Py_INCREF(builtins);
1882 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1883 if (globals == NULL)
1884 goto err;
1885 }
1886
1887 /* Get the __import__ function from the builtins */
1888 if (PyDict_Check(builtins))
1889 import=PyObject_GetItem(builtins, import_str);
1890 else
1891 import=PyObject_GetAttr(builtins, import_str);
1892 if (import == NULL)
1893 goto err;
1894
1895 /* Call the _import__ function with the proper argument list */
1896 r = PyObject_CallFunction(import, "OOOO",
1897 module_name, globals, globals, silly_list);
1898
1899 err:
1900 Py_XDECREF(globals);
1901 Py_XDECREF(builtins);
1902 Py_XDECREF(import);
1903
1904 return r;
1905}
1906
1907
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001908/* Module 'imp' provides Python access to the primitives used for
1909 importing modules.
1910*/
1911
Guido van Rossum79f25d91997-04-29 20:08:16 +00001912static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001913imp_get_magic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001914{
1915 char buf[4];
1916
Guido van Rossum43713e52000-02-29 13:59:29 +00001917 if (!PyArg_ParseTuple(args, ":get_magic"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001918 return NULL;
Guido van Rossum96774c12000-05-01 20:19:08 +00001919 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
1920 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
1921 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
1922 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001923
Guido van Rossum79f25d91997-04-29 20:08:16 +00001924 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001925}
1926
Guido van Rossum79f25d91997-04-29 20:08:16 +00001927static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001928imp_get_suffixes(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001929{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001930 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001931 struct filedescr *fdp;
1932
Guido van Rossum43713e52000-02-29 13:59:29 +00001933 if (!PyArg_ParseTuple(args, ":get_suffixes"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001934 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001935 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001936 if (list == NULL)
1937 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001938 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
1939 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001940 fdp->suffix, fdp->mode, fdp->type);
1941 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001942 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001943 return NULL;
1944 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001945 if (PyList_Append(list, item) < 0) {
1946 Py_DECREF(list);
1947 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001948 return NULL;
1949 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001950 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001951 }
1952 return list;
1953}
1954
Guido van Rossum79f25d91997-04-29 20:08:16 +00001955static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001956call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001957{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001958 extern int fclose(FILE *);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001959 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001960 struct filedescr *fdp;
1961 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001962 FILE *fp = NULL;
1963
1964 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001965 if (path == Py_None)
1966 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001967 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
1968 if (fdp == NULL)
1969 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001970 if (fp != NULL) {
1971 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
1972 if (fob == NULL) {
1973 fclose(fp);
1974 return NULL;
1975 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001976 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001977 else {
1978 fob = Py_None;
1979 Py_INCREF(fob);
1980 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001981 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001982 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001983 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001984 return ret;
1985}
1986
Guido van Rossum79f25d91997-04-29 20:08:16 +00001987static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001988imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001989{
1990 char *name;
1991 PyObject *path = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00001992 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001993 return NULL;
1994 return call_find_module(name, path);
1995}
1996
1997static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001998imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001999{
2000 char *name;
2001 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002002 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002003 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002004 return NULL;
2005 ret = init_builtin(name);
2006 if (ret < 0)
2007 return NULL;
2008 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002009 Py_INCREF(Py_None);
2010 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002011 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002012 m = PyImport_AddModule(name);
2013 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002014 return m;
2015}
2016
Guido van Rossum79f25d91997-04-29 20:08:16 +00002017static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002018imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002019{
2020 char *name;
2021 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002022 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002023 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002024 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002025 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002026 if (ret < 0)
2027 return NULL;
2028 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002029 Py_INCREF(Py_None);
2030 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002031 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002032 m = PyImport_AddModule(name);
2033 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002034 return m;
2035}
2036
Guido van Rossum79f25d91997-04-29 20:08:16 +00002037static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002038imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002039{
2040 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002041
Guido van Rossum43713e52000-02-29 13:59:29 +00002042 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002043 return NULL;
2044 return get_frozen_object(name);
2045}
2046
Guido van Rossum79f25d91997-04-29 20:08:16 +00002047static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002048imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002049{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002050 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002051 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002052 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002053 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002054}
2055
Guido van Rossum79f25d91997-04-29 20:08:16 +00002056static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002057imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002058{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002059 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002060 struct _frozen *p;
Guido van Rossum43713e52000-02-29 13:59:29 +00002061 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002062 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002063 p = find_frozen(name);
2064 return PyInt_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002065}
2066
2067static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002068get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002069{
2070 FILE *fp;
2071 if (fob == NULL) {
2072 fp = fopen(pathname, mode);
2073 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002074 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002075 }
2076 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002077 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002078 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002079 PyErr_SetString(PyExc_ValueError,
2080 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002081 }
2082 return fp;
2083}
2084
Guido van Rossum79f25d91997-04-29 20:08:16 +00002085static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002086imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002087{
2088 char *name;
2089 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002090 PyObject *fob = NULL;
2091 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002092 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002093 if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002094 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002095 return NULL;
2096 fp = get_file(pathname, fob, "rb");
2097 if (fp == NULL)
2098 return NULL;
2099 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002100 if (fob == NULL)
2101 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002102 return m;
2103}
2104
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002105#ifdef HAVE_DYNAMIC_LOADING
2106
Guido van Rossum79f25d91997-04-29 20:08:16 +00002107static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002108imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002109{
2110 char *name;
2111 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002112 PyObject *fob = NULL;
2113 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002114 FILE *fp = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002115 if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002116 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002117 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002118 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002119 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002120 if (fp == NULL)
2121 return NULL;
2122 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002123 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002124 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002125}
2126
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002127#endif /* HAVE_DYNAMIC_LOADING */
2128
Guido van Rossum79f25d91997-04-29 20:08:16 +00002129static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002130imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002131{
2132 char *name;
2133 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002134 PyObject *fob = NULL;
2135 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002136 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002137 if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002138 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002139 return NULL;
2140 fp = get_file(pathname, fob, "r");
2141 if (fp == NULL)
2142 return NULL;
2143 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002144 if (fob == NULL)
2145 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002146 return m;
2147}
2148
Jack Jansen9c96a921995-02-15 22:57:06 +00002149#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002150static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002151imp_load_resource(PyObject *self, PyObject *args)
Jack Jansen9c96a921995-02-15 22:57:06 +00002152{
2153 char *name;
2154 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002155 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002156
Guido van Rossum43713e52000-02-29 13:59:29 +00002157 if (!PyArg_ParseTuple(args, "ss:load_resource", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002158 return NULL;
2159 m = PyMac_LoadResourceModule(name, pathname);
2160 return m;
2161}
2162#endif /* macintosh */
2163
Guido van Rossum79f25d91997-04-29 20:08:16 +00002164static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002165imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002166{
2167 char *name;
2168 PyObject *fob;
2169 char *pathname;
2170 char *suffix; /* Unused */
2171 char *mode;
2172 int type;
2173 FILE *fp;
2174
Guido van Rossum43713e52000-02-29 13:59:29 +00002175 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002176 &name, &fob, &pathname,
2177 &suffix, &mode, &type))
2178 return NULL;
2179 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
2180 PyErr_Format(PyExc_ValueError,
2181 "invalid file open mode %.200s", mode);
2182 return NULL;
2183 }
2184 if (fob == Py_None)
2185 fp = NULL;
2186 else {
2187 if (!PyFile_Check(fob)) {
2188 PyErr_SetString(PyExc_ValueError,
2189 "load_module arg#2 should be a file or None");
2190 return NULL;
2191 }
2192 fp = get_file(pathname, fob, mode);
2193 if (fp == NULL)
2194 return NULL;
2195 }
2196 return load_module(name, fp, pathname, type);
2197}
2198
2199static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002200imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002201{
2202 char *name;
2203 char *pathname;
Guido van Rossum43713e52000-02-29 13:59:29 +00002204 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002205 return NULL;
2206 return load_package(name, pathname);
2207}
2208
2209static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002210imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002211{
2212 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002213 if (!PyArg_ParseTuple(args, "s:new_module", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002214 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002215 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002216}
2217
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002218/* Doc strings */
2219
2220static char doc_imp[] = "\
2221This module provides the components needed to build your own\n\
2222__import__ function. Undocumented functions are obsolete.\n\
2223";
2224
2225static char doc_find_module[] = "\
2226find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
2227Search for a module. If path is omitted or None, search for a\n\
2228built-in, frozen or special module and continue search in sys.path.\n\
2229The module name cannot contain '.'; to search for a submodule of a\n\
2230package, pass the submodule name and the package's __path__.\
2231";
2232
2233static char doc_load_module[] = "\
2234load_module(name, file, filename, (suffix, mode, type)) -> module\n\
2235Load a module, given information returned by find_module().\n\
2236The module name must include the full package name, if any.\
2237";
2238
2239static char doc_get_magic[] = "\
2240get_magic() -> string\n\
2241Return the magic number for .pyc or .pyo files.\
2242";
2243
2244static char doc_get_suffixes[] = "\
2245get_suffixes() -> [(suffix, mode, type), ...]\n\
2246Return a list of (suffix, mode, type) tuples describing the files\n\
2247that find_module() looks for.\
2248";
2249
2250static char doc_new_module[] = "\
2251new_module(name) -> module\n\
2252Create a new module. Do not enter it in sys.modules.\n\
2253The module name must include the full package name, if any.\
2254";
2255
Guido van Rossum79f25d91997-04-29 20:08:16 +00002256static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002257 {"find_module", imp_find_module, 1, doc_find_module},
2258 {"get_magic", imp_get_magic, 1, doc_get_magic},
2259 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2260 {"load_module", imp_load_module, 1, doc_load_module},
2261 {"new_module", imp_new_module, 1, doc_new_module},
2262 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002263 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002264 {"init_builtin", imp_init_builtin, 1},
2265 {"init_frozen", imp_init_frozen, 1},
2266 {"is_builtin", imp_is_builtin, 1},
2267 {"is_frozen", imp_is_frozen, 1},
2268 {"load_compiled", imp_load_compiled, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002269#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002270 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002271#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002272 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002273#ifdef macintosh
2274 {"load_resource", imp_load_resource, 1},
2275#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002276 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002277 {NULL, NULL} /* sentinel */
2278};
2279
Guido van Rossum1a8791e1998-08-04 22:46:29 +00002280static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002281setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002282{
2283 PyObject *v;
2284 int err;
2285
2286 v = PyInt_FromLong((long)value);
2287 err = PyDict_SetItemString(d, name, v);
2288 Py_XDECREF(v);
2289 return err;
2290}
2291
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002292void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002293initimp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002294{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002295 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002296
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002297 m = Py_InitModule4("imp", imp_methods, doc_imp,
2298 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002299 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002300
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002301 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2302 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2303 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2304 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2305 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2306 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2307 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2308 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00002309 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002310
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002311 failure:
2312 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002313}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002314
2315
Guido van Rossumb18618d2000-05-03 23:44:39 +00002316/* API for embedding applications that want to add their own entries
2317 to the table of built-in modules. This should normally be called
2318 *before* Py_Initialize(). When the table resize fails, -1 is
2319 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002320
2321 After a similar function by Just van Rossum. */
2322
2323int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002324PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002325{
2326 static struct _inittab *our_copy = NULL;
2327 struct _inittab *p;
2328 int i, n;
2329
2330 /* Count the number of entries in both tables */
2331 for (n = 0; newtab[n].name != NULL; n++)
2332 ;
2333 if (n == 0)
2334 return 0; /* Nothing to do */
2335 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2336 ;
2337
2338 /* Allocate new memory for the combined table */
Guido van Rossumb18618d2000-05-03 23:44:39 +00002339 p = our_copy;
2340 PyMem_RESIZE(p, struct _inittab, i+n+1);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002341 if (p == NULL)
2342 return -1;
2343
2344 /* Copy the tables into the new memory */
2345 if (our_copy != PyImport_Inittab)
2346 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2347 PyImport_Inittab = our_copy = p;
2348 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
2349
2350 return 0;
2351}
2352
2353/* Shorthand to add a single entry given a name and a function */
2354
2355int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002356PyImport_AppendInittab(char *name, void (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002357{
2358 struct _inittab newtab[2];
2359
2360 memset(newtab, '\0', sizeof newtab);
2361
2362 newtab[0].name = name;
2363 newtab[0].initfunc = initfunc;
2364
2365 return PyImport_ExtendInittab(newtab);
2366}