blob: 9ecd38de978dbec227daa9e590b772a267f70dfc [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);
Tim Peters42c83af2000-09-29 04:03:10 +0000649 fd = open(filename, O_EXCL|O_CREAT|O_WRONLY|O_TRUNC
650#ifdef O_BINARY
651 |O_BINARY /* necessary for Windows */
652#endif
653
654 , 0666);
Guido van Rossum55a83382000-09-20 20:31:38 +0000655 if (fd < 0)
656 return NULL;
657 return fdopen(fd, "wb");
658#else
659 /* Best we can do -- on Windows this can't happen anyway */
660 return fopen(filename, "wb");
661#endif
662}
663
664
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000665/* Write a compiled module to a file, placing the time of last
666 modification of its source into the header.
667 Errors are ignored, if a write error occurs an attempt is made to
668 remove the file. */
669
670static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000671write_compiled_module(PyCodeObject *co, char *cpathname, long mtime)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000672{
673 FILE *fp;
674
Guido van Rossum55a83382000-09-20 20:31:38 +0000675 fp = open_exclusive(cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000676 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000677 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000678 PySys_WriteStderr(
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000679 "# can't create %s\n", cpathname);
680 return;
681 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000682 PyMarshal_WriteLongToFile(pyc_magic, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000683 /* First write a 0 for mtime */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000684 PyMarshal_WriteLongToFile(0L, fp);
685 PyMarshal_WriteObjectToFile((PyObject *)co, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000686 if (ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000687 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000688 PySys_WriteStderr("# can't write %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000689 /* Don't keep partial file */
690 fclose(fp);
691 (void) unlink(cpathname);
692 return;
693 }
694 /* Now write the true mtime */
695 fseek(fp, 4L, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000696 PyMarshal_WriteLongToFile(mtime, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000697 fflush(fp);
698 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000699 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000700 PySys_WriteStderr("# wrote %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000701#ifdef macintosh
Jack Jansencbf630f2000-07-11 21:59:16 +0000702 PyMac_setfiletype(cpathname, 'Pyth', 'PYC ');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000703#endif
704}
705
706
707/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000708 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
709 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000710
Guido van Rossum79f25d91997-04-29 20:08:16 +0000711static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000712load_source_module(char *name, char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000713{
Fred Drake4c82b232000-06-30 16:18:57 +0000714 time_t mtime;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000715 FILE *fpc;
716 char buf[MAXPATHLEN+1];
717 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000718 PyCodeObject *co;
719 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000720
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000721 mtime = PyOS_GetLastModificationTime(pathname, fp);
Fred Drake4c82b232000-06-30 16:18:57 +0000722 if (mtime == -1)
723 return NULL;
724#if SIZEOF_TIME_T > 4
725 /* Python's .pyc timestamp handling presumes that the timestamp fits
726 in 4 bytes. This will be fine until sometime in the year 2038,
727 when a 4-byte signed time_t will overflow.
728 */
729 if (mtime >> 32) {
730 PyErr_SetString(PyExc_OverflowError,
731 "modification time overflows a 4 bytes");
732 return NULL;
733 }
734#endif
735 cpathname = make_compiled_pathname(pathname, buf, (size_t)MAXPATHLEN+1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000736 if (cpathname != NULL &&
737 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000738 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000739 fclose(fpc);
740 if (co == NULL)
741 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000742 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000743 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000744 name, cpathname);
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000745 pathname = cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000746 }
747 else {
748 co = parse_source_module(pathname, fp);
749 if (co == NULL)
750 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000751 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000752 PySys_WriteStderr("import %s # from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000753 name, pathname);
754 write_compiled_module(co, cpathname, mtime);
755 }
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000756 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000757 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000758
759 return m;
760}
761
762
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000763/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +0000764static PyObject *load_module(char *, FILE *, char *, int);
765static struct filedescr *find_module(char *, PyObject *,
766 char *, size_t, FILE **);
767static struct _frozen *find_frozen(char *name);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000768
769/* Load a package and return its module object WITH INCREMENTED
770 REFERENCE COUNT */
771
772static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000773load_package(char *name, char *pathname)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000774{
775 PyObject *m, *d, *file, *path;
776 int err;
777 char buf[MAXPATHLEN+1];
778 FILE *fp = NULL;
779 struct filedescr *fdp;
780
781 m = PyImport_AddModule(name);
782 if (m == NULL)
783 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000784 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000785 PySys_WriteStderr("import %s # directory %s\n",
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000786 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000787 d = PyModule_GetDict(m);
788 file = PyString_FromString(pathname);
789 if (file == NULL)
790 return NULL;
791 path = Py_BuildValue("[O]", file);
792 if (path == NULL) {
793 Py_DECREF(file);
794 return NULL;
795 }
796 err = PyDict_SetItemString(d, "__file__", file);
797 if (err == 0)
798 err = PyDict_SetItemString(d, "__path__", path);
799 if (err != 0) {
800 m = NULL;
801 goto cleanup;
802 }
803 buf[0] = '\0';
804 fdp = find_module("__init__", path, buf, sizeof(buf), &fp);
805 if (fdp == NULL) {
806 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
807 PyErr_Clear();
808 }
809 else
810 m = NULL;
811 goto cleanup;
812 }
813 m = load_module(name, fp, buf, fdp->type);
814 if (fp != NULL)
815 fclose(fp);
816 cleanup:
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000817 Py_XDECREF(path);
818 Py_XDECREF(file);
819 return m;
820}
821
822
823/* Helper to test for built-in module */
824
825static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000826is_builtin(char *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000827{
828 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +0000829 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
830 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
831 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000832 return -1;
833 else
834 return 1;
835 }
836 }
837 return 0;
838}
839
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000840
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000841/* Search the path (default sys.path) for a module. Return the
842 corresponding filedescr struct, and (via return arguments) the
843 pathname and an open file. Return NULL if the module is not found. */
844
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000845#ifdef MS_COREDLL
Thomas Woutersb4bd21c2000-07-22 23:38:01 +0000846extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **,
847 char *, int);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000848#endif
849
Guido van Rossum0980bd91998-02-13 17:18:36 +0000850#ifdef CHECK_IMPORT_CASE
851static int check_case(char *, int, int, char *);
852#endif
853
Tim Petersdbd9ba62000-07-09 03:09:57 +0000854static int find_init_module(char *); /* Forward */
Guido van Rossum197346f1997-10-31 18:38:52 +0000855
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000856static struct filedescr *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000857find_module(char *realname, PyObject *path, char *buf, size_t buflen,
858 FILE **p_fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000859{
Fred Drake4c82b232000-06-30 16:18:57 +0000860 int i, npath;
861 size_t len, namelen;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000862 struct _frozen *f;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000863 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000864 FILE *fp = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000865 struct stat statbuf;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000866 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
867 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
868 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossum0506a431998-08-11 15:07:39 +0000869 char name[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000870
Fred Drake4c82b232000-06-30 16:18:57 +0000871 if (strlen(realname) > MAXPATHLEN) {
872 PyErr_SetString(PyExc_OverflowError, "module name is too long");
873 return NULL;
874 }
Guido van Rossum0506a431998-08-11 15:07:39 +0000875 strcpy(name, realname);
876
877 if (path != NULL && PyString_Check(path)) {
878 /* Submodule of "frozen" package:
879 Set name to the fullname, path to NULL
880 and continue as "usual" */
881 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
882 PyErr_SetString(PyExc_ImportError,
883 "full frozen module name too long");
884 return NULL;
885 }
886 strcpy(buf, PyString_AsString(path));
887 strcat(buf, ".");
888 strcat(buf, name);
889 strcpy(name, buf);
890 path = NULL;
891 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000892 if (path == NULL) {
893 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000894 strcpy(buf, name);
895 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000896 }
Guido van Rossuma5568d31998-03-05 03:45:08 +0000897 if ((f = find_frozen(name)) != NULL) {
898 strcpy(buf, name);
899 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000900 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000901
Guido van Rossumac279101996-08-22 23:10:58 +0000902#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000903 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
904 if (fp != NULL) {
905 *p_fp = fp;
906 return fdp;
907 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000908#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000909 path = PySys_GetObject("path");
910 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000911 if (path == NULL || !PyList_Check(path)) {
912 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +0000913 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000914 return NULL;
915 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000916 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000917 namelen = strlen(name);
918 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000919 PyObject *v = PyList_GetItem(path, i);
920 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000921 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000922 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000923 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000924 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000925 strcpy(buf, PyString_AsString(v));
Fred Drake4c82b232000-06-30 16:18:57 +0000926 if (strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000927 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000928#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000929#ifdef INTERN_STRINGS
930 /*
931 ** Speedup: each sys.path item is interned, and
932 ** FindResourceModule remembers which items refer to
933 ** folders (so we don't have to bother trying to look
934 ** into them for resources).
935 */
936 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
937 v = PyList_GET_ITEM(path, i);
938#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000939 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000940 static struct filedescr resfiledescr =
941 {"", "", PY_RESOURCE};
Jack Jansen9c96a921995-02-15 22:57:06 +0000942
943 return &resfiledescr;
944 }
Guido van Rossum0f84a341998-08-06 13:36:01 +0000945 if (PyMac_FindCodeResourceModule((PyStringObject *)v, name, buf)) {
946 static struct filedescr resfiledescr =
947 {"", "", PY_CODERESOURCE};
948
949 return &resfiledescr;
950 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000951#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000952 if (len > 0 && buf[len-1] != SEP
953#ifdef ALTSEP
954 && buf[len-1] != ALTSEP
955#endif
956 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000957 buf[len++] = SEP;
Guido van Rossum40f470f1996-05-23 22:51:04 +0000958#ifdef IMPORT_8x3_NAMES
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000959 /* see if we are searching in directory dos-8x3 */
960 if (len > 7 && !strncmp(buf + len - 8, "dos-8x3", 7)){
Guido van Rossum40f470f1996-05-23 22:51:04 +0000961 int j;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000962 char ch; /* limit name to 8 lower-case characters */
Guido van Rossum40f470f1996-05-23 22:51:04 +0000963 for (j = 0; (ch = name[j]) && j < 8; j++)
964 if (isupper(ch))
965 buf[len++] = tolower(ch);
966 else
967 buf[len++] = ch;
968 }
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000969 else /* Not in dos-8x3, use the full name */
Guido van Rossum6f489d91996-06-28 20:15:15 +0000970#endif
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000971 {
Guido van Rossum40f470f1996-05-23 22:51:04 +0000972 strcpy(buf+len, name);
973 len += namelen;
974 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000975#ifdef HAVE_STAT
976 if (stat(buf, &statbuf) == 0) {
Guido van Rossum197346f1997-10-31 18:38:52 +0000977 if (S_ISDIR(statbuf.st_mode)) {
Guido van Rossum0980bd91998-02-13 17:18:36 +0000978 if (find_init_module(buf)) {
979#ifdef CHECK_IMPORT_CASE
980 if (!check_case(buf, len, namelen,
981 name))
982 return NULL;
983#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000984 return &fd_package;
Guido van Rossum0980bd91998-02-13 17:18:36 +0000985 }
Guido van Rossum197346f1997-10-31 18:38:52 +0000986 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000987 }
988#else
989 /* XXX How are you going to test for directories? */
990#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000991#ifdef macintosh
992 fdp = PyMac_FindModuleExtension(buf, &len, name);
993 if (fdp)
994 fp = fopen(buf, fdp->mode);
995#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000996 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000997 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000998 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000999 PySys_WriteStderr("# trying %s\n", buf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001000 fp = fopen(buf, fdp->mode);
1001 if (fp != NULL)
1002 break;
1003 }
Guido van Rossum741689d1997-08-12 14:53:39 +00001004#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001005 if (fp != NULL)
1006 break;
1007 }
1008 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001009 PyErr_Format(PyExc_ImportError,
1010 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001011 return NULL;
1012 }
Guido van Rossum0980bd91998-02-13 17:18:36 +00001013#ifdef CHECK_IMPORT_CASE
1014 if (!check_case(buf, len, namelen, name)) {
1015 fclose(fp);
1016 return NULL;
1017 }
1018#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001019
1020 *p_fp = fp;
1021 return fdp;
1022}
1023
Guido van Rossum0980bd91998-02-13 17:18:36 +00001024#ifdef CHECK_IMPORT_CASE
1025
1026#ifdef MS_WIN32
1027#include <windows.h>
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001028#include <ctype.h>
1029
1030static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001031allcaps8x3(char *s)
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001032{
1033 /* Return 1 if s is an 8.3 filename in ALLCAPS */
1034 char c;
1035 char *dot = strchr(s, '.');
1036 char *end = strchr(s, '\0');
1037 if (dot != NULL) {
1038 if (dot-s > 8)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001039 return 0; /* More than 8 before '.' */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001040 if (end-dot > 4)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001041 return 0; /* More than 3 after '.' */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001042 end = strchr(dot+1, '.');
1043 if (end != NULL)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001044 return 0; /* More than one dot */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001045 }
1046 else if (end-s > 8)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001047 return 0; /* More than 8 and no dot */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001048 while ((c = *s++)) {
1049 if (islower(c))
1050 return 0;
1051 }
1052 return 1;
1053}
1054
Guido van Rossum0980bd91998-02-13 17:18:36 +00001055static int
1056check_case(char *buf, int len, int namelen, char *name)
1057{
1058 WIN32_FIND_DATA data;
1059 HANDLE h;
1060 if (getenv("PYTHONCASEOK") != NULL)
1061 return 1;
1062 h = FindFirstFile(buf, &data);
1063 if (h == INVALID_HANDLE_VALUE) {
1064 PyErr_Format(PyExc_NameError,
1065 "Can't find file for module %.100s\n(filename %.300s)",
1066 name, buf);
1067 return 0;
1068 }
1069 FindClose(h);
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001070 if (allcaps8x3(data.cFileName)) {
1071 /* Skip the test if the filename is ALL.CAPS. This can
1072 happen in certain circumstances beyond our control,
1073 e.g. when software is installed under NT on a FAT
1074 filesystem and then the same FAT filesystem is used
1075 under Windows 95. */
1076 return 1;
1077 }
Guido van Rossum0980bd91998-02-13 17:18:36 +00001078 if (strncmp(data.cFileName, name, namelen) != 0) {
1079 strcpy(buf+len-namelen, data.cFileName);
1080 PyErr_Format(PyExc_NameError,
1081 "Case mismatch for module name %.100s\n(filename %.300s)",
1082 name, buf);
1083 return 0;
1084 }
1085 return 1;
1086}
1087#endif /* MS_WIN32 */
1088
1089#ifdef macintosh
1090#include <TextUtils.h>
Guido van Rossumb33aa1a2000-04-24 15:08:18 +00001091#ifdef USE_GUSI1
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001092#include "TFileSpec.h" /* for Path2FSSpec() */
1093#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001094static int
1095check_case(char *buf, int len, int namelen, char *name)
1096{
1097 FSSpec fss;
1098 OSErr err;
Guido van Rossumb33aa1a2000-04-24 15:08:18 +00001099#ifndef USE_GUSI1
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001100 err = FSMakeFSSpec(0, 0, Pstring(buf), &fss);
1101#else
1102 /* GUSI's Path2FSSpec() resolves all possible aliases nicely on
1103 the way, which is fine for all directories, but here we need
1104 the original name of the alias file (say, Dlg.ppc.slb, not
1105 toolboxmodules.ppc.slb). */
1106 char *colon;
1107 err = Path2FSSpec(buf, &fss);
1108 if (err == noErr) {
1109 colon = strrchr(buf, ':'); /* find filename */
1110 if (colon != NULL)
1111 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1112 Pstring(colon+1), &fss);
1113 else
1114 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1115 fss.name, &fss);
1116 }
1117#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001118 if (err) {
1119 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001120 "Can't find file for module %.100s\n(filename %.300s)",
1121 name, buf);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001122 return 0;
1123 }
Guido van Rossum63e97ad2000-07-01 01:06:56 +00001124 if ( namelen > fss.name[0] || strncmp(name, (char *)fss.name+1, namelen) != 0 ) {
Guido van Rossum0980bd91998-02-13 17:18:36 +00001125 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001126 "Case mismatch for module name %.100s\n(filename %.300s)",
1127 name, fss.name);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001128 return 0;
1129 }
1130 return 1;
1131}
1132#endif /* macintosh */
1133
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001134#ifdef DJGPP
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001135#include <dir.h>
1136
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001137static int
1138check_case(char *buf, int len, int namelen, char *name)
1139{
1140 struct ffblk ffblk;
1141 int done;
1142
1143 if (getenv("PYTHONCASEOK") != NULL)
1144 return 1;
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001145 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001146 if (done) {
1147 PyErr_Format(PyExc_NameError,
1148 "Can't find file for module %.100s\n(filename %.300s)",
1149 name, buf);
1150 return 0;
1151 }
1152
1153 if (strncmp(ffblk.ff_name, name, namelen) != 0) {
1154 strcpy(buf+len-namelen, ffblk.ff_name);
1155 PyErr_Format(PyExc_NameError,
1156 "Case mismatch for module name %.100s\n(filename %.300s)",
1157 name, buf);
1158 return 0;
1159 }
1160 return 1;
1161}
1162#endif
1163
Guido van Rossum8766a771998-04-10 23:44:32 +00001164#endif /* CHECK_IMPORT_CASE */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001165
Guido van Rossum197346f1997-10-31 18:38:52 +00001166#ifdef HAVE_STAT
1167/* Helper to look for __init__.py or __init__.py[co] in potential package */
1168static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001169find_init_module(char *buf)
Guido van Rossum197346f1997-10-31 18:38:52 +00001170{
Fred Drake4c82b232000-06-30 16:18:57 +00001171 size_t save_len = strlen(buf);
1172 size_t i = save_len;
Guido van Rossum197346f1997-10-31 18:38:52 +00001173 struct stat statbuf;
1174
1175 if (save_len + 13 >= MAXPATHLEN)
1176 return 0;
1177 buf[i++] = SEP;
1178 strcpy(buf+i, "__init__.py");
1179 if (stat(buf, &statbuf) == 0) {
1180 buf[save_len] = '\0';
1181 return 1;
1182 }
1183 i += strlen(buf+i);
1184 if (Py_OptimizeFlag)
1185 strcpy(buf+i, "o");
1186 else
1187 strcpy(buf+i, "c");
1188 if (stat(buf, &statbuf) == 0) {
1189 buf[save_len] = '\0';
1190 return 1;
1191 }
1192 buf[save_len] = '\0';
1193 return 0;
1194}
1195#endif /* HAVE_STAT */
1196
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001197
Tim Petersdbd9ba62000-07-09 03:09:57 +00001198static int init_builtin(char *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001199
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001200/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001201 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001202
Guido van Rossum79f25d91997-04-29 20:08:16 +00001203static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001204load_module(char *name, FILE *fp, char *buf, int type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001205{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001206 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001207 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001208 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001209
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001210 /* First check that there's an open file (if we need one) */
1211 switch (type) {
1212 case PY_SOURCE:
1213 case PY_COMPILED:
1214 if (fp == NULL) {
1215 PyErr_Format(PyExc_ValueError,
1216 "file object required for import (type code %d)",
1217 type);
1218 return NULL;
1219 }
1220 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001221
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001222 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001223
1224 case PY_SOURCE:
1225 m = load_source_module(name, buf, fp);
1226 break;
1227
1228 case PY_COMPILED:
1229 m = load_compiled_module(name, buf, fp);
1230 break;
1231
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001232#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001233 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001234 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001235 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001236#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001237
Jack Jansen9c96a921995-02-15 22:57:06 +00001238#ifdef macintosh
1239 case PY_RESOURCE:
1240 m = PyMac_LoadResourceModule(name, buf);
1241 break;
Guido van Rossum0f84a341998-08-06 13:36:01 +00001242 case PY_CODERESOURCE:
1243 m = PyMac_LoadCodeResourceModule(name, buf);
1244 break;
Jack Jansen9c96a921995-02-15 22:57:06 +00001245#endif
1246
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001247 case PKG_DIRECTORY:
1248 m = load_package(name, buf);
1249 break;
1250
1251 case C_BUILTIN:
1252 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001253 if (buf != NULL && buf[0] != '\0')
1254 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001255 if (type == C_BUILTIN)
1256 err = init_builtin(name);
1257 else
1258 err = PyImport_ImportFrozenModule(name);
1259 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001260 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001261 if (err == 0) {
1262 PyErr_Format(PyExc_ImportError,
1263 "Purported %s module %.200s not found",
1264 type == C_BUILTIN ?
1265 "builtin" : "frozen",
1266 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001267 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001268 }
1269 modules = PyImport_GetModuleDict();
1270 m = PyDict_GetItemString(modules, name);
1271 if (m == NULL) {
1272 PyErr_Format(
1273 PyExc_ImportError,
1274 "%s module %.200s not properly initialized",
1275 type == C_BUILTIN ?
1276 "builtin" : "frozen",
1277 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001278 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001279 }
1280 Py_INCREF(m);
1281 break;
1282
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001283 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001284 PyErr_Format(PyExc_ImportError,
1285 "Don't know how to import %.200s (type code %d)",
1286 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001287 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001288
1289 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001290
1291 return m;
1292}
1293
1294
1295/* Initialize a built-in module.
1296 Return 1 for succes, 0 if the module is not found, and -1 with
1297 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001298
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001299static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001300init_builtin(char *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001301{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001302 struct _inittab *p;
1303 PyObject *mod;
1304
1305 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
1306 return 1;
1307
Guido van Rossum771c6c81997-10-31 18:37:24 +00001308 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001309 if (strcmp(name, p->name) == 0) {
1310 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001311 PyErr_Format(PyExc_ImportError,
1312 "Cannot re-init internal module %.200s",
1313 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001314 return -1;
1315 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001316 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001317 PySys_WriteStderr("import %s # builtin\n", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001318 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001319 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001320 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001321 if (_PyImport_FixupExtension(name, name) == NULL)
1322 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001323 return 1;
1324 }
1325 }
1326 return 0;
1327}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001328
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001329
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001330/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001331
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001332static struct _frozen *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001333find_frozen(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001334{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001335 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001336
Guido van Rossum79f25d91997-04-29 20:08:16 +00001337 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001338 if (p->name == NULL)
1339 return NULL;
1340 if (strcmp(p->name, name) == 0)
1341 break;
1342 }
1343 return p;
1344}
1345
Guido van Rossum79f25d91997-04-29 20:08:16 +00001346static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001347get_frozen_object(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001348{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001349 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001350 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001351
1352 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001353 PyErr_Format(PyExc_ImportError,
1354 "No such frozen object named %.200s",
1355 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001356 return NULL;
1357 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001358 size = p->size;
1359 if (size < 0)
1360 size = -size;
1361 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001362}
1363
1364/* Initialize a frozen module.
1365 Return 1 for succes, 0 if the module is not found, and -1 with
1366 an exception set if the initialization failed.
1367 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001368
1369int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001370PyImport_ImportFrozenModule(char *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001371{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001372 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001373 PyObject *co;
1374 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001375 int ispackage;
1376 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001377
1378 if (p == NULL)
1379 return 0;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001380 size = p->size;
1381 ispackage = (size < 0);
1382 if (ispackage)
1383 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001384 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001385 PySys_WriteStderr("import %s # frozen%s\n",
Guido van Rossuma5568d31998-03-05 03:45:08 +00001386 name, ispackage ? " package" : "");
1387 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001388 if (co == NULL)
1389 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001390 if (!PyCode_Check(co)) {
1391 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001392 PyErr_Format(PyExc_TypeError,
1393 "frozen object %.200s is not a code object",
1394 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001395 return -1;
1396 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001397 if (ispackage) {
1398 /* Set __path__ to the package name */
1399 PyObject *d, *s;
1400 int err;
1401 m = PyImport_AddModule(name);
1402 if (m == NULL)
1403 return -1;
1404 d = PyModule_GetDict(m);
1405 s = PyString_InternFromString(name);
1406 if (s == NULL)
1407 return -1;
1408 err = PyDict_SetItemString(d, "__path__", s);
1409 Py_DECREF(s);
1410 if (err != 0)
1411 return err;
1412 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001413 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001414 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001415 if (m == NULL)
1416 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001417 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001418 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001419}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001420
1421
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001422/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001423 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001424
Guido van Rossum79f25d91997-04-29 20:08:16 +00001425PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001426PyImport_ImportModule(char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00001427{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001428 static PyObject *fromlist = NULL;
1429 if (fromlist == NULL && strchr(name, '.') != NULL) {
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001430 fromlist = Py_BuildValue("(s)", "*");
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001431 if (fromlist == NULL)
1432 return NULL;
1433 }
1434 return PyImport_ImportModuleEx(name, NULL, NULL, fromlist);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001435}
1436
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001437/* Forward declarations for helper routines */
Tim Petersdbd9ba62000-07-09 03:09:57 +00001438static PyObject *get_parent(PyObject *globals, char *buf, int *p_buflen);
1439static PyObject *load_next(PyObject *mod, PyObject *altmod,
1440 char **p_name, char *buf, int *p_buflen);
1441static int mark_miss(char *name);
1442static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
1443 char *buf, int buflen, int recursive);
1444static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001445
1446/* The Magnum Opus of dotted-name import :-) */
1447
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001448static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001449import_module_ex(char *name, PyObject *globals, PyObject *locals,
1450 PyObject *fromlist)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001451{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001452 char buf[MAXPATHLEN+1];
1453 int buflen = 0;
1454 PyObject *parent, *head, *next, *tail;
1455
1456 parent = get_parent(globals, buf, &buflen);
1457 if (parent == NULL)
1458 return NULL;
1459
1460 head = load_next(parent, Py_None, &name, buf, &buflen);
1461 if (head == NULL)
1462 return NULL;
1463
1464 tail = head;
1465 Py_INCREF(tail);
1466 while (name) {
1467 next = load_next(tail, tail, &name, buf, &buflen);
1468 Py_DECREF(tail);
1469 if (next == NULL) {
1470 Py_DECREF(head);
1471 return NULL;
1472 }
1473 tail = next;
1474 }
1475
1476 if (fromlist != NULL) {
1477 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1478 fromlist = NULL;
1479 }
1480
1481 if (fromlist == NULL) {
1482 Py_DECREF(tail);
1483 return head;
1484 }
1485
1486 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001487 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001488 Py_DECREF(tail);
1489 return NULL;
1490 }
1491
1492 return tail;
1493}
1494
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001495PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001496PyImport_ImportModuleEx(char *name, PyObject *globals, PyObject *locals,
1497 PyObject *fromlist)
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001498{
1499 PyObject *result;
1500 lock_import();
Guido van Rossumd65911b1998-03-03 22:33:27 +00001501 result = import_module_ex(name, globals, locals, fromlist);
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001502 unlock_import();
1503 return result;
1504}
1505
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001506static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001507get_parent(PyObject *globals, char *buf, int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001508{
1509 static PyObject *namestr = NULL;
1510 static PyObject *pathstr = NULL;
1511 PyObject *modname, *modpath, *modules, *parent;
1512
1513 if (globals == NULL || !PyDict_Check(globals))
1514 return Py_None;
1515
1516 if (namestr == NULL) {
1517 namestr = PyString_InternFromString("__name__");
1518 if (namestr == NULL)
1519 return NULL;
1520 }
1521 if (pathstr == NULL) {
1522 pathstr = PyString_InternFromString("__path__");
1523 if (pathstr == NULL)
1524 return NULL;
1525 }
1526
1527 *buf = '\0';
1528 *p_buflen = 0;
1529 modname = PyDict_GetItem(globals, namestr);
1530 if (modname == NULL || !PyString_Check(modname))
1531 return Py_None;
1532
1533 modpath = PyDict_GetItem(globals, pathstr);
1534 if (modpath != NULL) {
1535 int len = PyString_GET_SIZE(modname);
1536 if (len > MAXPATHLEN) {
1537 PyErr_SetString(PyExc_ValueError,
1538 "Module name too long");
1539 return NULL;
1540 }
1541 strcpy(buf, PyString_AS_STRING(modname));
1542 *p_buflen = len;
1543 }
1544 else {
1545 char *start = PyString_AS_STRING(modname);
1546 char *lastdot = strrchr(start, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001547 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001548 if (lastdot == NULL)
1549 return Py_None;
1550 len = lastdot - start;
1551 if (len >= MAXPATHLEN) {
1552 PyErr_SetString(PyExc_ValueError,
1553 "Module name too long");
1554 return NULL;
1555 }
1556 strncpy(buf, start, len);
1557 buf[len] = '\0';
1558 *p_buflen = len;
1559 }
1560
1561 modules = PyImport_GetModuleDict();
1562 parent = PyDict_GetItemString(modules, buf);
1563 if (parent == NULL)
1564 parent = Py_None;
1565 return parent;
1566 /* We expect, but can't guarantee, if parent != None, that:
1567 - parent.__name__ == buf
1568 - parent.__dict__ is globals
1569 If this is violated... Who cares? */
1570}
1571
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001572/* altmod is either None or same as mod */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001573static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001574load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
1575 int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001576{
1577 char *name = *p_name;
1578 char *dot = strchr(name, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001579 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001580 char *p;
1581 PyObject *result;
1582
1583 if (dot == NULL) {
1584 *p_name = NULL;
1585 len = strlen(name);
1586 }
1587 else {
1588 *p_name = dot+1;
1589 len = dot-name;
1590 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00001591 if (len == 0) {
1592 PyErr_SetString(PyExc_ValueError,
1593 "Empty module name");
1594 return NULL;
1595 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001596
1597 p = buf + *p_buflen;
1598 if (p != buf)
1599 *p++ = '.';
1600 if (p+len-buf >= MAXPATHLEN) {
1601 PyErr_SetString(PyExc_ValueError,
1602 "Module name too long");
1603 return NULL;
1604 }
1605 strncpy(p, name, len);
1606 p[len] = '\0';
1607 *p_buflen = p+len-buf;
1608
1609 result = import_submodule(mod, p, buf);
1610 if (result == Py_None && altmod != mod) {
1611 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001612 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001613 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001614 if (result != NULL && result != Py_None) {
1615 if (mark_miss(buf) != 0) {
1616 Py_DECREF(result);
1617 return NULL;
1618 }
1619 strncpy(buf, name, len);
1620 buf[len] = '\0';
1621 *p_buflen = len;
1622 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001623 }
1624 if (result == NULL)
1625 return NULL;
1626
1627 if (result == Py_None) {
1628 Py_DECREF(result);
1629 PyErr_Format(PyExc_ImportError,
1630 "No module named %.200s", name);
1631 return NULL;
1632 }
1633
1634 return result;
1635}
1636
1637static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001638mark_miss(char *name)
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001639{
1640 PyObject *modules = PyImport_GetModuleDict();
1641 return PyDict_SetItemString(modules, name, Py_None);
1642}
1643
1644static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001645ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, int buflen,
1646 int recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001647{
1648 int i;
1649
1650 if (!PyObject_HasAttrString(mod, "__path__"))
1651 return 1;
1652
1653 for (i = 0; ; i++) {
1654 PyObject *item = PySequence_GetItem(fromlist, i);
1655 int hasit;
1656 if (item == NULL) {
1657 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1658 PyErr_Clear();
1659 return 1;
1660 }
1661 return 0;
1662 }
1663 if (!PyString_Check(item)) {
1664 PyErr_SetString(PyExc_TypeError,
1665 "Item in ``from list'' not a string");
1666 Py_DECREF(item);
1667 return 0;
1668 }
1669 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001670 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001671 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001672 /* See if the package defines __all__ */
1673 if (recursive)
1674 continue; /* Avoid endless recursion */
1675 all = PyObject_GetAttrString(mod, "__all__");
1676 if (all == NULL)
1677 PyErr_Clear();
1678 else {
1679 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1680 return 0;
1681 Py_DECREF(all);
1682 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001683 continue;
1684 }
1685 hasit = PyObject_HasAttr(mod, item);
1686 if (!hasit) {
1687 char *subname = PyString_AS_STRING(item);
1688 PyObject *submod;
1689 char *p;
1690 if (buflen + strlen(subname) >= MAXPATHLEN) {
1691 PyErr_SetString(PyExc_ValueError,
1692 "Module name too long");
1693 Py_DECREF(item);
1694 return 0;
1695 }
1696 p = buf + buflen;
1697 *p++ = '.';
1698 strcpy(p, subname);
1699 submod = import_submodule(mod, subname, buf);
1700 Py_XDECREF(submod);
1701 if (submod == NULL) {
1702 Py_DECREF(item);
1703 return 0;
1704 }
1705 }
1706 Py_DECREF(item);
1707 }
1708
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001709 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001710}
1711
1712static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001713import_submodule(PyObject *mod, char *subname, char *fullname)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001714{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001715 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001716 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001717
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001718 /* Require:
1719 if mod == None: subname == fullname
1720 else: mod.__name__ + "." + subname == fullname
1721 */
1722
1723 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001724 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001725 }
1726 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001727 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001728 char buf[MAXPATHLEN+1];
1729 struct filedescr *fdp;
1730 FILE *fp = NULL;
1731
Guido van Rossum9c0afe51998-05-19 15:09:05 +00001732 if (mod == Py_None)
1733 path = NULL;
1734 else {
1735 path = PyObject_GetAttrString(mod, "__path__");
1736 if (path == NULL) {
1737 PyErr_Clear();
1738 Py_INCREF(Py_None);
1739 return Py_None;
1740 }
1741 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001742
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001743 buf[0] = '\0';
Guido van Rossumb68cd421998-07-01 17:36:26 +00001744 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1745 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001746 if (fdp == NULL) {
1747 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1748 return NULL;
1749 PyErr_Clear();
1750 Py_INCREF(Py_None);
1751 return Py_None;
1752 }
1753 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001754 if (fp)
1755 fclose(fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001756 if (m != NULL && mod != Py_None) {
1757 if (PyObject_SetAttrString(mod, subname, m) < 0) {
1758 Py_DECREF(m);
1759 m = NULL;
1760 }
1761 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001762 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001763
1764 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001765}
1766
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001767
1768/* Re-import a module of any kind and return its module object, WITH
1769 INCREMENTED REFERENCE COUNT */
1770
Guido van Rossum79f25d91997-04-29 20:08:16 +00001771PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001772PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001773{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001774 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001775 PyObject *path = NULL;
1776 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001777 char buf[MAXPATHLEN+1];
1778 struct filedescr *fdp;
1779 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001780
Guido van Rossum79f25d91997-04-29 20:08:16 +00001781 if (m == NULL || !PyModule_Check(m)) {
1782 PyErr_SetString(PyExc_TypeError,
1783 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001784 return NULL;
1785 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001786 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001787 if (name == NULL)
1788 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001789 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001790 PyErr_Format(PyExc_ImportError,
1791 "reload(): module %.200s not in sys.modules",
1792 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001793 return NULL;
1794 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001795 subname = strrchr(name, '.');
1796 if (subname == NULL)
1797 subname = name;
1798 else {
1799 PyObject *parentname, *parent;
1800 parentname = PyString_FromStringAndSize(name, (subname-name));
1801 if (parentname == NULL)
1802 return NULL;
1803 parent = PyDict_GetItem(modules, parentname);
Barry Warsaw38793331999-01-27 17:54:20 +00001804 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00001805 if (parent == NULL) {
1806 PyErr_Format(PyExc_ImportError,
1807 "reload(): parent %.200s not in sys.modules",
1808 name);
1809 return NULL;
1810 }
1811 subname++;
1812 path = PyObject_GetAttrString(parent, "__path__");
1813 if (path == NULL)
1814 PyErr_Clear();
1815 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001816 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001817 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1818 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001819 if (fdp == NULL)
1820 return NULL;
1821 m = load_module(name, fp, buf, fdp->type);
1822 if (fp)
1823 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001824 return m;
1825}
1826
1827
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001828/* Higher-level import emulator which emulates the "import" statement
1829 more accurately -- it invokes the __import__() function from the
1830 builtins of the current globals. This means that the import is
1831 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00001832 environment, e.g. by "rexec".
1833 A dummy list ["__doc__"] is passed as the 4th argument so that
1834 e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
1835 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001836
1837PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001838PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001839{
1840 static PyObject *silly_list = NULL;
1841 static PyObject *builtins_str = NULL;
1842 static PyObject *import_str = NULL;
1843 static PyObject *standard_builtins = NULL;
1844 PyObject *globals = NULL;
1845 PyObject *import = NULL;
1846 PyObject *builtins = NULL;
1847 PyObject *r = NULL;
1848
1849 /* Initialize constant string objects */
1850 if (silly_list == NULL) {
1851 import_str = PyString_InternFromString("__import__");
1852 if (import_str == NULL)
1853 return NULL;
1854 builtins_str = PyString_InternFromString("__builtins__");
1855 if (builtins_str == NULL)
1856 return NULL;
1857 silly_list = Py_BuildValue("[s]", "__doc__");
1858 if (silly_list == NULL)
1859 return NULL;
1860 }
1861
1862 /* Get the builtins from current globals */
1863 globals = PyEval_GetGlobals();
1864 if(globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00001865 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001866 builtins = PyObject_GetItem(globals, builtins_str);
1867 if (builtins == NULL)
1868 goto err;
1869 }
1870 else {
1871 /* No globals -- use standard builtins, and fake globals */
1872 PyErr_Clear();
1873
1874 if (standard_builtins == NULL) {
1875 standard_builtins =
1876 PyImport_ImportModule("__builtin__");
1877 if (standard_builtins == NULL)
1878 return NULL;
1879 }
1880
1881 builtins = standard_builtins;
1882 Py_INCREF(builtins);
1883 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1884 if (globals == NULL)
1885 goto err;
1886 }
1887
1888 /* Get the __import__ function from the builtins */
1889 if (PyDict_Check(builtins))
1890 import=PyObject_GetItem(builtins, import_str);
1891 else
1892 import=PyObject_GetAttr(builtins, import_str);
1893 if (import == NULL)
1894 goto err;
1895
1896 /* Call the _import__ function with the proper argument list */
1897 r = PyObject_CallFunction(import, "OOOO",
1898 module_name, globals, globals, silly_list);
1899
1900 err:
1901 Py_XDECREF(globals);
1902 Py_XDECREF(builtins);
1903 Py_XDECREF(import);
1904
1905 return r;
1906}
1907
1908
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001909/* Module 'imp' provides Python access to the primitives used for
1910 importing modules.
1911*/
1912
Guido van Rossum79f25d91997-04-29 20:08:16 +00001913static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001914imp_get_magic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001915{
1916 char buf[4];
1917
Guido van Rossum43713e52000-02-29 13:59:29 +00001918 if (!PyArg_ParseTuple(args, ":get_magic"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001919 return NULL;
Guido van Rossum96774c12000-05-01 20:19:08 +00001920 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
1921 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
1922 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
1923 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001924
Guido van Rossum79f25d91997-04-29 20:08:16 +00001925 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001926}
1927
Guido van Rossum79f25d91997-04-29 20:08:16 +00001928static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001929imp_get_suffixes(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001930{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001931 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001932 struct filedescr *fdp;
1933
Guido van Rossum43713e52000-02-29 13:59:29 +00001934 if (!PyArg_ParseTuple(args, ":get_suffixes"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001935 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001936 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001937 if (list == NULL)
1938 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001939 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
1940 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001941 fdp->suffix, fdp->mode, fdp->type);
1942 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001943 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001944 return NULL;
1945 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001946 if (PyList_Append(list, item) < 0) {
1947 Py_DECREF(list);
1948 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001949 return NULL;
1950 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001951 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001952 }
1953 return list;
1954}
1955
Guido van Rossum79f25d91997-04-29 20:08:16 +00001956static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001957call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001958{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001959 extern int fclose(FILE *);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001960 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001961 struct filedescr *fdp;
1962 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001963 FILE *fp = NULL;
1964
1965 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001966 if (path == Py_None)
1967 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001968 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
1969 if (fdp == NULL)
1970 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001971 if (fp != NULL) {
1972 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
1973 if (fob == NULL) {
1974 fclose(fp);
1975 return NULL;
1976 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001977 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001978 else {
1979 fob = Py_None;
1980 Py_INCREF(fob);
1981 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001982 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001983 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001984 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001985 return ret;
1986}
1987
Guido van Rossum79f25d91997-04-29 20:08:16 +00001988static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001989imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001990{
1991 char *name;
1992 PyObject *path = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00001993 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001994 return NULL;
1995 return call_find_module(name, path);
1996}
1997
1998static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001999imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002000{
2001 char *name;
2002 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002003 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002004 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002005 return NULL;
2006 ret = init_builtin(name);
2007 if (ret < 0)
2008 return NULL;
2009 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002010 Py_INCREF(Py_None);
2011 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002012 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002013 m = PyImport_AddModule(name);
2014 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002015 return m;
2016}
2017
Guido van Rossum79f25d91997-04-29 20:08:16 +00002018static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002019imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002020{
2021 char *name;
2022 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002023 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002024 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002025 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002026 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002027 if (ret < 0)
2028 return NULL;
2029 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002030 Py_INCREF(Py_None);
2031 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002032 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002033 m = PyImport_AddModule(name);
2034 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002035 return m;
2036}
2037
Guido van Rossum79f25d91997-04-29 20:08:16 +00002038static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002039imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002040{
2041 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002042
Guido van Rossum43713e52000-02-29 13:59:29 +00002043 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002044 return NULL;
2045 return get_frozen_object(name);
2046}
2047
Guido van Rossum79f25d91997-04-29 20:08:16 +00002048static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002049imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002050{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002051 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002052 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002053 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002054 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002055}
2056
Guido van Rossum79f25d91997-04-29 20:08:16 +00002057static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002058imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002059{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002060 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002061 struct _frozen *p;
Guido van Rossum43713e52000-02-29 13:59:29 +00002062 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002063 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002064 p = find_frozen(name);
2065 return PyInt_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002066}
2067
2068static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002069get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002070{
2071 FILE *fp;
2072 if (fob == NULL) {
2073 fp = fopen(pathname, mode);
2074 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002075 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002076 }
2077 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002078 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002079 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002080 PyErr_SetString(PyExc_ValueError,
2081 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002082 }
2083 return fp;
2084}
2085
Guido van Rossum79f25d91997-04-29 20:08:16 +00002086static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002087imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002088{
2089 char *name;
2090 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002091 PyObject *fob = NULL;
2092 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002093 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002094 if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002095 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002096 return NULL;
2097 fp = get_file(pathname, fob, "rb");
2098 if (fp == NULL)
2099 return NULL;
2100 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002101 if (fob == NULL)
2102 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002103 return m;
2104}
2105
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002106#ifdef HAVE_DYNAMIC_LOADING
2107
Guido van Rossum79f25d91997-04-29 20:08:16 +00002108static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002109imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002110{
2111 char *name;
2112 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002113 PyObject *fob = NULL;
2114 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002115 FILE *fp = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002116 if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002117 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002118 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002119 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002120 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002121 if (fp == NULL)
2122 return NULL;
2123 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002124 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002125 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002126}
2127
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002128#endif /* HAVE_DYNAMIC_LOADING */
2129
Guido van Rossum79f25d91997-04-29 20:08:16 +00002130static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002131imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002132{
2133 char *name;
2134 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002135 PyObject *fob = NULL;
2136 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002137 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002138 if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002139 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002140 return NULL;
2141 fp = get_file(pathname, fob, "r");
2142 if (fp == NULL)
2143 return NULL;
2144 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002145 if (fob == NULL)
2146 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002147 return m;
2148}
2149
Jack Jansen9c96a921995-02-15 22:57:06 +00002150#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002151static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002152imp_load_resource(PyObject *self, PyObject *args)
Jack Jansen9c96a921995-02-15 22:57:06 +00002153{
2154 char *name;
2155 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002156 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002157
Guido van Rossum43713e52000-02-29 13:59:29 +00002158 if (!PyArg_ParseTuple(args, "ss:load_resource", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002159 return NULL;
2160 m = PyMac_LoadResourceModule(name, pathname);
2161 return m;
2162}
2163#endif /* macintosh */
2164
Guido van Rossum79f25d91997-04-29 20:08:16 +00002165static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002166imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002167{
2168 char *name;
2169 PyObject *fob;
2170 char *pathname;
2171 char *suffix; /* Unused */
2172 char *mode;
2173 int type;
2174 FILE *fp;
2175
Guido van Rossum43713e52000-02-29 13:59:29 +00002176 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002177 &name, &fob, &pathname,
2178 &suffix, &mode, &type))
2179 return NULL;
2180 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
2181 PyErr_Format(PyExc_ValueError,
2182 "invalid file open mode %.200s", mode);
2183 return NULL;
2184 }
2185 if (fob == Py_None)
2186 fp = NULL;
2187 else {
2188 if (!PyFile_Check(fob)) {
2189 PyErr_SetString(PyExc_ValueError,
2190 "load_module arg#2 should be a file or None");
2191 return NULL;
2192 }
2193 fp = get_file(pathname, fob, mode);
2194 if (fp == NULL)
2195 return NULL;
2196 }
2197 return load_module(name, fp, pathname, type);
2198}
2199
2200static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002201imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002202{
2203 char *name;
2204 char *pathname;
Guido van Rossum43713e52000-02-29 13:59:29 +00002205 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002206 return NULL;
2207 return load_package(name, pathname);
2208}
2209
2210static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002211imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002212{
2213 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002214 if (!PyArg_ParseTuple(args, "s:new_module", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002215 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002216 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002217}
2218
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002219/* Doc strings */
2220
2221static char doc_imp[] = "\
2222This module provides the components needed to build your own\n\
2223__import__ function. Undocumented functions are obsolete.\n\
2224";
2225
2226static char doc_find_module[] = "\
2227find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
2228Search for a module. If path is omitted or None, search for a\n\
2229built-in, frozen or special module and continue search in sys.path.\n\
2230The module name cannot contain '.'; to search for a submodule of a\n\
2231package, pass the submodule name and the package's __path__.\
2232";
2233
2234static char doc_load_module[] = "\
2235load_module(name, file, filename, (suffix, mode, type)) -> module\n\
2236Load a module, given information returned by find_module().\n\
2237The module name must include the full package name, if any.\
2238";
2239
2240static char doc_get_magic[] = "\
2241get_magic() -> string\n\
2242Return the magic number for .pyc or .pyo files.\
2243";
2244
2245static char doc_get_suffixes[] = "\
2246get_suffixes() -> [(suffix, mode, type), ...]\n\
2247Return a list of (suffix, mode, type) tuples describing the files\n\
2248that find_module() looks for.\
2249";
2250
2251static char doc_new_module[] = "\
2252new_module(name) -> module\n\
2253Create a new module. Do not enter it in sys.modules.\n\
2254The module name must include the full package name, if any.\
2255";
2256
Guido van Rossum79f25d91997-04-29 20:08:16 +00002257static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002258 {"find_module", imp_find_module, 1, doc_find_module},
2259 {"get_magic", imp_get_magic, 1, doc_get_magic},
2260 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2261 {"load_module", imp_load_module, 1, doc_load_module},
2262 {"new_module", imp_new_module, 1, doc_new_module},
2263 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002264 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002265 {"init_builtin", imp_init_builtin, 1},
2266 {"init_frozen", imp_init_frozen, 1},
2267 {"is_builtin", imp_is_builtin, 1},
2268 {"is_frozen", imp_is_frozen, 1},
2269 {"load_compiled", imp_load_compiled, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002270#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002271 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002272#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002273 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002274#ifdef macintosh
2275 {"load_resource", imp_load_resource, 1},
2276#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002277 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002278 {NULL, NULL} /* sentinel */
2279};
2280
Guido van Rossum1a8791e1998-08-04 22:46:29 +00002281static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002282setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002283{
2284 PyObject *v;
2285 int err;
2286
2287 v = PyInt_FromLong((long)value);
2288 err = PyDict_SetItemString(d, name, v);
2289 Py_XDECREF(v);
2290 return err;
2291}
2292
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002293void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002294initimp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002295{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002296 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002297
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002298 m = Py_InitModule4("imp", imp_methods, doc_imp,
2299 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002300 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002301
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002302 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2303 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2304 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2305 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2306 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2307 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2308 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2309 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00002310 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002311
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002312 failure:
2313 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002314}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002315
2316
Guido van Rossumb18618d2000-05-03 23:44:39 +00002317/* API for embedding applications that want to add their own entries
2318 to the table of built-in modules. This should normally be called
2319 *before* Py_Initialize(). When the table resize fails, -1 is
2320 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002321
2322 After a similar function by Just van Rossum. */
2323
2324int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002325PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002326{
2327 static struct _inittab *our_copy = NULL;
2328 struct _inittab *p;
2329 int i, n;
2330
2331 /* Count the number of entries in both tables */
2332 for (n = 0; newtab[n].name != NULL; n++)
2333 ;
2334 if (n == 0)
2335 return 0; /* Nothing to do */
2336 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2337 ;
2338
2339 /* Allocate new memory for the combined table */
Guido van Rossumb18618d2000-05-03 23:44:39 +00002340 p = our_copy;
2341 PyMem_RESIZE(p, struct _inittab, i+n+1);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002342 if (p == NULL)
2343 return -1;
2344
2345 /* Copy the tables into the new memory */
2346 if (our_copy != PyImport_Inittab)
2347 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2348 PyImport_Inittab = our_copy = p;
2349 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
2350
2351 return 0;
2352}
2353
2354/* Shorthand to add a single entry given a name and a function */
2355
2356int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002357PyImport_AppendInittab(char *name, void (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002358{
2359 struct _inittab newtab[2];
2360
2361 memset(newtab, '\0', sizeof newtab);
2362
2363 newtab[0].name = name;
2364 newtab[0].initfunc = initfunc;
2365
2366 return PyImport_ExtendInittab(newtab);
2367}