blob: 959474a429804f296bb89d763e8922400eb5ca1f [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 */
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000069#define MAGIC (50715 | ((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
820extern FILE *PyWin_FindRegisteredModule();
821#endif
822
Guido van Rossum0980bd91998-02-13 17:18:36 +0000823#ifdef CHECK_IMPORT_CASE
824static int check_case(char *, int, int, char *);
825#endif
826
Tim Petersdbd9ba62000-07-09 03:09:57 +0000827static int find_init_module(char *); /* Forward */
Guido van Rossum197346f1997-10-31 18:38:52 +0000828
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000829static struct filedescr *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000830find_module(char *realname, PyObject *path, char *buf, size_t buflen,
831 FILE **p_fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000832{
Fred Drake4c82b232000-06-30 16:18:57 +0000833 int i, npath;
834 size_t len, namelen;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000835 struct _frozen *f;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000836 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000837 FILE *fp = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000838 struct stat statbuf;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000839 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
840 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
841 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossum0506a431998-08-11 15:07:39 +0000842 char name[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000843
Fred Drake4c82b232000-06-30 16:18:57 +0000844 if (strlen(realname) > MAXPATHLEN) {
845 PyErr_SetString(PyExc_OverflowError, "module name is too long");
846 return NULL;
847 }
Guido van Rossum0506a431998-08-11 15:07:39 +0000848 strcpy(name, realname);
849
850 if (path != NULL && PyString_Check(path)) {
851 /* Submodule of "frozen" package:
852 Set name to the fullname, path to NULL
853 and continue as "usual" */
854 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
855 PyErr_SetString(PyExc_ImportError,
856 "full frozen module name too long");
857 return NULL;
858 }
859 strcpy(buf, PyString_AsString(path));
860 strcat(buf, ".");
861 strcat(buf, name);
862 strcpy(name, buf);
863 path = NULL;
864 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000865 if (path == NULL) {
866 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000867 strcpy(buf, name);
868 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000869 }
Guido van Rossuma5568d31998-03-05 03:45:08 +0000870 if ((f = find_frozen(name)) != NULL) {
871 strcpy(buf, name);
872 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000873 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000874
Guido van Rossumac279101996-08-22 23:10:58 +0000875#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000876 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
877 if (fp != NULL) {
878 *p_fp = fp;
879 return fdp;
880 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000881#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000882 path = PySys_GetObject("path");
883 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000884 if (path == NULL || !PyList_Check(path)) {
885 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +0000886 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000887 return NULL;
888 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000889 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000890 namelen = strlen(name);
891 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000892 PyObject *v = PyList_GetItem(path, i);
893 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000894 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000895 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000896 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000897 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000898 strcpy(buf, PyString_AsString(v));
Fred Drake4c82b232000-06-30 16:18:57 +0000899 if (strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000900 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000901#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000902#ifdef INTERN_STRINGS
903 /*
904 ** Speedup: each sys.path item is interned, and
905 ** FindResourceModule remembers which items refer to
906 ** folders (so we don't have to bother trying to look
907 ** into them for resources).
908 */
909 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
910 v = PyList_GET_ITEM(path, i);
911#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000912 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000913 static struct filedescr resfiledescr =
914 {"", "", PY_RESOURCE};
Jack Jansen9c96a921995-02-15 22:57:06 +0000915
916 return &resfiledescr;
917 }
Guido van Rossum0f84a341998-08-06 13:36:01 +0000918 if (PyMac_FindCodeResourceModule((PyStringObject *)v, name, buf)) {
919 static struct filedescr resfiledescr =
920 {"", "", PY_CODERESOURCE};
921
922 return &resfiledescr;
923 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000924#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000925 if (len > 0 && buf[len-1] != SEP
926#ifdef ALTSEP
927 && buf[len-1] != ALTSEP
928#endif
929 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000930 buf[len++] = SEP;
Guido van Rossum40f470f1996-05-23 22:51:04 +0000931#ifdef IMPORT_8x3_NAMES
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000932 /* see if we are searching in directory dos-8x3 */
933 if (len > 7 && !strncmp(buf + len - 8, "dos-8x3", 7)){
Guido van Rossum40f470f1996-05-23 22:51:04 +0000934 int j;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000935 char ch; /* limit name to 8 lower-case characters */
Guido van Rossum40f470f1996-05-23 22:51:04 +0000936 for (j = 0; (ch = name[j]) && j < 8; j++)
937 if (isupper(ch))
938 buf[len++] = tolower(ch);
939 else
940 buf[len++] = ch;
941 }
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000942 else /* Not in dos-8x3, use the full name */
Guido van Rossum6f489d91996-06-28 20:15:15 +0000943#endif
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000944 {
Guido van Rossum40f470f1996-05-23 22:51:04 +0000945 strcpy(buf+len, name);
946 len += namelen;
947 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000948#ifdef HAVE_STAT
949 if (stat(buf, &statbuf) == 0) {
Guido van Rossum197346f1997-10-31 18:38:52 +0000950 if (S_ISDIR(statbuf.st_mode)) {
Guido van Rossum0980bd91998-02-13 17:18:36 +0000951 if (find_init_module(buf)) {
952#ifdef CHECK_IMPORT_CASE
953 if (!check_case(buf, len, namelen,
954 name))
955 return NULL;
956#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000957 return &fd_package;
Guido van Rossum0980bd91998-02-13 17:18:36 +0000958 }
Guido van Rossum197346f1997-10-31 18:38:52 +0000959 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000960 }
961#else
962 /* XXX How are you going to test for directories? */
963#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000964#ifdef macintosh
965 fdp = PyMac_FindModuleExtension(buf, &len, name);
966 if (fdp)
967 fp = fopen(buf, fdp->mode);
968#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000969 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000970 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000971 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000972 PySys_WriteStderr("# trying %s\n", buf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000973 fp = fopen(buf, fdp->mode);
974 if (fp != NULL)
975 break;
976 }
Guido van Rossum741689d1997-08-12 14:53:39 +0000977#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000978 if (fp != NULL)
979 break;
980 }
981 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000982 PyErr_Format(PyExc_ImportError,
983 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000984 return NULL;
985 }
Guido van Rossum0980bd91998-02-13 17:18:36 +0000986#ifdef CHECK_IMPORT_CASE
987 if (!check_case(buf, len, namelen, name)) {
988 fclose(fp);
989 return NULL;
990 }
991#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000992
993 *p_fp = fp;
994 return fdp;
995}
996
Guido van Rossum0980bd91998-02-13 17:18:36 +0000997#ifdef CHECK_IMPORT_CASE
998
999#ifdef MS_WIN32
1000#include <windows.h>
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001001#include <ctype.h>
1002
1003static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001004allcaps8x3(char *s)
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001005{
1006 /* Return 1 if s is an 8.3 filename in ALLCAPS */
1007 char c;
1008 char *dot = strchr(s, '.');
1009 char *end = strchr(s, '\0');
1010 if (dot != NULL) {
1011 if (dot-s > 8)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001012 return 0; /* More than 8 before '.' */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001013 if (end-dot > 4)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001014 return 0; /* More than 3 after '.' */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001015 end = strchr(dot+1, '.');
1016 if (end != NULL)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001017 return 0; /* More than one dot */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001018 }
1019 else if (end-s > 8)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001020 return 0; /* More than 8 and no dot */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001021 while ((c = *s++)) {
1022 if (islower(c))
1023 return 0;
1024 }
1025 return 1;
1026}
1027
Guido van Rossum0980bd91998-02-13 17:18:36 +00001028static int
1029check_case(char *buf, int len, int namelen, char *name)
1030{
1031 WIN32_FIND_DATA data;
1032 HANDLE h;
1033 if (getenv("PYTHONCASEOK") != NULL)
1034 return 1;
1035 h = FindFirstFile(buf, &data);
1036 if (h == INVALID_HANDLE_VALUE) {
1037 PyErr_Format(PyExc_NameError,
1038 "Can't find file for module %.100s\n(filename %.300s)",
1039 name, buf);
1040 return 0;
1041 }
1042 FindClose(h);
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001043 if (allcaps8x3(data.cFileName)) {
1044 /* Skip the test if the filename is ALL.CAPS. This can
1045 happen in certain circumstances beyond our control,
1046 e.g. when software is installed under NT on a FAT
1047 filesystem and then the same FAT filesystem is used
1048 under Windows 95. */
1049 return 1;
1050 }
Guido van Rossum0980bd91998-02-13 17:18:36 +00001051 if (strncmp(data.cFileName, name, namelen) != 0) {
1052 strcpy(buf+len-namelen, data.cFileName);
1053 PyErr_Format(PyExc_NameError,
1054 "Case mismatch for module name %.100s\n(filename %.300s)",
1055 name, buf);
1056 return 0;
1057 }
1058 return 1;
1059}
1060#endif /* MS_WIN32 */
1061
1062#ifdef macintosh
1063#include <TextUtils.h>
Guido van Rossumb33aa1a2000-04-24 15:08:18 +00001064#ifdef USE_GUSI1
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001065#include "TFileSpec.h" /* for Path2FSSpec() */
1066#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001067static int
1068check_case(char *buf, int len, int namelen, char *name)
1069{
1070 FSSpec fss;
1071 OSErr err;
Guido van Rossumb33aa1a2000-04-24 15:08:18 +00001072#ifndef USE_GUSI1
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001073 err = FSMakeFSSpec(0, 0, Pstring(buf), &fss);
1074#else
1075 /* GUSI's Path2FSSpec() resolves all possible aliases nicely on
1076 the way, which is fine for all directories, but here we need
1077 the original name of the alias file (say, Dlg.ppc.slb, not
1078 toolboxmodules.ppc.slb). */
1079 char *colon;
1080 err = Path2FSSpec(buf, &fss);
1081 if (err == noErr) {
1082 colon = strrchr(buf, ':'); /* find filename */
1083 if (colon != NULL)
1084 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1085 Pstring(colon+1), &fss);
1086 else
1087 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1088 fss.name, &fss);
1089 }
1090#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001091 if (err) {
1092 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001093 "Can't find file for module %.100s\n(filename %.300s)",
1094 name, buf);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001095 return 0;
1096 }
Guido van Rossum63e97ad2000-07-01 01:06:56 +00001097 if ( namelen > fss.name[0] || strncmp(name, (char *)fss.name+1, namelen) != 0 ) {
Guido van Rossum0980bd91998-02-13 17:18:36 +00001098 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001099 "Case mismatch for module name %.100s\n(filename %.300s)",
1100 name, fss.name);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001101 return 0;
1102 }
1103 return 1;
1104}
1105#endif /* macintosh */
1106
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001107#ifdef DJGPP
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001108#include <dir.h>
1109
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001110static int
1111check_case(char *buf, int len, int namelen, char *name)
1112{
1113 struct ffblk ffblk;
1114 int done;
1115
1116 if (getenv("PYTHONCASEOK") != NULL)
1117 return 1;
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001118 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001119 if (done) {
1120 PyErr_Format(PyExc_NameError,
1121 "Can't find file for module %.100s\n(filename %.300s)",
1122 name, buf);
1123 return 0;
1124 }
1125
1126 if (strncmp(ffblk.ff_name, name, namelen) != 0) {
1127 strcpy(buf+len-namelen, ffblk.ff_name);
1128 PyErr_Format(PyExc_NameError,
1129 "Case mismatch for module name %.100s\n(filename %.300s)",
1130 name, buf);
1131 return 0;
1132 }
1133 return 1;
1134}
1135#endif
1136
Guido van Rossum8766a771998-04-10 23:44:32 +00001137#endif /* CHECK_IMPORT_CASE */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001138
Guido van Rossum197346f1997-10-31 18:38:52 +00001139#ifdef HAVE_STAT
1140/* Helper to look for __init__.py or __init__.py[co] in potential package */
1141static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001142find_init_module(char *buf)
Guido van Rossum197346f1997-10-31 18:38:52 +00001143{
Fred Drake4c82b232000-06-30 16:18:57 +00001144 size_t save_len = strlen(buf);
1145 size_t i = save_len;
Guido van Rossum197346f1997-10-31 18:38:52 +00001146 struct stat statbuf;
1147
1148 if (save_len + 13 >= MAXPATHLEN)
1149 return 0;
1150 buf[i++] = SEP;
1151 strcpy(buf+i, "__init__.py");
1152 if (stat(buf, &statbuf) == 0) {
1153 buf[save_len] = '\0';
1154 return 1;
1155 }
1156 i += strlen(buf+i);
1157 if (Py_OptimizeFlag)
1158 strcpy(buf+i, "o");
1159 else
1160 strcpy(buf+i, "c");
1161 if (stat(buf, &statbuf) == 0) {
1162 buf[save_len] = '\0';
1163 return 1;
1164 }
1165 buf[save_len] = '\0';
1166 return 0;
1167}
1168#endif /* HAVE_STAT */
1169
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001170
Tim Petersdbd9ba62000-07-09 03:09:57 +00001171static int init_builtin(char *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001172
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001173/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001174 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001175
Guido van Rossum79f25d91997-04-29 20:08:16 +00001176static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001177load_module(char *name, FILE *fp, char *buf, int type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001178{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001179 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001180 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001181 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001182
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001183 /* First check that there's an open file (if we need one) */
1184 switch (type) {
1185 case PY_SOURCE:
1186 case PY_COMPILED:
1187 if (fp == NULL) {
1188 PyErr_Format(PyExc_ValueError,
1189 "file object required for import (type code %d)",
1190 type);
1191 return NULL;
1192 }
1193 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001194
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001195 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001196
1197 case PY_SOURCE:
1198 m = load_source_module(name, buf, fp);
1199 break;
1200
1201 case PY_COMPILED:
1202 m = load_compiled_module(name, buf, fp);
1203 break;
1204
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001205#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001206 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001207 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001208 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001209#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001210
Jack Jansen9c96a921995-02-15 22:57:06 +00001211#ifdef macintosh
1212 case PY_RESOURCE:
1213 m = PyMac_LoadResourceModule(name, buf);
1214 break;
Guido van Rossum0f84a341998-08-06 13:36:01 +00001215 case PY_CODERESOURCE:
1216 m = PyMac_LoadCodeResourceModule(name, buf);
1217 break;
Jack Jansen9c96a921995-02-15 22:57:06 +00001218#endif
1219
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001220 case PKG_DIRECTORY:
1221 m = load_package(name, buf);
1222 break;
1223
1224 case C_BUILTIN:
1225 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001226 if (buf != NULL && buf[0] != '\0')
1227 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001228 if (type == C_BUILTIN)
1229 err = init_builtin(name);
1230 else
1231 err = PyImport_ImportFrozenModule(name);
1232 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001233 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001234 if (err == 0) {
1235 PyErr_Format(PyExc_ImportError,
1236 "Purported %s module %.200s not found",
1237 type == C_BUILTIN ?
1238 "builtin" : "frozen",
1239 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001240 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001241 }
1242 modules = PyImport_GetModuleDict();
1243 m = PyDict_GetItemString(modules, name);
1244 if (m == NULL) {
1245 PyErr_Format(
1246 PyExc_ImportError,
1247 "%s module %.200s not properly initialized",
1248 type == C_BUILTIN ?
1249 "builtin" : "frozen",
1250 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001251 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001252 }
1253 Py_INCREF(m);
1254 break;
1255
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001256 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001257 PyErr_Format(PyExc_ImportError,
1258 "Don't know how to import %.200s (type code %d)",
1259 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001260 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001261
1262 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001263
1264 return m;
1265}
1266
1267
1268/* Initialize a built-in module.
1269 Return 1 for succes, 0 if the module is not found, and -1 with
1270 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001271
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001272static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001273init_builtin(char *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001274{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001275 struct _inittab *p;
1276 PyObject *mod;
1277
1278 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
1279 return 1;
1280
Guido van Rossum771c6c81997-10-31 18:37:24 +00001281 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001282 if (strcmp(name, p->name) == 0) {
1283 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001284 PyErr_Format(PyExc_ImportError,
1285 "Cannot re-init internal module %.200s",
1286 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001287 return -1;
1288 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001289 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001290 PySys_WriteStderr("import %s # builtin\n", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001291 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001292 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001293 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001294 if (_PyImport_FixupExtension(name, name) == NULL)
1295 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001296 return 1;
1297 }
1298 }
1299 return 0;
1300}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001301
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001302
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001303/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001304
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001305static struct _frozen *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001306find_frozen(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001307{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001308 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001309
Guido van Rossum79f25d91997-04-29 20:08:16 +00001310 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001311 if (p->name == NULL)
1312 return NULL;
1313 if (strcmp(p->name, name) == 0)
1314 break;
1315 }
1316 return p;
1317}
1318
Guido van Rossum79f25d91997-04-29 20:08:16 +00001319static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001320get_frozen_object(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001321{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001322 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001323 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001324
1325 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001326 PyErr_Format(PyExc_ImportError,
1327 "No such frozen object named %.200s",
1328 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001329 return NULL;
1330 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001331 size = p->size;
1332 if (size < 0)
1333 size = -size;
1334 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001335}
1336
1337/* Initialize a frozen module.
1338 Return 1 for succes, 0 if the module is not found, and -1 with
1339 an exception set if the initialization failed.
1340 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001341
1342int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001343PyImport_ImportFrozenModule(char *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001344{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001345 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001346 PyObject *co;
1347 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001348 int ispackage;
1349 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001350
1351 if (p == NULL)
1352 return 0;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001353 size = p->size;
1354 ispackage = (size < 0);
1355 if (ispackage)
1356 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001357 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001358 PySys_WriteStderr("import %s # frozen%s\n",
Guido van Rossuma5568d31998-03-05 03:45:08 +00001359 name, ispackage ? " package" : "");
1360 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001361 if (co == NULL)
1362 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001363 if (!PyCode_Check(co)) {
1364 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001365 PyErr_Format(PyExc_TypeError,
1366 "frozen object %.200s is not a code object",
1367 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001368 return -1;
1369 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001370 if (ispackage) {
1371 /* Set __path__ to the package name */
1372 PyObject *d, *s;
1373 int err;
1374 m = PyImport_AddModule(name);
1375 if (m == NULL)
1376 return -1;
1377 d = PyModule_GetDict(m);
1378 s = PyString_InternFromString(name);
1379 if (s == NULL)
1380 return -1;
1381 err = PyDict_SetItemString(d, "__path__", s);
1382 Py_DECREF(s);
1383 if (err != 0)
1384 return err;
1385 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001386 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001387 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001388 if (m == NULL)
1389 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001390 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001391 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001392}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001393
1394
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001395/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001396 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001397
Guido van Rossum79f25d91997-04-29 20:08:16 +00001398PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001399PyImport_ImportModule(char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00001400{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001401 static PyObject *fromlist = NULL;
1402 if (fromlist == NULL && strchr(name, '.') != NULL) {
1403 fromlist = Py_BuildValue("[s]", "*");
1404 if (fromlist == NULL)
1405 return NULL;
1406 }
1407 return PyImport_ImportModuleEx(name, NULL, NULL, fromlist);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001408}
1409
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001410/* Forward declarations for helper routines */
Tim Petersdbd9ba62000-07-09 03:09:57 +00001411static PyObject *get_parent(PyObject *globals, char *buf, int *p_buflen);
1412static PyObject *load_next(PyObject *mod, PyObject *altmod,
1413 char **p_name, char *buf, int *p_buflen);
1414static int mark_miss(char *name);
1415static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
1416 char *buf, int buflen, int recursive);
1417static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001418
1419/* The Magnum Opus of dotted-name import :-) */
1420
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001421static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001422import_module_ex(char *name, PyObject *globals, PyObject *locals,
1423 PyObject *fromlist)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001424{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001425 char buf[MAXPATHLEN+1];
1426 int buflen = 0;
1427 PyObject *parent, *head, *next, *tail;
1428
1429 parent = get_parent(globals, buf, &buflen);
1430 if (parent == NULL)
1431 return NULL;
1432
1433 head = load_next(parent, Py_None, &name, buf, &buflen);
1434 if (head == NULL)
1435 return NULL;
1436
1437 tail = head;
1438 Py_INCREF(tail);
1439 while (name) {
1440 next = load_next(tail, tail, &name, buf, &buflen);
1441 Py_DECREF(tail);
1442 if (next == NULL) {
1443 Py_DECREF(head);
1444 return NULL;
1445 }
1446 tail = next;
1447 }
1448
1449 if (fromlist != NULL) {
1450 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1451 fromlist = NULL;
1452 }
1453
1454 if (fromlist == NULL) {
1455 Py_DECREF(tail);
1456 return head;
1457 }
1458
1459 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001460 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001461 Py_DECREF(tail);
1462 return NULL;
1463 }
1464
1465 return tail;
1466}
1467
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001468PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001469PyImport_ImportModuleEx(char *name, PyObject *globals, PyObject *locals,
1470 PyObject *fromlist)
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001471{
1472 PyObject *result;
1473 lock_import();
Guido van Rossumd65911b1998-03-03 22:33:27 +00001474 result = import_module_ex(name, globals, locals, fromlist);
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001475 unlock_import();
1476 return result;
1477}
1478
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001479static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001480get_parent(PyObject *globals, char *buf, int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001481{
1482 static PyObject *namestr = NULL;
1483 static PyObject *pathstr = NULL;
1484 PyObject *modname, *modpath, *modules, *parent;
1485
1486 if (globals == NULL || !PyDict_Check(globals))
1487 return Py_None;
1488
1489 if (namestr == NULL) {
1490 namestr = PyString_InternFromString("__name__");
1491 if (namestr == NULL)
1492 return NULL;
1493 }
1494 if (pathstr == NULL) {
1495 pathstr = PyString_InternFromString("__path__");
1496 if (pathstr == NULL)
1497 return NULL;
1498 }
1499
1500 *buf = '\0';
1501 *p_buflen = 0;
1502 modname = PyDict_GetItem(globals, namestr);
1503 if (modname == NULL || !PyString_Check(modname))
1504 return Py_None;
1505
1506 modpath = PyDict_GetItem(globals, pathstr);
1507 if (modpath != NULL) {
1508 int len = PyString_GET_SIZE(modname);
1509 if (len > MAXPATHLEN) {
1510 PyErr_SetString(PyExc_ValueError,
1511 "Module name too long");
1512 return NULL;
1513 }
1514 strcpy(buf, PyString_AS_STRING(modname));
1515 *p_buflen = len;
1516 }
1517 else {
1518 char *start = PyString_AS_STRING(modname);
1519 char *lastdot = strrchr(start, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001520 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001521 if (lastdot == NULL)
1522 return Py_None;
1523 len = lastdot - start;
1524 if (len >= MAXPATHLEN) {
1525 PyErr_SetString(PyExc_ValueError,
1526 "Module name too long");
1527 return NULL;
1528 }
1529 strncpy(buf, start, len);
1530 buf[len] = '\0';
1531 *p_buflen = len;
1532 }
1533
1534 modules = PyImport_GetModuleDict();
1535 parent = PyDict_GetItemString(modules, buf);
1536 if (parent == NULL)
1537 parent = Py_None;
1538 return parent;
1539 /* We expect, but can't guarantee, if parent != None, that:
1540 - parent.__name__ == buf
1541 - parent.__dict__ is globals
1542 If this is violated... Who cares? */
1543}
1544
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001545/* altmod is either None or same as mod */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001546static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001547load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
1548 int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001549{
1550 char *name = *p_name;
1551 char *dot = strchr(name, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001552 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001553 char *p;
1554 PyObject *result;
1555
1556 if (dot == NULL) {
1557 *p_name = NULL;
1558 len = strlen(name);
1559 }
1560 else {
1561 *p_name = dot+1;
1562 len = dot-name;
1563 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00001564 if (len == 0) {
1565 PyErr_SetString(PyExc_ValueError,
1566 "Empty module name");
1567 return NULL;
1568 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001569
1570 p = buf + *p_buflen;
1571 if (p != buf)
1572 *p++ = '.';
1573 if (p+len-buf >= MAXPATHLEN) {
1574 PyErr_SetString(PyExc_ValueError,
1575 "Module name too long");
1576 return NULL;
1577 }
1578 strncpy(p, name, len);
1579 p[len] = '\0';
1580 *p_buflen = p+len-buf;
1581
1582 result = import_submodule(mod, p, buf);
1583 if (result == Py_None && altmod != mod) {
1584 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001585 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001586 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001587 if (result != NULL && result != Py_None) {
1588 if (mark_miss(buf) != 0) {
1589 Py_DECREF(result);
1590 return NULL;
1591 }
1592 strncpy(buf, name, len);
1593 buf[len] = '\0';
1594 *p_buflen = len;
1595 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001596 }
1597 if (result == NULL)
1598 return NULL;
1599
1600 if (result == Py_None) {
1601 Py_DECREF(result);
1602 PyErr_Format(PyExc_ImportError,
1603 "No module named %.200s", name);
1604 return NULL;
1605 }
1606
1607 return result;
1608}
1609
1610static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001611mark_miss(char *name)
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001612{
1613 PyObject *modules = PyImport_GetModuleDict();
1614 return PyDict_SetItemString(modules, name, Py_None);
1615}
1616
1617static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001618ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, int buflen,
1619 int recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001620{
1621 int i;
1622
1623 if (!PyObject_HasAttrString(mod, "__path__"))
1624 return 1;
1625
1626 for (i = 0; ; i++) {
1627 PyObject *item = PySequence_GetItem(fromlist, i);
1628 int hasit;
1629 if (item == NULL) {
1630 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1631 PyErr_Clear();
1632 return 1;
1633 }
1634 return 0;
1635 }
1636 if (!PyString_Check(item)) {
1637 PyErr_SetString(PyExc_TypeError,
1638 "Item in ``from list'' not a string");
1639 Py_DECREF(item);
1640 return 0;
1641 }
1642 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001643 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001644 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001645 /* See if the package defines __all__ */
1646 if (recursive)
1647 continue; /* Avoid endless recursion */
1648 all = PyObject_GetAttrString(mod, "__all__");
1649 if (all == NULL)
1650 PyErr_Clear();
1651 else {
1652 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1653 return 0;
1654 Py_DECREF(all);
1655 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001656 continue;
1657 }
1658 hasit = PyObject_HasAttr(mod, item);
1659 if (!hasit) {
1660 char *subname = PyString_AS_STRING(item);
1661 PyObject *submod;
1662 char *p;
1663 if (buflen + strlen(subname) >= MAXPATHLEN) {
1664 PyErr_SetString(PyExc_ValueError,
1665 "Module name too long");
1666 Py_DECREF(item);
1667 return 0;
1668 }
1669 p = buf + buflen;
1670 *p++ = '.';
1671 strcpy(p, subname);
1672 submod = import_submodule(mod, subname, buf);
1673 Py_XDECREF(submod);
1674 if (submod == NULL) {
1675 Py_DECREF(item);
1676 return 0;
1677 }
1678 }
1679 Py_DECREF(item);
1680 }
1681
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001682 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001683}
1684
1685static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001686import_submodule(PyObject *mod, char *subname, char *fullname)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001687{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001688 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001689 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001690
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001691 /* Require:
1692 if mod == None: subname == fullname
1693 else: mod.__name__ + "." + subname == fullname
1694 */
1695
1696 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001697 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001698 }
1699 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001700 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001701 char buf[MAXPATHLEN+1];
1702 struct filedescr *fdp;
1703 FILE *fp = NULL;
1704
Guido van Rossum9c0afe51998-05-19 15:09:05 +00001705 if (mod == Py_None)
1706 path = NULL;
1707 else {
1708 path = PyObject_GetAttrString(mod, "__path__");
1709 if (path == NULL) {
1710 PyErr_Clear();
1711 Py_INCREF(Py_None);
1712 return Py_None;
1713 }
1714 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001715
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001716 buf[0] = '\0';
Guido van Rossumb68cd421998-07-01 17:36:26 +00001717 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1718 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001719 if (fdp == NULL) {
1720 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1721 return NULL;
1722 PyErr_Clear();
1723 Py_INCREF(Py_None);
1724 return Py_None;
1725 }
1726 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001727 if (fp)
1728 fclose(fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001729 if (m != NULL && mod != Py_None) {
1730 if (PyObject_SetAttrString(mod, subname, m) < 0) {
1731 Py_DECREF(m);
1732 m = NULL;
1733 }
1734 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001735 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001736
1737 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001738}
1739
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001740
1741/* Re-import a module of any kind and return its module object, WITH
1742 INCREMENTED REFERENCE COUNT */
1743
Guido van Rossum79f25d91997-04-29 20:08:16 +00001744PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001745PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001746{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001747 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001748 PyObject *path = NULL;
1749 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001750 char buf[MAXPATHLEN+1];
1751 struct filedescr *fdp;
1752 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001753
Guido van Rossum79f25d91997-04-29 20:08:16 +00001754 if (m == NULL || !PyModule_Check(m)) {
1755 PyErr_SetString(PyExc_TypeError,
1756 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001757 return NULL;
1758 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001759 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001760 if (name == NULL)
1761 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001762 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001763 PyErr_Format(PyExc_ImportError,
1764 "reload(): module %.200s not in sys.modules",
1765 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001766 return NULL;
1767 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001768 subname = strrchr(name, '.');
1769 if (subname == NULL)
1770 subname = name;
1771 else {
1772 PyObject *parentname, *parent;
1773 parentname = PyString_FromStringAndSize(name, (subname-name));
1774 if (parentname == NULL)
1775 return NULL;
1776 parent = PyDict_GetItem(modules, parentname);
Barry Warsaw38793331999-01-27 17:54:20 +00001777 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00001778 if (parent == NULL) {
1779 PyErr_Format(PyExc_ImportError,
1780 "reload(): parent %.200s not in sys.modules",
1781 name);
1782 return NULL;
1783 }
1784 subname++;
1785 path = PyObject_GetAttrString(parent, "__path__");
1786 if (path == NULL)
1787 PyErr_Clear();
1788 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001789 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001790 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1791 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001792 if (fdp == NULL)
1793 return NULL;
1794 m = load_module(name, fp, buf, fdp->type);
1795 if (fp)
1796 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001797 return m;
1798}
1799
1800
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001801/* Higher-level import emulator which emulates the "import" statement
1802 more accurately -- it invokes the __import__() function from the
1803 builtins of the current globals. This means that the import is
1804 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00001805 environment, e.g. by "rexec".
1806 A dummy list ["__doc__"] is passed as the 4th argument so that
1807 e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
1808 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001809
1810PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001811PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001812{
1813 static PyObject *silly_list = NULL;
1814 static PyObject *builtins_str = NULL;
1815 static PyObject *import_str = NULL;
1816 static PyObject *standard_builtins = NULL;
1817 PyObject *globals = NULL;
1818 PyObject *import = NULL;
1819 PyObject *builtins = NULL;
1820 PyObject *r = NULL;
1821
1822 /* Initialize constant string objects */
1823 if (silly_list == NULL) {
1824 import_str = PyString_InternFromString("__import__");
1825 if (import_str == NULL)
1826 return NULL;
1827 builtins_str = PyString_InternFromString("__builtins__");
1828 if (builtins_str == NULL)
1829 return NULL;
1830 silly_list = Py_BuildValue("[s]", "__doc__");
1831 if (silly_list == NULL)
1832 return NULL;
1833 }
1834
1835 /* Get the builtins from current globals */
1836 globals = PyEval_GetGlobals();
1837 if(globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00001838 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001839 builtins = PyObject_GetItem(globals, builtins_str);
1840 if (builtins == NULL)
1841 goto err;
1842 }
1843 else {
1844 /* No globals -- use standard builtins, and fake globals */
1845 PyErr_Clear();
1846
1847 if (standard_builtins == NULL) {
1848 standard_builtins =
1849 PyImport_ImportModule("__builtin__");
1850 if (standard_builtins == NULL)
1851 return NULL;
1852 }
1853
1854 builtins = standard_builtins;
1855 Py_INCREF(builtins);
1856 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1857 if (globals == NULL)
1858 goto err;
1859 }
1860
1861 /* Get the __import__ function from the builtins */
1862 if (PyDict_Check(builtins))
1863 import=PyObject_GetItem(builtins, import_str);
1864 else
1865 import=PyObject_GetAttr(builtins, import_str);
1866 if (import == NULL)
1867 goto err;
1868
1869 /* Call the _import__ function with the proper argument list */
1870 r = PyObject_CallFunction(import, "OOOO",
1871 module_name, globals, globals, silly_list);
1872
1873 err:
1874 Py_XDECREF(globals);
1875 Py_XDECREF(builtins);
1876 Py_XDECREF(import);
1877
1878 return r;
1879}
1880
1881
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001882/* Module 'imp' provides Python access to the primitives used for
1883 importing modules.
1884*/
1885
Guido van Rossum79f25d91997-04-29 20:08:16 +00001886static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001887imp_get_magic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001888{
1889 char buf[4];
1890
Guido van Rossum43713e52000-02-29 13:59:29 +00001891 if (!PyArg_ParseTuple(args, ":get_magic"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001892 return NULL;
Guido van Rossum96774c12000-05-01 20:19:08 +00001893 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
1894 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
1895 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
1896 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001897
Guido van Rossum79f25d91997-04-29 20:08:16 +00001898 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001899}
1900
Guido van Rossum79f25d91997-04-29 20:08:16 +00001901static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001902imp_get_suffixes(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001903{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001904 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001905 struct filedescr *fdp;
1906
Guido van Rossum43713e52000-02-29 13:59:29 +00001907 if (!PyArg_ParseTuple(args, ":get_suffixes"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001908 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001909 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001910 if (list == NULL)
1911 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001912 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
1913 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001914 fdp->suffix, fdp->mode, fdp->type);
1915 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001916 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001917 return NULL;
1918 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001919 if (PyList_Append(list, item) < 0) {
1920 Py_DECREF(list);
1921 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001922 return NULL;
1923 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001924 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001925 }
1926 return list;
1927}
1928
Guido van Rossum79f25d91997-04-29 20:08:16 +00001929static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001930call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001931{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001932 extern int fclose(FILE *);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001933 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001934 struct filedescr *fdp;
1935 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001936 FILE *fp = NULL;
1937
1938 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001939 if (path == Py_None)
1940 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001941 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
1942 if (fdp == NULL)
1943 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001944 if (fp != NULL) {
1945 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
1946 if (fob == NULL) {
1947 fclose(fp);
1948 return NULL;
1949 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001950 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001951 else {
1952 fob = Py_None;
1953 Py_INCREF(fob);
1954 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001955 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001956 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001957 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001958 return ret;
1959}
1960
Guido van Rossum79f25d91997-04-29 20:08:16 +00001961static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001962imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001963{
1964 char *name;
1965 PyObject *path = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00001966 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001967 return NULL;
1968 return call_find_module(name, path);
1969}
1970
1971static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001972imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001973{
1974 char *name;
1975 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001976 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00001977 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001978 return NULL;
1979 ret = init_builtin(name);
1980 if (ret < 0)
1981 return NULL;
1982 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001983 Py_INCREF(Py_None);
1984 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001985 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001986 m = PyImport_AddModule(name);
1987 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001988 return m;
1989}
1990
Guido van Rossum79f25d91997-04-29 20:08:16 +00001991static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001992imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001993{
1994 char *name;
1995 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001996 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00001997 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001998 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001999 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002000 if (ret < 0)
2001 return NULL;
2002 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002003 Py_INCREF(Py_None);
2004 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002005 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002006 m = PyImport_AddModule(name);
2007 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002008 return m;
2009}
2010
Guido van Rossum79f25d91997-04-29 20:08:16 +00002011static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002012imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002013{
2014 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002015
Guido van Rossum43713e52000-02-29 13:59:29 +00002016 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002017 return NULL;
2018 return get_frozen_object(name);
2019}
2020
Guido van Rossum79f25d91997-04-29 20:08:16 +00002021static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002022imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002023{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002024 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002025 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002026 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002027 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002028}
2029
Guido van Rossum79f25d91997-04-29 20:08:16 +00002030static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002031imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002032{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002033 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002034 struct _frozen *p;
Guido van Rossum43713e52000-02-29 13:59:29 +00002035 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002036 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002037 p = find_frozen(name);
2038 return PyInt_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002039}
2040
2041static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002042get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002043{
2044 FILE *fp;
2045 if (fob == NULL) {
2046 fp = fopen(pathname, mode);
2047 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002048 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002049 }
2050 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002051 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002052 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002053 PyErr_SetString(PyExc_ValueError,
2054 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002055 }
2056 return fp;
2057}
2058
Guido van Rossum79f25d91997-04-29 20:08:16 +00002059static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002060imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002061{
2062 char *name;
2063 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002064 PyObject *fob = NULL;
2065 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002066 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002067 if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002068 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002069 return NULL;
2070 fp = get_file(pathname, fob, "rb");
2071 if (fp == NULL)
2072 return NULL;
2073 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002074 if (fob == NULL)
2075 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002076 return m;
2077}
2078
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002079#ifdef HAVE_DYNAMIC_LOADING
2080
Guido van Rossum79f25d91997-04-29 20:08:16 +00002081static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002082imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002083{
2084 char *name;
2085 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002086 PyObject *fob = NULL;
2087 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002088 FILE *fp = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002089 if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002090 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002091 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002092 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002093 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002094 if (fp == NULL)
2095 return NULL;
2096 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002097 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002098 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002099}
2100
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002101#endif /* HAVE_DYNAMIC_LOADING */
2102
Guido van Rossum79f25d91997-04-29 20:08:16 +00002103static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002104imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002105{
2106 char *name;
2107 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002108 PyObject *fob = NULL;
2109 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002110 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002111 if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002112 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002113 return NULL;
2114 fp = get_file(pathname, fob, "r");
2115 if (fp == NULL)
2116 return NULL;
2117 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002118 if (fob == NULL)
2119 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002120 return m;
2121}
2122
Jack Jansen9c96a921995-02-15 22:57:06 +00002123#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002124static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002125imp_load_resource(PyObject *self, PyObject *args)
Jack Jansen9c96a921995-02-15 22:57:06 +00002126{
2127 char *name;
2128 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002129 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002130
Guido van Rossum43713e52000-02-29 13:59:29 +00002131 if (!PyArg_ParseTuple(args, "ss:load_resource", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002132 return NULL;
2133 m = PyMac_LoadResourceModule(name, pathname);
2134 return m;
2135}
2136#endif /* macintosh */
2137
Guido van Rossum79f25d91997-04-29 20:08:16 +00002138static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002139imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002140{
2141 char *name;
2142 PyObject *fob;
2143 char *pathname;
2144 char *suffix; /* Unused */
2145 char *mode;
2146 int type;
2147 FILE *fp;
2148
Guido van Rossum43713e52000-02-29 13:59:29 +00002149 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002150 &name, &fob, &pathname,
2151 &suffix, &mode, &type))
2152 return NULL;
2153 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
2154 PyErr_Format(PyExc_ValueError,
2155 "invalid file open mode %.200s", mode);
2156 return NULL;
2157 }
2158 if (fob == Py_None)
2159 fp = NULL;
2160 else {
2161 if (!PyFile_Check(fob)) {
2162 PyErr_SetString(PyExc_ValueError,
2163 "load_module arg#2 should be a file or None");
2164 return NULL;
2165 }
2166 fp = get_file(pathname, fob, mode);
2167 if (fp == NULL)
2168 return NULL;
2169 }
2170 return load_module(name, fp, pathname, type);
2171}
2172
2173static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002174imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002175{
2176 char *name;
2177 char *pathname;
Guido van Rossum43713e52000-02-29 13:59:29 +00002178 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002179 return NULL;
2180 return load_package(name, pathname);
2181}
2182
2183static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002184imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002185{
2186 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002187 if (!PyArg_ParseTuple(args, "s:new_module", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002188 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002189 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002190}
2191
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002192/* Doc strings */
2193
2194static char doc_imp[] = "\
2195This module provides the components needed to build your own\n\
2196__import__ function. Undocumented functions are obsolete.\n\
2197";
2198
2199static char doc_find_module[] = "\
2200find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
2201Search for a module. If path is omitted or None, search for a\n\
2202built-in, frozen or special module and continue search in sys.path.\n\
2203The module name cannot contain '.'; to search for a submodule of a\n\
2204package, pass the submodule name and the package's __path__.\
2205";
2206
2207static char doc_load_module[] = "\
2208load_module(name, file, filename, (suffix, mode, type)) -> module\n\
2209Load a module, given information returned by find_module().\n\
2210The module name must include the full package name, if any.\
2211";
2212
2213static char doc_get_magic[] = "\
2214get_magic() -> string\n\
2215Return the magic number for .pyc or .pyo files.\
2216";
2217
2218static char doc_get_suffixes[] = "\
2219get_suffixes() -> [(suffix, mode, type), ...]\n\
2220Return a list of (suffix, mode, type) tuples describing the files\n\
2221that find_module() looks for.\
2222";
2223
2224static char doc_new_module[] = "\
2225new_module(name) -> module\n\
2226Create a new module. Do not enter it in sys.modules.\n\
2227The module name must include the full package name, if any.\
2228";
2229
Guido van Rossum79f25d91997-04-29 20:08:16 +00002230static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002231 {"find_module", imp_find_module, 1, doc_find_module},
2232 {"get_magic", imp_get_magic, 1, doc_get_magic},
2233 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2234 {"load_module", imp_load_module, 1, doc_load_module},
2235 {"new_module", imp_new_module, 1, doc_new_module},
2236 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002237 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002238 {"init_builtin", imp_init_builtin, 1},
2239 {"init_frozen", imp_init_frozen, 1},
2240 {"is_builtin", imp_is_builtin, 1},
2241 {"is_frozen", imp_is_frozen, 1},
2242 {"load_compiled", imp_load_compiled, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002243#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002244 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002245#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002246 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002247#ifdef macintosh
2248 {"load_resource", imp_load_resource, 1},
2249#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002250 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002251 {NULL, NULL} /* sentinel */
2252};
2253
Guido van Rossum1a8791e1998-08-04 22:46:29 +00002254static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002255setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002256{
2257 PyObject *v;
2258 int err;
2259
2260 v = PyInt_FromLong((long)value);
2261 err = PyDict_SetItemString(d, name, v);
2262 Py_XDECREF(v);
2263 return err;
2264}
2265
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002266void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002267initimp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002268{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002269 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002270
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002271 m = Py_InitModule4("imp", imp_methods, doc_imp,
2272 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002273 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002274
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002275 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2276 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2277 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2278 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2279 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2280 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2281 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2282 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00002283 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002284
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002285 failure:
2286 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002287}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002288
2289
Guido van Rossumb18618d2000-05-03 23:44:39 +00002290/* API for embedding applications that want to add their own entries
2291 to the table of built-in modules. This should normally be called
2292 *before* Py_Initialize(). When the table resize fails, -1 is
2293 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002294
2295 After a similar function by Just van Rossum. */
2296
2297int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002298PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002299{
2300 static struct _inittab *our_copy = NULL;
2301 struct _inittab *p;
2302 int i, n;
2303
2304 /* Count the number of entries in both tables */
2305 for (n = 0; newtab[n].name != NULL; n++)
2306 ;
2307 if (n == 0)
2308 return 0; /* Nothing to do */
2309 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2310 ;
2311
2312 /* Allocate new memory for the combined table */
Guido van Rossumb18618d2000-05-03 23:44:39 +00002313 p = our_copy;
2314 PyMem_RESIZE(p, struct _inittab, i+n+1);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002315 if (p == NULL)
2316 return -1;
2317
2318 /* Copy the tables into the new memory */
2319 if (our_copy != PyImport_Inittab)
2320 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2321 PyImport_Inittab = our_copy = p;
2322 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
2323
2324 return 0;
2325}
2326
2327/* Shorthand to add a single entry given a name and a function */
2328
2329int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002330PyImport_AppendInittab(char *name, void (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002331{
2332 struct _inittab newtab[2];
2333
2334 memset(newtab, '\0', sizeof newtab);
2335
2336 newtab[0].name = name;
2337 newtab[0].initfunc = initfunc;
2338
2339 return PyImport_ExtendInittab(newtab);
2340}