blob: a34d6c36d2ebe28fee646f531d634706a0761117 [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 Rossum2571cc81999-04-07 16:07:23 +000042#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +000043
Guido van Rossum595d7ba1997-12-05 21:45:29 +000044#if defined(PYCC_VACPP)
45/* VisualAge C/C++ Failed to Define MountType Field in sys/stat.h */
46#define S_IFMT (S_IFDIR|S_IFCHR|S_IFREG)
47#endif
48
Guido van Rossumaee0bad1997-09-05 07:33:22 +000049#ifndef S_ISDIR
50#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
51#endif
52
53#endif
54
55
Fred Drake4c82b232000-06-30 16:18:57 +000056extern time_t PyOS_GetLastModificationTime(); /* In getmtime.c */
Guido van Rossum21d335e1993-10-15 13:01:11 +000057
Guido van Rossum6c849691994-09-26 15:47:17 +000058/* Magic word to reject .pyc files generated by other Python versions */
Guido van Rossum7faeab31995-07-07 22:50:36 +000059/* Change for each incompatible change */
60/* The value of CR and LF is incorporated so if you ever read or write
61 a .pyc file in text mode the magic number will be wrong; also, the
62 Apple MPW compiler swaps their values, botching string constants */
63/* XXX Perhaps the magic number should be frozen and a version field
64 added to the .pyc file header? */
Guido van Rossumdd5db431997-01-17 21:06:11 +000065/* New way to come up with the magic number: (YEAR-1995), MONTH, DAY */
Guido van Rossum1cb6cd02000-04-28 19:03:54 +000066#define MAGIC (50428 | ((long)'\r'<<16) | ((long)'\n'<<24))
Guido van Rossum3ddee711991-12-16 13:06:34 +000067
Guido van Rossum96774c12000-05-01 20:19:08 +000068/* Magic word as global; note that _PyImport_Init() can change the
Jeremy Hylton9262b8a2000-06-30 04:59:17 +000069 value of this global to accommodate for alterations of how the
Guido van Rossum96774c12000-05-01 20:19:08 +000070 compiler works which are enabled by command line switches. */
71static long pyc_magic = MAGIC;
72
Guido van Rossum25ce5661997-08-02 03:10:38 +000073/* See _PyImport_FixupExtension() below */
74static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000075
Guido van Rossum771c6c81997-10-31 18:37:24 +000076/* This table is defined in config.c: */
77extern struct _inittab _PyImport_Inittab[];
78
79struct _inittab *PyImport_Inittab = _PyImport_Inittab;
Guido van Rossum66f1fa81991-04-03 19:03:52 +000080
Guido van Rossumed1170e1999-12-20 21:23:41 +000081/* these tables define the module suffixes that Python recognizes */
82struct filedescr * _PyImport_Filetab = NULL;
83static const struct filedescr _PyImport_StandardFiletab[] = {
84 {".py", "r", PY_SOURCE},
85 {".pyc", "rb", PY_COMPILED},
86 {0, 0}
87};
88
Guido van Rossum1ae940a1995-01-02 19:04:15 +000089/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000090
91void
Guido van Rossum25ce5661997-08-02 03:10:38 +000092_PyImport_Init()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000093{
Guido van Rossumed1170e1999-12-20 21:23:41 +000094 const struct filedescr *scan;
95 struct filedescr *filetab;
96 int countD = 0;
97 int countS = 0;
98
99 /* prepare _PyImport_Filetab: copy entries from
100 _PyImport_DynLoadFiletab and _PyImport_StandardFiletab.
101 */
102 for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan)
103 ++countD;
104 for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan)
105 ++countS;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000106 filetab = PyMem_NEW(struct filedescr, countD + countS + 1);
Guido van Rossumed1170e1999-12-20 21:23:41 +0000107 memcpy(filetab, _PyImport_DynLoadFiletab,
108 countD * sizeof(struct filedescr));
109 memcpy(filetab + countD, _PyImport_StandardFiletab,
110 countS * sizeof(struct filedescr));
111 filetab[countD + countS].suffix = NULL;
112
113 _PyImport_Filetab = filetab;
114
Guido van Rossum0824f631997-03-11 18:37:35 +0000115 if (Py_OptimizeFlag) {
Guido van Rossumed1170e1999-12-20 21:23:41 +0000116 /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */
117 for (; filetab->suffix != NULL; filetab++) {
118 if (strcmp(filetab->suffix, ".pyc") == 0)
119 filetab->suffix = ".pyo";
Guido van Rossum0824f631997-03-11 18:37:35 +0000120 }
121 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000122
123 if (Py_UnicodeFlag) {
124 /* Fix the pyc_magic so that byte compiled code created
125 using the all-Unicode method doesn't interfere with
126 code created in normal operation mode. */
127 pyc_magic = MAGIC + 1;
128 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000129}
130
Guido van Rossum25ce5661997-08-02 03:10:38 +0000131void
132_PyImport_Fini()
133{
134 Py_XDECREF(extensions);
135 extensions = NULL;
136}
137
138
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000139/* Locking primitives to prevent parallel imports of the same module
140 in different threads to return with a partially loaded module.
141 These calls are serialized by the global interpreter lock. */
142
143#ifdef WITH_THREAD
144
Guido van Rossum49b56061998-10-01 20:42:43 +0000145#include "pythread.h"
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000146
Guido van Rossum65d5b571998-12-21 19:32:43 +0000147static PyThread_type_lock import_lock = 0;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000148static long import_lock_thread = -1;
149static int import_lock_level = 0;
150
151static void
152lock_import()
153{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000154 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000155 if (me == -1)
156 return; /* Too bad */
157 if (import_lock == NULL)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000158 import_lock = PyThread_allocate_lock();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000159 if (import_lock_thread == me) {
160 import_lock_level++;
161 return;
162 }
Guido van Rossum65d5b571998-12-21 19:32:43 +0000163 if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0)) {
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000164 PyThreadState *tstate = PyEval_SaveThread();
Guido van Rossum65d5b571998-12-21 19:32:43 +0000165 PyThread_acquire_lock(import_lock, 1);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000166 PyEval_RestoreThread(tstate);
167 }
168 import_lock_thread = me;
169 import_lock_level = 1;
170}
171
172static void
173unlock_import()
174{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000175 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000176 if (me == -1)
177 return; /* Too bad */
178 if (import_lock_thread != me)
179 Py_FatalError("unlock_import: not holding the import lock");
180 import_lock_level--;
181 if (import_lock_level == 0) {
182 import_lock_thread = -1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000183 PyThread_release_lock(import_lock);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000184 }
185}
186
187#else
188
189#define lock_import()
190#define unlock_import()
191
192#endif
193
Guido van Rossum25ce5661997-08-02 03:10:38 +0000194/* Helper for sys */
195
196PyObject *
197PyImport_GetModuleDict()
198{
199 PyInterpreterState *interp = PyThreadState_Get()->interp;
200 if (interp->modules == NULL)
201 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
202 return interp->modules;
203}
204
Guido van Rossum3f5da241990-12-20 15:06:42 +0000205
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000206/* List of names to clear in sys */
207static char* sys_deletes[] = {
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000208 "path", "argv", "ps1", "ps2", "exitfunc",
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000209 "exc_type", "exc_value", "exc_traceback",
210 "last_type", "last_value", "last_traceback",
211 NULL
212};
213
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000214static char* sys_files[] = {
215 "stdin", "__stdin__",
216 "stdout", "__stdout__",
217 "stderr", "__stderr__",
218 NULL
219};
220
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000221
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000222/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000223
Guido van Rossum3f5da241990-12-20 15:06:42 +0000224void
Guido van Rossum79f25d91997-04-29 20:08:16 +0000225PyImport_Cleanup()
Guido van Rossum3f5da241990-12-20 15:06:42 +0000226{
Guido van Rossum758eec01998-01-19 21:58:26 +0000227 int pos, ndone;
228 char *name;
229 PyObject *key, *value, *dict;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000230 PyInterpreterState *interp = PyThreadState_Get()->interp;
Guido van Rossum758eec01998-01-19 21:58:26 +0000231 PyObject *modules = interp->modules;
232
233 if (modules == NULL)
234 return; /* Already done */
235
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000236 /* Delete some special variables first. These are common
237 places where user values hide and people complain when their
238 destructors fail. Since the modules containing them are
239 deleted *last* of all, they would come too late in the normal
240 destruction order. Sigh. */
241
242 value = PyDict_GetItemString(modules, "__builtin__");
243 if (value != NULL && PyModule_Check(value)) {
244 dict = PyModule_GetDict(value);
245 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000246 PySys_WriteStderr("# clear __builtin__._\n");
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000247 PyDict_SetItemString(dict, "_", Py_None);
248 }
249 value = PyDict_GetItemString(modules, "sys");
250 if (value != NULL && PyModule_Check(value)) {
251 char **p;
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000252 PyObject *v;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000253 dict = PyModule_GetDict(value);
254 for (p = sys_deletes; *p != NULL; p++) {
255 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000256 PySys_WriteStderr("# clear sys.%s\n", *p);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000257 PyDict_SetItemString(dict, *p, Py_None);
258 }
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000259 for (p = sys_files; *p != NULL; p+=2) {
260 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000261 PySys_WriteStderr("# restore sys.%s\n", *p);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000262 v = PyDict_GetItemString(dict, *(p+1));
263 if (v == NULL)
264 v = Py_None;
265 PyDict_SetItemString(dict, *p, v);
266 }
267 }
268
269 /* First, delete __main__ */
270 value = PyDict_GetItemString(modules, "__main__");
271 if (value != NULL && PyModule_Check(value)) {
272 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000273 PySys_WriteStderr("# cleanup __main__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000274 _PyModule_Clear(value);
275 PyDict_SetItemString(modules, "__main__", Py_None);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000276 }
277
Guido van Rossum758eec01998-01-19 21:58:26 +0000278 /* The special treatment of __builtin__ here is because even
279 when it's not referenced as a module, its dictionary is
280 referenced by almost every module's __builtins__. Since
281 deleting a module clears its dictionary (even if there are
282 references left to it), we need to delete the __builtin__
283 module last. Likewise, we don't delete sys until the very
284 end because it is implicitly referenced (e.g. by print).
285
286 Also note that we 'delete' modules by replacing their entry
287 in the modules dict with None, rather than really deleting
288 them; this avoids a rehash of the modules dictionary and
289 also marks them as "non existent" so they won't be
290 re-imported. */
291
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000292 /* Next, repeatedly delete modules with a reference count of
Guido van Rossum758eec01998-01-19 21:58:26 +0000293 one (skipping __builtin__ and sys) and delete them */
294 do {
295 ndone = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000296 pos = 0;
Guido van Rossum758eec01998-01-19 21:58:26 +0000297 while (PyDict_Next(modules, &pos, &key, &value)) {
298 if (value->ob_refcnt != 1)
299 continue;
Guido van Rossum566373e1998-10-01 15:24:50 +0000300 if (PyString_Check(key) && PyModule_Check(value)) {
301 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000302 if (strcmp(name, "__builtin__") == 0)
303 continue;
304 if (strcmp(name, "sys") == 0)
305 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000306 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000307 PySys_WriteStderr(
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000308 "# cleanup[1] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000309 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000310 PyDict_SetItem(modules, key, Py_None);
311 ndone++;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000312 }
313 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000314 } while (ndone > 0);
315
Guido van Rossum758eec01998-01-19 21:58:26 +0000316 /* Next, delete all modules (still skipping __builtin__ and sys) */
317 pos = 0;
318 while (PyDict_Next(modules, &pos, &key, &value)) {
Guido van Rossum566373e1998-10-01 15:24:50 +0000319 if (PyString_Check(key) && PyModule_Check(value)) {
320 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000321 if (strcmp(name, "__builtin__") == 0)
322 continue;
323 if (strcmp(name, "sys") == 0)
324 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000325 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000326 PySys_WriteStderr("# cleanup[2] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000327 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000328 PyDict_SetItem(modules, key, Py_None);
329 }
330 }
331
332 /* Next, delete sys and __builtin__ (in that order) */
333 value = PyDict_GetItemString(modules, "sys");
334 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000335 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000336 PySys_WriteStderr("# cleanup sys\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000337 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000338 PyDict_SetItemString(modules, "sys", Py_None);
339 }
340 value = PyDict_GetItemString(modules, "__builtin__");
341 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000342 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000343 PySys_WriteStderr("# cleanup __builtin__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000344 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000345 PyDict_SetItemString(modules, "__builtin__", Py_None);
346 }
347
348 /* Finally, clear and delete the modules directory */
349 PyDict_Clear(modules);
350 interp->modules = NULL;
351 Py_DECREF(modules);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000352}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000353
354
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000355/* Helper for pythonrun.c -- return magic number */
356
357long
Guido van Rossum79f25d91997-04-29 20:08:16 +0000358PyImport_GetMagicNumber()
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000359{
Guido van Rossum96774c12000-05-01 20:19:08 +0000360 return pyc_magic;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000361}
362
363
Guido van Rossum25ce5661997-08-02 03:10:38 +0000364/* Magic for extension modules (built-in as well as dynamically
365 loaded). To prevent initializing an extension module more than
366 once, we keep a static dictionary 'extensions' keyed by module name
367 (for built-in modules) or by filename (for dynamically loaded
368 modules), containing these modules. A copy od the module's
369 dictionary is stored by calling _PyImport_FixupExtension()
370 immediately after the module initialization function succeeds. A
371 copy can be retrieved from there by calling
372 _PyImport_FindExtension(). */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000373
Guido van Rossum79f25d91997-04-29 20:08:16 +0000374PyObject *
Guido van Rossum25ce5661997-08-02 03:10:38 +0000375_PyImport_FixupExtension(name, filename)
376 char *name;
377 char *filename;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000378{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000379 PyObject *modules, *mod, *dict, *copy;
380 if (extensions == NULL) {
381 extensions = PyDict_New();
382 if (extensions == NULL)
383 return NULL;
384 }
385 modules = PyImport_GetModuleDict();
386 mod = PyDict_GetItemString(modules, name);
387 if (mod == NULL || !PyModule_Check(mod)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000388 PyErr_Format(PyExc_SystemError,
389 "_PyImport_FixupExtension: module %.200s not loaded", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000390 return NULL;
391 }
392 dict = PyModule_GetDict(mod);
393 if (dict == NULL)
394 return NULL;
395 copy = PyObject_CallMethod(dict, "copy", "");
396 if (copy == NULL)
397 return NULL;
398 PyDict_SetItemString(extensions, filename, copy);
399 Py_DECREF(copy);
400 return copy;
401}
402
403PyObject *
404_PyImport_FindExtension(name, filename)
405 char *name;
406 char *filename;
407{
408 PyObject *dict, *mod, *mdict, *result;
409 if (extensions == NULL)
410 return NULL;
411 dict = PyDict_GetItemString(extensions, filename);
412 if (dict == NULL)
413 return NULL;
414 mod = PyImport_AddModule(name);
415 if (mod == NULL)
416 return NULL;
417 mdict = PyModule_GetDict(mod);
418 if (mdict == NULL)
419 return NULL;
420 result = PyObject_CallMethod(mdict, "update", "O", dict);
421 if (result == NULL)
422 return NULL;
423 Py_DECREF(result);
424 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000425 PySys_WriteStderr("import %s # previously loaded (%s)\n",
Guido van Rossum25ce5661997-08-02 03:10:38 +0000426 name, filename);
427 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000428}
429
430
431/* Get the module object corresponding to a module name.
432 First check the modules dictionary if there's one there,
433 if not, create a new one and insert in in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000434 Because the former action is most common, THIS DOES NOT RETURN A
435 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000436
Guido van Rossum79f25d91997-04-29 20:08:16 +0000437PyObject *
438PyImport_AddModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000439 char *name;
440{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000441 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000442 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000443
Guido van Rossum25ce5661997-08-02 03:10:38 +0000444 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
Guido van Rossum79f25d91997-04-29 20:08:16 +0000445 PyModule_Check(m))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000446 return m;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000447 m = PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000448 if (m == NULL)
449 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000450 if (PyDict_SetItemString(modules, name, m) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000451 Py_DECREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000452 return NULL;
453 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000454 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000455
456 return m;
457}
458
459
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000460/* Execute a code object in a module and return the module object
461 WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000462
Guido van Rossum79f25d91997-04-29 20:08:16 +0000463PyObject *
464PyImport_ExecCodeModule(name, co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000465 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000466 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000467{
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000468 return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
469}
470
471PyObject *
472PyImport_ExecCodeModuleEx(name, co, pathname)
473 char *name;
474 PyObject *co;
475 char *pathname;
476{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000477 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000478 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000479
Guido van Rossum79f25d91997-04-29 20:08:16 +0000480 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000481 if (m == NULL)
482 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000483 d = PyModule_GetDict(m);
484 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
485 if (PyDict_SetItemString(d, "__builtins__",
486 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000487 return NULL;
488 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000489 /* Remember the filename as the __file__ attribute */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000490 v = NULL;
491 if (pathname != NULL) {
492 v = PyString_FromString(pathname);
493 if (v == NULL)
494 PyErr_Clear();
495 }
496 if (v == NULL) {
497 v = ((PyCodeObject *)co)->co_filename;
498 Py_INCREF(v);
499 }
500 if (PyDict_SetItemString(d, "__file__", v) != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000501 PyErr_Clear(); /* Not important enough to report */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000502 Py_DECREF(v);
503
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000504 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000505 if (v == NULL)
506 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000507 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000508
Guido van Rossum25ce5661997-08-02 03:10:38 +0000509 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000510 PyErr_Format(PyExc_ImportError,
511 "Loaded module %.200s not found in sys.modules",
512 name);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000513 return NULL;
514 }
515
Guido van Rossum79f25d91997-04-29 20:08:16 +0000516 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000517
518 return m;
519}
520
521
522/* Given a pathname for a Python source file, fill a buffer with the
523 pathname for the corresponding compiled file. Return the pathname
524 for the compiled file, or NULL if there's no space in the buffer.
525 Doesn't set an exception. */
526
527static char *
528make_compiled_pathname(pathname, buf, buflen)
529 char *pathname;
530 char *buf;
Fred Drake4c82b232000-06-30 16:18:57 +0000531 size_t buflen;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000532{
Fred Drake4c82b232000-06-30 16:18:57 +0000533 size_t len;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000534
535 len = strlen(pathname);
536 if (len+2 > buflen)
537 return NULL;
538 strcpy(buf, pathname);
Guido van Rossum0824f631997-03-11 18:37:35 +0000539 strcpy(buf+len, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000540
541 return buf;
542}
543
544
545/* Given a pathname for a Python source file, its time of last
546 modification, and a pathname for a compiled file, check whether the
547 compiled file represents the same version of the source. If so,
548 return a FILE pointer for the compiled file, positioned just after
549 the header; if not, return NULL.
550 Doesn't set an exception. */
551
552static FILE *
553check_compiled_module(pathname, mtime, cpathname)
554 char *pathname;
555 long mtime;
556 char *cpathname;
557{
558 FILE *fp;
559 long magic;
560 long pyc_mtime;
561
562 fp = fopen(cpathname, "rb");
563 if (fp == NULL)
564 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000565 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000566 if (magic != pyc_magic) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000567 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000568 PySys_WriteStderr("# %s has bad magic\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000569 fclose(fp);
570 return NULL;
571 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000572 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000573 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000574 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000575 PySys_WriteStderr("# %s has bad mtime\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000576 fclose(fp);
577 return NULL;
578 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000579 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000580 PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000581 return fp;
582}
583
584
585/* Read a code object from a file and check it for validity */
586
Guido van Rossum79f25d91997-04-29 20:08:16 +0000587static PyCodeObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000588read_compiled_module(cpathname, fp)
589 char *cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000590 FILE *fp;
591{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000592 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000593
Guido van Rossum79f25d91997-04-29 20:08:16 +0000594 co = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000595 /* Ugly: rd_object() may return NULL with or without error */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000596 if (co == NULL || !PyCode_Check(co)) {
597 if (!PyErr_Occurred())
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000598 PyErr_Format(PyExc_ImportError,
599 "Non-code object in %.200s", cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000600 Py_XDECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000601 return NULL;
602 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000603 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000604}
605
606
607/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000608 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000609
Guido van Rossum79f25d91997-04-29 20:08:16 +0000610static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000611load_compiled_module(name, cpathname, fp)
612 char *name;
613 char *cpathname;
614 FILE *fp;
615{
616 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000617 PyCodeObject *co;
618 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000619
Guido van Rossum79f25d91997-04-29 20:08:16 +0000620 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000621 if (magic != pyc_magic) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000622 PyErr_Format(PyExc_ImportError,
623 "Bad magic number in %.200s", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000624 return NULL;
625 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000626 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000627 co = read_compiled_module(cpathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000628 if (co == NULL)
629 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000630 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000631 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000632 name, cpathname);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000633 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000634 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000635
636 return m;
637}
638
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000639/* Parse a source file and return the corresponding code object */
640
Guido van Rossum79f25d91997-04-29 20:08:16 +0000641static PyCodeObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000642parse_source_module(pathname, fp)
643 char *pathname;
644 FILE *fp;
645{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000646 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000647 node *n;
648
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000649 n = PyParser_SimpleParseFile(fp, pathname, Py_file_input);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000650 if (n == NULL)
651 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000652 co = PyNode_Compile(n, pathname);
653 PyNode_Free(n);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000654
655 return co;
656}
657
658
659/* Write a compiled module to a file, placing the time of last
660 modification of its source into the header.
661 Errors are ignored, if a write error occurs an attempt is made to
662 remove the file. */
663
664static void
665write_compiled_module(co, cpathname, mtime)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000666 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000667 char *cpathname;
668 long mtime;
669{
670 FILE *fp;
671
672 fp = fopen(cpathname, "wb");
673 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000674 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000675 PySys_WriteStderr(
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000676 "# can't create %s\n", cpathname);
677 return;
678 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000679 PyMarshal_WriteLongToFile(pyc_magic, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000680 /* First write a 0 for mtime */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000681 PyMarshal_WriteLongToFile(0L, fp);
682 PyMarshal_WriteObjectToFile((PyObject *)co, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000683 if (ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000684 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000685 PySys_WriteStderr("# can't write %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000686 /* Don't keep partial file */
687 fclose(fp);
688 (void) unlink(cpathname);
689 return;
690 }
691 /* Now write the true mtime */
692 fseek(fp, 4L, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000693 PyMarshal_WriteLongToFile(mtime, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000694 fflush(fp);
695 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000696 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000697 PySys_WriteStderr("# wrote %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000698#ifdef macintosh
Guido van Rossumbe1a6e21996-02-21 15:29:20 +0000699 setfiletype(cpathname, 'Pyth', 'PYC ');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000700#endif
701}
702
703
704/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000705 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
706 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000707
Guido van Rossum79f25d91997-04-29 20:08:16 +0000708static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000709load_source_module(name, pathname, fp)
710 char *name;
711 char *pathname;
712 FILE *fp;
713{
Fred Drake4c82b232000-06-30 16:18:57 +0000714 time_t mtime;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000715 FILE *fpc;
716 char buf[MAXPATHLEN+1];
717 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000718 PyCodeObject *co;
719 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000720
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000721 mtime = PyOS_GetLastModificationTime(pathname, fp);
Fred Drake4c82b232000-06-30 16:18:57 +0000722 if (mtime == -1)
723 return NULL;
724#if SIZEOF_TIME_T > 4
725 /* Python's .pyc timestamp handling presumes that the timestamp fits
726 in 4 bytes. This will be fine until sometime in the year 2038,
727 when a 4-byte signed time_t will overflow.
728 */
729 if (mtime >> 32) {
730 PyErr_SetString(PyExc_OverflowError,
731 "modification time overflows a 4 bytes");
732 return NULL;
733 }
734#endif
735 cpathname = make_compiled_pathname(pathname, buf, (size_t)MAXPATHLEN+1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000736 if (cpathname != NULL &&
737 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000738 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000739 fclose(fpc);
740 if (co == NULL)
741 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000742 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000743 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000744 name, cpathname);
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000745 pathname = cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000746 }
747 else {
748 co = parse_source_module(pathname, fp);
749 if (co == NULL)
750 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000751 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000752 PySys_WriteStderr("import %s # from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000753 name, pathname);
754 write_compiled_module(co, cpathname, mtime);
755 }
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000756 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000757 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000758
759 return m;
760}
761
762
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000763/* Forward */
764static PyObject *load_module Py_PROTO((char *, FILE *, char *, int));
765static struct filedescr *find_module Py_PROTO((char *, PyObject *,
Fred Drake4c82b232000-06-30 16:18:57 +0000766 char *, size_t, FILE **));
Guido van Rossuma86f77d1997-09-09 18:53:47 +0000767static struct _frozen *find_frozen Py_PROTO((char *name));
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000768
769/* Load a package and return its module object WITH INCREMENTED
770 REFERENCE COUNT */
771
772static PyObject *
773load_package(name, pathname)
774 char *name;
775 char *pathname;
776{
777 PyObject *m, *d, *file, *path;
778 int err;
779 char buf[MAXPATHLEN+1];
780 FILE *fp = NULL;
781 struct filedescr *fdp;
782
783 m = PyImport_AddModule(name);
784 if (m == NULL)
785 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000786 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000787 PySys_WriteStderr("import %s # directory %s\n",
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000788 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000789 d = PyModule_GetDict(m);
790 file = PyString_FromString(pathname);
791 if (file == NULL)
792 return NULL;
793 path = Py_BuildValue("[O]", file);
794 if (path == NULL) {
795 Py_DECREF(file);
796 return NULL;
797 }
798 err = PyDict_SetItemString(d, "__file__", file);
799 if (err == 0)
800 err = PyDict_SetItemString(d, "__path__", path);
801 if (err != 0) {
802 m = NULL;
803 goto cleanup;
804 }
805 buf[0] = '\0';
806 fdp = find_module("__init__", path, buf, sizeof(buf), &fp);
807 if (fdp == NULL) {
808 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
809 PyErr_Clear();
810 }
811 else
812 m = NULL;
813 goto cleanup;
814 }
815 m = load_module(name, fp, buf, fdp->type);
816 if (fp != NULL)
817 fclose(fp);
818 cleanup:
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000819 Py_XDECREF(path);
820 Py_XDECREF(file);
821 return m;
822}
823
824
825/* Helper to test for built-in module */
826
827static int
828is_builtin(name)
829 char *name;
830{
831 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +0000832 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
833 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
834 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000835 return -1;
836 else
837 return 1;
838 }
839 }
840 return 0;
841}
842
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000843
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000844/* Search the path (default sys.path) for a module. Return the
845 corresponding filedescr struct, and (via return arguments) the
846 pathname and an open file. Return NULL if the module is not found. */
847
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000848#ifdef MS_COREDLL
849extern FILE *PyWin_FindRegisteredModule();
850#endif
851
Guido van Rossum0980bd91998-02-13 17:18:36 +0000852#ifdef CHECK_IMPORT_CASE
853static int check_case(char *, int, int, char *);
854#endif
855
Guido van Rossum197346f1997-10-31 18:38:52 +0000856static int find_init_module Py_PROTO((char *)); /* Forward */
857
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000858static struct filedescr *
Guido van Rossum0506a431998-08-11 15:07:39 +0000859find_module(realname, path, buf, buflen, p_fp)
860 char *realname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000861 PyObject *path;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000862 /* Output parameters: */
863 char *buf;
Fred Drake4c82b232000-06-30 16:18:57 +0000864 size_t buflen;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000865 FILE **p_fp;
866{
Fred Drake4c82b232000-06-30 16:18:57 +0000867 int i, npath;
868 size_t len, namelen;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000869 struct _frozen *f;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000870 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000871 FILE *fp = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000872 struct stat statbuf;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000873 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
874 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
875 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossum0506a431998-08-11 15:07:39 +0000876 char name[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000877
Fred Drake4c82b232000-06-30 16:18:57 +0000878 if (strlen(realname) > MAXPATHLEN) {
879 PyErr_SetString(PyExc_OverflowError, "module name is too long");
880 return NULL;
881 }
Guido van Rossum0506a431998-08-11 15:07:39 +0000882 strcpy(name, realname);
883
884 if (path != NULL && PyString_Check(path)) {
885 /* Submodule of "frozen" package:
886 Set name to the fullname, path to NULL
887 and continue as "usual" */
888 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
889 PyErr_SetString(PyExc_ImportError,
890 "full frozen module name too long");
891 return NULL;
892 }
893 strcpy(buf, PyString_AsString(path));
894 strcat(buf, ".");
895 strcat(buf, name);
896 strcpy(name, buf);
897 path = NULL;
898 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000899 if (path == NULL) {
900 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000901 strcpy(buf, name);
902 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000903 }
Guido van Rossuma5568d31998-03-05 03:45:08 +0000904 if ((f = find_frozen(name)) != NULL) {
905 strcpy(buf, name);
906 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000907 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000908
Guido van Rossumac279101996-08-22 23:10:58 +0000909#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000910 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
911 if (fp != NULL) {
912 *p_fp = fp;
913 return fdp;
914 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000915#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000916 path = PySys_GetObject("path");
917 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000918 if (path == NULL || !PyList_Check(path)) {
919 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +0000920 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000921 return NULL;
922 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000923 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000924 namelen = strlen(name);
925 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000926 PyObject *v = PyList_GetItem(path, i);
927 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000928 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000929 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000930 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000931 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000932 strcpy(buf, PyString_AsString(v));
Fred Drake4c82b232000-06-30 16:18:57 +0000933 if (strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000934 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000935#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000936#ifdef INTERN_STRINGS
937 /*
938 ** Speedup: each sys.path item is interned, and
939 ** FindResourceModule remembers which items refer to
940 ** folders (so we don't have to bother trying to look
941 ** into them for resources).
942 */
943 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
944 v = PyList_GET_ITEM(path, i);
945#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000946 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000947 static struct filedescr resfiledescr =
948 {"", "", PY_RESOURCE};
Jack Jansen9c96a921995-02-15 22:57:06 +0000949
950 return &resfiledescr;
951 }
Guido van Rossum0f84a341998-08-06 13:36:01 +0000952 if (PyMac_FindCodeResourceModule((PyStringObject *)v, name, buf)) {
953 static struct filedescr resfiledescr =
954 {"", "", PY_CODERESOURCE};
955
956 return &resfiledescr;
957 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000958#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000959 if (len > 0 && buf[len-1] != SEP
960#ifdef ALTSEP
961 && buf[len-1] != ALTSEP
962#endif
963 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000964 buf[len++] = SEP;
Guido van Rossum40f470f1996-05-23 22:51:04 +0000965#ifdef IMPORT_8x3_NAMES
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000966 /* see if we are searching in directory dos-8x3 */
967 if (len > 7 && !strncmp(buf + len - 8, "dos-8x3", 7)){
Guido van Rossum40f470f1996-05-23 22:51:04 +0000968 int j;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000969 char ch; /* limit name to 8 lower-case characters */
Guido van Rossum40f470f1996-05-23 22:51:04 +0000970 for (j = 0; (ch = name[j]) && j < 8; j++)
971 if (isupper(ch))
972 buf[len++] = tolower(ch);
973 else
974 buf[len++] = ch;
975 }
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000976 else /* Not in dos-8x3, use the full name */
Guido van Rossum6f489d91996-06-28 20:15:15 +0000977#endif
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000978 {
Guido van Rossum40f470f1996-05-23 22:51:04 +0000979 strcpy(buf+len, name);
980 len += namelen;
981 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000982#ifdef HAVE_STAT
983 if (stat(buf, &statbuf) == 0) {
Guido van Rossum197346f1997-10-31 18:38:52 +0000984 if (S_ISDIR(statbuf.st_mode)) {
Guido van Rossum0980bd91998-02-13 17:18:36 +0000985 if (find_init_module(buf)) {
986#ifdef CHECK_IMPORT_CASE
987 if (!check_case(buf, len, namelen,
988 name))
989 return NULL;
990#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000991 return &fd_package;
Guido van Rossum0980bd91998-02-13 17:18:36 +0000992 }
Guido van Rossum197346f1997-10-31 18:38:52 +0000993 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000994 }
995#else
996 /* XXX How are you going to test for directories? */
997#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000998#ifdef macintosh
999 fdp = PyMac_FindModuleExtension(buf, &len, name);
1000 if (fdp)
1001 fp = fopen(buf, fdp->mode);
1002#else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001003 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001004 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001005 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001006 PySys_WriteStderr("# trying %s\n", buf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001007 fp = fopen(buf, fdp->mode);
1008 if (fp != NULL)
1009 break;
1010 }
Guido van Rossum741689d1997-08-12 14:53:39 +00001011#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001012 if (fp != NULL)
1013 break;
1014 }
1015 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001016 PyErr_Format(PyExc_ImportError,
1017 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001018 return NULL;
1019 }
Guido van Rossum0980bd91998-02-13 17:18:36 +00001020#ifdef CHECK_IMPORT_CASE
1021 if (!check_case(buf, len, namelen, name)) {
1022 fclose(fp);
1023 return NULL;
1024 }
1025#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001026
1027 *p_fp = fp;
1028 return fdp;
1029}
1030
Guido van Rossum0980bd91998-02-13 17:18:36 +00001031#ifdef CHECK_IMPORT_CASE
1032
1033#ifdef MS_WIN32
1034#include <windows.h>
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001035#include <ctype.h>
1036
1037static int
1038allcaps8x3(s)
1039 char *s;
1040{
1041 /* Return 1 if s is an 8.3 filename in ALLCAPS */
1042 char c;
1043 char *dot = strchr(s, '.');
1044 char *end = strchr(s, '\0');
1045 if (dot != NULL) {
1046 if (dot-s > 8)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001047 return 0; /* More than 8 before '.' */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001048 if (end-dot > 4)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001049 return 0; /* More than 3 after '.' */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001050 end = strchr(dot+1, '.');
1051 if (end != NULL)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001052 return 0; /* More than one dot */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001053 }
1054 else if (end-s > 8)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001055 return 0; /* More than 8 and no dot */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001056 while ((c = *s++)) {
1057 if (islower(c))
1058 return 0;
1059 }
1060 return 1;
1061}
1062
Guido van Rossum0980bd91998-02-13 17:18:36 +00001063static int
1064check_case(char *buf, int len, int namelen, char *name)
1065{
1066 WIN32_FIND_DATA data;
1067 HANDLE h;
1068 if (getenv("PYTHONCASEOK") != NULL)
1069 return 1;
1070 h = FindFirstFile(buf, &data);
1071 if (h == INVALID_HANDLE_VALUE) {
1072 PyErr_Format(PyExc_NameError,
1073 "Can't find file for module %.100s\n(filename %.300s)",
1074 name, buf);
1075 return 0;
1076 }
1077 FindClose(h);
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001078 if (allcaps8x3(data.cFileName)) {
1079 /* Skip the test if the filename is ALL.CAPS. This can
1080 happen in certain circumstances beyond our control,
1081 e.g. when software is installed under NT on a FAT
1082 filesystem and then the same FAT filesystem is used
1083 under Windows 95. */
1084 return 1;
1085 }
Guido van Rossum0980bd91998-02-13 17:18:36 +00001086 if (strncmp(data.cFileName, name, namelen) != 0) {
1087 strcpy(buf+len-namelen, data.cFileName);
1088 PyErr_Format(PyExc_NameError,
1089 "Case mismatch for module name %.100s\n(filename %.300s)",
1090 name, buf);
1091 return 0;
1092 }
1093 return 1;
1094}
1095#endif /* MS_WIN32 */
1096
1097#ifdef macintosh
1098#include <TextUtils.h>
Guido van Rossumb33aa1a2000-04-24 15:08:18 +00001099#ifdef USE_GUSI1
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001100#include "TFileSpec.h" /* for Path2FSSpec() */
1101#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001102static int
1103check_case(char *buf, int len, int namelen, char *name)
1104{
1105 FSSpec fss;
1106 OSErr err;
Guido van Rossumb33aa1a2000-04-24 15:08:18 +00001107#ifndef USE_GUSI1
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001108 err = FSMakeFSSpec(0, 0, Pstring(buf), &fss);
1109#else
1110 /* GUSI's Path2FSSpec() resolves all possible aliases nicely on
1111 the way, which is fine for all directories, but here we need
1112 the original name of the alias file (say, Dlg.ppc.slb, not
1113 toolboxmodules.ppc.slb). */
1114 char *colon;
1115 err = Path2FSSpec(buf, &fss);
1116 if (err == noErr) {
1117 colon = strrchr(buf, ':'); /* find filename */
1118 if (colon != NULL)
1119 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1120 Pstring(colon+1), &fss);
1121 else
1122 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1123 fss.name, &fss);
1124 }
1125#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001126 if (err) {
1127 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001128 "Can't find file for module %.100s\n(filename %.300s)",
1129 name, buf);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001130 return 0;
1131 }
1132 p2cstr(fss.name);
1133 if ( strncmp(name, (char *)fss.name, namelen) != 0 ) {
1134 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001135 "Case mismatch for module name %.100s\n(filename %.300s)",
1136 name, fss.name);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001137 return 0;
1138 }
1139 return 1;
1140}
1141#endif /* macintosh */
1142
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001143#ifdef DJGPP
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001144#include <dir.h>
1145
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001146static int
1147check_case(char *buf, int len, int namelen, char *name)
1148{
1149 struct ffblk ffblk;
1150 int done;
1151
1152 if (getenv("PYTHONCASEOK") != NULL)
1153 return 1;
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001154 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001155 if (done) {
1156 PyErr_Format(PyExc_NameError,
1157 "Can't find file for module %.100s\n(filename %.300s)",
1158 name, buf);
1159 return 0;
1160 }
1161
1162 if (strncmp(ffblk.ff_name, name, namelen) != 0) {
1163 strcpy(buf+len-namelen, ffblk.ff_name);
1164 PyErr_Format(PyExc_NameError,
1165 "Case mismatch for module name %.100s\n(filename %.300s)",
1166 name, buf);
1167 return 0;
1168 }
1169 return 1;
1170}
1171#endif
1172
Guido van Rossum8766a771998-04-10 23:44:32 +00001173#endif /* CHECK_IMPORT_CASE */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001174
Guido van Rossum197346f1997-10-31 18:38:52 +00001175#ifdef HAVE_STAT
1176/* Helper to look for __init__.py or __init__.py[co] in potential package */
1177static int
1178find_init_module(buf)
1179 char *buf;
1180{
Fred Drake4c82b232000-06-30 16:18:57 +00001181 size_t save_len = strlen(buf);
1182 size_t i = save_len;
Guido van Rossum197346f1997-10-31 18:38:52 +00001183 struct stat statbuf;
1184
1185 if (save_len + 13 >= MAXPATHLEN)
1186 return 0;
1187 buf[i++] = SEP;
1188 strcpy(buf+i, "__init__.py");
1189 if (stat(buf, &statbuf) == 0) {
1190 buf[save_len] = '\0';
1191 return 1;
1192 }
1193 i += strlen(buf+i);
1194 if (Py_OptimizeFlag)
1195 strcpy(buf+i, "o");
1196 else
1197 strcpy(buf+i, "c");
1198 if (stat(buf, &statbuf) == 0) {
1199 buf[save_len] = '\0';
1200 return 1;
1201 }
1202 buf[save_len] = '\0';
1203 return 0;
1204}
1205#endif /* HAVE_STAT */
1206
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001207
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001208static int init_builtin Py_PROTO((char *)); /* Forward */
1209
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001210/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001211 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001212
Guido van Rossum79f25d91997-04-29 20:08:16 +00001213static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001214load_module(name, fp, buf, type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001215 char *name;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001216 FILE *fp;
1217 char *buf;
1218 int type;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001219{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001220 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001221 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001222 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001223
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001224 /* First check that there's an open file (if we need one) */
1225 switch (type) {
1226 case PY_SOURCE:
1227 case PY_COMPILED:
1228 if (fp == NULL) {
1229 PyErr_Format(PyExc_ValueError,
1230 "file object required for import (type code %d)",
1231 type);
1232 return NULL;
1233 }
1234 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001235
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001236 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001237
1238 case PY_SOURCE:
1239 m = load_source_module(name, buf, fp);
1240 break;
1241
1242 case PY_COMPILED:
1243 m = load_compiled_module(name, buf, fp);
1244 break;
1245
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001246#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001247 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001248 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001249 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001250#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001251
Jack Jansen9c96a921995-02-15 22:57:06 +00001252#ifdef macintosh
1253 case PY_RESOURCE:
1254 m = PyMac_LoadResourceModule(name, buf);
1255 break;
Guido van Rossum0f84a341998-08-06 13:36:01 +00001256 case PY_CODERESOURCE:
1257 m = PyMac_LoadCodeResourceModule(name, buf);
1258 break;
Jack Jansen9c96a921995-02-15 22:57:06 +00001259#endif
1260
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001261 case PKG_DIRECTORY:
1262 m = load_package(name, buf);
1263 break;
1264
1265 case C_BUILTIN:
1266 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001267 if (buf != NULL && buf[0] != '\0')
1268 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001269 if (type == C_BUILTIN)
1270 err = init_builtin(name);
1271 else
1272 err = PyImport_ImportFrozenModule(name);
1273 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001274 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001275 if (err == 0) {
1276 PyErr_Format(PyExc_ImportError,
1277 "Purported %s module %.200s not found",
1278 type == C_BUILTIN ?
1279 "builtin" : "frozen",
1280 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001281 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001282 }
1283 modules = PyImport_GetModuleDict();
1284 m = PyDict_GetItemString(modules, name);
1285 if (m == NULL) {
1286 PyErr_Format(
1287 PyExc_ImportError,
1288 "%s module %.200s not properly initialized",
1289 type == C_BUILTIN ?
1290 "builtin" : "frozen",
1291 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001292 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001293 }
1294 Py_INCREF(m);
1295 break;
1296
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001297 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001298 PyErr_Format(PyExc_ImportError,
1299 "Don't know how to import %.200s (type code %d)",
1300 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001301 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001302
1303 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001304
1305 return m;
1306}
1307
1308
1309/* Initialize a built-in module.
1310 Return 1 for succes, 0 if the module is not found, and -1 with
1311 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001312
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001313static int
1314init_builtin(name)
1315 char *name;
1316{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001317 struct _inittab *p;
1318 PyObject *mod;
1319
1320 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
1321 return 1;
1322
Guido van Rossum771c6c81997-10-31 18:37:24 +00001323 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001324 if (strcmp(name, p->name) == 0) {
1325 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001326 PyErr_Format(PyExc_ImportError,
1327 "Cannot re-init internal module %.200s",
1328 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001329 return -1;
1330 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001331 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001332 PySys_WriteStderr("import %s # builtin\n", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001333 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001334 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001335 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001336 if (_PyImport_FixupExtension(name, name) == NULL)
1337 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001338 return 1;
1339 }
1340 }
1341 return 0;
1342}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001343
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001344
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001345/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001346
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001347static struct _frozen *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001348find_frozen(name)
1349 char *name;
1350{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001351 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001352
Guido van Rossum79f25d91997-04-29 20:08:16 +00001353 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001354 if (p->name == NULL)
1355 return NULL;
1356 if (strcmp(p->name, name) == 0)
1357 break;
1358 }
1359 return p;
1360}
1361
Guido van Rossum79f25d91997-04-29 20:08:16 +00001362static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001363get_frozen_object(name)
1364 char *name;
1365{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001366 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001367 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001368
1369 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001370 PyErr_Format(PyExc_ImportError,
1371 "No such frozen object named %.200s",
1372 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001373 return NULL;
1374 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001375 size = p->size;
1376 if (size < 0)
1377 size = -size;
1378 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001379}
1380
1381/* Initialize a frozen module.
1382 Return 1 for succes, 0 if the module is not found, and -1 with
1383 an exception set if the initialization failed.
1384 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001385
1386int
Guido van Rossum79f25d91997-04-29 20:08:16 +00001387PyImport_ImportFrozenModule(name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001388 char *name;
1389{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001390 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001391 PyObject *co;
1392 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001393 int ispackage;
1394 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001395
1396 if (p == NULL)
1397 return 0;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001398 size = p->size;
1399 ispackage = (size < 0);
1400 if (ispackage)
1401 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001402 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001403 PySys_WriteStderr("import %s # frozen%s\n",
Guido van Rossuma5568d31998-03-05 03:45:08 +00001404 name, ispackage ? " package" : "");
1405 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001406 if (co == NULL)
1407 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001408 if (!PyCode_Check(co)) {
1409 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001410 PyErr_Format(PyExc_TypeError,
1411 "frozen object %.200s is not a code object",
1412 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001413 return -1;
1414 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001415 if (ispackage) {
1416 /* Set __path__ to the package name */
1417 PyObject *d, *s;
1418 int err;
1419 m = PyImport_AddModule(name);
1420 if (m == NULL)
1421 return -1;
1422 d = PyModule_GetDict(m);
1423 s = PyString_InternFromString(name);
1424 if (s == NULL)
1425 return -1;
1426 err = PyDict_SetItemString(d, "__path__", s);
1427 Py_DECREF(s);
1428 if (err != 0)
1429 return err;
1430 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001431 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001432 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001433 if (m == NULL)
1434 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001435 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001436 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001437}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001438
1439
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001440/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001441 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001442
Guido van Rossum79f25d91997-04-29 20:08:16 +00001443PyObject *
1444PyImport_ImportModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001445 char *name;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001446{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001447 static PyObject *fromlist = NULL;
1448 if (fromlist == NULL && strchr(name, '.') != NULL) {
1449 fromlist = Py_BuildValue("[s]", "*");
1450 if (fromlist == NULL)
1451 return NULL;
1452 }
1453 return PyImport_ImportModuleEx(name, NULL, NULL, fromlist);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001454}
1455
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001456/* Forward declarations for helper routines */
1457static PyObject *get_parent Py_PROTO((PyObject *globals,
1458 char *buf, int *p_buflen));
1459static PyObject *load_next Py_PROTO((PyObject *mod, PyObject *altmod,
1460 char **p_name, char *buf, int *p_buflen));
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001461static int mark_miss Py_PROTO((char *name));
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001462static int ensure_fromlist Py_PROTO((PyObject *mod, PyObject *fromlist,
Guido van Rossum9905ef91997-09-08 16:07:11 +00001463 char *buf, int buflen, int recursive));
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001464static PyObject * import_submodule Py_PROTO((PyObject *mod,
1465 char *name, char *fullname));
1466
1467/* The Magnum Opus of dotted-name import :-) */
1468
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001469static PyObject *
1470import_module_ex(name, globals, locals, fromlist)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001471 char *name;
1472 PyObject *globals;
1473 PyObject *locals;
1474 PyObject *fromlist;
1475{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001476 char buf[MAXPATHLEN+1];
1477 int buflen = 0;
1478 PyObject *parent, *head, *next, *tail;
1479
1480 parent = get_parent(globals, buf, &buflen);
1481 if (parent == NULL)
1482 return NULL;
1483
1484 head = load_next(parent, Py_None, &name, buf, &buflen);
1485 if (head == NULL)
1486 return NULL;
1487
1488 tail = head;
1489 Py_INCREF(tail);
1490 while (name) {
1491 next = load_next(tail, tail, &name, buf, &buflen);
1492 Py_DECREF(tail);
1493 if (next == NULL) {
1494 Py_DECREF(head);
1495 return NULL;
1496 }
1497 tail = next;
1498 }
1499
1500 if (fromlist != NULL) {
1501 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1502 fromlist = NULL;
1503 }
1504
1505 if (fromlist == NULL) {
1506 Py_DECREF(tail);
1507 return head;
1508 }
1509
1510 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001511 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001512 Py_DECREF(tail);
1513 return NULL;
1514 }
1515
1516 return tail;
1517}
1518
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001519PyObject *
1520PyImport_ImportModuleEx(name, globals, locals, fromlist)
1521 char *name;
1522 PyObject *globals;
1523 PyObject *locals;
1524 PyObject *fromlist;
1525{
1526 PyObject *result;
1527 lock_import();
Guido van Rossumd65911b1998-03-03 22:33:27 +00001528 result = import_module_ex(name, globals, locals, fromlist);
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001529 unlock_import();
1530 return result;
1531}
1532
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001533static PyObject *
1534get_parent(globals, buf, p_buflen)
1535 PyObject *globals;
1536 char *buf;
1537 int *p_buflen;
1538{
1539 static PyObject *namestr = NULL;
1540 static PyObject *pathstr = NULL;
1541 PyObject *modname, *modpath, *modules, *parent;
1542
1543 if (globals == NULL || !PyDict_Check(globals))
1544 return Py_None;
1545
1546 if (namestr == NULL) {
1547 namestr = PyString_InternFromString("__name__");
1548 if (namestr == NULL)
1549 return NULL;
1550 }
1551 if (pathstr == NULL) {
1552 pathstr = PyString_InternFromString("__path__");
1553 if (pathstr == NULL)
1554 return NULL;
1555 }
1556
1557 *buf = '\0';
1558 *p_buflen = 0;
1559 modname = PyDict_GetItem(globals, namestr);
1560 if (modname == NULL || !PyString_Check(modname))
1561 return Py_None;
1562
1563 modpath = PyDict_GetItem(globals, pathstr);
1564 if (modpath != NULL) {
1565 int len = PyString_GET_SIZE(modname);
1566 if (len > MAXPATHLEN) {
1567 PyErr_SetString(PyExc_ValueError,
1568 "Module name too long");
1569 return NULL;
1570 }
1571 strcpy(buf, PyString_AS_STRING(modname));
1572 *p_buflen = len;
1573 }
1574 else {
1575 char *start = PyString_AS_STRING(modname);
1576 char *lastdot = strrchr(start, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001577 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001578 if (lastdot == NULL)
1579 return Py_None;
1580 len = lastdot - start;
1581 if (len >= MAXPATHLEN) {
1582 PyErr_SetString(PyExc_ValueError,
1583 "Module name too long");
1584 return NULL;
1585 }
1586 strncpy(buf, start, len);
1587 buf[len] = '\0';
1588 *p_buflen = len;
1589 }
1590
1591 modules = PyImport_GetModuleDict();
1592 parent = PyDict_GetItemString(modules, buf);
1593 if (parent == NULL)
1594 parent = Py_None;
1595 return parent;
1596 /* We expect, but can't guarantee, if parent != None, that:
1597 - parent.__name__ == buf
1598 - parent.__dict__ is globals
1599 If this is violated... Who cares? */
1600}
1601
1602static PyObject *
1603load_next(mod, altmod, p_name, buf, p_buflen)
1604 PyObject *mod;
1605 PyObject *altmod; /* Either None or same as mod */
1606 char **p_name;
1607 char *buf;
1608 int *p_buflen;
1609{
1610 char *name = *p_name;
1611 char *dot = strchr(name, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001612 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001613 char *p;
1614 PyObject *result;
1615
1616 if (dot == NULL) {
1617 *p_name = NULL;
1618 len = strlen(name);
1619 }
1620 else {
1621 *p_name = dot+1;
1622 len = dot-name;
1623 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00001624 if (len == 0) {
1625 PyErr_SetString(PyExc_ValueError,
1626 "Empty module name");
1627 return NULL;
1628 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001629
1630 p = buf + *p_buflen;
1631 if (p != buf)
1632 *p++ = '.';
1633 if (p+len-buf >= MAXPATHLEN) {
1634 PyErr_SetString(PyExc_ValueError,
1635 "Module name too long");
1636 return NULL;
1637 }
1638 strncpy(p, name, len);
1639 p[len] = '\0';
1640 *p_buflen = p+len-buf;
1641
1642 result = import_submodule(mod, p, buf);
1643 if (result == Py_None && altmod != mod) {
1644 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001645 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001646 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001647 if (result != NULL && result != Py_None) {
1648 if (mark_miss(buf) != 0) {
1649 Py_DECREF(result);
1650 return NULL;
1651 }
1652 strncpy(buf, name, len);
1653 buf[len] = '\0';
1654 *p_buflen = len;
1655 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001656 }
1657 if (result == NULL)
1658 return NULL;
1659
1660 if (result == Py_None) {
1661 Py_DECREF(result);
1662 PyErr_Format(PyExc_ImportError,
1663 "No module named %.200s", name);
1664 return NULL;
1665 }
1666
1667 return result;
1668}
1669
1670static int
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001671mark_miss(name)
1672 char *name;
1673{
1674 PyObject *modules = PyImport_GetModuleDict();
1675 return PyDict_SetItemString(modules, name, Py_None);
1676}
1677
1678static int
Guido van Rossum9905ef91997-09-08 16:07:11 +00001679ensure_fromlist(mod, fromlist, buf, buflen, recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001680 PyObject *mod;
1681 PyObject *fromlist;
1682 char *buf;
1683 int buflen;
Guido van Rossum9905ef91997-09-08 16:07:11 +00001684 int recursive;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001685{
1686 int i;
1687
1688 if (!PyObject_HasAttrString(mod, "__path__"))
1689 return 1;
1690
1691 for (i = 0; ; i++) {
1692 PyObject *item = PySequence_GetItem(fromlist, i);
1693 int hasit;
1694 if (item == NULL) {
1695 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1696 PyErr_Clear();
1697 return 1;
1698 }
1699 return 0;
1700 }
1701 if (!PyString_Check(item)) {
1702 PyErr_SetString(PyExc_TypeError,
1703 "Item in ``from list'' not a string");
1704 Py_DECREF(item);
1705 return 0;
1706 }
1707 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001708 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001709 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001710 /* See if the package defines __all__ */
1711 if (recursive)
1712 continue; /* Avoid endless recursion */
1713 all = PyObject_GetAttrString(mod, "__all__");
1714 if (all == NULL)
1715 PyErr_Clear();
1716 else {
1717 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1718 return 0;
1719 Py_DECREF(all);
1720 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001721 continue;
1722 }
1723 hasit = PyObject_HasAttr(mod, item);
1724 if (!hasit) {
1725 char *subname = PyString_AS_STRING(item);
1726 PyObject *submod;
1727 char *p;
1728 if (buflen + strlen(subname) >= MAXPATHLEN) {
1729 PyErr_SetString(PyExc_ValueError,
1730 "Module name too long");
1731 Py_DECREF(item);
1732 return 0;
1733 }
1734 p = buf + buflen;
1735 *p++ = '.';
1736 strcpy(p, subname);
1737 submod = import_submodule(mod, subname, buf);
1738 Py_XDECREF(submod);
1739 if (submod == NULL) {
1740 Py_DECREF(item);
1741 return 0;
1742 }
1743 }
1744 Py_DECREF(item);
1745 }
1746
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001747 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001748}
1749
1750static PyObject *
1751import_submodule(mod, subname, fullname)
1752 PyObject *mod; /* May be None */
1753 char *subname;
1754 char *fullname;
1755{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001756 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001757 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001758
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001759 /* Require:
1760 if mod == None: subname == fullname
1761 else: mod.__name__ + "." + subname == fullname
1762 */
1763
1764 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001765 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001766 }
1767 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001768 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001769 char buf[MAXPATHLEN+1];
1770 struct filedescr *fdp;
1771 FILE *fp = NULL;
1772
Guido van Rossum9c0afe51998-05-19 15:09:05 +00001773 if (mod == Py_None)
1774 path = NULL;
1775 else {
1776 path = PyObject_GetAttrString(mod, "__path__");
1777 if (path == NULL) {
1778 PyErr_Clear();
1779 Py_INCREF(Py_None);
1780 return Py_None;
1781 }
1782 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001783
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001784 buf[0] = '\0';
Guido van Rossumb68cd421998-07-01 17:36:26 +00001785 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1786 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001787 if (fdp == NULL) {
1788 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1789 return NULL;
1790 PyErr_Clear();
1791 Py_INCREF(Py_None);
1792 return Py_None;
1793 }
1794 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001795 if (fp)
1796 fclose(fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001797 if (m != NULL && mod != Py_None) {
1798 if (PyObject_SetAttrString(mod, subname, m) < 0) {
1799 Py_DECREF(m);
1800 m = NULL;
1801 }
1802 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001803 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001804
1805 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001806}
1807
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001808
1809/* Re-import a module of any kind and return its module object, WITH
1810 INCREMENTED REFERENCE COUNT */
1811
Guido van Rossum79f25d91997-04-29 20:08:16 +00001812PyObject *
1813PyImport_ReloadModule(m)
1814 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001815{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001816 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001817 PyObject *path = NULL;
1818 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001819 char buf[MAXPATHLEN+1];
1820 struct filedescr *fdp;
1821 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001822
Guido van Rossum79f25d91997-04-29 20:08:16 +00001823 if (m == NULL || !PyModule_Check(m)) {
1824 PyErr_SetString(PyExc_TypeError,
1825 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001826 return NULL;
1827 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001828 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001829 if (name == NULL)
1830 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001831 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001832 PyErr_Format(PyExc_ImportError,
1833 "reload(): module %.200s not in sys.modules",
1834 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001835 return NULL;
1836 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001837 subname = strrchr(name, '.');
1838 if (subname == NULL)
1839 subname = name;
1840 else {
1841 PyObject *parentname, *parent;
1842 parentname = PyString_FromStringAndSize(name, (subname-name));
1843 if (parentname == NULL)
1844 return NULL;
1845 parent = PyDict_GetItem(modules, parentname);
Barry Warsaw38793331999-01-27 17:54:20 +00001846 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00001847 if (parent == NULL) {
1848 PyErr_Format(PyExc_ImportError,
1849 "reload(): parent %.200s not in sys.modules",
1850 name);
1851 return NULL;
1852 }
1853 subname++;
1854 path = PyObject_GetAttrString(parent, "__path__");
1855 if (path == NULL)
1856 PyErr_Clear();
1857 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001858 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001859 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1860 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001861 if (fdp == NULL)
1862 return NULL;
1863 m = load_module(name, fp, buf, fdp->type);
1864 if (fp)
1865 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001866 return m;
1867}
1868
1869
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001870/* Higher-level import emulator which emulates the "import" statement
1871 more accurately -- it invokes the __import__() function from the
1872 builtins of the current globals. This means that the import is
1873 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00001874 environment, e.g. by "rexec".
1875 A dummy list ["__doc__"] is passed as the 4th argument so that
1876 e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
1877 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001878
1879PyObject *
1880PyImport_Import(module_name)
1881 PyObject *module_name;
1882{
1883 static PyObject *silly_list = NULL;
1884 static PyObject *builtins_str = NULL;
1885 static PyObject *import_str = NULL;
1886 static PyObject *standard_builtins = NULL;
1887 PyObject *globals = NULL;
1888 PyObject *import = NULL;
1889 PyObject *builtins = NULL;
1890 PyObject *r = NULL;
1891
1892 /* Initialize constant string objects */
1893 if (silly_list == NULL) {
1894 import_str = PyString_InternFromString("__import__");
1895 if (import_str == NULL)
1896 return NULL;
1897 builtins_str = PyString_InternFromString("__builtins__");
1898 if (builtins_str == NULL)
1899 return NULL;
1900 silly_list = Py_BuildValue("[s]", "__doc__");
1901 if (silly_list == NULL)
1902 return NULL;
1903 }
1904
1905 /* Get the builtins from current globals */
1906 globals = PyEval_GetGlobals();
1907 if(globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00001908 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001909 builtins = PyObject_GetItem(globals, builtins_str);
1910 if (builtins == NULL)
1911 goto err;
1912 }
1913 else {
1914 /* No globals -- use standard builtins, and fake globals */
1915 PyErr_Clear();
1916
1917 if (standard_builtins == NULL) {
1918 standard_builtins =
1919 PyImport_ImportModule("__builtin__");
1920 if (standard_builtins == NULL)
1921 return NULL;
1922 }
1923
1924 builtins = standard_builtins;
1925 Py_INCREF(builtins);
1926 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1927 if (globals == NULL)
1928 goto err;
1929 }
1930
1931 /* Get the __import__ function from the builtins */
1932 if (PyDict_Check(builtins))
1933 import=PyObject_GetItem(builtins, import_str);
1934 else
1935 import=PyObject_GetAttr(builtins, import_str);
1936 if (import == NULL)
1937 goto err;
1938
1939 /* Call the _import__ function with the proper argument list */
1940 r = PyObject_CallFunction(import, "OOOO",
1941 module_name, globals, globals, silly_list);
1942
1943 err:
1944 Py_XDECREF(globals);
1945 Py_XDECREF(builtins);
1946 Py_XDECREF(import);
1947
1948 return r;
1949}
1950
1951
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001952/* Module 'imp' provides Python access to the primitives used for
1953 importing modules.
1954*/
1955
Guido van Rossum79f25d91997-04-29 20:08:16 +00001956static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001957imp_get_magic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001958 PyObject *self;
1959 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001960{
1961 char buf[4];
1962
Guido van Rossum43713e52000-02-29 13:59:29 +00001963 if (!PyArg_ParseTuple(args, ":get_magic"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001964 return NULL;
Guido van Rossum96774c12000-05-01 20:19:08 +00001965 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
1966 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
1967 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
1968 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001969
Guido van Rossum79f25d91997-04-29 20:08:16 +00001970 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001971}
1972
Guido van Rossum79f25d91997-04-29 20:08:16 +00001973static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001974imp_get_suffixes(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001975 PyObject *self;
1976 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001977{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001978 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001979 struct filedescr *fdp;
1980
Guido van Rossum43713e52000-02-29 13:59:29 +00001981 if (!PyArg_ParseTuple(args, ":get_suffixes"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001982 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001983 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001984 if (list == NULL)
1985 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001986 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
1987 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001988 fdp->suffix, fdp->mode, fdp->type);
1989 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001990 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001991 return NULL;
1992 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001993 if (PyList_Append(list, item) < 0) {
1994 Py_DECREF(list);
1995 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001996 return NULL;
1997 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001998 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001999 }
2000 return list;
2001}
2002
Guido van Rossum79f25d91997-04-29 20:08:16 +00002003static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002004call_find_module(name, path)
2005 char *name;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002006 PyObject *path; /* list or None or NULL */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002007{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002008 extern int fclose Py_PROTO((FILE *));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002009 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002010 struct filedescr *fdp;
2011 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002012 FILE *fp = NULL;
2013
2014 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002015 if (path == Py_None)
2016 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002017 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
2018 if (fdp == NULL)
2019 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002020 if (fp != NULL) {
2021 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
2022 if (fob == NULL) {
2023 fclose(fp);
2024 return NULL;
2025 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002026 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002027 else {
2028 fob = Py_None;
2029 Py_INCREF(fob);
2030 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002031 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002032 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002033 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002034 return ret;
2035}
2036
Guido van Rossum79f25d91997-04-29 20:08:16 +00002037static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002038imp_find_module(self, args)
2039 PyObject *self;
2040 PyObject *args;
2041{
2042 char *name;
2043 PyObject *path = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002044 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002045 return NULL;
2046 return call_find_module(name, path);
2047}
2048
2049static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002050imp_init_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002051 PyObject *self;
2052 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002053{
2054 char *name;
2055 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002056 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002057 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002058 return NULL;
2059 ret = init_builtin(name);
2060 if (ret < 0)
2061 return NULL;
2062 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002063 Py_INCREF(Py_None);
2064 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002065 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002066 m = PyImport_AddModule(name);
2067 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002068 return m;
2069}
2070
Guido van Rossum79f25d91997-04-29 20:08:16 +00002071static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002072imp_init_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002073 PyObject *self;
2074 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002075{
2076 char *name;
2077 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002078 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002079 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002080 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002081 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002082 if (ret < 0)
2083 return NULL;
2084 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002085 Py_INCREF(Py_None);
2086 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002087 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002088 m = PyImport_AddModule(name);
2089 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002090 return m;
2091}
2092
Guido van Rossum79f25d91997-04-29 20:08:16 +00002093static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002094imp_get_frozen_object(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002095 PyObject *self;
2096 PyObject *args;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002097{
2098 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002099
Guido van Rossum43713e52000-02-29 13:59:29 +00002100 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002101 return NULL;
2102 return get_frozen_object(name);
2103}
2104
Guido van Rossum79f25d91997-04-29 20:08:16 +00002105static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002106imp_is_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002107 PyObject *self;
2108 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002109{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002110 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002111 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002112 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002113 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002114}
2115
Guido van Rossum79f25d91997-04-29 20:08:16 +00002116static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002117imp_is_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002118 PyObject *self;
2119 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002120{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002121 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002122 struct _frozen *p;
Guido van Rossum43713e52000-02-29 13:59:29 +00002123 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002124 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002125 p = find_frozen(name);
2126 return PyInt_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002127}
2128
2129static FILE *
2130get_file(pathname, fob, mode)
2131 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002132 PyObject *fob;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002133 char *mode;
2134{
2135 FILE *fp;
2136 if (fob == NULL) {
2137 fp = fopen(pathname, mode);
2138 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002139 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002140 }
2141 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002142 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002143 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002144 PyErr_SetString(PyExc_ValueError,
2145 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002146 }
2147 return fp;
2148}
2149
Guido van Rossum79f25d91997-04-29 20:08:16 +00002150static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002151imp_load_compiled(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002152 PyObject *self;
2153 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002154{
2155 char *name;
2156 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002157 PyObject *fob = NULL;
2158 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002159 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002160 if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002161 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002162 return NULL;
2163 fp = get_file(pathname, fob, "rb");
2164 if (fp == NULL)
2165 return NULL;
2166 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002167 if (fob == NULL)
2168 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002169 return m;
2170}
2171
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002172#ifdef HAVE_DYNAMIC_LOADING
2173
Guido van Rossum79f25d91997-04-29 20:08:16 +00002174static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002175imp_load_dynamic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002176 PyObject *self;
2177 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002178{
2179 char *name;
2180 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002181 PyObject *fob = NULL;
2182 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002183 FILE *fp = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002184 if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002185 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002186 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002187 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002188 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002189 if (fp == NULL)
2190 return NULL;
2191 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002192 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002193 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002194}
2195
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002196#endif /* HAVE_DYNAMIC_LOADING */
2197
Guido van Rossum79f25d91997-04-29 20:08:16 +00002198static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002199imp_load_source(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002200 PyObject *self;
2201 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002202{
2203 char *name;
2204 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002205 PyObject *fob = NULL;
2206 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002207 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002208 if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002209 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002210 return NULL;
2211 fp = get_file(pathname, fob, "r");
2212 if (fp == NULL)
2213 return NULL;
2214 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002215 if (fob == NULL)
2216 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002217 return m;
2218}
2219
Jack Jansen9c96a921995-02-15 22:57:06 +00002220#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002221static PyObject *
Jack Jansen9c96a921995-02-15 22:57:06 +00002222imp_load_resource(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002223 PyObject *self;
2224 PyObject *args;
Jack Jansen9c96a921995-02-15 22:57:06 +00002225{
2226 char *name;
2227 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002228 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002229
Guido van Rossum43713e52000-02-29 13:59:29 +00002230 if (!PyArg_ParseTuple(args, "ss:load_resource", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002231 return NULL;
2232 m = PyMac_LoadResourceModule(name, pathname);
2233 return m;
2234}
2235#endif /* macintosh */
2236
Guido van Rossum79f25d91997-04-29 20:08:16 +00002237static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002238imp_load_module(self, args)
2239 PyObject *self;
2240 PyObject *args;
2241{
2242 char *name;
2243 PyObject *fob;
2244 char *pathname;
2245 char *suffix; /* Unused */
2246 char *mode;
2247 int type;
2248 FILE *fp;
2249
Guido van Rossum43713e52000-02-29 13:59:29 +00002250 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002251 &name, &fob, &pathname,
2252 &suffix, &mode, &type))
2253 return NULL;
2254 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
2255 PyErr_Format(PyExc_ValueError,
2256 "invalid file open mode %.200s", mode);
2257 return NULL;
2258 }
2259 if (fob == Py_None)
2260 fp = NULL;
2261 else {
2262 if (!PyFile_Check(fob)) {
2263 PyErr_SetString(PyExc_ValueError,
2264 "load_module arg#2 should be a file or None");
2265 return NULL;
2266 }
2267 fp = get_file(pathname, fob, mode);
2268 if (fp == NULL)
2269 return NULL;
2270 }
2271 return load_module(name, fp, pathname, type);
2272}
2273
2274static PyObject *
2275imp_load_package(self, args)
2276 PyObject *self;
2277 PyObject *args;
2278{
2279 char *name;
2280 char *pathname;
Guido van Rossum43713e52000-02-29 13:59:29 +00002281 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002282 return NULL;
2283 return load_package(name, pathname);
2284}
2285
2286static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002287imp_new_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002288 PyObject *self;
2289 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002290{
2291 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002292 if (!PyArg_ParseTuple(args, "s:new_module", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002293 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002294 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002295}
2296
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002297/* Doc strings */
2298
2299static char doc_imp[] = "\
2300This module provides the components needed to build your own\n\
2301__import__ function. Undocumented functions are obsolete.\n\
2302";
2303
2304static char doc_find_module[] = "\
2305find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
2306Search for a module. If path is omitted or None, search for a\n\
2307built-in, frozen or special module and continue search in sys.path.\n\
2308The module name cannot contain '.'; to search for a submodule of a\n\
2309package, pass the submodule name and the package's __path__.\
2310";
2311
2312static char doc_load_module[] = "\
2313load_module(name, file, filename, (suffix, mode, type)) -> module\n\
2314Load a module, given information returned by find_module().\n\
2315The module name must include the full package name, if any.\
2316";
2317
2318static char doc_get_magic[] = "\
2319get_magic() -> string\n\
2320Return the magic number for .pyc or .pyo files.\
2321";
2322
2323static char doc_get_suffixes[] = "\
2324get_suffixes() -> [(suffix, mode, type), ...]\n\
2325Return a list of (suffix, mode, type) tuples describing the files\n\
2326that find_module() looks for.\
2327";
2328
2329static char doc_new_module[] = "\
2330new_module(name) -> module\n\
2331Create a new module. Do not enter it in sys.modules.\n\
2332The module name must include the full package name, if any.\
2333";
2334
Guido van Rossum79f25d91997-04-29 20:08:16 +00002335static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002336 {"find_module", imp_find_module, 1, doc_find_module},
2337 {"get_magic", imp_get_magic, 1, doc_get_magic},
2338 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2339 {"load_module", imp_load_module, 1, doc_load_module},
2340 {"new_module", imp_new_module, 1, doc_new_module},
2341 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002342 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002343 {"init_builtin", imp_init_builtin, 1},
2344 {"init_frozen", imp_init_frozen, 1},
2345 {"is_builtin", imp_is_builtin, 1},
2346 {"is_frozen", imp_is_frozen, 1},
2347 {"load_compiled", imp_load_compiled, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002348#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002349 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002350#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002351 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002352#ifdef macintosh
2353 {"load_resource", imp_load_resource, 1},
2354#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002355 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002356 {NULL, NULL} /* sentinel */
2357};
2358
Guido van Rossum1a8791e1998-08-04 22:46:29 +00002359static int
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002360setint(d, name, value)
2361 PyObject *d;
2362 char *name;
2363 int value;
2364{
2365 PyObject *v;
2366 int err;
2367
2368 v = PyInt_FromLong((long)value);
2369 err = PyDict_SetItemString(d, name, v);
2370 Py_XDECREF(v);
2371 return err;
2372}
2373
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002374void
2375initimp()
2376{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002377 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002378
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002379 m = Py_InitModule4("imp", imp_methods, doc_imp,
2380 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002381 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002382
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002383 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2384 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2385 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2386 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2387 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2388 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2389 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2390 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00002391 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002392
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002393 failure:
2394 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002395}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002396
2397
Guido van Rossumb18618d2000-05-03 23:44:39 +00002398/* API for embedding applications that want to add their own entries
2399 to the table of built-in modules. This should normally be called
2400 *before* Py_Initialize(). When the table resize fails, -1 is
2401 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002402
2403 After a similar function by Just van Rossum. */
2404
2405int
2406PyImport_ExtendInittab(newtab)
2407 struct _inittab *newtab;
2408{
2409 static struct _inittab *our_copy = NULL;
2410 struct _inittab *p;
2411 int i, n;
2412
2413 /* Count the number of entries in both tables */
2414 for (n = 0; newtab[n].name != NULL; n++)
2415 ;
2416 if (n == 0)
2417 return 0; /* Nothing to do */
2418 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2419 ;
2420
2421 /* Allocate new memory for the combined table */
Guido van Rossumb18618d2000-05-03 23:44:39 +00002422 p = our_copy;
2423 PyMem_RESIZE(p, struct _inittab, i+n+1);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002424 if (p == NULL)
2425 return -1;
2426
2427 /* Copy the tables into the new memory */
2428 if (our_copy != PyImport_Inittab)
2429 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2430 PyImport_Inittab = our_copy = p;
2431 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
2432
2433 return 0;
2434}
2435
2436/* Shorthand to add a single entry given a name and a function */
2437
2438int
2439PyImport_AppendInittab(name, initfunc)
2440 char *name;
2441 void (*initfunc)();
2442{
2443 struct _inittab newtab[2];
2444
2445 memset(newtab, '\0', sizeof newtab);
2446
2447 newtab[0].name = name;
2448 newtab[0].initfunc = initfunc;
2449
2450 return PyImport_ExtendInittab(newtab);
2451}