blob: 533f85e0fd7be054ad4189505eead89daed26c6e [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;
135}
136
137
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000138/* Locking primitives to prevent parallel imports of the same module
139 in different threads to return with a partially loaded module.
140 These calls are serialized by the global interpreter lock. */
141
142#ifdef WITH_THREAD
143
Guido van Rossum49b56061998-10-01 20:42:43 +0000144#include "pythread.h"
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000145
Guido van Rossum65d5b571998-12-21 19:32:43 +0000146static PyThread_type_lock import_lock = 0;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000147static long import_lock_thread = -1;
148static int import_lock_level = 0;
149
150static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000151lock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000152{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000153 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000154 if (me == -1)
155 return; /* Too bad */
156 if (import_lock == NULL)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000157 import_lock = PyThread_allocate_lock();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000158 if (import_lock_thread == me) {
159 import_lock_level++;
160 return;
161 }
Guido van Rossum65d5b571998-12-21 19:32:43 +0000162 if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0)) {
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000163 PyThreadState *tstate = PyEval_SaveThread();
Guido van Rossum65d5b571998-12-21 19:32:43 +0000164 PyThread_acquire_lock(import_lock, 1);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000165 PyEval_RestoreThread(tstate);
166 }
167 import_lock_thread = me;
168 import_lock_level = 1;
169}
170
171static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000172unlock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000173{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000174 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000175 if (me == -1)
176 return; /* Too bad */
177 if (import_lock_thread != me)
178 Py_FatalError("unlock_import: not holding the import lock");
179 import_lock_level--;
180 if (import_lock_level == 0) {
181 import_lock_thread = -1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000182 PyThread_release_lock(import_lock);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000183 }
184}
185
186#else
187
188#define lock_import()
189#define unlock_import()
190
191#endif
192
Guido van Rossum25ce5661997-08-02 03:10:38 +0000193/* Helper for sys */
194
195PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000196PyImport_GetModuleDict(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000197{
198 PyInterpreterState *interp = PyThreadState_Get()->interp;
199 if (interp->modules == NULL)
200 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
201 return interp->modules;
202}
203
Guido van Rossum3f5da241990-12-20 15:06:42 +0000204
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000205/* List of names to clear in sys */
206static char* sys_deletes[] = {
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000207 "path", "argv", "ps1", "ps2", "exitfunc",
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000208 "exc_type", "exc_value", "exc_traceback",
209 "last_type", "last_value", "last_traceback",
210 NULL
211};
212
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000213static char* sys_files[] = {
214 "stdin", "__stdin__",
215 "stdout", "__stdout__",
216 "stderr", "__stderr__",
217 NULL
218};
219
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000220
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000221/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000222
Guido van Rossum3f5da241990-12-20 15:06:42 +0000223void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000224PyImport_Cleanup(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000225{
Guido van Rossum758eec01998-01-19 21:58:26 +0000226 int pos, ndone;
227 char *name;
228 PyObject *key, *value, *dict;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000229 PyInterpreterState *interp = PyThreadState_Get()->interp;
Guido van Rossum758eec01998-01-19 21:58:26 +0000230 PyObject *modules = interp->modules;
231
232 if (modules == NULL)
233 return; /* Already done */
234
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000235 /* Delete some special variables first. These are common
236 places where user values hide and people complain when their
237 destructors fail. Since the modules containing them are
238 deleted *last* of all, they would come too late in the normal
239 destruction order. Sigh. */
240
241 value = PyDict_GetItemString(modules, "__builtin__");
242 if (value != NULL && PyModule_Check(value)) {
243 dict = PyModule_GetDict(value);
244 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000245 PySys_WriteStderr("# clear __builtin__._\n");
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000246 PyDict_SetItemString(dict, "_", Py_None);
247 }
248 value = PyDict_GetItemString(modules, "sys");
249 if (value != NULL && PyModule_Check(value)) {
250 char **p;
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000251 PyObject *v;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000252 dict = PyModule_GetDict(value);
253 for (p = sys_deletes; *p != NULL; p++) {
254 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000255 PySys_WriteStderr("# clear sys.%s\n", *p);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000256 PyDict_SetItemString(dict, *p, Py_None);
257 }
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000258 for (p = sys_files; *p != NULL; p+=2) {
259 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000260 PySys_WriteStderr("# restore sys.%s\n", *p);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000261 v = PyDict_GetItemString(dict, *(p+1));
262 if (v == NULL)
263 v = Py_None;
264 PyDict_SetItemString(dict, *p, v);
265 }
266 }
267
268 /* First, delete __main__ */
269 value = PyDict_GetItemString(modules, "__main__");
270 if (value != NULL && PyModule_Check(value)) {
271 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000272 PySys_WriteStderr("# cleanup __main__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000273 _PyModule_Clear(value);
274 PyDict_SetItemString(modules, "__main__", Py_None);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000275 }
276
Guido van Rossum758eec01998-01-19 21:58:26 +0000277 /* The special treatment of __builtin__ here is because even
278 when it's not referenced as a module, its dictionary is
279 referenced by almost every module's __builtins__. Since
280 deleting a module clears its dictionary (even if there are
281 references left to it), we need to delete the __builtin__
282 module last. Likewise, we don't delete sys until the very
283 end because it is implicitly referenced (e.g. by print).
284
285 Also note that we 'delete' modules by replacing their entry
286 in the modules dict with None, rather than really deleting
287 them; this avoids a rehash of the modules dictionary and
288 also marks them as "non existent" so they won't be
289 re-imported. */
290
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000291 /* Next, repeatedly delete modules with a reference count of
Guido van Rossum758eec01998-01-19 21:58:26 +0000292 one (skipping __builtin__ and sys) and delete them */
293 do {
294 ndone = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000295 pos = 0;
Guido van Rossum758eec01998-01-19 21:58:26 +0000296 while (PyDict_Next(modules, &pos, &key, &value)) {
297 if (value->ob_refcnt != 1)
298 continue;
Guido van Rossum566373e1998-10-01 15:24:50 +0000299 if (PyString_Check(key) && PyModule_Check(value)) {
300 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000301 if (strcmp(name, "__builtin__") == 0)
302 continue;
303 if (strcmp(name, "sys") == 0)
304 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000305 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000306 PySys_WriteStderr(
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000307 "# cleanup[1] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000308 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000309 PyDict_SetItem(modules, key, Py_None);
310 ndone++;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000311 }
312 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000313 } while (ndone > 0);
314
Guido van Rossum758eec01998-01-19 21:58:26 +0000315 /* Next, delete all modules (still skipping __builtin__ and sys) */
316 pos = 0;
317 while (PyDict_Next(modules, &pos, &key, &value)) {
Guido van Rossum566373e1998-10-01 15:24:50 +0000318 if (PyString_Check(key) && PyModule_Check(value)) {
319 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000320 if (strcmp(name, "__builtin__") == 0)
321 continue;
322 if (strcmp(name, "sys") == 0)
323 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000324 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000325 PySys_WriteStderr("# cleanup[2] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000326 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000327 PyDict_SetItem(modules, key, Py_None);
328 }
329 }
330
331 /* Next, delete sys and __builtin__ (in that order) */
332 value = PyDict_GetItemString(modules, "sys");
333 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000334 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000335 PySys_WriteStderr("# cleanup sys\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000336 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000337 PyDict_SetItemString(modules, "sys", Py_None);
338 }
339 value = PyDict_GetItemString(modules, "__builtin__");
340 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000341 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000342 PySys_WriteStderr("# cleanup __builtin__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000343 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000344 PyDict_SetItemString(modules, "__builtin__", Py_None);
345 }
346
347 /* Finally, clear and delete the modules directory */
348 PyDict_Clear(modules);
349 interp->modules = NULL;
350 Py_DECREF(modules);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000351}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000352
353
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000354/* Helper for pythonrun.c -- return magic number */
355
356long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000357PyImport_GetMagicNumber(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000358{
Guido van Rossum96774c12000-05-01 20:19:08 +0000359 return pyc_magic;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000360}
361
362
Guido van Rossum25ce5661997-08-02 03:10:38 +0000363/* Magic for extension modules (built-in as well as dynamically
364 loaded). To prevent initializing an extension module more than
365 once, we keep a static dictionary 'extensions' keyed by module name
366 (for built-in modules) or by filename (for dynamically loaded
367 modules), containing these modules. A copy od the module's
368 dictionary is stored by calling _PyImport_FixupExtension()
369 immediately after the module initialization function succeeds. A
370 copy can be retrieved from there by calling
371 _PyImport_FindExtension(). */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000372
Guido van Rossum79f25d91997-04-29 20:08:16 +0000373PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000374_PyImport_FixupExtension(char *name, char *filename)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000375{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000376 PyObject *modules, *mod, *dict, *copy;
377 if (extensions == NULL) {
378 extensions = PyDict_New();
379 if (extensions == NULL)
380 return NULL;
381 }
382 modules = PyImport_GetModuleDict();
383 mod = PyDict_GetItemString(modules, name);
384 if (mod == NULL || !PyModule_Check(mod)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000385 PyErr_Format(PyExc_SystemError,
386 "_PyImport_FixupExtension: module %.200s not loaded", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000387 return NULL;
388 }
389 dict = PyModule_GetDict(mod);
390 if (dict == NULL)
391 return NULL;
392 copy = PyObject_CallMethod(dict, "copy", "");
393 if (copy == NULL)
394 return NULL;
395 PyDict_SetItemString(extensions, filename, copy);
396 Py_DECREF(copy);
397 return copy;
398}
399
400PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000401_PyImport_FindExtension(char *name, char *filename)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000402{
403 PyObject *dict, *mod, *mdict, *result;
404 if (extensions == NULL)
405 return NULL;
406 dict = PyDict_GetItemString(extensions, filename);
407 if (dict == NULL)
408 return NULL;
409 mod = PyImport_AddModule(name);
410 if (mod == NULL)
411 return NULL;
412 mdict = PyModule_GetDict(mod);
413 if (mdict == NULL)
414 return NULL;
415 result = PyObject_CallMethod(mdict, "update", "O", dict);
416 if (result == NULL)
417 return NULL;
418 Py_DECREF(result);
419 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000420 PySys_WriteStderr("import %s # previously loaded (%s)\n",
Guido van Rossum25ce5661997-08-02 03:10:38 +0000421 name, filename);
422 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000423}
424
425
426/* Get the module object corresponding to a module name.
427 First check the modules dictionary if there's one there,
428 if not, create a new one and insert in in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000429 Because the former action is most common, THIS DOES NOT RETURN A
430 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000431
Guido van Rossum79f25d91997-04-29 20:08:16 +0000432PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000433PyImport_AddModule(char *name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000434{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000435 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000436 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000437
Guido van Rossum25ce5661997-08-02 03:10:38 +0000438 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
Guido van Rossum79f25d91997-04-29 20:08:16 +0000439 PyModule_Check(m))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000440 return m;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000441 m = PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000442 if (m == NULL)
443 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000444 if (PyDict_SetItemString(modules, name, m) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000445 Py_DECREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000446 return NULL;
447 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000448 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000449
450 return m;
451}
452
453
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000454/* Execute a code object in a module and return the module object
455 WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000456
Guido van Rossum79f25d91997-04-29 20:08:16 +0000457PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000458PyImport_ExecCodeModule(char *name, PyObject *co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000459{
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000460 return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
461}
462
463PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000464PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname)
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000465{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000466 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000467 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000468
Guido van Rossum79f25d91997-04-29 20:08:16 +0000469 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000470 if (m == NULL)
471 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000472 d = PyModule_GetDict(m);
473 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
474 if (PyDict_SetItemString(d, "__builtins__",
475 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000476 return NULL;
477 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000478 /* Remember the filename as the __file__ attribute */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000479 v = NULL;
480 if (pathname != NULL) {
481 v = PyString_FromString(pathname);
482 if (v == NULL)
483 PyErr_Clear();
484 }
485 if (v == NULL) {
486 v = ((PyCodeObject *)co)->co_filename;
487 Py_INCREF(v);
488 }
489 if (PyDict_SetItemString(d, "__file__", v) != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000490 PyErr_Clear(); /* Not important enough to report */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000491 Py_DECREF(v);
492
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000493 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000494 if (v == NULL)
495 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000496 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000497
Guido van Rossum25ce5661997-08-02 03:10:38 +0000498 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000499 PyErr_Format(PyExc_ImportError,
500 "Loaded module %.200s not found in sys.modules",
501 name);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000502 return NULL;
503 }
504
Guido van Rossum79f25d91997-04-29 20:08:16 +0000505 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000506
507 return m;
508}
509
510
511/* Given a pathname for a Python source file, fill a buffer with the
512 pathname for the corresponding compiled file. Return the pathname
513 for the compiled file, or NULL if there's no space in the buffer.
514 Doesn't set an exception. */
515
516static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000517make_compiled_pathname(char *pathname, char *buf, size_t buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000518{
Fred Drake4c82b232000-06-30 16:18:57 +0000519 size_t len;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000520
521 len = strlen(pathname);
522 if (len+2 > buflen)
523 return NULL;
524 strcpy(buf, pathname);
Guido van Rossum0824f631997-03-11 18:37:35 +0000525 strcpy(buf+len, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000526
527 return buf;
528}
529
530
531/* Given a pathname for a Python source file, its time of last
532 modification, and a pathname for a compiled file, check whether the
533 compiled file represents the same version of the source. If so,
534 return a FILE pointer for the compiled file, positioned just after
535 the header; if not, return NULL.
536 Doesn't set an exception. */
537
538static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000539check_compiled_module(char *pathname, long mtime, char *cpathname)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000540{
541 FILE *fp;
542 long magic;
543 long pyc_mtime;
544
545 fp = fopen(cpathname, "rb");
546 if (fp == NULL)
547 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000548 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000549 if (magic != pyc_magic) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000550 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000551 PySys_WriteStderr("# %s has bad magic\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000552 fclose(fp);
553 return NULL;
554 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000555 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000556 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000557 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000558 PySys_WriteStderr("# %s has bad mtime\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000559 fclose(fp);
560 return NULL;
561 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000562 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000563 PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000564 return fp;
565}
566
567
568/* Read a code object from a file and check it for validity */
569
Guido van Rossum79f25d91997-04-29 20:08:16 +0000570static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000571read_compiled_module(char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000572{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000573 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000574
Guido van Rossum79f25d91997-04-29 20:08:16 +0000575 co = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000576 /* Ugly: rd_object() may return NULL with or without error */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000577 if (co == NULL || !PyCode_Check(co)) {
578 if (!PyErr_Occurred())
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000579 PyErr_Format(PyExc_ImportError,
580 "Non-code object in %.200s", cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000581 Py_XDECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000582 return NULL;
583 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000584 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000585}
586
587
588/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000589 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000590
Guido van Rossum79f25d91997-04-29 20:08:16 +0000591static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000592load_compiled_module(char *name, char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000593{
594 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000595 PyCodeObject *co;
596 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000597
Guido van Rossum79f25d91997-04-29 20:08:16 +0000598 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000599 if (magic != pyc_magic) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000600 PyErr_Format(PyExc_ImportError,
601 "Bad magic number in %.200s", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000602 return NULL;
603 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000604 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000605 co = read_compiled_module(cpathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000606 if (co == NULL)
607 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000608 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000609 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000610 name, cpathname);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000611 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000612 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000613
614 return m;
615}
616
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000617/* Parse a source file and return the corresponding code object */
618
Guido van Rossum79f25d91997-04-29 20:08:16 +0000619static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000620parse_source_module(char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000621{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000622 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000623 node *n;
624
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000625 n = PyParser_SimpleParseFile(fp, pathname, Py_file_input);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000626 if (n == NULL)
627 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000628 co = PyNode_Compile(n, pathname);
629 PyNode_Free(n);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000630
631 return co;
632}
633
634
Guido van Rossum55a83382000-09-20 20:31:38 +0000635/* Helper to open a bytecode file for writing in exclusive mode */
636
637static FILE *
638open_exclusive(char *filename)
639{
640#if defined(O_EXCL)&&defined(O_CREAT)&&defined(O_WRONLY)&&defined(O_TRUNC)
641 /* Use O_EXCL to avoid a race condition when another process tries to
642 write the same file. When that happens, our open() call fails,
643 which is just fine (since it's only a cache).
644 XXX If the file exists and is writable but the directory is not
645 writable, the file will never be written. Oh well.
646 */
647 int fd;
648 (void) unlink(filename);
649 fd = open(filename, O_EXCL|O_CREAT|O_WRONLY|O_TRUNC, 0666);
650 if (fd < 0)
651 return NULL;
652 return fdopen(fd, "wb");
653#else
654 /* Best we can do -- on Windows this can't happen anyway */
655 return fopen(filename, "wb");
656#endif
657}
658
659
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000660/* Write a compiled module to a file, placing the time of last
661 modification of its source into the header.
662 Errors are ignored, if a write error occurs an attempt is made to
663 remove the file. */
664
665static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000666write_compiled_module(PyCodeObject *co, char *cpathname, long mtime)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000667{
668 FILE *fp;
669
Guido van Rossum55a83382000-09-20 20:31:38 +0000670 fp = open_exclusive(cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000671 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000672 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000673 PySys_WriteStderr(
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000674 "# can't create %s\n", cpathname);
675 return;
676 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000677 PyMarshal_WriteLongToFile(pyc_magic, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000678 /* First write a 0 for mtime */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000679 PyMarshal_WriteLongToFile(0L, fp);
680 PyMarshal_WriteObjectToFile((PyObject *)co, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000681 if (ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000682 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000683 PySys_WriteStderr("# can't write %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000684 /* Don't keep partial file */
685 fclose(fp);
686 (void) unlink(cpathname);
687 return;
688 }
689 /* Now write the true mtime */
690 fseek(fp, 4L, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000691 PyMarshal_WriteLongToFile(mtime, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000692 fflush(fp);
693 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000694 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000695 PySys_WriteStderr("# wrote %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000696#ifdef macintosh
Jack Jansencbf630f2000-07-11 21:59:16 +0000697 PyMac_setfiletype(cpathname, 'Pyth', 'PYC ');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000698#endif
699}
700
701
702/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000703 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
704 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000705
Guido van Rossum79f25d91997-04-29 20:08:16 +0000706static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000707load_source_module(char *name, char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000708{
Fred Drake4c82b232000-06-30 16:18:57 +0000709 time_t mtime;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000710 FILE *fpc;
711 char buf[MAXPATHLEN+1];
712 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000713 PyCodeObject *co;
714 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000715
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000716 mtime = PyOS_GetLastModificationTime(pathname, fp);
Fred Drake4c82b232000-06-30 16:18:57 +0000717 if (mtime == -1)
718 return NULL;
719#if SIZEOF_TIME_T > 4
720 /* Python's .pyc timestamp handling presumes that the timestamp fits
721 in 4 bytes. This will be fine until sometime in the year 2038,
722 when a 4-byte signed time_t will overflow.
723 */
724 if (mtime >> 32) {
725 PyErr_SetString(PyExc_OverflowError,
726 "modification time overflows a 4 bytes");
727 return NULL;
728 }
729#endif
730 cpathname = make_compiled_pathname(pathname, buf, (size_t)MAXPATHLEN+1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000731 if (cpathname != NULL &&
732 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000733 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000734 fclose(fpc);
735 if (co == NULL)
736 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000737 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000738 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000739 name, cpathname);
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000740 pathname = cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000741 }
742 else {
743 co = parse_source_module(pathname, fp);
744 if (co == NULL)
745 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000746 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000747 PySys_WriteStderr("import %s # from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000748 name, pathname);
749 write_compiled_module(co, cpathname, mtime);
750 }
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000751 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000752 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000753
754 return m;
755}
756
757
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000758/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +0000759static PyObject *load_module(char *, FILE *, char *, int);
760static struct filedescr *find_module(char *, PyObject *,
761 char *, size_t, FILE **);
762static struct _frozen *find_frozen(char *name);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000763
764/* Load a package and return its module object WITH INCREMENTED
765 REFERENCE COUNT */
766
767static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000768load_package(char *name, char *pathname)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000769{
770 PyObject *m, *d, *file, *path;
771 int err;
772 char buf[MAXPATHLEN+1];
773 FILE *fp = NULL;
774 struct filedescr *fdp;
775
776 m = PyImport_AddModule(name);
777 if (m == NULL)
778 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000779 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000780 PySys_WriteStderr("import %s # directory %s\n",
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000781 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000782 d = PyModule_GetDict(m);
783 file = PyString_FromString(pathname);
784 if (file == NULL)
785 return NULL;
786 path = Py_BuildValue("[O]", file);
787 if (path == NULL) {
788 Py_DECREF(file);
789 return NULL;
790 }
791 err = PyDict_SetItemString(d, "__file__", file);
792 if (err == 0)
793 err = PyDict_SetItemString(d, "__path__", path);
794 if (err != 0) {
795 m = NULL;
796 goto cleanup;
797 }
798 buf[0] = '\0';
799 fdp = find_module("__init__", path, buf, sizeof(buf), &fp);
800 if (fdp == NULL) {
801 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
802 PyErr_Clear();
803 }
804 else
805 m = NULL;
806 goto cleanup;
807 }
808 m = load_module(name, fp, buf, fdp->type);
809 if (fp != NULL)
810 fclose(fp);
811 cleanup:
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000812 Py_XDECREF(path);
813 Py_XDECREF(file);
814 return m;
815}
816
817
818/* Helper to test for built-in module */
819
820static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000821is_builtin(char *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000822{
823 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +0000824 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
825 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
826 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000827 return -1;
828 else
829 return 1;
830 }
831 }
832 return 0;
833}
834
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000835
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000836/* Search the path (default sys.path) for a module. Return the
837 corresponding filedescr struct, and (via return arguments) the
838 pathname and an open file. Return NULL if the module is not found. */
839
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000840#ifdef MS_COREDLL
Thomas Woutersb4bd21c2000-07-22 23:38:01 +0000841extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **,
842 char *, int);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000843#endif
844
Guido van Rossum0980bd91998-02-13 17:18:36 +0000845#ifdef CHECK_IMPORT_CASE
846static int check_case(char *, int, int, char *);
847#endif
848
Tim Petersdbd9ba62000-07-09 03:09:57 +0000849static int find_init_module(char *); /* Forward */
Guido van Rossum197346f1997-10-31 18:38:52 +0000850
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000851static struct filedescr *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000852find_module(char *realname, PyObject *path, char *buf, size_t buflen,
853 FILE **p_fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000854{
Fred Drake4c82b232000-06-30 16:18:57 +0000855 int i, npath;
856 size_t len, namelen;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000857 struct _frozen *f;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000858 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000859 FILE *fp = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000860 struct stat statbuf;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000861 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
862 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
863 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossum0506a431998-08-11 15:07:39 +0000864 char name[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000865
Fred Drake4c82b232000-06-30 16:18:57 +0000866 if (strlen(realname) > MAXPATHLEN) {
867 PyErr_SetString(PyExc_OverflowError, "module name is too long");
868 return NULL;
869 }
Guido van Rossum0506a431998-08-11 15:07:39 +0000870 strcpy(name, realname);
871
872 if (path != NULL && PyString_Check(path)) {
873 /* Submodule of "frozen" package:
874 Set name to the fullname, path to NULL
875 and continue as "usual" */
876 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
877 PyErr_SetString(PyExc_ImportError,
878 "full frozen module name too long");
879 return NULL;
880 }
881 strcpy(buf, PyString_AsString(path));
882 strcat(buf, ".");
883 strcat(buf, name);
884 strcpy(name, buf);
885 path = NULL;
886 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000887 if (path == NULL) {
888 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000889 strcpy(buf, name);
890 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000891 }
Guido van Rossuma5568d31998-03-05 03:45:08 +0000892 if ((f = find_frozen(name)) != NULL) {
893 strcpy(buf, name);
894 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000895 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000896
Guido van Rossumac279101996-08-22 23:10:58 +0000897#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000898 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
899 if (fp != NULL) {
900 *p_fp = fp;
901 return fdp;
902 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000903#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000904 path = PySys_GetObject("path");
905 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000906 if (path == NULL || !PyList_Check(path)) {
907 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +0000908 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000909 return NULL;
910 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000911 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000912 namelen = strlen(name);
913 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000914 PyObject *v = PyList_GetItem(path, i);
915 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000916 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000917 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000918 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000919 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000920 strcpy(buf, PyString_AsString(v));
Fred Drake4c82b232000-06-30 16:18:57 +0000921 if (strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000922 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000923#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000924#ifdef INTERN_STRINGS
925 /*
926 ** Speedup: each sys.path item is interned, and
927 ** FindResourceModule remembers which items refer to
928 ** folders (so we don't have to bother trying to look
929 ** into them for resources).
930 */
931 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
932 v = PyList_GET_ITEM(path, i);
933#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000934 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000935 static struct filedescr resfiledescr =
936 {"", "", PY_RESOURCE};
Jack Jansen9c96a921995-02-15 22:57:06 +0000937
938 return &resfiledescr;
939 }
Guido van Rossum0f84a341998-08-06 13:36:01 +0000940 if (PyMac_FindCodeResourceModule((PyStringObject *)v, name, buf)) {
941 static struct filedescr resfiledescr =
942 {"", "", PY_CODERESOURCE};
943
944 return &resfiledescr;
945 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000946#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000947 if (len > 0 && buf[len-1] != SEP
948#ifdef ALTSEP
949 && buf[len-1] != ALTSEP
950#endif
951 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000952 buf[len++] = SEP;
Guido van Rossum40f470f1996-05-23 22:51:04 +0000953#ifdef IMPORT_8x3_NAMES
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000954 /* see if we are searching in directory dos-8x3 */
955 if (len > 7 && !strncmp(buf + len - 8, "dos-8x3", 7)){
Guido van Rossum40f470f1996-05-23 22:51:04 +0000956 int j;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000957 char ch; /* limit name to 8 lower-case characters */
Guido van Rossum40f470f1996-05-23 22:51:04 +0000958 for (j = 0; (ch = name[j]) && j < 8; j++)
959 if (isupper(ch))
960 buf[len++] = tolower(ch);
961 else
962 buf[len++] = ch;
963 }
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000964 else /* Not in dos-8x3, use the full name */
Guido van Rossum6f489d91996-06-28 20:15:15 +0000965#endif
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000966 {
Guido van Rossum40f470f1996-05-23 22:51:04 +0000967 strcpy(buf+len, name);
968 len += namelen;
969 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000970#ifdef HAVE_STAT
971 if (stat(buf, &statbuf) == 0) {
Guido van Rossum197346f1997-10-31 18:38:52 +0000972 if (S_ISDIR(statbuf.st_mode)) {
Guido van Rossum0980bd91998-02-13 17:18:36 +0000973 if (find_init_module(buf)) {
974#ifdef CHECK_IMPORT_CASE
975 if (!check_case(buf, len, namelen,
976 name))
977 return NULL;
978#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000979 return &fd_package;
Guido van Rossum0980bd91998-02-13 17:18:36 +0000980 }
Guido van Rossum197346f1997-10-31 18:38:52 +0000981 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000982 }
983#else
984 /* XXX How are you going to test for directories? */
985#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000986#ifdef macintosh
987 fdp = PyMac_FindModuleExtension(buf, &len, name);
988 if (fdp)
989 fp = fopen(buf, fdp->mode);
990#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000991 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000992 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000993 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000994 PySys_WriteStderr("# trying %s\n", buf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000995 fp = fopen(buf, fdp->mode);
996 if (fp != NULL)
997 break;
998 }
Guido van Rossum741689d1997-08-12 14:53:39 +0000999#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001000 if (fp != NULL)
1001 break;
1002 }
1003 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001004 PyErr_Format(PyExc_ImportError,
1005 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001006 return NULL;
1007 }
Guido van Rossum0980bd91998-02-13 17:18:36 +00001008#ifdef CHECK_IMPORT_CASE
1009 if (!check_case(buf, len, namelen, name)) {
1010 fclose(fp);
1011 return NULL;
1012 }
1013#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001014
1015 *p_fp = fp;
1016 return fdp;
1017}
1018
Guido van Rossum0980bd91998-02-13 17:18:36 +00001019#ifdef CHECK_IMPORT_CASE
1020
1021#ifdef MS_WIN32
1022#include <windows.h>
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001023#include <ctype.h>
1024
1025static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001026allcaps8x3(char *s)
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001027{
1028 /* Return 1 if s is an 8.3 filename in ALLCAPS */
1029 char c;
1030 char *dot = strchr(s, '.');
1031 char *end = strchr(s, '\0');
1032 if (dot != NULL) {
1033 if (dot-s > 8)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001034 return 0; /* More than 8 before '.' */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001035 if (end-dot > 4)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001036 return 0; /* More than 3 after '.' */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001037 end = strchr(dot+1, '.');
1038 if (end != NULL)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001039 return 0; /* More than one dot */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001040 }
1041 else if (end-s > 8)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001042 return 0; /* More than 8 and no dot */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001043 while ((c = *s++)) {
1044 if (islower(c))
1045 return 0;
1046 }
1047 return 1;
1048}
1049
Guido van Rossum0980bd91998-02-13 17:18:36 +00001050static int
1051check_case(char *buf, int len, int namelen, char *name)
1052{
1053 WIN32_FIND_DATA data;
1054 HANDLE h;
1055 if (getenv("PYTHONCASEOK") != NULL)
1056 return 1;
1057 h = FindFirstFile(buf, &data);
1058 if (h == INVALID_HANDLE_VALUE) {
1059 PyErr_Format(PyExc_NameError,
1060 "Can't find file for module %.100s\n(filename %.300s)",
1061 name, buf);
1062 return 0;
1063 }
1064 FindClose(h);
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001065 if (allcaps8x3(data.cFileName)) {
1066 /* Skip the test if the filename is ALL.CAPS. This can
1067 happen in certain circumstances beyond our control,
1068 e.g. when software is installed under NT on a FAT
1069 filesystem and then the same FAT filesystem is used
1070 under Windows 95. */
1071 return 1;
1072 }
Guido van Rossum0980bd91998-02-13 17:18:36 +00001073 if (strncmp(data.cFileName, name, namelen) != 0) {
1074 strcpy(buf+len-namelen, data.cFileName);
1075 PyErr_Format(PyExc_NameError,
1076 "Case mismatch for module name %.100s\n(filename %.300s)",
1077 name, buf);
1078 return 0;
1079 }
1080 return 1;
1081}
1082#endif /* MS_WIN32 */
1083
1084#ifdef macintosh
1085#include <TextUtils.h>
Guido van Rossumb33aa1a2000-04-24 15:08:18 +00001086#ifdef USE_GUSI1
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001087#include "TFileSpec.h" /* for Path2FSSpec() */
1088#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001089static int
1090check_case(char *buf, int len, int namelen, char *name)
1091{
1092 FSSpec fss;
1093 OSErr err;
Guido van Rossumb33aa1a2000-04-24 15:08:18 +00001094#ifndef USE_GUSI1
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001095 err = FSMakeFSSpec(0, 0, Pstring(buf), &fss);
1096#else
1097 /* GUSI's Path2FSSpec() resolves all possible aliases nicely on
1098 the way, which is fine for all directories, but here we need
1099 the original name of the alias file (say, Dlg.ppc.slb, not
1100 toolboxmodules.ppc.slb). */
1101 char *colon;
1102 err = Path2FSSpec(buf, &fss);
1103 if (err == noErr) {
1104 colon = strrchr(buf, ':'); /* find filename */
1105 if (colon != NULL)
1106 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1107 Pstring(colon+1), &fss);
1108 else
1109 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1110 fss.name, &fss);
1111 }
1112#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001113 if (err) {
1114 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001115 "Can't find file for module %.100s\n(filename %.300s)",
1116 name, buf);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001117 return 0;
1118 }
Guido van Rossum63e97ad2000-07-01 01:06:56 +00001119 if ( namelen > fss.name[0] || strncmp(name, (char *)fss.name+1, namelen) != 0 ) {
Guido van Rossum0980bd91998-02-13 17:18:36 +00001120 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001121 "Case mismatch for module name %.100s\n(filename %.300s)",
1122 name, fss.name);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001123 return 0;
1124 }
1125 return 1;
1126}
1127#endif /* macintosh */
1128
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001129#ifdef DJGPP
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001130#include <dir.h>
1131
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001132static int
1133check_case(char *buf, int len, int namelen, char *name)
1134{
1135 struct ffblk ffblk;
1136 int done;
1137
1138 if (getenv("PYTHONCASEOK") != NULL)
1139 return 1;
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001140 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001141 if (done) {
1142 PyErr_Format(PyExc_NameError,
1143 "Can't find file for module %.100s\n(filename %.300s)",
1144 name, buf);
1145 return 0;
1146 }
1147
1148 if (strncmp(ffblk.ff_name, name, namelen) != 0) {
1149 strcpy(buf+len-namelen, ffblk.ff_name);
1150 PyErr_Format(PyExc_NameError,
1151 "Case mismatch for module name %.100s\n(filename %.300s)",
1152 name, buf);
1153 return 0;
1154 }
1155 return 1;
1156}
1157#endif
1158
Guido van Rossum8766a771998-04-10 23:44:32 +00001159#endif /* CHECK_IMPORT_CASE */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001160
Guido van Rossum197346f1997-10-31 18:38:52 +00001161#ifdef HAVE_STAT
1162/* Helper to look for __init__.py or __init__.py[co] in potential package */
1163static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001164find_init_module(char *buf)
Guido van Rossum197346f1997-10-31 18:38:52 +00001165{
Fred Drake4c82b232000-06-30 16:18:57 +00001166 size_t save_len = strlen(buf);
1167 size_t i = save_len;
Guido van Rossum197346f1997-10-31 18:38:52 +00001168 struct stat statbuf;
1169
1170 if (save_len + 13 >= MAXPATHLEN)
1171 return 0;
1172 buf[i++] = SEP;
1173 strcpy(buf+i, "__init__.py");
1174 if (stat(buf, &statbuf) == 0) {
1175 buf[save_len] = '\0';
1176 return 1;
1177 }
1178 i += strlen(buf+i);
1179 if (Py_OptimizeFlag)
1180 strcpy(buf+i, "o");
1181 else
1182 strcpy(buf+i, "c");
1183 if (stat(buf, &statbuf) == 0) {
1184 buf[save_len] = '\0';
1185 return 1;
1186 }
1187 buf[save_len] = '\0';
1188 return 0;
1189}
1190#endif /* HAVE_STAT */
1191
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001192
Tim Petersdbd9ba62000-07-09 03:09:57 +00001193static int init_builtin(char *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001194
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001195/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001196 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001197
Guido van Rossum79f25d91997-04-29 20:08:16 +00001198static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001199load_module(char *name, FILE *fp, char *buf, int type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001200{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001201 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001202 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001203 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001204
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001205 /* First check that there's an open file (if we need one) */
1206 switch (type) {
1207 case PY_SOURCE:
1208 case PY_COMPILED:
1209 if (fp == NULL) {
1210 PyErr_Format(PyExc_ValueError,
1211 "file object required for import (type code %d)",
1212 type);
1213 return NULL;
1214 }
1215 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001216
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001217 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001218
1219 case PY_SOURCE:
1220 m = load_source_module(name, buf, fp);
1221 break;
1222
1223 case PY_COMPILED:
1224 m = load_compiled_module(name, buf, fp);
1225 break;
1226
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001227#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001228 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001229 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001230 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001231#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001232
Jack Jansen9c96a921995-02-15 22:57:06 +00001233#ifdef macintosh
1234 case PY_RESOURCE:
1235 m = PyMac_LoadResourceModule(name, buf);
1236 break;
Guido van Rossum0f84a341998-08-06 13:36:01 +00001237 case PY_CODERESOURCE:
1238 m = PyMac_LoadCodeResourceModule(name, buf);
1239 break;
Jack Jansen9c96a921995-02-15 22:57:06 +00001240#endif
1241
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001242 case PKG_DIRECTORY:
1243 m = load_package(name, buf);
1244 break;
1245
1246 case C_BUILTIN:
1247 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001248 if (buf != NULL && buf[0] != '\0')
1249 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001250 if (type == C_BUILTIN)
1251 err = init_builtin(name);
1252 else
1253 err = PyImport_ImportFrozenModule(name);
1254 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001255 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001256 if (err == 0) {
1257 PyErr_Format(PyExc_ImportError,
1258 "Purported %s module %.200s not found",
1259 type == C_BUILTIN ?
1260 "builtin" : "frozen",
1261 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001262 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001263 }
1264 modules = PyImport_GetModuleDict();
1265 m = PyDict_GetItemString(modules, name);
1266 if (m == NULL) {
1267 PyErr_Format(
1268 PyExc_ImportError,
1269 "%s module %.200s not properly initialized",
1270 type == C_BUILTIN ?
1271 "builtin" : "frozen",
1272 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001273 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001274 }
1275 Py_INCREF(m);
1276 break;
1277
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001278 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001279 PyErr_Format(PyExc_ImportError,
1280 "Don't know how to import %.200s (type code %d)",
1281 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001282 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001283
1284 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001285
1286 return m;
1287}
1288
1289
1290/* Initialize a built-in module.
1291 Return 1 for succes, 0 if the module is not found, and -1 with
1292 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001293
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001294static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001295init_builtin(char *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001296{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001297 struct _inittab *p;
1298 PyObject *mod;
1299
1300 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
1301 return 1;
1302
Guido van Rossum771c6c81997-10-31 18:37:24 +00001303 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001304 if (strcmp(name, p->name) == 0) {
1305 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001306 PyErr_Format(PyExc_ImportError,
1307 "Cannot re-init internal module %.200s",
1308 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001309 return -1;
1310 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001311 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001312 PySys_WriteStderr("import %s # builtin\n", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001313 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001314 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001315 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001316 if (_PyImport_FixupExtension(name, name) == NULL)
1317 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001318 return 1;
1319 }
1320 }
1321 return 0;
1322}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001323
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001324
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001325/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001326
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001327static struct _frozen *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001328find_frozen(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001329{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001330 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001331
Guido van Rossum79f25d91997-04-29 20:08:16 +00001332 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001333 if (p->name == NULL)
1334 return NULL;
1335 if (strcmp(p->name, name) == 0)
1336 break;
1337 }
1338 return p;
1339}
1340
Guido van Rossum79f25d91997-04-29 20:08:16 +00001341static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001342get_frozen_object(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001343{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001344 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001345 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001346
1347 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001348 PyErr_Format(PyExc_ImportError,
1349 "No such frozen object named %.200s",
1350 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001351 return NULL;
1352 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001353 size = p->size;
1354 if (size < 0)
1355 size = -size;
1356 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001357}
1358
1359/* Initialize a frozen module.
1360 Return 1 for succes, 0 if the module is not found, and -1 with
1361 an exception set if the initialization failed.
1362 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001363
1364int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001365PyImport_ImportFrozenModule(char *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001366{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001367 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001368 PyObject *co;
1369 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001370 int ispackage;
1371 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001372
1373 if (p == NULL)
1374 return 0;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001375 size = p->size;
1376 ispackage = (size < 0);
1377 if (ispackage)
1378 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001379 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001380 PySys_WriteStderr("import %s # frozen%s\n",
Guido van Rossuma5568d31998-03-05 03:45:08 +00001381 name, ispackage ? " package" : "");
1382 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001383 if (co == NULL)
1384 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001385 if (!PyCode_Check(co)) {
1386 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001387 PyErr_Format(PyExc_TypeError,
1388 "frozen object %.200s is not a code object",
1389 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001390 return -1;
1391 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001392 if (ispackage) {
1393 /* Set __path__ to the package name */
1394 PyObject *d, *s;
1395 int err;
1396 m = PyImport_AddModule(name);
1397 if (m == NULL)
1398 return -1;
1399 d = PyModule_GetDict(m);
1400 s = PyString_InternFromString(name);
1401 if (s == NULL)
1402 return -1;
1403 err = PyDict_SetItemString(d, "__path__", s);
1404 Py_DECREF(s);
1405 if (err != 0)
1406 return err;
1407 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001408 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001409 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001410 if (m == NULL)
1411 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001412 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001413 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001414}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001415
1416
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001417/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001418 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001419
Guido van Rossum79f25d91997-04-29 20:08:16 +00001420PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001421PyImport_ImportModule(char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00001422{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001423 static PyObject *fromlist = NULL;
1424 if (fromlist == NULL && strchr(name, '.') != NULL) {
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001425 fromlist = Py_BuildValue("(s)", "*");
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001426 if (fromlist == NULL)
1427 return NULL;
1428 }
1429 return PyImport_ImportModuleEx(name, NULL, NULL, fromlist);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001430}
1431
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001432/* Forward declarations for helper routines */
Tim Petersdbd9ba62000-07-09 03:09:57 +00001433static PyObject *get_parent(PyObject *globals, char *buf, int *p_buflen);
1434static PyObject *load_next(PyObject *mod, PyObject *altmod,
1435 char **p_name, char *buf, int *p_buflen);
1436static int mark_miss(char *name);
1437static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
1438 char *buf, int buflen, int recursive);
1439static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001440
1441/* The Magnum Opus of dotted-name import :-) */
1442
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001443static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001444import_module_ex(char *name, PyObject *globals, PyObject *locals,
1445 PyObject *fromlist)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001446{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001447 char buf[MAXPATHLEN+1];
1448 int buflen = 0;
1449 PyObject *parent, *head, *next, *tail;
1450
1451 parent = get_parent(globals, buf, &buflen);
1452 if (parent == NULL)
1453 return NULL;
1454
1455 head = load_next(parent, Py_None, &name, buf, &buflen);
1456 if (head == NULL)
1457 return NULL;
1458
1459 tail = head;
1460 Py_INCREF(tail);
1461 while (name) {
1462 next = load_next(tail, tail, &name, buf, &buflen);
1463 Py_DECREF(tail);
1464 if (next == NULL) {
1465 Py_DECREF(head);
1466 return NULL;
1467 }
1468 tail = next;
1469 }
1470
1471 if (fromlist != NULL) {
1472 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1473 fromlist = NULL;
1474 }
1475
1476 if (fromlist == NULL) {
1477 Py_DECREF(tail);
1478 return head;
1479 }
1480
1481 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001482 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001483 Py_DECREF(tail);
1484 return NULL;
1485 }
1486
1487 return tail;
1488}
1489
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001490PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001491PyImport_ImportModuleEx(char *name, PyObject *globals, PyObject *locals,
1492 PyObject *fromlist)
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001493{
1494 PyObject *result;
1495 lock_import();
Guido van Rossumd65911b1998-03-03 22:33:27 +00001496 result = import_module_ex(name, globals, locals, fromlist);
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001497 unlock_import();
1498 return result;
1499}
1500
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001501static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001502get_parent(PyObject *globals, char *buf, int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001503{
1504 static PyObject *namestr = NULL;
1505 static PyObject *pathstr = NULL;
1506 PyObject *modname, *modpath, *modules, *parent;
1507
1508 if (globals == NULL || !PyDict_Check(globals))
1509 return Py_None;
1510
1511 if (namestr == NULL) {
1512 namestr = PyString_InternFromString("__name__");
1513 if (namestr == NULL)
1514 return NULL;
1515 }
1516 if (pathstr == NULL) {
1517 pathstr = PyString_InternFromString("__path__");
1518 if (pathstr == NULL)
1519 return NULL;
1520 }
1521
1522 *buf = '\0';
1523 *p_buflen = 0;
1524 modname = PyDict_GetItem(globals, namestr);
1525 if (modname == NULL || !PyString_Check(modname))
1526 return Py_None;
1527
1528 modpath = PyDict_GetItem(globals, pathstr);
1529 if (modpath != NULL) {
1530 int len = PyString_GET_SIZE(modname);
1531 if (len > MAXPATHLEN) {
1532 PyErr_SetString(PyExc_ValueError,
1533 "Module name too long");
1534 return NULL;
1535 }
1536 strcpy(buf, PyString_AS_STRING(modname));
1537 *p_buflen = len;
1538 }
1539 else {
1540 char *start = PyString_AS_STRING(modname);
1541 char *lastdot = strrchr(start, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001542 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001543 if (lastdot == NULL)
1544 return Py_None;
1545 len = lastdot - start;
1546 if (len >= MAXPATHLEN) {
1547 PyErr_SetString(PyExc_ValueError,
1548 "Module name too long");
1549 return NULL;
1550 }
1551 strncpy(buf, start, len);
1552 buf[len] = '\0';
1553 *p_buflen = len;
1554 }
1555
1556 modules = PyImport_GetModuleDict();
1557 parent = PyDict_GetItemString(modules, buf);
1558 if (parent == NULL)
1559 parent = Py_None;
1560 return parent;
1561 /* We expect, but can't guarantee, if parent != None, that:
1562 - parent.__name__ == buf
1563 - parent.__dict__ is globals
1564 If this is violated... Who cares? */
1565}
1566
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001567/* altmod is either None or same as mod */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001568static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001569load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
1570 int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001571{
1572 char *name = *p_name;
1573 char *dot = strchr(name, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001574 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001575 char *p;
1576 PyObject *result;
1577
1578 if (dot == NULL) {
1579 *p_name = NULL;
1580 len = strlen(name);
1581 }
1582 else {
1583 *p_name = dot+1;
1584 len = dot-name;
1585 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00001586 if (len == 0) {
1587 PyErr_SetString(PyExc_ValueError,
1588 "Empty module name");
1589 return NULL;
1590 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001591
1592 p = buf + *p_buflen;
1593 if (p != buf)
1594 *p++ = '.';
1595 if (p+len-buf >= MAXPATHLEN) {
1596 PyErr_SetString(PyExc_ValueError,
1597 "Module name too long");
1598 return NULL;
1599 }
1600 strncpy(p, name, len);
1601 p[len] = '\0';
1602 *p_buflen = p+len-buf;
1603
1604 result = import_submodule(mod, p, buf);
1605 if (result == Py_None && altmod != mod) {
1606 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001607 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001608 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001609 if (result != NULL && result != Py_None) {
1610 if (mark_miss(buf) != 0) {
1611 Py_DECREF(result);
1612 return NULL;
1613 }
1614 strncpy(buf, name, len);
1615 buf[len] = '\0';
1616 *p_buflen = len;
1617 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001618 }
1619 if (result == NULL)
1620 return NULL;
1621
1622 if (result == Py_None) {
1623 Py_DECREF(result);
1624 PyErr_Format(PyExc_ImportError,
1625 "No module named %.200s", name);
1626 return NULL;
1627 }
1628
1629 return result;
1630}
1631
1632static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001633mark_miss(char *name)
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001634{
1635 PyObject *modules = PyImport_GetModuleDict();
1636 return PyDict_SetItemString(modules, name, Py_None);
1637}
1638
1639static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001640ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, int buflen,
1641 int recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001642{
1643 int i;
1644
1645 if (!PyObject_HasAttrString(mod, "__path__"))
1646 return 1;
1647
1648 for (i = 0; ; i++) {
1649 PyObject *item = PySequence_GetItem(fromlist, i);
1650 int hasit;
1651 if (item == NULL) {
1652 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1653 PyErr_Clear();
1654 return 1;
1655 }
1656 return 0;
1657 }
1658 if (!PyString_Check(item)) {
1659 PyErr_SetString(PyExc_TypeError,
1660 "Item in ``from list'' not a string");
1661 Py_DECREF(item);
1662 return 0;
1663 }
1664 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001665 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001666 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001667 /* See if the package defines __all__ */
1668 if (recursive)
1669 continue; /* Avoid endless recursion */
1670 all = PyObject_GetAttrString(mod, "__all__");
1671 if (all == NULL)
1672 PyErr_Clear();
1673 else {
1674 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1675 return 0;
1676 Py_DECREF(all);
1677 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001678 continue;
1679 }
1680 hasit = PyObject_HasAttr(mod, item);
1681 if (!hasit) {
1682 char *subname = PyString_AS_STRING(item);
1683 PyObject *submod;
1684 char *p;
1685 if (buflen + strlen(subname) >= MAXPATHLEN) {
1686 PyErr_SetString(PyExc_ValueError,
1687 "Module name too long");
1688 Py_DECREF(item);
1689 return 0;
1690 }
1691 p = buf + buflen;
1692 *p++ = '.';
1693 strcpy(p, subname);
1694 submod = import_submodule(mod, subname, buf);
1695 Py_XDECREF(submod);
1696 if (submod == NULL) {
1697 Py_DECREF(item);
1698 return 0;
1699 }
1700 }
1701 Py_DECREF(item);
1702 }
1703
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001704 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001705}
1706
1707static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001708import_submodule(PyObject *mod, char *subname, char *fullname)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001709{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001710 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001711 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001712
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001713 /* Require:
1714 if mod == None: subname == fullname
1715 else: mod.__name__ + "." + subname == fullname
1716 */
1717
1718 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001719 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001720 }
1721 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001722 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001723 char buf[MAXPATHLEN+1];
1724 struct filedescr *fdp;
1725 FILE *fp = NULL;
1726
Guido van Rossum9c0afe51998-05-19 15:09:05 +00001727 if (mod == Py_None)
1728 path = NULL;
1729 else {
1730 path = PyObject_GetAttrString(mod, "__path__");
1731 if (path == NULL) {
1732 PyErr_Clear();
1733 Py_INCREF(Py_None);
1734 return Py_None;
1735 }
1736 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001737
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001738 buf[0] = '\0';
Guido van Rossumb68cd421998-07-01 17:36:26 +00001739 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1740 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001741 if (fdp == NULL) {
1742 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1743 return NULL;
1744 PyErr_Clear();
1745 Py_INCREF(Py_None);
1746 return Py_None;
1747 }
1748 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001749 if (fp)
1750 fclose(fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001751 if (m != NULL && mod != Py_None) {
1752 if (PyObject_SetAttrString(mod, subname, m) < 0) {
1753 Py_DECREF(m);
1754 m = NULL;
1755 }
1756 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001757 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001758
1759 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001760}
1761
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001762
1763/* Re-import a module of any kind and return its module object, WITH
1764 INCREMENTED REFERENCE COUNT */
1765
Guido van Rossum79f25d91997-04-29 20:08:16 +00001766PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001767PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001768{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001769 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001770 PyObject *path = NULL;
1771 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001772 char buf[MAXPATHLEN+1];
1773 struct filedescr *fdp;
1774 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001775
Guido van Rossum79f25d91997-04-29 20:08:16 +00001776 if (m == NULL || !PyModule_Check(m)) {
1777 PyErr_SetString(PyExc_TypeError,
1778 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001779 return NULL;
1780 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001781 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001782 if (name == NULL)
1783 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001784 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001785 PyErr_Format(PyExc_ImportError,
1786 "reload(): module %.200s not in sys.modules",
1787 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001788 return NULL;
1789 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001790 subname = strrchr(name, '.');
1791 if (subname == NULL)
1792 subname = name;
1793 else {
1794 PyObject *parentname, *parent;
1795 parentname = PyString_FromStringAndSize(name, (subname-name));
1796 if (parentname == NULL)
1797 return NULL;
1798 parent = PyDict_GetItem(modules, parentname);
Barry Warsaw38793331999-01-27 17:54:20 +00001799 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00001800 if (parent == NULL) {
1801 PyErr_Format(PyExc_ImportError,
1802 "reload(): parent %.200s not in sys.modules",
1803 name);
1804 return NULL;
1805 }
1806 subname++;
1807 path = PyObject_GetAttrString(parent, "__path__");
1808 if (path == NULL)
1809 PyErr_Clear();
1810 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001811 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001812 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1813 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001814 if (fdp == NULL)
1815 return NULL;
1816 m = load_module(name, fp, buf, fdp->type);
1817 if (fp)
1818 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001819 return m;
1820}
1821
1822
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001823/* Higher-level import emulator which emulates the "import" statement
1824 more accurately -- it invokes the __import__() function from the
1825 builtins of the current globals. This means that the import is
1826 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00001827 environment, e.g. by "rexec".
1828 A dummy list ["__doc__"] is passed as the 4th argument so that
1829 e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
1830 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001831
1832PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001833PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001834{
1835 static PyObject *silly_list = NULL;
1836 static PyObject *builtins_str = NULL;
1837 static PyObject *import_str = NULL;
1838 static PyObject *standard_builtins = NULL;
1839 PyObject *globals = NULL;
1840 PyObject *import = NULL;
1841 PyObject *builtins = NULL;
1842 PyObject *r = NULL;
1843
1844 /* Initialize constant string objects */
1845 if (silly_list == NULL) {
1846 import_str = PyString_InternFromString("__import__");
1847 if (import_str == NULL)
1848 return NULL;
1849 builtins_str = PyString_InternFromString("__builtins__");
1850 if (builtins_str == NULL)
1851 return NULL;
1852 silly_list = Py_BuildValue("[s]", "__doc__");
1853 if (silly_list == NULL)
1854 return NULL;
1855 }
1856
1857 /* Get the builtins from current globals */
1858 globals = PyEval_GetGlobals();
1859 if(globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00001860 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001861 builtins = PyObject_GetItem(globals, builtins_str);
1862 if (builtins == NULL)
1863 goto err;
1864 }
1865 else {
1866 /* No globals -- use standard builtins, and fake globals */
1867 PyErr_Clear();
1868
1869 if (standard_builtins == NULL) {
1870 standard_builtins =
1871 PyImport_ImportModule("__builtin__");
1872 if (standard_builtins == NULL)
1873 return NULL;
1874 }
1875
1876 builtins = standard_builtins;
1877 Py_INCREF(builtins);
1878 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1879 if (globals == NULL)
1880 goto err;
1881 }
1882
1883 /* Get the __import__ function from the builtins */
1884 if (PyDict_Check(builtins))
1885 import=PyObject_GetItem(builtins, import_str);
1886 else
1887 import=PyObject_GetAttr(builtins, import_str);
1888 if (import == NULL)
1889 goto err;
1890
1891 /* Call the _import__ function with the proper argument list */
1892 r = PyObject_CallFunction(import, "OOOO",
1893 module_name, globals, globals, silly_list);
1894
1895 err:
1896 Py_XDECREF(globals);
1897 Py_XDECREF(builtins);
1898 Py_XDECREF(import);
1899
1900 return r;
1901}
1902
1903
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001904/* Module 'imp' provides Python access to the primitives used for
1905 importing modules.
1906*/
1907
Guido van Rossum79f25d91997-04-29 20:08:16 +00001908static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001909imp_get_magic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001910{
1911 char buf[4];
1912
Guido van Rossum43713e52000-02-29 13:59:29 +00001913 if (!PyArg_ParseTuple(args, ":get_magic"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001914 return NULL;
Guido van Rossum96774c12000-05-01 20:19:08 +00001915 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
1916 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
1917 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
1918 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001919
Guido van Rossum79f25d91997-04-29 20:08:16 +00001920 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001921}
1922
Guido van Rossum79f25d91997-04-29 20:08:16 +00001923static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001924imp_get_suffixes(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001925{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001926 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001927 struct filedescr *fdp;
1928
Guido van Rossum43713e52000-02-29 13:59:29 +00001929 if (!PyArg_ParseTuple(args, ":get_suffixes"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001930 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001931 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001932 if (list == NULL)
1933 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001934 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
1935 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001936 fdp->suffix, fdp->mode, fdp->type);
1937 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001938 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001939 return NULL;
1940 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001941 if (PyList_Append(list, item) < 0) {
1942 Py_DECREF(list);
1943 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001944 return NULL;
1945 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001946 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001947 }
1948 return list;
1949}
1950
Guido van Rossum79f25d91997-04-29 20:08:16 +00001951static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001952call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001953{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001954 extern int fclose(FILE *);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001955 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001956 struct filedescr *fdp;
1957 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001958 FILE *fp = NULL;
1959
1960 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001961 if (path == Py_None)
1962 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001963 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
1964 if (fdp == NULL)
1965 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001966 if (fp != NULL) {
1967 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
1968 if (fob == NULL) {
1969 fclose(fp);
1970 return NULL;
1971 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001972 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001973 else {
1974 fob = Py_None;
1975 Py_INCREF(fob);
1976 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001977 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001978 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001979 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001980 return ret;
1981}
1982
Guido van Rossum79f25d91997-04-29 20:08:16 +00001983static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001984imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001985{
1986 char *name;
1987 PyObject *path = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00001988 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001989 return NULL;
1990 return call_find_module(name, path);
1991}
1992
1993static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001994imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001995{
1996 char *name;
1997 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001998 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00001999 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002000 return NULL;
2001 ret = init_builtin(name);
2002 if (ret < 0)
2003 return NULL;
2004 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002005 Py_INCREF(Py_None);
2006 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002007 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002008 m = PyImport_AddModule(name);
2009 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002010 return m;
2011}
2012
Guido van Rossum79f25d91997-04-29 20:08:16 +00002013static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002014imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002015{
2016 char *name;
2017 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002018 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002019 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002020 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002021 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002022 if (ret < 0)
2023 return NULL;
2024 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002025 Py_INCREF(Py_None);
2026 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002027 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002028 m = PyImport_AddModule(name);
2029 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002030 return m;
2031}
2032
Guido van Rossum79f25d91997-04-29 20:08:16 +00002033static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002034imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002035{
2036 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002037
Guido van Rossum43713e52000-02-29 13:59:29 +00002038 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002039 return NULL;
2040 return get_frozen_object(name);
2041}
2042
Guido van Rossum79f25d91997-04-29 20:08:16 +00002043static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002044imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002045{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002046 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002047 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002048 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002049 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002050}
2051
Guido van Rossum79f25d91997-04-29 20:08:16 +00002052static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002053imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002054{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002055 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002056 struct _frozen *p;
Guido van Rossum43713e52000-02-29 13:59:29 +00002057 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002058 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002059 p = find_frozen(name);
2060 return PyInt_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002061}
2062
2063static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002064get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002065{
2066 FILE *fp;
2067 if (fob == NULL) {
2068 fp = fopen(pathname, mode);
2069 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002070 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002071 }
2072 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002073 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002074 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002075 PyErr_SetString(PyExc_ValueError,
2076 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002077 }
2078 return fp;
2079}
2080
Guido van Rossum79f25d91997-04-29 20:08:16 +00002081static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002082imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002083{
2084 char *name;
2085 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002086 PyObject *fob = NULL;
2087 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002088 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002089 if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002090 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002091 return NULL;
2092 fp = get_file(pathname, fob, "rb");
2093 if (fp == NULL)
2094 return NULL;
2095 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002096 if (fob == NULL)
2097 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002098 return m;
2099}
2100
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002101#ifdef HAVE_DYNAMIC_LOADING
2102
Guido van Rossum79f25d91997-04-29 20:08:16 +00002103static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002104imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002105{
2106 char *name;
2107 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002108 PyObject *fob = NULL;
2109 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002110 FILE *fp = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002111 if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002112 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002113 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002114 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002115 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002116 if (fp == NULL)
2117 return NULL;
2118 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002119 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002120 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002121}
2122
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002123#endif /* HAVE_DYNAMIC_LOADING */
2124
Guido van Rossum79f25d91997-04-29 20:08:16 +00002125static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002126imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002127{
2128 char *name;
2129 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002130 PyObject *fob = NULL;
2131 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002132 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002133 if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002134 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002135 return NULL;
2136 fp = get_file(pathname, fob, "r");
2137 if (fp == NULL)
2138 return NULL;
2139 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002140 if (fob == NULL)
2141 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002142 return m;
2143}
2144
Jack Jansen9c96a921995-02-15 22:57:06 +00002145#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002146static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002147imp_load_resource(PyObject *self, PyObject *args)
Jack Jansen9c96a921995-02-15 22:57:06 +00002148{
2149 char *name;
2150 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002151 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002152
Guido van Rossum43713e52000-02-29 13:59:29 +00002153 if (!PyArg_ParseTuple(args, "ss:load_resource", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002154 return NULL;
2155 m = PyMac_LoadResourceModule(name, pathname);
2156 return m;
2157}
2158#endif /* macintosh */
2159
Guido van Rossum79f25d91997-04-29 20:08:16 +00002160static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002161imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002162{
2163 char *name;
2164 PyObject *fob;
2165 char *pathname;
2166 char *suffix; /* Unused */
2167 char *mode;
2168 int type;
2169 FILE *fp;
2170
Guido van Rossum43713e52000-02-29 13:59:29 +00002171 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002172 &name, &fob, &pathname,
2173 &suffix, &mode, &type))
2174 return NULL;
2175 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
2176 PyErr_Format(PyExc_ValueError,
2177 "invalid file open mode %.200s", mode);
2178 return NULL;
2179 }
2180 if (fob == Py_None)
2181 fp = NULL;
2182 else {
2183 if (!PyFile_Check(fob)) {
2184 PyErr_SetString(PyExc_ValueError,
2185 "load_module arg#2 should be a file or None");
2186 return NULL;
2187 }
2188 fp = get_file(pathname, fob, mode);
2189 if (fp == NULL)
2190 return NULL;
2191 }
2192 return load_module(name, fp, pathname, type);
2193}
2194
2195static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002196imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002197{
2198 char *name;
2199 char *pathname;
Guido van Rossum43713e52000-02-29 13:59:29 +00002200 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002201 return NULL;
2202 return load_package(name, pathname);
2203}
2204
2205static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002206imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002207{
2208 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002209 if (!PyArg_ParseTuple(args, "s:new_module", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002210 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002211 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002212}
2213
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002214/* Doc strings */
2215
2216static char doc_imp[] = "\
2217This module provides the components needed to build your own\n\
2218__import__ function. Undocumented functions are obsolete.\n\
2219";
2220
2221static char doc_find_module[] = "\
2222find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
2223Search for a module. If path is omitted or None, search for a\n\
2224built-in, frozen or special module and continue search in sys.path.\n\
2225The module name cannot contain '.'; to search for a submodule of a\n\
2226package, pass the submodule name and the package's __path__.\
2227";
2228
2229static char doc_load_module[] = "\
2230load_module(name, file, filename, (suffix, mode, type)) -> module\n\
2231Load a module, given information returned by find_module().\n\
2232The module name must include the full package name, if any.\
2233";
2234
2235static char doc_get_magic[] = "\
2236get_magic() -> string\n\
2237Return the magic number for .pyc or .pyo files.\
2238";
2239
2240static char doc_get_suffixes[] = "\
2241get_suffixes() -> [(suffix, mode, type), ...]\n\
2242Return a list of (suffix, mode, type) tuples describing the files\n\
2243that find_module() looks for.\
2244";
2245
2246static char doc_new_module[] = "\
2247new_module(name) -> module\n\
2248Create a new module. Do not enter it in sys.modules.\n\
2249The module name must include the full package name, if any.\
2250";
2251
Guido van Rossum79f25d91997-04-29 20:08:16 +00002252static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002253 {"find_module", imp_find_module, 1, doc_find_module},
2254 {"get_magic", imp_get_magic, 1, doc_get_magic},
2255 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2256 {"load_module", imp_load_module, 1, doc_load_module},
2257 {"new_module", imp_new_module, 1, doc_new_module},
2258 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002259 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002260 {"init_builtin", imp_init_builtin, 1},
2261 {"init_frozen", imp_init_frozen, 1},
2262 {"is_builtin", imp_is_builtin, 1},
2263 {"is_frozen", imp_is_frozen, 1},
2264 {"load_compiled", imp_load_compiled, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002265#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002266 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002267#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002268 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002269#ifdef macintosh
2270 {"load_resource", imp_load_resource, 1},
2271#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002272 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002273 {NULL, NULL} /* sentinel */
2274};
2275
Guido van Rossum1a8791e1998-08-04 22:46:29 +00002276static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002277setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002278{
2279 PyObject *v;
2280 int err;
2281
2282 v = PyInt_FromLong((long)value);
2283 err = PyDict_SetItemString(d, name, v);
2284 Py_XDECREF(v);
2285 return err;
2286}
2287
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002288void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002289initimp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002290{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002291 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002292
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002293 m = Py_InitModule4("imp", imp_methods, doc_imp,
2294 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002295 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002296
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002297 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2298 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2299 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2300 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2301 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2302 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2303 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2304 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00002305 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002306
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002307 failure:
2308 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002309}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002310
2311
Guido van Rossumb18618d2000-05-03 23:44:39 +00002312/* API for embedding applications that want to add their own entries
2313 to the table of built-in modules. This should normally be called
2314 *before* Py_Initialize(). When the table resize fails, -1 is
2315 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002316
2317 After a similar function by Just van Rossum. */
2318
2319int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002320PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002321{
2322 static struct _inittab *our_copy = NULL;
2323 struct _inittab *p;
2324 int i, n;
2325
2326 /* Count the number of entries in both tables */
2327 for (n = 0; newtab[n].name != NULL; n++)
2328 ;
2329 if (n == 0)
2330 return 0; /* Nothing to do */
2331 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2332 ;
2333
2334 /* Allocate new memory for the combined table */
Guido van Rossumb18618d2000-05-03 23:44:39 +00002335 p = our_copy;
2336 PyMem_RESIZE(p, struct _inittab, i+n+1);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002337 if (p == NULL)
2338 return -1;
2339
2340 /* Copy the tables into the new memory */
2341 if (our_copy != PyImport_Inittab)
2342 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2343 PyImport_Inittab = our_copy = p;
2344 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
2345
2346 return 0;
2347}
2348
2349/* Shorthand to add a single entry given a name and a function */
2350
2351int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002352PyImport_AppendInittab(char *name, void (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002353{
2354 struct _inittab newtab[2];
2355
2356 memset(newtab, '\0', sizeof newtab);
2357
2358 newtab[0].name = name;
2359 newtab[0].initfunc = initfunc;
2360
2361 return PyImport_ExtendInittab(newtab);
2362}