blob: 99e62047d048eb8c6b171e11d30c80e3d498583e [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011/* Module definition and import implementation */
12
Guido van Rossum79f25d91997-04-29 20:08:16 +000013#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000014
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000015#include "node.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000016#include "token.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000017#include "errcode.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +000018#include "marshal.h"
19#include "compile.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000020#include "eval.h"
Guido van Rossumd8bac6d1992-02-26 15:19:13 +000021#include "osdefs.h"
Guido van Rossum1ae940a1995-01-02 19:04:15 +000022#include "importdl.h"
Jack Jansen9c96a921995-02-15 22:57:06 +000023#ifdef macintosh
24#include "macglue.h"
25#endif
Guido van Rossumc405b7b1991-06-04 19:39:42 +000026
Guido van Rossum80bb9651996-12-05 23:27:02 +000027#ifdef HAVE_UNISTD_H
28#include <unistd.h>
29#endif
30
Guido van Rossumaee0bad1997-09-05 07:33:22 +000031/* We expect that stat exists on most systems.
32 It's confirmed on Unix, Mac and Windows.
33 If you don't have it, add #define DONT_HAVE_STAT to your config.h. */
34#ifndef DONT_HAVE_STAT
35#define HAVE_STAT
36
Guido van Rossum2571cc81999-04-07 16:07:23 +000037#ifndef DONT_HAVE_SYS_TYPES_H
Guido van Rossumaee0bad1997-09-05 07:33:22 +000038#include <sys/types.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +000039#endif
40#ifndef DONT_HAVE_SYS_STAT_H
Guido van Rossumaee0bad1997-09-05 07:33:22 +000041#include <sys/stat.h>
Guido van Rossum63e97ad2000-07-01 01:06:56 +000042#elif defined(HAVE_STAT_H)
43#include <stat.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +000044#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +000045
Guido van Rossum595d7ba1997-12-05 21:45:29 +000046#if defined(PYCC_VACPP)
47/* VisualAge C/C++ Failed to Define MountType Field in sys/stat.h */
48#define S_IFMT (S_IFDIR|S_IFCHR|S_IFREG)
49#endif
50
Guido van Rossumaee0bad1997-09-05 07:33:22 +000051#ifndef S_ISDIR
52#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
53#endif
54
55#endif
56
57
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000058extern time_t PyOS_GetLastModificationTime(char *, FILE *);
59 /* In getmtime.c */
Guido van Rossum21d335e1993-10-15 13:01:11 +000060
Guido van Rossum6c849691994-09-26 15:47:17 +000061/* Magic word to reject .pyc files generated by other Python versions */
Guido van Rossum7faeab31995-07-07 22:50:36 +000062/* Change for each incompatible change */
63/* The value of CR and LF is incorporated so if you ever read or write
64 a .pyc file in text mode the magic number will be wrong; also, the
65 Apple MPW compiler swaps their values, botching string constants */
66/* XXX Perhaps the magic number should be frozen and a version field
67 added to the .pyc file header? */
Guido van Rossumdd5db431997-01-17 21:06:11 +000068/* New way to come up with the magic number: (YEAR-1995), MONTH, DAY */
Barry Warsaw45ab2b62000-08-21 16:35:06 +000069#define MAGIC (50821 | ((long)'\r'<<16) | ((long)'\n'<<24))
Guido van Rossum3ddee711991-12-16 13:06:34 +000070
Guido van Rossum96774c12000-05-01 20:19:08 +000071/* Magic word as global; note that _PyImport_Init() can change the
Jeremy Hylton9262b8a2000-06-30 04:59:17 +000072 value of this global to accommodate for alterations of how the
Guido van Rossum96774c12000-05-01 20:19:08 +000073 compiler works which are enabled by command line switches. */
74static long pyc_magic = MAGIC;
75
Guido van Rossum25ce5661997-08-02 03:10:38 +000076/* See _PyImport_FixupExtension() below */
77static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000078
Guido van Rossum771c6c81997-10-31 18:37:24 +000079/* This table is defined in config.c: */
80extern struct _inittab _PyImport_Inittab[];
81
82struct _inittab *PyImport_Inittab = _PyImport_Inittab;
Guido van Rossum66f1fa81991-04-03 19:03:52 +000083
Guido van Rossumed1170e1999-12-20 21:23:41 +000084/* these tables define the module suffixes that Python recognizes */
85struct filedescr * _PyImport_Filetab = NULL;
86static const struct filedescr _PyImport_StandardFiletab[] = {
87 {".py", "r", PY_SOURCE},
88 {".pyc", "rb", PY_COMPILED},
89 {0, 0}
90};
91
Guido van Rossum1ae940a1995-01-02 19:04:15 +000092/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000093
94void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000095_PyImport_Init(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000096{
Guido van Rossumed1170e1999-12-20 21:23:41 +000097 const struct filedescr *scan;
98 struct filedescr *filetab;
99 int countD = 0;
100 int countS = 0;
101
102 /* prepare _PyImport_Filetab: copy entries from
103 _PyImport_DynLoadFiletab and _PyImport_StandardFiletab.
104 */
105 for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan)
106 ++countD;
107 for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan)
108 ++countS;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000109 filetab = PyMem_NEW(struct filedescr, countD + countS + 1);
Guido van Rossumed1170e1999-12-20 21:23:41 +0000110 memcpy(filetab, _PyImport_DynLoadFiletab,
111 countD * sizeof(struct filedescr));
112 memcpy(filetab + countD, _PyImport_StandardFiletab,
113 countS * sizeof(struct filedescr));
114 filetab[countD + countS].suffix = NULL;
115
116 _PyImport_Filetab = filetab;
117
Guido van Rossum0824f631997-03-11 18:37:35 +0000118 if (Py_OptimizeFlag) {
Guido van Rossumed1170e1999-12-20 21:23:41 +0000119 /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */
120 for (; filetab->suffix != NULL; filetab++) {
121 if (strcmp(filetab->suffix, ".pyc") == 0)
122 filetab->suffix = ".pyo";
Guido van Rossum0824f631997-03-11 18:37:35 +0000123 }
124 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000125
126 if (Py_UnicodeFlag) {
127 /* Fix the pyc_magic so that byte compiled code created
128 using the all-Unicode method doesn't interfere with
129 code created in normal operation mode. */
130 pyc_magic = MAGIC + 1;
131 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000132}
133
Guido van Rossum25ce5661997-08-02 03:10:38 +0000134void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000135_PyImport_Fini(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000136{
137 Py_XDECREF(extensions);
138 extensions = NULL;
139}
140
141
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000142/* Locking primitives to prevent parallel imports of the same module
143 in different threads to return with a partially loaded module.
144 These calls are serialized by the global interpreter lock. */
145
146#ifdef WITH_THREAD
147
Guido van Rossum49b56061998-10-01 20:42:43 +0000148#include "pythread.h"
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000149
Guido van Rossum65d5b571998-12-21 19:32:43 +0000150static PyThread_type_lock import_lock = 0;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000151static long import_lock_thread = -1;
152static int import_lock_level = 0;
153
154static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000155lock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000156{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000157 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000158 if (me == -1)
159 return; /* Too bad */
160 if (import_lock == NULL)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000161 import_lock = PyThread_allocate_lock();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000162 if (import_lock_thread == me) {
163 import_lock_level++;
164 return;
165 }
Guido van Rossum65d5b571998-12-21 19:32:43 +0000166 if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0)) {
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000167 PyThreadState *tstate = PyEval_SaveThread();
Guido van Rossum65d5b571998-12-21 19:32:43 +0000168 PyThread_acquire_lock(import_lock, 1);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000169 PyEval_RestoreThread(tstate);
170 }
171 import_lock_thread = me;
172 import_lock_level = 1;
173}
174
175static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000176unlock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000177{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000178 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000179 if (me == -1)
180 return; /* Too bad */
181 if (import_lock_thread != me)
182 Py_FatalError("unlock_import: not holding the import lock");
183 import_lock_level--;
184 if (import_lock_level == 0) {
185 import_lock_thread = -1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000186 PyThread_release_lock(import_lock);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000187 }
188}
189
190#else
191
192#define lock_import()
193#define unlock_import()
194
195#endif
196
Guido van Rossum25ce5661997-08-02 03:10:38 +0000197/* Helper for sys */
198
199PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000200PyImport_GetModuleDict(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000201{
202 PyInterpreterState *interp = PyThreadState_Get()->interp;
203 if (interp->modules == NULL)
204 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
205 return interp->modules;
206}
207
Guido van Rossum3f5da241990-12-20 15:06:42 +0000208
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000209/* List of names to clear in sys */
210static char* sys_deletes[] = {
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000211 "path", "argv", "ps1", "ps2", "exitfunc",
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000212 "exc_type", "exc_value", "exc_traceback",
213 "last_type", "last_value", "last_traceback",
214 NULL
215};
216
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000217static char* sys_files[] = {
218 "stdin", "__stdin__",
219 "stdout", "__stdout__",
220 "stderr", "__stderr__",
221 NULL
222};
223
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000224
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000225/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000226
Guido van Rossum3f5da241990-12-20 15:06:42 +0000227void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000228PyImport_Cleanup(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000229{
Guido van Rossum758eec01998-01-19 21:58:26 +0000230 int pos, ndone;
231 char *name;
232 PyObject *key, *value, *dict;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000233 PyInterpreterState *interp = PyThreadState_Get()->interp;
Guido van Rossum758eec01998-01-19 21:58:26 +0000234 PyObject *modules = interp->modules;
235
236 if (modules == NULL)
237 return; /* Already done */
238
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000239 /* Delete some special variables first. These are common
240 places where user values hide and people complain when their
241 destructors fail. Since the modules containing them are
242 deleted *last* of all, they would come too late in the normal
243 destruction order. Sigh. */
244
245 value = PyDict_GetItemString(modules, "__builtin__");
246 if (value != NULL && PyModule_Check(value)) {
247 dict = PyModule_GetDict(value);
248 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000249 PySys_WriteStderr("# clear __builtin__._\n");
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000250 PyDict_SetItemString(dict, "_", Py_None);
251 }
252 value = PyDict_GetItemString(modules, "sys");
253 if (value != NULL && PyModule_Check(value)) {
254 char **p;
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000255 PyObject *v;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000256 dict = PyModule_GetDict(value);
257 for (p = sys_deletes; *p != NULL; p++) {
258 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000259 PySys_WriteStderr("# clear sys.%s\n", *p);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000260 PyDict_SetItemString(dict, *p, Py_None);
261 }
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000262 for (p = sys_files; *p != NULL; p+=2) {
263 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000264 PySys_WriteStderr("# restore sys.%s\n", *p);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000265 v = PyDict_GetItemString(dict, *(p+1));
266 if (v == NULL)
267 v = Py_None;
268 PyDict_SetItemString(dict, *p, v);
269 }
270 }
271
272 /* First, delete __main__ */
273 value = PyDict_GetItemString(modules, "__main__");
274 if (value != NULL && PyModule_Check(value)) {
275 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000276 PySys_WriteStderr("# cleanup __main__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000277 _PyModule_Clear(value);
278 PyDict_SetItemString(modules, "__main__", Py_None);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000279 }
280
Guido van Rossum758eec01998-01-19 21:58:26 +0000281 /* The special treatment of __builtin__ here is because even
282 when it's not referenced as a module, its dictionary is
283 referenced by almost every module's __builtins__. Since
284 deleting a module clears its dictionary (even if there are
285 references left to it), we need to delete the __builtin__
286 module last. Likewise, we don't delete sys until the very
287 end because it is implicitly referenced (e.g. by print).
288
289 Also note that we 'delete' modules by replacing their entry
290 in the modules dict with None, rather than really deleting
291 them; this avoids a rehash of the modules dictionary and
292 also marks them as "non existent" so they won't be
293 re-imported. */
294
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000295 /* Next, repeatedly delete modules with a reference count of
Guido van Rossum758eec01998-01-19 21:58:26 +0000296 one (skipping __builtin__ and sys) and delete them */
297 do {
298 ndone = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000299 pos = 0;
Guido van Rossum758eec01998-01-19 21:58:26 +0000300 while (PyDict_Next(modules, &pos, &key, &value)) {
301 if (value->ob_refcnt != 1)
302 continue;
Guido van Rossum566373e1998-10-01 15:24:50 +0000303 if (PyString_Check(key) && PyModule_Check(value)) {
304 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000305 if (strcmp(name, "__builtin__") == 0)
306 continue;
307 if (strcmp(name, "sys") == 0)
308 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000309 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000310 PySys_WriteStderr(
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000311 "# cleanup[1] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000312 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000313 PyDict_SetItem(modules, key, Py_None);
314 ndone++;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000315 }
316 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000317 } while (ndone > 0);
318
Guido van Rossum758eec01998-01-19 21:58:26 +0000319 /* Next, delete all modules (still skipping __builtin__ and sys) */
320 pos = 0;
321 while (PyDict_Next(modules, &pos, &key, &value)) {
Guido van Rossum566373e1998-10-01 15:24:50 +0000322 if (PyString_Check(key) && PyModule_Check(value)) {
323 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000324 if (strcmp(name, "__builtin__") == 0)
325 continue;
326 if (strcmp(name, "sys") == 0)
327 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000328 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000329 PySys_WriteStderr("# cleanup[2] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000330 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000331 PyDict_SetItem(modules, key, Py_None);
332 }
333 }
334
335 /* Next, delete sys and __builtin__ (in that order) */
336 value = PyDict_GetItemString(modules, "sys");
337 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000338 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000339 PySys_WriteStderr("# cleanup sys\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000340 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000341 PyDict_SetItemString(modules, "sys", Py_None);
342 }
343 value = PyDict_GetItemString(modules, "__builtin__");
344 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000345 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000346 PySys_WriteStderr("# cleanup __builtin__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000347 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000348 PyDict_SetItemString(modules, "__builtin__", Py_None);
349 }
350
351 /* Finally, clear and delete the modules directory */
352 PyDict_Clear(modules);
353 interp->modules = NULL;
354 Py_DECREF(modules);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000355}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000356
357
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000358/* Helper for pythonrun.c -- return magic number */
359
360long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000361PyImport_GetMagicNumber(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000362{
Guido van Rossum96774c12000-05-01 20:19:08 +0000363 return pyc_magic;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000364}
365
366
Guido van Rossum25ce5661997-08-02 03:10:38 +0000367/* Magic for extension modules (built-in as well as dynamically
368 loaded). To prevent initializing an extension module more than
369 once, we keep a static dictionary 'extensions' keyed by module name
370 (for built-in modules) or by filename (for dynamically loaded
371 modules), containing these modules. A copy od the module's
372 dictionary is stored by calling _PyImport_FixupExtension()
373 immediately after the module initialization function succeeds. A
374 copy can be retrieved from there by calling
375 _PyImport_FindExtension(). */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000376
Guido van Rossum79f25d91997-04-29 20:08:16 +0000377PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000378_PyImport_FixupExtension(char *name, char *filename)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000379{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000380 PyObject *modules, *mod, *dict, *copy;
381 if (extensions == NULL) {
382 extensions = PyDict_New();
383 if (extensions == NULL)
384 return NULL;
385 }
386 modules = PyImport_GetModuleDict();
387 mod = PyDict_GetItemString(modules, name);
388 if (mod == NULL || !PyModule_Check(mod)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000389 PyErr_Format(PyExc_SystemError,
390 "_PyImport_FixupExtension: module %.200s not loaded", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000391 return NULL;
392 }
393 dict = PyModule_GetDict(mod);
394 if (dict == NULL)
395 return NULL;
396 copy = PyObject_CallMethod(dict, "copy", "");
397 if (copy == NULL)
398 return NULL;
399 PyDict_SetItemString(extensions, filename, copy);
400 Py_DECREF(copy);
401 return copy;
402}
403
404PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000405_PyImport_FindExtension(char *name, char *filename)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000406{
407 PyObject *dict, *mod, *mdict, *result;
408 if (extensions == NULL)
409 return NULL;
410 dict = PyDict_GetItemString(extensions, filename);
411 if (dict == NULL)
412 return NULL;
413 mod = PyImport_AddModule(name);
414 if (mod == NULL)
415 return NULL;
416 mdict = PyModule_GetDict(mod);
417 if (mdict == NULL)
418 return NULL;
419 result = PyObject_CallMethod(mdict, "update", "O", dict);
420 if (result == NULL)
421 return NULL;
422 Py_DECREF(result);
423 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000424 PySys_WriteStderr("import %s # previously loaded (%s)\n",
Guido van Rossum25ce5661997-08-02 03:10:38 +0000425 name, filename);
426 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000427}
428
429
430/* Get the module object corresponding to a module name.
431 First check the modules dictionary if there's one there,
432 if not, create a new one and insert in in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000433 Because the former action is most common, THIS DOES NOT RETURN A
434 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000435
Guido van Rossum79f25d91997-04-29 20:08:16 +0000436PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000437PyImport_AddModule(char *name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000438{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000439 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000440 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000441
Guido van Rossum25ce5661997-08-02 03:10:38 +0000442 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
Guido van Rossum79f25d91997-04-29 20:08:16 +0000443 PyModule_Check(m))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000444 return m;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000445 m = PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000446 if (m == NULL)
447 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000448 if (PyDict_SetItemString(modules, name, m) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000449 Py_DECREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000450 return NULL;
451 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000452 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000453
454 return m;
455}
456
457
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000458/* Execute a code object in a module and return the module object
459 WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000460
Guido van Rossum79f25d91997-04-29 20:08:16 +0000461PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000462PyImport_ExecCodeModule(char *name, PyObject *co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000463{
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000464 return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
465}
466
467PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000468PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname)
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000469{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000470 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000471 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000472
Guido van Rossum79f25d91997-04-29 20:08:16 +0000473 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000474 if (m == NULL)
475 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000476 d = PyModule_GetDict(m);
477 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
478 if (PyDict_SetItemString(d, "__builtins__",
479 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000480 return NULL;
481 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000482 /* Remember the filename as the __file__ attribute */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000483 v = NULL;
484 if (pathname != NULL) {
485 v = PyString_FromString(pathname);
486 if (v == NULL)
487 PyErr_Clear();
488 }
489 if (v == NULL) {
490 v = ((PyCodeObject *)co)->co_filename;
491 Py_INCREF(v);
492 }
493 if (PyDict_SetItemString(d, "__file__", v) != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000494 PyErr_Clear(); /* Not important enough to report */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000495 Py_DECREF(v);
496
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000497 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000498 if (v == NULL)
499 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000500 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000501
Guido van Rossum25ce5661997-08-02 03:10:38 +0000502 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000503 PyErr_Format(PyExc_ImportError,
504 "Loaded module %.200s not found in sys.modules",
505 name);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000506 return NULL;
507 }
508
Guido van Rossum79f25d91997-04-29 20:08:16 +0000509 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000510
511 return m;
512}
513
514
515/* Given a pathname for a Python source file, fill a buffer with the
516 pathname for the corresponding compiled file. Return the pathname
517 for the compiled file, or NULL if there's no space in the buffer.
518 Doesn't set an exception. */
519
520static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000521make_compiled_pathname(char *pathname, char *buf, size_t buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000522{
Fred Drake4c82b232000-06-30 16:18:57 +0000523 size_t len;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000524
525 len = strlen(pathname);
526 if (len+2 > buflen)
527 return NULL;
528 strcpy(buf, pathname);
Guido van Rossum0824f631997-03-11 18:37:35 +0000529 strcpy(buf+len, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000530
531 return buf;
532}
533
534
535/* Given a pathname for a Python source file, its time of last
536 modification, and a pathname for a compiled file, check whether the
537 compiled file represents the same version of the source. If so,
538 return a FILE pointer for the compiled file, positioned just after
539 the header; if not, return NULL.
540 Doesn't set an exception. */
541
542static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000543check_compiled_module(char *pathname, long mtime, char *cpathname)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000544{
545 FILE *fp;
546 long magic;
547 long pyc_mtime;
548
549 fp = fopen(cpathname, "rb");
550 if (fp == NULL)
551 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000552 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000553 if (magic != pyc_magic) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000554 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000555 PySys_WriteStderr("# %s has bad magic\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000556 fclose(fp);
557 return NULL;
558 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000559 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000560 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000561 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000562 PySys_WriteStderr("# %s has bad mtime\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000563 fclose(fp);
564 return NULL;
565 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000566 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000567 PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000568 return fp;
569}
570
571
572/* Read a code object from a file and check it for validity */
573
Guido van Rossum79f25d91997-04-29 20:08:16 +0000574static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000575read_compiled_module(char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000576{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000577 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000578
Guido van Rossum79f25d91997-04-29 20:08:16 +0000579 co = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000580 /* Ugly: rd_object() may return NULL with or without error */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000581 if (co == NULL || !PyCode_Check(co)) {
582 if (!PyErr_Occurred())
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000583 PyErr_Format(PyExc_ImportError,
584 "Non-code object in %.200s", cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000585 Py_XDECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000586 return NULL;
587 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000588 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000589}
590
591
592/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000593 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000594
Guido van Rossum79f25d91997-04-29 20:08:16 +0000595static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000596load_compiled_module(char *name, char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000597{
598 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000599 PyCodeObject *co;
600 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000601
Guido van Rossum79f25d91997-04-29 20:08:16 +0000602 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000603 if (magic != pyc_magic) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000604 PyErr_Format(PyExc_ImportError,
605 "Bad magic number in %.200s", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000606 return NULL;
607 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000608 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000609 co = read_compiled_module(cpathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000610 if (co == NULL)
611 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000612 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000613 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000614 name, cpathname);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000615 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000616 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000617
618 return m;
619}
620
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000621/* Parse a source file and return the corresponding code object */
622
Guido van Rossum79f25d91997-04-29 20:08:16 +0000623static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000624parse_source_module(char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000625{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000626 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000627 node *n;
628
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000629 n = PyParser_SimpleParseFile(fp, pathname, Py_file_input);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000630 if (n == NULL)
631 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000632 co = PyNode_Compile(n, pathname);
633 PyNode_Free(n);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000634
635 return co;
636}
637
638
639/* Write a compiled module to a file, placing the time of last
640 modification of its source into the header.
641 Errors are ignored, if a write error occurs an attempt is made to
642 remove the file. */
643
644static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000645write_compiled_module(PyCodeObject *co, char *cpathname, long mtime)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000646{
647 FILE *fp;
648
649 fp = fopen(cpathname, "wb");
650 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000651 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000652 PySys_WriteStderr(
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000653 "# can't create %s\n", cpathname);
654 return;
655 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000656 PyMarshal_WriteLongToFile(pyc_magic, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000657 /* First write a 0 for mtime */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000658 PyMarshal_WriteLongToFile(0L, fp);
659 PyMarshal_WriteObjectToFile((PyObject *)co, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000660 if (ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000661 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000662 PySys_WriteStderr("# can't write %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000663 /* Don't keep partial file */
664 fclose(fp);
665 (void) unlink(cpathname);
666 return;
667 }
668 /* Now write the true mtime */
669 fseek(fp, 4L, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000670 PyMarshal_WriteLongToFile(mtime, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000671 fflush(fp);
672 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000673 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000674 PySys_WriteStderr("# wrote %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000675#ifdef macintosh
Jack Jansencbf630f2000-07-11 21:59:16 +0000676 PyMac_setfiletype(cpathname, 'Pyth', 'PYC ');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000677#endif
678}
679
680
681/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000682 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
683 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000684
Guido van Rossum79f25d91997-04-29 20:08:16 +0000685static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000686load_source_module(char *name, char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000687{
Fred Drake4c82b232000-06-30 16:18:57 +0000688 time_t mtime;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000689 FILE *fpc;
690 char buf[MAXPATHLEN+1];
691 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000692 PyCodeObject *co;
693 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000694
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000695 mtime = PyOS_GetLastModificationTime(pathname, fp);
Fred Drake4c82b232000-06-30 16:18:57 +0000696 if (mtime == -1)
697 return NULL;
698#if SIZEOF_TIME_T > 4
699 /* Python's .pyc timestamp handling presumes that the timestamp fits
700 in 4 bytes. This will be fine until sometime in the year 2038,
701 when a 4-byte signed time_t will overflow.
702 */
703 if (mtime >> 32) {
704 PyErr_SetString(PyExc_OverflowError,
705 "modification time overflows a 4 bytes");
706 return NULL;
707 }
708#endif
709 cpathname = make_compiled_pathname(pathname, buf, (size_t)MAXPATHLEN+1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000710 if (cpathname != NULL &&
711 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000712 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000713 fclose(fpc);
714 if (co == NULL)
715 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000716 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000717 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000718 name, cpathname);
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000719 pathname = cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000720 }
721 else {
722 co = parse_source_module(pathname, fp);
723 if (co == NULL)
724 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000725 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000726 PySys_WriteStderr("import %s # from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000727 name, pathname);
728 write_compiled_module(co, cpathname, mtime);
729 }
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000730 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000731 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000732
733 return m;
734}
735
736
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000737/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +0000738static PyObject *load_module(char *, FILE *, char *, int);
739static struct filedescr *find_module(char *, PyObject *,
740 char *, size_t, FILE **);
741static struct _frozen *find_frozen(char *name);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000742
743/* Load a package and return its module object WITH INCREMENTED
744 REFERENCE COUNT */
745
746static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000747load_package(char *name, char *pathname)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000748{
749 PyObject *m, *d, *file, *path;
750 int err;
751 char buf[MAXPATHLEN+1];
752 FILE *fp = NULL;
753 struct filedescr *fdp;
754
755 m = PyImport_AddModule(name);
756 if (m == NULL)
757 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000758 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000759 PySys_WriteStderr("import %s # directory %s\n",
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000760 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000761 d = PyModule_GetDict(m);
762 file = PyString_FromString(pathname);
763 if (file == NULL)
764 return NULL;
765 path = Py_BuildValue("[O]", file);
766 if (path == NULL) {
767 Py_DECREF(file);
768 return NULL;
769 }
770 err = PyDict_SetItemString(d, "__file__", file);
771 if (err == 0)
772 err = PyDict_SetItemString(d, "__path__", path);
773 if (err != 0) {
774 m = NULL;
775 goto cleanup;
776 }
777 buf[0] = '\0';
778 fdp = find_module("__init__", path, buf, sizeof(buf), &fp);
779 if (fdp == NULL) {
780 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
781 PyErr_Clear();
782 }
783 else
784 m = NULL;
785 goto cleanup;
786 }
787 m = load_module(name, fp, buf, fdp->type);
788 if (fp != NULL)
789 fclose(fp);
790 cleanup:
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000791 Py_XDECREF(path);
792 Py_XDECREF(file);
793 return m;
794}
795
796
797/* Helper to test for built-in module */
798
799static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000800is_builtin(char *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000801{
802 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +0000803 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
804 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
805 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000806 return -1;
807 else
808 return 1;
809 }
810 }
811 return 0;
812}
813
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000814
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000815/* Search the path (default sys.path) for a module. Return the
816 corresponding filedescr struct, and (via return arguments) the
817 pathname and an open file. Return NULL if the module is not found. */
818
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000819#ifdef MS_COREDLL
Thomas Woutersb4bd21c2000-07-22 23:38:01 +0000820extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **,
821 char *, int);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000822#endif
823
Guido van Rossum0980bd91998-02-13 17:18:36 +0000824#ifdef CHECK_IMPORT_CASE
825static int check_case(char *, int, int, char *);
826#endif
827
Tim Petersdbd9ba62000-07-09 03:09:57 +0000828static int find_init_module(char *); /* Forward */
Guido van Rossum197346f1997-10-31 18:38:52 +0000829
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000830static struct filedescr *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000831find_module(char *realname, PyObject *path, char *buf, size_t buflen,
832 FILE **p_fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000833{
Fred Drake4c82b232000-06-30 16:18:57 +0000834 int i, npath;
835 size_t len, namelen;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000836 struct _frozen *f;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000837 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000838 FILE *fp = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000839 struct stat statbuf;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000840 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
841 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
842 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossum0506a431998-08-11 15:07:39 +0000843 char name[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000844
Fred Drake4c82b232000-06-30 16:18:57 +0000845 if (strlen(realname) > MAXPATHLEN) {
846 PyErr_SetString(PyExc_OverflowError, "module name is too long");
847 return NULL;
848 }
Guido van Rossum0506a431998-08-11 15:07:39 +0000849 strcpy(name, realname);
850
851 if (path != NULL && PyString_Check(path)) {
852 /* Submodule of "frozen" package:
853 Set name to the fullname, path to NULL
854 and continue as "usual" */
855 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
856 PyErr_SetString(PyExc_ImportError,
857 "full frozen module name too long");
858 return NULL;
859 }
860 strcpy(buf, PyString_AsString(path));
861 strcat(buf, ".");
862 strcat(buf, name);
863 strcpy(name, buf);
864 path = NULL;
865 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000866 if (path == NULL) {
867 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000868 strcpy(buf, name);
869 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000870 }
Guido van Rossuma5568d31998-03-05 03:45:08 +0000871 if ((f = find_frozen(name)) != NULL) {
872 strcpy(buf, name);
873 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000874 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000875
Guido van Rossumac279101996-08-22 23:10:58 +0000876#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000877 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
878 if (fp != NULL) {
879 *p_fp = fp;
880 return fdp;
881 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000882#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000883 path = PySys_GetObject("path");
884 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000885 if (path == NULL || !PyList_Check(path)) {
886 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +0000887 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000888 return NULL;
889 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000890 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000891 namelen = strlen(name);
892 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000893 PyObject *v = PyList_GetItem(path, i);
894 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000895 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000896 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000897 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000898 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000899 strcpy(buf, PyString_AsString(v));
Fred Drake4c82b232000-06-30 16:18:57 +0000900 if (strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000901 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000902#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000903#ifdef INTERN_STRINGS
904 /*
905 ** Speedup: each sys.path item is interned, and
906 ** FindResourceModule remembers which items refer to
907 ** folders (so we don't have to bother trying to look
908 ** into them for resources).
909 */
910 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
911 v = PyList_GET_ITEM(path, i);
912#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000913 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000914 static struct filedescr resfiledescr =
915 {"", "", PY_RESOURCE};
Jack Jansen9c96a921995-02-15 22:57:06 +0000916
917 return &resfiledescr;
918 }
Guido van Rossum0f84a341998-08-06 13:36:01 +0000919 if (PyMac_FindCodeResourceModule((PyStringObject *)v, name, buf)) {
920 static struct filedescr resfiledescr =
921 {"", "", PY_CODERESOURCE};
922
923 return &resfiledescr;
924 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000925#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000926 if (len > 0 && buf[len-1] != SEP
927#ifdef ALTSEP
928 && buf[len-1] != ALTSEP
929#endif
930 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000931 buf[len++] = SEP;
Guido van Rossum40f470f1996-05-23 22:51:04 +0000932#ifdef IMPORT_8x3_NAMES
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000933 /* see if we are searching in directory dos-8x3 */
934 if (len > 7 && !strncmp(buf + len - 8, "dos-8x3", 7)){
Guido van Rossum40f470f1996-05-23 22:51:04 +0000935 int j;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000936 char ch; /* limit name to 8 lower-case characters */
Guido van Rossum40f470f1996-05-23 22:51:04 +0000937 for (j = 0; (ch = name[j]) && j < 8; j++)
938 if (isupper(ch))
939 buf[len++] = tolower(ch);
940 else
941 buf[len++] = ch;
942 }
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000943 else /* Not in dos-8x3, use the full name */
Guido van Rossum6f489d91996-06-28 20:15:15 +0000944#endif
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000945 {
Guido van Rossum40f470f1996-05-23 22:51:04 +0000946 strcpy(buf+len, name);
947 len += namelen;
948 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000949#ifdef HAVE_STAT
950 if (stat(buf, &statbuf) == 0) {
Guido van Rossum197346f1997-10-31 18:38:52 +0000951 if (S_ISDIR(statbuf.st_mode)) {
Guido van Rossum0980bd91998-02-13 17:18:36 +0000952 if (find_init_module(buf)) {
953#ifdef CHECK_IMPORT_CASE
954 if (!check_case(buf, len, namelen,
955 name))
956 return NULL;
957#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000958 return &fd_package;
Guido van Rossum0980bd91998-02-13 17:18:36 +0000959 }
Guido van Rossum197346f1997-10-31 18:38:52 +0000960 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000961 }
962#else
963 /* XXX How are you going to test for directories? */
964#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000965#ifdef macintosh
966 fdp = PyMac_FindModuleExtension(buf, &len, name);
967 if (fdp)
968 fp = fopen(buf, fdp->mode);
969#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000970 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000971 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000972 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000973 PySys_WriteStderr("# trying %s\n", buf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000974 fp = fopen(buf, fdp->mode);
975 if (fp != NULL)
976 break;
977 }
Guido van Rossum741689d1997-08-12 14:53:39 +0000978#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000979 if (fp != NULL)
980 break;
981 }
982 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000983 PyErr_Format(PyExc_ImportError,
984 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000985 return NULL;
986 }
Guido van Rossum0980bd91998-02-13 17:18:36 +0000987#ifdef CHECK_IMPORT_CASE
988 if (!check_case(buf, len, namelen, name)) {
989 fclose(fp);
990 return NULL;
991 }
992#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000993
994 *p_fp = fp;
995 return fdp;
996}
997
Guido van Rossum0980bd91998-02-13 17:18:36 +0000998#ifdef CHECK_IMPORT_CASE
999
1000#ifdef MS_WIN32
1001#include <windows.h>
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001002#include <ctype.h>
1003
1004static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001005allcaps8x3(char *s)
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001006{
1007 /* Return 1 if s is an 8.3 filename in ALLCAPS */
1008 char c;
1009 char *dot = strchr(s, '.');
1010 char *end = strchr(s, '\0');
1011 if (dot != NULL) {
1012 if (dot-s > 8)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001013 return 0; /* More than 8 before '.' */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001014 if (end-dot > 4)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001015 return 0; /* More than 3 after '.' */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001016 end = strchr(dot+1, '.');
1017 if (end != NULL)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001018 return 0; /* More than one dot */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001019 }
1020 else if (end-s > 8)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001021 return 0; /* More than 8 and no dot */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001022 while ((c = *s++)) {
1023 if (islower(c))
1024 return 0;
1025 }
1026 return 1;
1027}
1028
Guido van Rossum0980bd91998-02-13 17:18:36 +00001029static int
1030check_case(char *buf, int len, int namelen, char *name)
1031{
1032 WIN32_FIND_DATA data;
1033 HANDLE h;
1034 if (getenv("PYTHONCASEOK") != NULL)
1035 return 1;
1036 h = FindFirstFile(buf, &data);
1037 if (h == INVALID_HANDLE_VALUE) {
1038 PyErr_Format(PyExc_NameError,
1039 "Can't find file for module %.100s\n(filename %.300s)",
1040 name, buf);
1041 return 0;
1042 }
1043 FindClose(h);
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001044 if (allcaps8x3(data.cFileName)) {
1045 /* Skip the test if the filename is ALL.CAPS. This can
1046 happen in certain circumstances beyond our control,
1047 e.g. when software is installed under NT on a FAT
1048 filesystem and then the same FAT filesystem is used
1049 under Windows 95. */
1050 return 1;
1051 }
Guido van Rossum0980bd91998-02-13 17:18:36 +00001052 if (strncmp(data.cFileName, name, namelen) != 0) {
1053 strcpy(buf+len-namelen, data.cFileName);
1054 PyErr_Format(PyExc_NameError,
1055 "Case mismatch for module name %.100s\n(filename %.300s)",
1056 name, buf);
1057 return 0;
1058 }
1059 return 1;
1060}
1061#endif /* MS_WIN32 */
1062
1063#ifdef macintosh
1064#include <TextUtils.h>
Guido van Rossumb33aa1a2000-04-24 15:08:18 +00001065#ifdef USE_GUSI1
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001066#include "TFileSpec.h" /* for Path2FSSpec() */
1067#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001068static int
1069check_case(char *buf, int len, int namelen, char *name)
1070{
1071 FSSpec fss;
1072 OSErr err;
Guido van Rossumb33aa1a2000-04-24 15:08:18 +00001073#ifndef USE_GUSI1
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001074 err = FSMakeFSSpec(0, 0, Pstring(buf), &fss);
1075#else
1076 /* GUSI's Path2FSSpec() resolves all possible aliases nicely on
1077 the way, which is fine for all directories, but here we need
1078 the original name of the alias file (say, Dlg.ppc.slb, not
1079 toolboxmodules.ppc.slb). */
1080 char *colon;
1081 err = Path2FSSpec(buf, &fss);
1082 if (err == noErr) {
1083 colon = strrchr(buf, ':'); /* find filename */
1084 if (colon != NULL)
1085 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1086 Pstring(colon+1), &fss);
1087 else
1088 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1089 fss.name, &fss);
1090 }
1091#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001092 if (err) {
1093 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001094 "Can't find file for module %.100s\n(filename %.300s)",
1095 name, buf);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001096 return 0;
1097 }
Guido van Rossum63e97ad2000-07-01 01:06:56 +00001098 if ( namelen > fss.name[0] || strncmp(name, (char *)fss.name+1, namelen) != 0 ) {
Guido van Rossum0980bd91998-02-13 17:18:36 +00001099 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001100 "Case mismatch for module name %.100s\n(filename %.300s)",
1101 name, fss.name);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001102 return 0;
1103 }
1104 return 1;
1105}
1106#endif /* macintosh */
1107
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001108#ifdef DJGPP
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001109#include <dir.h>
1110
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001111static int
1112check_case(char *buf, int len, int namelen, char *name)
1113{
1114 struct ffblk ffblk;
1115 int done;
1116
1117 if (getenv("PYTHONCASEOK") != NULL)
1118 return 1;
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001119 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001120 if (done) {
1121 PyErr_Format(PyExc_NameError,
1122 "Can't find file for module %.100s\n(filename %.300s)",
1123 name, buf);
1124 return 0;
1125 }
1126
1127 if (strncmp(ffblk.ff_name, name, namelen) != 0) {
1128 strcpy(buf+len-namelen, ffblk.ff_name);
1129 PyErr_Format(PyExc_NameError,
1130 "Case mismatch for module name %.100s\n(filename %.300s)",
1131 name, buf);
1132 return 0;
1133 }
1134 return 1;
1135}
1136#endif
1137
Guido van Rossum8766a771998-04-10 23:44:32 +00001138#endif /* CHECK_IMPORT_CASE */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001139
Guido van Rossum197346f1997-10-31 18:38:52 +00001140#ifdef HAVE_STAT
1141/* Helper to look for __init__.py or __init__.py[co] in potential package */
1142static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001143find_init_module(char *buf)
Guido van Rossum197346f1997-10-31 18:38:52 +00001144{
Fred Drake4c82b232000-06-30 16:18:57 +00001145 size_t save_len = strlen(buf);
1146 size_t i = save_len;
Guido van Rossum197346f1997-10-31 18:38:52 +00001147 struct stat statbuf;
1148
1149 if (save_len + 13 >= MAXPATHLEN)
1150 return 0;
1151 buf[i++] = SEP;
1152 strcpy(buf+i, "__init__.py");
1153 if (stat(buf, &statbuf) == 0) {
1154 buf[save_len] = '\0';
1155 return 1;
1156 }
1157 i += strlen(buf+i);
1158 if (Py_OptimizeFlag)
1159 strcpy(buf+i, "o");
1160 else
1161 strcpy(buf+i, "c");
1162 if (stat(buf, &statbuf) == 0) {
1163 buf[save_len] = '\0';
1164 return 1;
1165 }
1166 buf[save_len] = '\0';
1167 return 0;
1168}
1169#endif /* HAVE_STAT */
1170
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001171
Tim Petersdbd9ba62000-07-09 03:09:57 +00001172static int init_builtin(char *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001173
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001174/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001175 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001176
Guido van Rossum79f25d91997-04-29 20:08:16 +00001177static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001178load_module(char *name, FILE *fp, char *buf, int type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001179{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001180 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001181 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001182 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001183
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001184 /* First check that there's an open file (if we need one) */
1185 switch (type) {
1186 case PY_SOURCE:
1187 case PY_COMPILED:
1188 if (fp == NULL) {
1189 PyErr_Format(PyExc_ValueError,
1190 "file object required for import (type code %d)",
1191 type);
1192 return NULL;
1193 }
1194 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001195
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001196 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001197
1198 case PY_SOURCE:
1199 m = load_source_module(name, buf, fp);
1200 break;
1201
1202 case PY_COMPILED:
1203 m = load_compiled_module(name, buf, fp);
1204 break;
1205
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001206#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001207 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001208 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001209 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001210#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001211
Jack Jansen9c96a921995-02-15 22:57:06 +00001212#ifdef macintosh
1213 case PY_RESOURCE:
1214 m = PyMac_LoadResourceModule(name, buf);
1215 break;
Guido van Rossum0f84a341998-08-06 13:36:01 +00001216 case PY_CODERESOURCE:
1217 m = PyMac_LoadCodeResourceModule(name, buf);
1218 break;
Jack Jansen9c96a921995-02-15 22:57:06 +00001219#endif
1220
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001221 case PKG_DIRECTORY:
1222 m = load_package(name, buf);
1223 break;
1224
1225 case C_BUILTIN:
1226 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001227 if (buf != NULL && buf[0] != '\0')
1228 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001229 if (type == C_BUILTIN)
1230 err = init_builtin(name);
1231 else
1232 err = PyImport_ImportFrozenModule(name);
1233 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001234 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001235 if (err == 0) {
1236 PyErr_Format(PyExc_ImportError,
1237 "Purported %s module %.200s not found",
1238 type == C_BUILTIN ?
1239 "builtin" : "frozen",
1240 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001241 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001242 }
1243 modules = PyImport_GetModuleDict();
1244 m = PyDict_GetItemString(modules, name);
1245 if (m == NULL) {
1246 PyErr_Format(
1247 PyExc_ImportError,
1248 "%s module %.200s not properly initialized",
1249 type == C_BUILTIN ?
1250 "builtin" : "frozen",
1251 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001252 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001253 }
1254 Py_INCREF(m);
1255 break;
1256
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001257 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001258 PyErr_Format(PyExc_ImportError,
1259 "Don't know how to import %.200s (type code %d)",
1260 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001261 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001262
1263 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001264
1265 return m;
1266}
1267
1268
1269/* Initialize a built-in module.
1270 Return 1 for succes, 0 if the module is not found, and -1 with
1271 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001272
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001273static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001274init_builtin(char *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001275{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001276 struct _inittab *p;
1277 PyObject *mod;
1278
1279 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
1280 return 1;
1281
Guido van Rossum771c6c81997-10-31 18:37:24 +00001282 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001283 if (strcmp(name, p->name) == 0) {
1284 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001285 PyErr_Format(PyExc_ImportError,
1286 "Cannot re-init internal module %.200s",
1287 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001288 return -1;
1289 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001290 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001291 PySys_WriteStderr("import %s # builtin\n", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001292 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001293 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001294 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001295 if (_PyImport_FixupExtension(name, name) == NULL)
1296 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001297 return 1;
1298 }
1299 }
1300 return 0;
1301}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001302
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001303
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001304/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001305
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001306static struct _frozen *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001307find_frozen(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001308{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001309 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001310
Guido van Rossum79f25d91997-04-29 20:08:16 +00001311 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001312 if (p->name == NULL)
1313 return NULL;
1314 if (strcmp(p->name, name) == 0)
1315 break;
1316 }
1317 return p;
1318}
1319
Guido van Rossum79f25d91997-04-29 20:08:16 +00001320static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001321get_frozen_object(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001322{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001323 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001324 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001325
1326 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001327 PyErr_Format(PyExc_ImportError,
1328 "No such frozen object named %.200s",
1329 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001330 return NULL;
1331 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001332 size = p->size;
1333 if (size < 0)
1334 size = -size;
1335 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001336}
1337
1338/* Initialize a frozen module.
1339 Return 1 for succes, 0 if the module is not found, and -1 with
1340 an exception set if the initialization failed.
1341 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001342
1343int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001344PyImport_ImportFrozenModule(char *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001345{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001346 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001347 PyObject *co;
1348 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001349 int ispackage;
1350 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001351
1352 if (p == NULL)
1353 return 0;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001354 size = p->size;
1355 ispackage = (size < 0);
1356 if (ispackage)
1357 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001358 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001359 PySys_WriteStderr("import %s # frozen%s\n",
Guido van Rossuma5568d31998-03-05 03:45:08 +00001360 name, ispackage ? " package" : "");
1361 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001362 if (co == NULL)
1363 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001364 if (!PyCode_Check(co)) {
1365 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001366 PyErr_Format(PyExc_TypeError,
1367 "frozen object %.200s is not a code object",
1368 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001369 return -1;
1370 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001371 if (ispackage) {
1372 /* Set __path__ to the package name */
1373 PyObject *d, *s;
1374 int err;
1375 m = PyImport_AddModule(name);
1376 if (m == NULL)
1377 return -1;
1378 d = PyModule_GetDict(m);
1379 s = PyString_InternFromString(name);
1380 if (s == NULL)
1381 return -1;
1382 err = PyDict_SetItemString(d, "__path__", s);
1383 Py_DECREF(s);
1384 if (err != 0)
1385 return err;
1386 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001387 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001388 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001389 if (m == NULL)
1390 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001391 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001392 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001393}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001394
1395
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001396/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001397 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001398
Guido van Rossum79f25d91997-04-29 20:08:16 +00001399PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001400PyImport_ImportModule(char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00001401{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001402 static PyObject *fromlist = NULL;
1403 if (fromlist == NULL && strchr(name, '.') != NULL) {
1404 fromlist = Py_BuildValue("[s]", "*");
1405 if (fromlist == NULL)
1406 return NULL;
1407 }
1408 return PyImport_ImportModuleEx(name, NULL, NULL, fromlist);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001409}
1410
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001411/* Forward declarations for helper routines */
Tim Petersdbd9ba62000-07-09 03:09:57 +00001412static PyObject *get_parent(PyObject *globals, char *buf, int *p_buflen);
1413static PyObject *load_next(PyObject *mod, PyObject *altmod,
1414 char **p_name, char *buf, int *p_buflen);
1415static int mark_miss(char *name);
1416static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
1417 char *buf, int buflen, int recursive);
1418static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001419
1420/* The Magnum Opus of dotted-name import :-) */
1421
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001422static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001423import_module_ex(char *name, PyObject *globals, PyObject *locals,
1424 PyObject *fromlist)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001425{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001426 char buf[MAXPATHLEN+1];
1427 int buflen = 0;
1428 PyObject *parent, *head, *next, *tail;
1429
1430 parent = get_parent(globals, buf, &buflen);
1431 if (parent == NULL)
1432 return NULL;
1433
1434 head = load_next(parent, Py_None, &name, buf, &buflen);
1435 if (head == NULL)
1436 return NULL;
1437
1438 tail = head;
1439 Py_INCREF(tail);
1440 while (name) {
1441 next = load_next(tail, tail, &name, buf, &buflen);
1442 Py_DECREF(tail);
1443 if (next == NULL) {
1444 Py_DECREF(head);
1445 return NULL;
1446 }
1447 tail = next;
1448 }
1449
1450 if (fromlist != NULL) {
1451 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1452 fromlist = NULL;
1453 }
1454
1455 if (fromlist == NULL) {
1456 Py_DECREF(tail);
1457 return head;
1458 }
1459
1460 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001461 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001462 Py_DECREF(tail);
1463 return NULL;
1464 }
1465
1466 return tail;
1467}
1468
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001469PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001470PyImport_ImportModuleEx(char *name, PyObject *globals, PyObject *locals,
1471 PyObject *fromlist)
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001472{
1473 PyObject *result;
1474 lock_import();
Guido van Rossumd65911b1998-03-03 22:33:27 +00001475 result = import_module_ex(name, globals, locals, fromlist);
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001476 unlock_import();
1477 return result;
1478}
1479
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001480static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001481get_parent(PyObject *globals, char *buf, int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001482{
1483 static PyObject *namestr = NULL;
1484 static PyObject *pathstr = NULL;
1485 PyObject *modname, *modpath, *modules, *parent;
1486
1487 if (globals == NULL || !PyDict_Check(globals))
1488 return Py_None;
1489
1490 if (namestr == NULL) {
1491 namestr = PyString_InternFromString("__name__");
1492 if (namestr == NULL)
1493 return NULL;
1494 }
1495 if (pathstr == NULL) {
1496 pathstr = PyString_InternFromString("__path__");
1497 if (pathstr == NULL)
1498 return NULL;
1499 }
1500
1501 *buf = '\0';
1502 *p_buflen = 0;
1503 modname = PyDict_GetItem(globals, namestr);
1504 if (modname == NULL || !PyString_Check(modname))
1505 return Py_None;
1506
1507 modpath = PyDict_GetItem(globals, pathstr);
1508 if (modpath != NULL) {
1509 int len = PyString_GET_SIZE(modname);
1510 if (len > MAXPATHLEN) {
1511 PyErr_SetString(PyExc_ValueError,
1512 "Module name too long");
1513 return NULL;
1514 }
1515 strcpy(buf, PyString_AS_STRING(modname));
1516 *p_buflen = len;
1517 }
1518 else {
1519 char *start = PyString_AS_STRING(modname);
1520 char *lastdot = strrchr(start, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001521 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001522 if (lastdot == NULL)
1523 return Py_None;
1524 len = lastdot - start;
1525 if (len >= MAXPATHLEN) {
1526 PyErr_SetString(PyExc_ValueError,
1527 "Module name too long");
1528 return NULL;
1529 }
1530 strncpy(buf, start, len);
1531 buf[len] = '\0';
1532 *p_buflen = len;
1533 }
1534
1535 modules = PyImport_GetModuleDict();
1536 parent = PyDict_GetItemString(modules, buf);
1537 if (parent == NULL)
1538 parent = Py_None;
1539 return parent;
1540 /* We expect, but can't guarantee, if parent != None, that:
1541 - parent.__name__ == buf
1542 - parent.__dict__ is globals
1543 If this is violated... Who cares? */
1544}
1545
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001546/* altmod is either None or same as mod */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001547static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001548load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
1549 int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001550{
1551 char *name = *p_name;
1552 char *dot = strchr(name, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001553 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001554 char *p;
1555 PyObject *result;
1556
1557 if (dot == NULL) {
1558 *p_name = NULL;
1559 len = strlen(name);
1560 }
1561 else {
1562 *p_name = dot+1;
1563 len = dot-name;
1564 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00001565 if (len == 0) {
1566 PyErr_SetString(PyExc_ValueError,
1567 "Empty module name");
1568 return NULL;
1569 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001570
1571 p = buf + *p_buflen;
1572 if (p != buf)
1573 *p++ = '.';
1574 if (p+len-buf >= MAXPATHLEN) {
1575 PyErr_SetString(PyExc_ValueError,
1576 "Module name too long");
1577 return NULL;
1578 }
1579 strncpy(p, name, len);
1580 p[len] = '\0';
1581 *p_buflen = p+len-buf;
1582
1583 result = import_submodule(mod, p, buf);
1584 if (result == Py_None && altmod != mod) {
1585 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001586 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001587 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001588 if (result != NULL && result != Py_None) {
1589 if (mark_miss(buf) != 0) {
1590 Py_DECREF(result);
1591 return NULL;
1592 }
1593 strncpy(buf, name, len);
1594 buf[len] = '\0';
1595 *p_buflen = len;
1596 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001597 }
1598 if (result == NULL)
1599 return NULL;
1600
1601 if (result == Py_None) {
1602 Py_DECREF(result);
1603 PyErr_Format(PyExc_ImportError,
1604 "No module named %.200s", name);
1605 return NULL;
1606 }
1607
1608 return result;
1609}
1610
1611static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001612mark_miss(char *name)
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001613{
1614 PyObject *modules = PyImport_GetModuleDict();
1615 return PyDict_SetItemString(modules, name, Py_None);
1616}
1617
1618static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001619ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, int buflen,
1620 int recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001621{
1622 int i;
1623
1624 if (!PyObject_HasAttrString(mod, "__path__"))
1625 return 1;
1626
1627 for (i = 0; ; i++) {
1628 PyObject *item = PySequence_GetItem(fromlist, i);
1629 int hasit;
1630 if (item == NULL) {
1631 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1632 PyErr_Clear();
1633 return 1;
1634 }
1635 return 0;
1636 }
1637 if (!PyString_Check(item)) {
1638 PyErr_SetString(PyExc_TypeError,
1639 "Item in ``from list'' not a string");
1640 Py_DECREF(item);
1641 return 0;
1642 }
1643 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001644 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001645 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001646 /* See if the package defines __all__ */
1647 if (recursive)
1648 continue; /* Avoid endless recursion */
1649 all = PyObject_GetAttrString(mod, "__all__");
1650 if (all == NULL)
1651 PyErr_Clear();
1652 else {
1653 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1654 return 0;
1655 Py_DECREF(all);
1656 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001657 continue;
1658 }
1659 hasit = PyObject_HasAttr(mod, item);
1660 if (!hasit) {
1661 char *subname = PyString_AS_STRING(item);
1662 PyObject *submod;
1663 char *p;
1664 if (buflen + strlen(subname) >= MAXPATHLEN) {
1665 PyErr_SetString(PyExc_ValueError,
1666 "Module name too long");
1667 Py_DECREF(item);
1668 return 0;
1669 }
1670 p = buf + buflen;
1671 *p++ = '.';
1672 strcpy(p, subname);
1673 submod = import_submodule(mod, subname, buf);
1674 Py_XDECREF(submod);
1675 if (submod == NULL) {
1676 Py_DECREF(item);
1677 return 0;
1678 }
1679 }
1680 Py_DECREF(item);
1681 }
1682
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001683 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001684}
1685
1686static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001687import_submodule(PyObject *mod, char *subname, char *fullname)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001688{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001689 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001690 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001691
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001692 /* Require:
1693 if mod == None: subname == fullname
1694 else: mod.__name__ + "." + subname == fullname
1695 */
1696
1697 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001698 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001699 }
1700 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001701 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001702 char buf[MAXPATHLEN+1];
1703 struct filedescr *fdp;
1704 FILE *fp = NULL;
1705
Guido van Rossum9c0afe51998-05-19 15:09:05 +00001706 if (mod == Py_None)
1707 path = NULL;
1708 else {
1709 path = PyObject_GetAttrString(mod, "__path__");
1710 if (path == NULL) {
1711 PyErr_Clear();
1712 Py_INCREF(Py_None);
1713 return Py_None;
1714 }
1715 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001716
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001717 buf[0] = '\0';
Guido van Rossumb68cd421998-07-01 17:36:26 +00001718 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1719 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001720 if (fdp == NULL) {
1721 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1722 return NULL;
1723 PyErr_Clear();
1724 Py_INCREF(Py_None);
1725 return Py_None;
1726 }
1727 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001728 if (fp)
1729 fclose(fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001730 if (m != NULL && mod != Py_None) {
1731 if (PyObject_SetAttrString(mod, subname, m) < 0) {
1732 Py_DECREF(m);
1733 m = NULL;
1734 }
1735 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001736 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001737
1738 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001739}
1740
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001741
1742/* Re-import a module of any kind and return its module object, WITH
1743 INCREMENTED REFERENCE COUNT */
1744
Guido van Rossum79f25d91997-04-29 20:08:16 +00001745PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001746PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001747{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001748 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001749 PyObject *path = NULL;
1750 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001751 char buf[MAXPATHLEN+1];
1752 struct filedescr *fdp;
1753 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001754
Guido van Rossum79f25d91997-04-29 20:08:16 +00001755 if (m == NULL || !PyModule_Check(m)) {
1756 PyErr_SetString(PyExc_TypeError,
1757 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001758 return NULL;
1759 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001760 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001761 if (name == NULL)
1762 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001763 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001764 PyErr_Format(PyExc_ImportError,
1765 "reload(): module %.200s not in sys.modules",
1766 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001767 return NULL;
1768 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001769 subname = strrchr(name, '.');
1770 if (subname == NULL)
1771 subname = name;
1772 else {
1773 PyObject *parentname, *parent;
1774 parentname = PyString_FromStringAndSize(name, (subname-name));
1775 if (parentname == NULL)
1776 return NULL;
1777 parent = PyDict_GetItem(modules, parentname);
Barry Warsaw38793331999-01-27 17:54:20 +00001778 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00001779 if (parent == NULL) {
1780 PyErr_Format(PyExc_ImportError,
1781 "reload(): parent %.200s not in sys.modules",
1782 name);
1783 return NULL;
1784 }
1785 subname++;
1786 path = PyObject_GetAttrString(parent, "__path__");
1787 if (path == NULL)
1788 PyErr_Clear();
1789 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001790 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001791 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1792 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001793 if (fdp == NULL)
1794 return NULL;
1795 m = load_module(name, fp, buf, fdp->type);
1796 if (fp)
1797 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001798 return m;
1799}
1800
1801
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001802/* Higher-level import emulator which emulates the "import" statement
1803 more accurately -- it invokes the __import__() function from the
1804 builtins of the current globals. This means that the import is
1805 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00001806 environment, e.g. by "rexec".
1807 A dummy list ["__doc__"] is passed as the 4th argument so that
1808 e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
1809 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001810
1811PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001812PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001813{
1814 static PyObject *silly_list = NULL;
1815 static PyObject *builtins_str = NULL;
1816 static PyObject *import_str = NULL;
1817 static PyObject *standard_builtins = NULL;
1818 PyObject *globals = NULL;
1819 PyObject *import = NULL;
1820 PyObject *builtins = NULL;
1821 PyObject *r = NULL;
1822
1823 /* Initialize constant string objects */
1824 if (silly_list == NULL) {
1825 import_str = PyString_InternFromString("__import__");
1826 if (import_str == NULL)
1827 return NULL;
1828 builtins_str = PyString_InternFromString("__builtins__");
1829 if (builtins_str == NULL)
1830 return NULL;
1831 silly_list = Py_BuildValue("[s]", "__doc__");
1832 if (silly_list == NULL)
1833 return NULL;
1834 }
1835
1836 /* Get the builtins from current globals */
1837 globals = PyEval_GetGlobals();
1838 if(globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00001839 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001840 builtins = PyObject_GetItem(globals, builtins_str);
1841 if (builtins == NULL)
1842 goto err;
1843 }
1844 else {
1845 /* No globals -- use standard builtins, and fake globals */
1846 PyErr_Clear();
1847
1848 if (standard_builtins == NULL) {
1849 standard_builtins =
1850 PyImport_ImportModule("__builtin__");
1851 if (standard_builtins == NULL)
1852 return NULL;
1853 }
1854
1855 builtins = standard_builtins;
1856 Py_INCREF(builtins);
1857 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1858 if (globals == NULL)
1859 goto err;
1860 }
1861
1862 /* Get the __import__ function from the builtins */
1863 if (PyDict_Check(builtins))
1864 import=PyObject_GetItem(builtins, import_str);
1865 else
1866 import=PyObject_GetAttr(builtins, import_str);
1867 if (import == NULL)
1868 goto err;
1869
1870 /* Call the _import__ function with the proper argument list */
1871 r = PyObject_CallFunction(import, "OOOO",
1872 module_name, globals, globals, silly_list);
1873
1874 err:
1875 Py_XDECREF(globals);
1876 Py_XDECREF(builtins);
1877 Py_XDECREF(import);
1878
1879 return r;
1880}
1881
1882
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001883/* Module 'imp' provides Python access to the primitives used for
1884 importing modules.
1885*/
1886
Guido van Rossum79f25d91997-04-29 20:08:16 +00001887static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001888imp_get_magic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001889{
1890 char buf[4];
1891
Guido van Rossum43713e52000-02-29 13:59:29 +00001892 if (!PyArg_ParseTuple(args, ":get_magic"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001893 return NULL;
Guido van Rossum96774c12000-05-01 20:19:08 +00001894 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
1895 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
1896 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
1897 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001898
Guido van Rossum79f25d91997-04-29 20:08:16 +00001899 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001900}
1901
Guido van Rossum79f25d91997-04-29 20:08:16 +00001902static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001903imp_get_suffixes(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001904{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001905 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001906 struct filedescr *fdp;
1907
Guido van Rossum43713e52000-02-29 13:59:29 +00001908 if (!PyArg_ParseTuple(args, ":get_suffixes"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001909 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001910 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001911 if (list == NULL)
1912 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001913 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
1914 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001915 fdp->suffix, fdp->mode, fdp->type);
1916 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001917 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001918 return NULL;
1919 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001920 if (PyList_Append(list, item) < 0) {
1921 Py_DECREF(list);
1922 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001923 return NULL;
1924 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001925 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001926 }
1927 return list;
1928}
1929
Guido van Rossum79f25d91997-04-29 20:08:16 +00001930static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001931call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001932{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001933 extern int fclose(FILE *);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001934 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001935 struct filedescr *fdp;
1936 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001937 FILE *fp = NULL;
1938
1939 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001940 if (path == Py_None)
1941 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001942 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
1943 if (fdp == NULL)
1944 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001945 if (fp != NULL) {
1946 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
1947 if (fob == NULL) {
1948 fclose(fp);
1949 return NULL;
1950 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001951 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001952 else {
1953 fob = Py_None;
1954 Py_INCREF(fob);
1955 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001956 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001957 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001958 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001959 return ret;
1960}
1961
Guido van Rossum79f25d91997-04-29 20:08:16 +00001962static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001963imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001964{
1965 char *name;
1966 PyObject *path = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00001967 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001968 return NULL;
1969 return call_find_module(name, path);
1970}
1971
1972static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001973imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001974{
1975 char *name;
1976 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001977 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00001978 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001979 return NULL;
1980 ret = init_builtin(name);
1981 if (ret < 0)
1982 return NULL;
1983 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001984 Py_INCREF(Py_None);
1985 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001986 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001987 m = PyImport_AddModule(name);
1988 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001989 return m;
1990}
1991
Guido van Rossum79f25d91997-04-29 20:08:16 +00001992static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001993imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001994{
1995 char *name;
1996 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001997 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00001998 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001999 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002000 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002001 if (ret < 0)
2002 return NULL;
2003 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002004 Py_INCREF(Py_None);
2005 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002006 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002007 m = PyImport_AddModule(name);
2008 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002009 return m;
2010}
2011
Guido van Rossum79f25d91997-04-29 20:08:16 +00002012static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002013imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002014{
2015 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002016
Guido van Rossum43713e52000-02-29 13:59:29 +00002017 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002018 return NULL;
2019 return get_frozen_object(name);
2020}
2021
Guido van Rossum79f25d91997-04-29 20:08:16 +00002022static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002023imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002024{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002025 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002026 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002027 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002028 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002029}
2030
Guido van Rossum79f25d91997-04-29 20:08:16 +00002031static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002032imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002033{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002034 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002035 struct _frozen *p;
Guido van Rossum43713e52000-02-29 13:59:29 +00002036 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002037 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002038 p = find_frozen(name);
2039 return PyInt_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002040}
2041
2042static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002043get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002044{
2045 FILE *fp;
2046 if (fob == NULL) {
2047 fp = fopen(pathname, mode);
2048 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002049 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002050 }
2051 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002052 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002053 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002054 PyErr_SetString(PyExc_ValueError,
2055 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002056 }
2057 return fp;
2058}
2059
Guido van Rossum79f25d91997-04-29 20:08:16 +00002060static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002061imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002062{
2063 char *name;
2064 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002065 PyObject *fob = NULL;
2066 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002067 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002068 if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002069 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002070 return NULL;
2071 fp = get_file(pathname, fob, "rb");
2072 if (fp == NULL)
2073 return NULL;
2074 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002075 if (fob == NULL)
2076 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002077 return m;
2078}
2079
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002080#ifdef HAVE_DYNAMIC_LOADING
2081
Guido van Rossum79f25d91997-04-29 20:08:16 +00002082static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002083imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002084{
2085 char *name;
2086 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002087 PyObject *fob = NULL;
2088 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002089 FILE *fp = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002090 if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002091 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002092 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002093 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002094 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002095 if (fp == NULL)
2096 return NULL;
2097 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002098 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002099 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002100}
2101
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002102#endif /* HAVE_DYNAMIC_LOADING */
2103
Guido van Rossum79f25d91997-04-29 20:08:16 +00002104static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002105imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002106{
2107 char *name;
2108 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002109 PyObject *fob = NULL;
2110 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002111 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002112 if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002113 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002114 return NULL;
2115 fp = get_file(pathname, fob, "r");
2116 if (fp == NULL)
2117 return NULL;
2118 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002119 if (fob == NULL)
2120 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002121 return m;
2122}
2123
Jack Jansen9c96a921995-02-15 22:57:06 +00002124#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002125static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002126imp_load_resource(PyObject *self, PyObject *args)
Jack Jansen9c96a921995-02-15 22:57:06 +00002127{
2128 char *name;
2129 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002130 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002131
Guido van Rossum43713e52000-02-29 13:59:29 +00002132 if (!PyArg_ParseTuple(args, "ss:load_resource", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002133 return NULL;
2134 m = PyMac_LoadResourceModule(name, pathname);
2135 return m;
2136}
2137#endif /* macintosh */
2138
Guido van Rossum79f25d91997-04-29 20:08:16 +00002139static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002140imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002141{
2142 char *name;
2143 PyObject *fob;
2144 char *pathname;
2145 char *suffix; /* Unused */
2146 char *mode;
2147 int type;
2148 FILE *fp;
2149
Guido van Rossum43713e52000-02-29 13:59:29 +00002150 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002151 &name, &fob, &pathname,
2152 &suffix, &mode, &type))
2153 return NULL;
2154 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
2155 PyErr_Format(PyExc_ValueError,
2156 "invalid file open mode %.200s", mode);
2157 return NULL;
2158 }
2159 if (fob == Py_None)
2160 fp = NULL;
2161 else {
2162 if (!PyFile_Check(fob)) {
2163 PyErr_SetString(PyExc_ValueError,
2164 "load_module arg#2 should be a file or None");
2165 return NULL;
2166 }
2167 fp = get_file(pathname, fob, mode);
2168 if (fp == NULL)
2169 return NULL;
2170 }
2171 return load_module(name, fp, pathname, type);
2172}
2173
2174static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002175imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002176{
2177 char *name;
2178 char *pathname;
Guido van Rossum43713e52000-02-29 13:59:29 +00002179 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002180 return NULL;
2181 return load_package(name, pathname);
2182}
2183
2184static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002185imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002186{
2187 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002188 if (!PyArg_ParseTuple(args, "s:new_module", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002189 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002190 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002191}
2192
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002193/* Doc strings */
2194
2195static char doc_imp[] = "\
2196This module provides the components needed to build your own\n\
2197__import__ function. Undocumented functions are obsolete.\n\
2198";
2199
2200static char doc_find_module[] = "\
2201find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
2202Search for a module. If path is omitted or None, search for a\n\
2203built-in, frozen or special module and continue search in sys.path.\n\
2204The module name cannot contain '.'; to search for a submodule of a\n\
2205package, pass the submodule name and the package's __path__.\
2206";
2207
2208static char doc_load_module[] = "\
2209load_module(name, file, filename, (suffix, mode, type)) -> module\n\
2210Load a module, given information returned by find_module().\n\
2211The module name must include the full package name, if any.\
2212";
2213
2214static char doc_get_magic[] = "\
2215get_magic() -> string\n\
2216Return the magic number for .pyc or .pyo files.\
2217";
2218
2219static char doc_get_suffixes[] = "\
2220get_suffixes() -> [(suffix, mode, type), ...]\n\
2221Return a list of (suffix, mode, type) tuples describing the files\n\
2222that find_module() looks for.\
2223";
2224
2225static char doc_new_module[] = "\
2226new_module(name) -> module\n\
2227Create a new module. Do not enter it in sys.modules.\n\
2228The module name must include the full package name, if any.\
2229";
2230
Guido van Rossum79f25d91997-04-29 20:08:16 +00002231static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002232 {"find_module", imp_find_module, 1, doc_find_module},
2233 {"get_magic", imp_get_magic, 1, doc_get_magic},
2234 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2235 {"load_module", imp_load_module, 1, doc_load_module},
2236 {"new_module", imp_new_module, 1, doc_new_module},
2237 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002238 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002239 {"init_builtin", imp_init_builtin, 1},
2240 {"init_frozen", imp_init_frozen, 1},
2241 {"is_builtin", imp_is_builtin, 1},
2242 {"is_frozen", imp_is_frozen, 1},
2243 {"load_compiled", imp_load_compiled, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002244#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002245 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002246#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002247 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002248#ifdef macintosh
2249 {"load_resource", imp_load_resource, 1},
2250#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002251 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002252 {NULL, NULL} /* sentinel */
2253};
2254
Guido van Rossum1a8791e1998-08-04 22:46:29 +00002255static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002256setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002257{
2258 PyObject *v;
2259 int err;
2260
2261 v = PyInt_FromLong((long)value);
2262 err = PyDict_SetItemString(d, name, v);
2263 Py_XDECREF(v);
2264 return err;
2265}
2266
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002267void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002268initimp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002269{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002270 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002271
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002272 m = Py_InitModule4("imp", imp_methods, doc_imp,
2273 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002274 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002275
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002276 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2277 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2278 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2279 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2280 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2281 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2282 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2283 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00002284 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002285
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002286 failure:
2287 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002288}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002289
2290
Guido van Rossumb18618d2000-05-03 23:44:39 +00002291/* API for embedding applications that want to add their own entries
2292 to the table of built-in modules. This should normally be called
2293 *before* Py_Initialize(). When the table resize fails, -1 is
2294 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002295
2296 After a similar function by Just van Rossum. */
2297
2298int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002299PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002300{
2301 static struct _inittab *our_copy = NULL;
2302 struct _inittab *p;
2303 int i, n;
2304
2305 /* Count the number of entries in both tables */
2306 for (n = 0; newtab[n].name != NULL; n++)
2307 ;
2308 if (n == 0)
2309 return 0; /* Nothing to do */
2310 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2311 ;
2312
2313 /* Allocate new memory for the combined table */
Guido van Rossumb18618d2000-05-03 23:44:39 +00002314 p = our_copy;
2315 PyMem_RESIZE(p, struct _inittab, i+n+1);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002316 if (p == NULL)
2317 return -1;
2318
2319 /* Copy the tables into the new memory */
2320 if (our_copy != PyImport_Inittab)
2321 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2322 PyImport_Inittab = our_copy = p;
2323 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
2324
2325 return 0;
2326}
2327
2328/* Shorthand to add a single entry given a name and a function */
2329
2330int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002331PyImport_AppendInittab(char *name, void (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002332{
2333 struct _inittab newtab[2];
2334
2335 memset(newtab, '\0', sizeof newtab);
2336
2337 newtab[0].name = name;
2338 newtab[0].initfunc = initfunc;
2339
2340 return PyImport_ExtendInittab(newtab);
2341}