blob: 9d65c70f47b16705c66cdc78cc2e9528ea3338e5 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Module definition and import implementation */
3
Guido van Rossum79f25d91997-04-29 20:08:16 +00004#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00005
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00006#include "node.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00007#include "token.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00008#include "errcode.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +00009#include "marshal.h"
10#include "compile.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000011#include "eval.h"
Guido van Rossumd8bac6d1992-02-26 15:19:13 +000012#include "osdefs.h"
Guido van Rossum1ae940a1995-01-02 19:04:15 +000013#include "importdl.h"
Jack Jansen9c96a921995-02-15 22:57:06 +000014#ifdef macintosh
15#include "macglue.h"
16#endif
Guido van Rossumc405b7b1991-06-04 19:39:42 +000017
Guido van Rossum80bb9651996-12-05 23:27:02 +000018#ifdef HAVE_UNISTD_H
19#include <unistd.h>
20#endif
21
Guido van Rossumaee0bad1997-09-05 07:33:22 +000022/* We expect that stat exists on most systems.
23 It's confirmed on Unix, Mac and Windows.
24 If you don't have it, add #define DONT_HAVE_STAT to your config.h. */
25#ifndef DONT_HAVE_STAT
26#define HAVE_STAT
27
Guido van Rossum2571cc81999-04-07 16:07:23 +000028#ifndef DONT_HAVE_SYS_TYPES_H
Guido van Rossumaee0bad1997-09-05 07:33:22 +000029#include <sys/types.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +000030#endif
31#ifndef DONT_HAVE_SYS_STAT_H
Guido van Rossumaee0bad1997-09-05 07:33:22 +000032#include <sys/stat.h>
Guido van Rossum63e97ad2000-07-01 01:06:56 +000033#elif defined(HAVE_STAT_H)
34#include <stat.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +000035#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +000036
Guido van Rossum595d7ba1997-12-05 21:45:29 +000037#if defined(PYCC_VACPP)
38/* VisualAge C/C++ Failed to Define MountType Field in sys/stat.h */
39#define S_IFMT (S_IFDIR|S_IFCHR|S_IFREG)
40#endif
41
Guido van Rossumaee0bad1997-09-05 07:33:22 +000042#ifndef S_ISDIR
43#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
44#endif
45
46#endif
47
48
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000049extern time_t PyOS_GetLastModificationTime(char *, FILE *);
50 /* In getmtime.c */
Guido van Rossum21d335e1993-10-15 13:01:11 +000051
Guido van Rossum6c849691994-09-26 15:47:17 +000052/* Magic word to reject .pyc files generated by other Python versions */
Guido van Rossum7faeab31995-07-07 22:50:36 +000053/* Change for each incompatible change */
54/* The value of CR and LF is incorporated so if you ever read or write
55 a .pyc file in text mode the magic number will be wrong; also, the
56 Apple MPW compiler swaps their values, botching string constants */
57/* XXX Perhaps the magic number should be frozen and a version field
58 added to the .pyc file header? */
Guido van Rossumdd5db431997-01-17 21:06:11 +000059/* New way to come up with the magic number: (YEAR-1995), MONTH, DAY */
Thomas Woutersdd13e4f2000-08-27 20:31:27 +000060#define MAGIC (50823 | ((long)'\r'<<16) | ((long)'\n'<<24))
Guido van Rossum3ddee711991-12-16 13:06:34 +000061
Guido van Rossum96774c12000-05-01 20:19:08 +000062/* Magic word as global; note that _PyImport_Init() can change the
Jeremy Hylton9262b8a2000-06-30 04:59:17 +000063 value of this global to accommodate for alterations of how the
Guido van Rossum96774c12000-05-01 20:19:08 +000064 compiler works which are enabled by command line switches. */
65static long pyc_magic = MAGIC;
66
Guido van Rossum25ce5661997-08-02 03:10:38 +000067/* See _PyImport_FixupExtension() below */
68static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000069
Guido van Rossum771c6c81997-10-31 18:37:24 +000070/* This table is defined in config.c: */
71extern struct _inittab _PyImport_Inittab[];
72
73struct _inittab *PyImport_Inittab = _PyImport_Inittab;
Guido van Rossum66f1fa81991-04-03 19:03:52 +000074
Guido van Rossumed1170e1999-12-20 21:23:41 +000075/* these tables define the module suffixes that Python recognizes */
76struct filedescr * _PyImport_Filetab = NULL;
77static const struct filedescr _PyImport_StandardFiletab[] = {
78 {".py", "r", PY_SOURCE},
79 {".pyc", "rb", PY_COMPILED},
80 {0, 0}
81};
82
Guido van Rossum1ae940a1995-01-02 19:04:15 +000083/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000084
85void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000086_PyImport_Init(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000087{
Guido van Rossumed1170e1999-12-20 21:23:41 +000088 const struct filedescr *scan;
89 struct filedescr *filetab;
90 int countD = 0;
91 int countS = 0;
92
93 /* prepare _PyImport_Filetab: copy entries from
94 _PyImport_DynLoadFiletab and _PyImport_StandardFiletab.
95 */
96 for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan)
97 ++countD;
98 for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan)
99 ++countS;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000100 filetab = PyMem_NEW(struct filedescr, countD + countS + 1);
Guido van Rossumed1170e1999-12-20 21:23:41 +0000101 memcpy(filetab, _PyImport_DynLoadFiletab,
102 countD * sizeof(struct filedescr));
103 memcpy(filetab + countD, _PyImport_StandardFiletab,
104 countS * sizeof(struct filedescr));
105 filetab[countD + countS].suffix = NULL;
106
107 _PyImport_Filetab = filetab;
108
Guido van Rossum0824f631997-03-11 18:37:35 +0000109 if (Py_OptimizeFlag) {
Guido van Rossumed1170e1999-12-20 21:23:41 +0000110 /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */
111 for (; filetab->suffix != NULL; filetab++) {
112 if (strcmp(filetab->suffix, ".pyc") == 0)
113 filetab->suffix = ".pyo";
Guido van Rossum0824f631997-03-11 18:37:35 +0000114 }
115 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000116
117 if (Py_UnicodeFlag) {
118 /* Fix the pyc_magic so that byte compiled code created
119 using the all-Unicode method doesn't interfere with
120 code created in normal operation mode. */
121 pyc_magic = MAGIC + 1;
122 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000123}
124
Guido van Rossum25ce5661997-08-02 03:10:38 +0000125void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000126_PyImport_Fini(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000127{
128 Py_XDECREF(extensions);
129 extensions = NULL;
130}
131
132
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000133/* Locking primitives to prevent parallel imports of the same module
134 in different threads to return with a partially loaded module.
135 These calls are serialized by the global interpreter lock. */
136
137#ifdef WITH_THREAD
138
Guido van Rossum49b56061998-10-01 20:42:43 +0000139#include "pythread.h"
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000140
Guido van Rossum65d5b571998-12-21 19:32:43 +0000141static PyThread_type_lock import_lock = 0;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000142static long import_lock_thread = -1;
143static int import_lock_level = 0;
144
145static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000146lock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000147{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000148 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000149 if (me == -1)
150 return; /* Too bad */
151 if (import_lock == NULL)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000152 import_lock = PyThread_allocate_lock();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000153 if (import_lock_thread == me) {
154 import_lock_level++;
155 return;
156 }
Guido van Rossum65d5b571998-12-21 19:32:43 +0000157 if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0)) {
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000158 PyThreadState *tstate = PyEval_SaveThread();
Guido van Rossum65d5b571998-12-21 19:32:43 +0000159 PyThread_acquire_lock(import_lock, 1);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000160 PyEval_RestoreThread(tstate);
161 }
162 import_lock_thread = me;
163 import_lock_level = 1;
164}
165
166static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000167unlock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000168{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000169 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000170 if (me == -1)
171 return; /* Too bad */
172 if (import_lock_thread != me)
173 Py_FatalError("unlock_import: not holding the import lock");
174 import_lock_level--;
175 if (import_lock_level == 0) {
176 import_lock_thread = -1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000177 PyThread_release_lock(import_lock);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000178 }
179}
180
181#else
182
183#define lock_import()
184#define unlock_import()
185
186#endif
187
Guido van Rossum25ce5661997-08-02 03:10:38 +0000188/* Helper for sys */
189
190PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000191PyImport_GetModuleDict(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000192{
193 PyInterpreterState *interp = PyThreadState_Get()->interp;
194 if (interp->modules == NULL)
195 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
196 return interp->modules;
197}
198
Guido van Rossum3f5da241990-12-20 15:06:42 +0000199
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000200/* List of names to clear in sys */
201static char* sys_deletes[] = {
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000202 "path", "argv", "ps1", "ps2", "exitfunc",
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000203 "exc_type", "exc_value", "exc_traceback",
204 "last_type", "last_value", "last_traceback",
205 NULL
206};
207
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000208static char* sys_files[] = {
209 "stdin", "__stdin__",
210 "stdout", "__stdout__",
211 "stderr", "__stderr__",
212 NULL
213};
214
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000215
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000216/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000217
Guido van Rossum3f5da241990-12-20 15:06:42 +0000218void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000219PyImport_Cleanup(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000220{
Guido van Rossum758eec01998-01-19 21:58:26 +0000221 int pos, ndone;
222 char *name;
223 PyObject *key, *value, *dict;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000224 PyInterpreterState *interp = PyThreadState_Get()->interp;
Guido van Rossum758eec01998-01-19 21:58:26 +0000225 PyObject *modules = interp->modules;
226
227 if (modules == NULL)
228 return; /* Already done */
229
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000230 /* Delete some special variables first. These are common
231 places where user values hide and people complain when their
232 destructors fail. Since the modules containing them are
233 deleted *last* of all, they would come too late in the normal
234 destruction order. Sigh. */
235
236 value = PyDict_GetItemString(modules, "__builtin__");
237 if (value != NULL && PyModule_Check(value)) {
238 dict = PyModule_GetDict(value);
239 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000240 PySys_WriteStderr("# clear __builtin__._\n");
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000241 PyDict_SetItemString(dict, "_", Py_None);
242 }
243 value = PyDict_GetItemString(modules, "sys");
244 if (value != NULL && PyModule_Check(value)) {
245 char **p;
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000246 PyObject *v;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000247 dict = PyModule_GetDict(value);
248 for (p = sys_deletes; *p != NULL; p++) {
249 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000250 PySys_WriteStderr("# clear sys.%s\n", *p);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000251 PyDict_SetItemString(dict, *p, Py_None);
252 }
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000253 for (p = sys_files; *p != NULL; p+=2) {
254 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000255 PySys_WriteStderr("# restore sys.%s\n", *p);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000256 v = PyDict_GetItemString(dict, *(p+1));
257 if (v == NULL)
258 v = Py_None;
259 PyDict_SetItemString(dict, *p, v);
260 }
261 }
262
263 /* First, delete __main__ */
264 value = PyDict_GetItemString(modules, "__main__");
265 if (value != NULL && PyModule_Check(value)) {
266 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000267 PySys_WriteStderr("# cleanup __main__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000268 _PyModule_Clear(value);
269 PyDict_SetItemString(modules, "__main__", Py_None);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000270 }
271
Guido van Rossum758eec01998-01-19 21:58:26 +0000272 /* The special treatment of __builtin__ here is because even
273 when it's not referenced as a module, its dictionary is
274 referenced by almost every module's __builtins__. Since
275 deleting a module clears its dictionary (even if there are
276 references left to it), we need to delete the __builtin__
277 module last. Likewise, we don't delete sys until the very
278 end because it is implicitly referenced (e.g. by print).
279
280 Also note that we 'delete' modules by replacing their entry
281 in the modules dict with None, rather than really deleting
282 them; this avoids a rehash of the modules dictionary and
283 also marks them as "non existent" so they won't be
284 re-imported. */
285
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000286 /* Next, repeatedly delete modules with a reference count of
Guido van Rossum758eec01998-01-19 21:58:26 +0000287 one (skipping __builtin__ and sys) and delete them */
288 do {
289 ndone = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000290 pos = 0;
Guido van Rossum758eec01998-01-19 21:58:26 +0000291 while (PyDict_Next(modules, &pos, &key, &value)) {
292 if (value->ob_refcnt != 1)
293 continue;
Guido van Rossum566373e1998-10-01 15:24:50 +0000294 if (PyString_Check(key) && PyModule_Check(value)) {
295 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000296 if (strcmp(name, "__builtin__") == 0)
297 continue;
298 if (strcmp(name, "sys") == 0)
299 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000300 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000301 PySys_WriteStderr(
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000302 "# cleanup[1] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000303 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000304 PyDict_SetItem(modules, key, Py_None);
305 ndone++;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000306 }
307 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000308 } while (ndone > 0);
309
Guido van Rossum758eec01998-01-19 21:58:26 +0000310 /* Next, delete all modules (still skipping __builtin__ and sys) */
311 pos = 0;
312 while (PyDict_Next(modules, &pos, &key, &value)) {
Guido van Rossum566373e1998-10-01 15:24:50 +0000313 if (PyString_Check(key) && PyModule_Check(value)) {
314 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000315 if (strcmp(name, "__builtin__") == 0)
316 continue;
317 if (strcmp(name, "sys") == 0)
318 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000319 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000320 PySys_WriteStderr("# cleanup[2] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000321 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000322 PyDict_SetItem(modules, key, Py_None);
323 }
324 }
325
326 /* Next, delete sys and __builtin__ (in that order) */
327 value = PyDict_GetItemString(modules, "sys");
328 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000329 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000330 PySys_WriteStderr("# cleanup sys\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000331 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000332 PyDict_SetItemString(modules, "sys", Py_None);
333 }
334 value = PyDict_GetItemString(modules, "__builtin__");
335 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000336 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000337 PySys_WriteStderr("# cleanup __builtin__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000338 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000339 PyDict_SetItemString(modules, "__builtin__", Py_None);
340 }
341
342 /* Finally, clear and delete the modules directory */
343 PyDict_Clear(modules);
344 interp->modules = NULL;
345 Py_DECREF(modules);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000346}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000347
348
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000349/* Helper for pythonrun.c -- return magic number */
350
351long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000352PyImport_GetMagicNumber(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000353{
Guido van Rossum96774c12000-05-01 20:19:08 +0000354 return pyc_magic;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000355}
356
357
Guido van Rossum25ce5661997-08-02 03:10:38 +0000358/* Magic for extension modules (built-in as well as dynamically
359 loaded). To prevent initializing an extension module more than
360 once, we keep a static dictionary 'extensions' keyed by module name
361 (for built-in modules) or by filename (for dynamically loaded
362 modules), containing these modules. A copy od the module's
363 dictionary is stored by calling _PyImport_FixupExtension()
364 immediately after the module initialization function succeeds. A
365 copy can be retrieved from there by calling
366 _PyImport_FindExtension(). */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000367
Guido van Rossum79f25d91997-04-29 20:08:16 +0000368PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000369_PyImport_FixupExtension(char *name, char *filename)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000370{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000371 PyObject *modules, *mod, *dict, *copy;
372 if (extensions == NULL) {
373 extensions = PyDict_New();
374 if (extensions == NULL)
375 return NULL;
376 }
377 modules = PyImport_GetModuleDict();
378 mod = PyDict_GetItemString(modules, name);
379 if (mod == NULL || !PyModule_Check(mod)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000380 PyErr_Format(PyExc_SystemError,
381 "_PyImport_FixupExtension: module %.200s not loaded", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000382 return NULL;
383 }
384 dict = PyModule_GetDict(mod);
385 if (dict == NULL)
386 return NULL;
387 copy = PyObject_CallMethod(dict, "copy", "");
388 if (copy == NULL)
389 return NULL;
390 PyDict_SetItemString(extensions, filename, copy);
391 Py_DECREF(copy);
392 return copy;
393}
394
395PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000396_PyImport_FindExtension(char *name, char *filename)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000397{
398 PyObject *dict, *mod, *mdict, *result;
399 if (extensions == NULL)
400 return NULL;
401 dict = PyDict_GetItemString(extensions, filename);
402 if (dict == NULL)
403 return NULL;
404 mod = PyImport_AddModule(name);
405 if (mod == NULL)
406 return NULL;
407 mdict = PyModule_GetDict(mod);
408 if (mdict == NULL)
409 return NULL;
410 result = PyObject_CallMethod(mdict, "update", "O", dict);
411 if (result == NULL)
412 return NULL;
413 Py_DECREF(result);
414 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000415 PySys_WriteStderr("import %s # previously loaded (%s)\n",
Guido van Rossum25ce5661997-08-02 03:10:38 +0000416 name, filename);
417 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000418}
419
420
421/* Get the module object corresponding to a module name.
422 First check the modules dictionary if there's one there,
423 if not, create a new one and insert in in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000424 Because the former action is most common, THIS DOES NOT RETURN A
425 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000426
Guido van Rossum79f25d91997-04-29 20:08:16 +0000427PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000428PyImport_AddModule(char *name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000429{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000430 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000431 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000432
Guido van Rossum25ce5661997-08-02 03:10:38 +0000433 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
Guido van Rossum79f25d91997-04-29 20:08:16 +0000434 PyModule_Check(m))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000435 return m;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000436 m = PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000437 if (m == NULL)
438 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000439 if (PyDict_SetItemString(modules, name, m) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000440 Py_DECREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000441 return NULL;
442 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000443 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000444
445 return m;
446}
447
448
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000449/* Execute a code object in a module and return the module object
450 WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000451
Guido van Rossum79f25d91997-04-29 20:08:16 +0000452PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000453PyImport_ExecCodeModule(char *name, PyObject *co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000454{
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000455 return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
456}
457
458PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000459PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname)
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000460{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000461 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000462 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000463
Guido van Rossum79f25d91997-04-29 20:08:16 +0000464 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000465 if (m == NULL)
466 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000467 d = PyModule_GetDict(m);
468 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
469 if (PyDict_SetItemString(d, "__builtins__",
470 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000471 return NULL;
472 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000473 /* Remember the filename as the __file__ attribute */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000474 v = NULL;
475 if (pathname != NULL) {
476 v = PyString_FromString(pathname);
477 if (v == NULL)
478 PyErr_Clear();
479 }
480 if (v == NULL) {
481 v = ((PyCodeObject *)co)->co_filename;
482 Py_INCREF(v);
483 }
484 if (PyDict_SetItemString(d, "__file__", v) != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000485 PyErr_Clear(); /* Not important enough to report */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000486 Py_DECREF(v);
487
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000488 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000489 if (v == NULL)
490 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000491 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000492
Guido van Rossum25ce5661997-08-02 03:10:38 +0000493 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000494 PyErr_Format(PyExc_ImportError,
495 "Loaded module %.200s not found in sys.modules",
496 name);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000497 return NULL;
498 }
499
Guido van Rossum79f25d91997-04-29 20:08:16 +0000500 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000501
502 return m;
503}
504
505
506/* Given a pathname for a Python source file, fill a buffer with the
507 pathname for the corresponding compiled file. Return the pathname
508 for the compiled file, or NULL if there's no space in the buffer.
509 Doesn't set an exception. */
510
511static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000512make_compiled_pathname(char *pathname, char *buf, size_t buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000513{
Fred Drake4c82b232000-06-30 16:18:57 +0000514 size_t len;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000515
516 len = strlen(pathname);
517 if (len+2 > buflen)
518 return NULL;
519 strcpy(buf, pathname);
Guido van Rossum0824f631997-03-11 18:37:35 +0000520 strcpy(buf+len, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000521
522 return buf;
523}
524
525
526/* Given a pathname for a Python source file, its time of last
527 modification, and a pathname for a compiled file, check whether the
528 compiled file represents the same version of the source. If so,
529 return a FILE pointer for the compiled file, positioned just after
530 the header; if not, return NULL.
531 Doesn't set an exception. */
532
533static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000534check_compiled_module(char *pathname, long mtime, char *cpathname)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000535{
536 FILE *fp;
537 long magic;
538 long pyc_mtime;
539
540 fp = fopen(cpathname, "rb");
541 if (fp == NULL)
542 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000543 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000544 if (magic != pyc_magic) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000545 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000546 PySys_WriteStderr("# %s has bad magic\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000547 fclose(fp);
548 return NULL;
549 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000550 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000551 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000552 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000553 PySys_WriteStderr("# %s has bad mtime\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000554 fclose(fp);
555 return NULL;
556 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000557 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000558 PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000559 return fp;
560}
561
562
563/* Read a code object from a file and check it for validity */
564
Guido van Rossum79f25d91997-04-29 20:08:16 +0000565static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000566read_compiled_module(char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000567{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000568 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000569
Guido van Rossum79f25d91997-04-29 20:08:16 +0000570 co = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000571 /* Ugly: rd_object() may return NULL with or without error */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000572 if (co == NULL || !PyCode_Check(co)) {
573 if (!PyErr_Occurred())
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000574 PyErr_Format(PyExc_ImportError,
575 "Non-code object in %.200s", cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000576 Py_XDECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000577 return NULL;
578 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000579 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000580}
581
582
583/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000584 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000585
Guido van Rossum79f25d91997-04-29 20:08:16 +0000586static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000587load_compiled_module(char *name, char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000588{
589 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000590 PyCodeObject *co;
591 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000592
Guido van Rossum79f25d91997-04-29 20:08:16 +0000593 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000594 if (magic != pyc_magic) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000595 PyErr_Format(PyExc_ImportError,
596 "Bad magic number in %.200s", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000597 return NULL;
598 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000599 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000600 co = read_compiled_module(cpathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000601 if (co == NULL)
602 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000603 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000604 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000605 name, cpathname);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000606 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000607 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000608
609 return m;
610}
611
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000612/* Parse a source file and return the corresponding code object */
613
Guido van Rossum79f25d91997-04-29 20:08:16 +0000614static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000615parse_source_module(char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000616{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000617 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000618 node *n;
619
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000620 n = PyParser_SimpleParseFile(fp, pathname, Py_file_input);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000621 if (n == NULL)
622 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000623 co = PyNode_Compile(n, pathname);
624 PyNode_Free(n);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000625
626 return co;
627}
628
629
630/* Write a compiled module to a file, placing the time of last
631 modification of its source into the header.
632 Errors are ignored, if a write error occurs an attempt is made to
633 remove the file. */
634
635static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000636write_compiled_module(PyCodeObject *co, char *cpathname, long mtime)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000637{
638 FILE *fp;
639
640 fp = fopen(cpathname, "wb");
641 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000642 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000643 PySys_WriteStderr(
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000644 "# can't create %s\n", cpathname);
645 return;
646 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000647 PyMarshal_WriteLongToFile(pyc_magic, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000648 /* First write a 0 for mtime */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000649 PyMarshal_WriteLongToFile(0L, fp);
650 PyMarshal_WriteObjectToFile((PyObject *)co, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000651 if (ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000652 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000653 PySys_WriteStderr("# can't write %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000654 /* Don't keep partial file */
655 fclose(fp);
656 (void) unlink(cpathname);
657 return;
658 }
659 /* Now write the true mtime */
660 fseek(fp, 4L, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000661 PyMarshal_WriteLongToFile(mtime, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000662 fflush(fp);
663 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000664 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000665 PySys_WriteStderr("# wrote %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000666#ifdef macintosh
Jack Jansencbf630f2000-07-11 21:59:16 +0000667 PyMac_setfiletype(cpathname, 'Pyth', 'PYC ');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000668#endif
669}
670
671
672/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000673 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
674 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000675
Guido van Rossum79f25d91997-04-29 20:08:16 +0000676static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000677load_source_module(char *name, char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000678{
Fred Drake4c82b232000-06-30 16:18:57 +0000679 time_t mtime;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000680 FILE *fpc;
681 char buf[MAXPATHLEN+1];
682 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000683 PyCodeObject *co;
684 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000685
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000686 mtime = PyOS_GetLastModificationTime(pathname, fp);
Fred Drake4c82b232000-06-30 16:18:57 +0000687 if (mtime == -1)
688 return NULL;
689#if SIZEOF_TIME_T > 4
690 /* Python's .pyc timestamp handling presumes that the timestamp fits
691 in 4 bytes. This will be fine until sometime in the year 2038,
692 when a 4-byte signed time_t will overflow.
693 */
694 if (mtime >> 32) {
695 PyErr_SetString(PyExc_OverflowError,
696 "modification time overflows a 4 bytes");
697 return NULL;
698 }
699#endif
700 cpathname = make_compiled_pathname(pathname, buf, (size_t)MAXPATHLEN+1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000701 if (cpathname != NULL &&
702 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000703 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000704 fclose(fpc);
705 if (co == NULL)
706 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000707 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000708 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000709 name, cpathname);
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000710 pathname = cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000711 }
712 else {
713 co = parse_source_module(pathname, fp);
714 if (co == NULL)
715 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000716 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000717 PySys_WriteStderr("import %s # from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000718 name, pathname);
719 write_compiled_module(co, cpathname, mtime);
720 }
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000721 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000722 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000723
724 return m;
725}
726
727
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000728/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +0000729static PyObject *load_module(char *, FILE *, char *, int);
730static struct filedescr *find_module(char *, PyObject *,
731 char *, size_t, FILE **);
732static struct _frozen *find_frozen(char *name);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000733
734/* Load a package and return its module object WITH INCREMENTED
735 REFERENCE COUNT */
736
737static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000738load_package(char *name, char *pathname)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000739{
740 PyObject *m, *d, *file, *path;
741 int err;
742 char buf[MAXPATHLEN+1];
743 FILE *fp = NULL;
744 struct filedescr *fdp;
745
746 m = PyImport_AddModule(name);
747 if (m == NULL)
748 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000749 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000750 PySys_WriteStderr("import %s # directory %s\n",
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000751 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000752 d = PyModule_GetDict(m);
753 file = PyString_FromString(pathname);
754 if (file == NULL)
755 return NULL;
756 path = Py_BuildValue("[O]", file);
757 if (path == NULL) {
758 Py_DECREF(file);
759 return NULL;
760 }
761 err = PyDict_SetItemString(d, "__file__", file);
762 if (err == 0)
763 err = PyDict_SetItemString(d, "__path__", path);
764 if (err != 0) {
765 m = NULL;
766 goto cleanup;
767 }
768 buf[0] = '\0';
769 fdp = find_module("__init__", path, buf, sizeof(buf), &fp);
770 if (fdp == NULL) {
771 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
772 PyErr_Clear();
773 }
774 else
775 m = NULL;
776 goto cleanup;
777 }
778 m = load_module(name, fp, buf, fdp->type);
779 if (fp != NULL)
780 fclose(fp);
781 cleanup:
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000782 Py_XDECREF(path);
783 Py_XDECREF(file);
784 return m;
785}
786
787
788/* Helper to test for built-in module */
789
790static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000791is_builtin(char *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000792{
793 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +0000794 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
795 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
796 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000797 return -1;
798 else
799 return 1;
800 }
801 }
802 return 0;
803}
804
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000805
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000806/* Search the path (default sys.path) for a module. Return the
807 corresponding filedescr struct, and (via return arguments) the
808 pathname and an open file. Return NULL if the module is not found. */
809
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000810#ifdef MS_COREDLL
Thomas Woutersb4bd21c2000-07-22 23:38:01 +0000811extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **,
812 char *, int);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000813#endif
814
Guido van Rossum0980bd91998-02-13 17:18:36 +0000815#ifdef CHECK_IMPORT_CASE
816static int check_case(char *, int, int, char *);
817#endif
818
Tim Petersdbd9ba62000-07-09 03:09:57 +0000819static int find_init_module(char *); /* Forward */
Guido van Rossum197346f1997-10-31 18:38:52 +0000820
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000821static struct filedescr *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000822find_module(char *realname, PyObject *path, char *buf, size_t buflen,
823 FILE **p_fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000824{
Fred Drake4c82b232000-06-30 16:18:57 +0000825 int i, npath;
826 size_t len, namelen;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000827 struct _frozen *f;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000828 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000829 FILE *fp = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000830 struct stat statbuf;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000831 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
832 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
833 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossum0506a431998-08-11 15:07:39 +0000834 char name[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000835
Fred Drake4c82b232000-06-30 16:18:57 +0000836 if (strlen(realname) > MAXPATHLEN) {
837 PyErr_SetString(PyExc_OverflowError, "module name is too long");
838 return NULL;
839 }
Guido van Rossum0506a431998-08-11 15:07:39 +0000840 strcpy(name, realname);
841
842 if (path != NULL && PyString_Check(path)) {
843 /* Submodule of "frozen" package:
844 Set name to the fullname, path to NULL
845 and continue as "usual" */
846 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
847 PyErr_SetString(PyExc_ImportError,
848 "full frozen module name too long");
849 return NULL;
850 }
851 strcpy(buf, PyString_AsString(path));
852 strcat(buf, ".");
853 strcat(buf, name);
854 strcpy(name, buf);
855 path = NULL;
856 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000857 if (path == NULL) {
858 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000859 strcpy(buf, name);
860 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000861 }
Guido van Rossuma5568d31998-03-05 03:45:08 +0000862 if ((f = find_frozen(name)) != NULL) {
863 strcpy(buf, name);
864 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000865 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000866
Guido van Rossumac279101996-08-22 23:10:58 +0000867#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000868 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
869 if (fp != NULL) {
870 *p_fp = fp;
871 return fdp;
872 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000873#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000874 path = PySys_GetObject("path");
875 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000876 if (path == NULL || !PyList_Check(path)) {
877 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +0000878 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000879 return NULL;
880 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000881 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000882 namelen = strlen(name);
883 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000884 PyObject *v = PyList_GetItem(path, i);
885 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000886 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000887 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000888 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000889 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000890 strcpy(buf, PyString_AsString(v));
Fred Drake4c82b232000-06-30 16:18:57 +0000891 if (strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000892 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000893#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000894#ifdef INTERN_STRINGS
895 /*
896 ** Speedup: each sys.path item is interned, and
897 ** FindResourceModule remembers which items refer to
898 ** folders (so we don't have to bother trying to look
899 ** into them for resources).
900 */
901 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
902 v = PyList_GET_ITEM(path, i);
903#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000904 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000905 static struct filedescr resfiledescr =
906 {"", "", PY_RESOURCE};
Jack Jansen9c96a921995-02-15 22:57:06 +0000907
908 return &resfiledescr;
909 }
Guido van Rossum0f84a341998-08-06 13:36:01 +0000910 if (PyMac_FindCodeResourceModule((PyStringObject *)v, name, buf)) {
911 static struct filedescr resfiledescr =
912 {"", "", PY_CODERESOURCE};
913
914 return &resfiledescr;
915 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000916#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000917 if (len > 0 && buf[len-1] != SEP
918#ifdef ALTSEP
919 && buf[len-1] != ALTSEP
920#endif
921 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000922 buf[len++] = SEP;
Guido van Rossum40f470f1996-05-23 22:51:04 +0000923#ifdef IMPORT_8x3_NAMES
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000924 /* see if we are searching in directory dos-8x3 */
925 if (len > 7 && !strncmp(buf + len - 8, "dos-8x3", 7)){
Guido van Rossum40f470f1996-05-23 22:51:04 +0000926 int j;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000927 char ch; /* limit name to 8 lower-case characters */
Guido van Rossum40f470f1996-05-23 22:51:04 +0000928 for (j = 0; (ch = name[j]) && j < 8; j++)
929 if (isupper(ch))
930 buf[len++] = tolower(ch);
931 else
932 buf[len++] = ch;
933 }
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000934 else /* Not in dos-8x3, use the full name */
Guido van Rossum6f489d91996-06-28 20:15:15 +0000935#endif
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000936 {
Guido van Rossum40f470f1996-05-23 22:51:04 +0000937 strcpy(buf+len, name);
938 len += namelen;
939 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000940#ifdef HAVE_STAT
941 if (stat(buf, &statbuf) == 0) {
Guido van Rossum197346f1997-10-31 18:38:52 +0000942 if (S_ISDIR(statbuf.st_mode)) {
Guido van Rossum0980bd91998-02-13 17:18:36 +0000943 if (find_init_module(buf)) {
944#ifdef CHECK_IMPORT_CASE
945 if (!check_case(buf, len, namelen,
946 name))
947 return NULL;
948#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000949 return &fd_package;
Guido van Rossum0980bd91998-02-13 17:18:36 +0000950 }
Guido van Rossum197346f1997-10-31 18:38:52 +0000951 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000952 }
953#else
954 /* XXX How are you going to test for directories? */
955#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000956#ifdef macintosh
957 fdp = PyMac_FindModuleExtension(buf, &len, name);
958 if (fdp)
959 fp = fopen(buf, fdp->mode);
960#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000961 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000962 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000963 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000964 PySys_WriteStderr("# trying %s\n", buf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000965 fp = fopen(buf, fdp->mode);
966 if (fp != NULL)
967 break;
968 }
Guido van Rossum741689d1997-08-12 14:53:39 +0000969#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000970 if (fp != NULL)
971 break;
972 }
973 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000974 PyErr_Format(PyExc_ImportError,
975 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000976 return NULL;
977 }
Guido van Rossum0980bd91998-02-13 17:18:36 +0000978#ifdef CHECK_IMPORT_CASE
979 if (!check_case(buf, len, namelen, name)) {
980 fclose(fp);
981 return NULL;
982 }
983#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000984
985 *p_fp = fp;
986 return fdp;
987}
988
Guido van Rossum0980bd91998-02-13 17:18:36 +0000989#ifdef CHECK_IMPORT_CASE
990
991#ifdef MS_WIN32
992#include <windows.h>
Guido van Rossum323bf5e1998-06-24 03:54:06 +0000993#include <ctype.h>
994
995static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000996allcaps8x3(char *s)
Guido van Rossum323bf5e1998-06-24 03:54:06 +0000997{
998 /* Return 1 if s is an 8.3 filename in ALLCAPS */
999 char c;
1000 char *dot = strchr(s, '.');
1001 char *end = strchr(s, '\0');
1002 if (dot != NULL) {
1003 if (dot-s > 8)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001004 return 0; /* More than 8 before '.' */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001005 if (end-dot > 4)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001006 return 0; /* More than 3 after '.' */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001007 end = strchr(dot+1, '.');
1008 if (end != NULL)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001009 return 0; /* More than one dot */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001010 }
1011 else if (end-s > 8)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001012 return 0; /* More than 8 and no dot */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001013 while ((c = *s++)) {
1014 if (islower(c))
1015 return 0;
1016 }
1017 return 1;
1018}
1019
Guido van Rossum0980bd91998-02-13 17:18:36 +00001020static int
1021check_case(char *buf, int len, int namelen, char *name)
1022{
1023 WIN32_FIND_DATA data;
1024 HANDLE h;
1025 if (getenv("PYTHONCASEOK") != NULL)
1026 return 1;
1027 h = FindFirstFile(buf, &data);
1028 if (h == INVALID_HANDLE_VALUE) {
1029 PyErr_Format(PyExc_NameError,
1030 "Can't find file for module %.100s\n(filename %.300s)",
1031 name, buf);
1032 return 0;
1033 }
1034 FindClose(h);
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001035 if (allcaps8x3(data.cFileName)) {
1036 /* Skip the test if the filename is ALL.CAPS. This can
1037 happen in certain circumstances beyond our control,
1038 e.g. when software is installed under NT on a FAT
1039 filesystem and then the same FAT filesystem is used
1040 under Windows 95. */
1041 return 1;
1042 }
Guido van Rossum0980bd91998-02-13 17:18:36 +00001043 if (strncmp(data.cFileName, name, namelen) != 0) {
1044 strcpy(buf+len-namelen, data.cFileName);
1045 PyErr_Format(PyExc_NameError,
1046 "Case mismatch for module name %.100s\n(filename %.300s)",
1047 name, buf);
1048 return 0;
1049 }
1050 return 1;
1051}
1052#endif /* MS_WIN32 */
1053
1054#ifdef macintosh
1055#include <TextUtils.h>
Guido van Rossumb33aa1a2000-04-24 15:08:18 +00001056#ifdef USE_GUSI1
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001057#include "TFileSpec.h" /* for Path2FSSpec() */
1058#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001059static int
1060check_case(char *buf, int len, int namelen, char *name)
1061{
1062 FSSpec fss;
1063 OSErr err;
Guido van Rossumb33aa1a2000-04-24 15:08:18 +00001064#ifndef USE_GUSI1
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001065 err = FSMakeFSSpec(0, 0, Pstring(buf), &fss);
1066#else
1067 /* GUSI's Path2FSSpec() resolves all possible aliases nicely on
1068 the way, which is fine for all directories, but here we need
1069 the original name of the alias file (say, Dlg.ppc.slb, not
1070 toolboxmodules.ppc.slb). */
1071 char *colon;
1072 err = Path2FSSpec(buf, &fss);
1073 if (err == noErr) {
1074 colon = strrchr(buf, ':'); /* find filename */
1075 if (colon != NULL)
1076 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1077 Pstring(colon+1), &fss);
1078 else
1079 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1080 fss.name, &fss);
1081 }
1082#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001083 if (err) {
1084 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001085 "Can't find file for module %.100s\n(filename %.300s)",
1086 name, buf);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001087 return 0;
1088 }
Guido van Rossum63e97ad2000-07-01 01:06:56 +00001089 if ( namelen > fss.name[0] || strncmp(name, (char *)fss.name+1, namelen) != 0 ) {
Guido van Rossum0980bd91998-02-13 17:18:36 +00001090 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001091 "Case mismatch for module name %.100s\n(filename %.300s)",
1092 name, fss.name);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001093 return 0;
1094 }
1095 return 1;
1096}
1097#endif /* macintosh */
1098
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001099#ifdef DJGPP
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001100#include <dir.h>
1101
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001102static int
1103check_case(char *buf, int len, int namelen, char *name)
1104{
1105 struct ffblk ffblk;
1106 int done;
1107
1108 if (getenv("PYTHONCASEOK") != NULL)
1109 return 1;
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001110 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001111 if (done) {
1112 PyErr_Format(PyExc_NameError,
1113 "Can't find file for module %.100s\n(filename %.300s)",
1114 name, buf);
1115 return 0;
1116 }
1117
1118 if (strncmp(ffblk.ff_name, name, namelen) != 0) {
1119 strcpy(buf+len-namelen, ffblk.ff_name);
1120 PyErr_Format(PyExc_NameError,
1121 "Case mismatch for module name %.100s\n(filename %.300s)",
1122 name, buf);
1123 return 0;
1124 }
1125 return 1;
1126}
1127#endif
1128
Guido van Rossum8766a771998-04-10 23:44:32 +00001129#endif /* CHECK_IMPORT_CASE */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001130
Guido van Rossum197346f1997-10-31 18:38:52 +00001131#ifdef HAVE_STAT
1132/* Helper to look for __init__.py or __init__.py[co] in potential package */
1133static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001134find_init_module(char *buf)
Guido van Rossum197346f1997-10-31 18:38:52 +00001135{
Fred Drake4c82b232000-06-30 16:18:57 +00001136 size_t save_len = strlen(buf);
1137 size_t i = save_len;
Guido van Rossum197346f1997-10-31 18:38:52 +00001138 struct stat statbuf;
1139
1140 if (save_len + 13 >= MAXPATHLEN)
1141 return 0;
1142 buf[i++] = SEP;
1143 strcpy(buf+i, "__init__.py");
1144 if (stat(buf, &statbuf) == 0) {
1145 buf[save_len] = '\0';
1146 return 1;
1147 }
1148 i += strlen(buf+i);
1149 if (Py_OptimizeFlag)
1150 strcpy(buf+i, "o");
1151 else
1152 strcpy(buf+i, "c");
1153 if (stat(buf, &statbuf) == 0) {
1154 buf[save_len] = '\0';
1155 return 1;
1156 }
1157 buf[save_len] = '\0';
1158 return 0;
1159}
1160#endif /* HAVE_STAT */
1161
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001162
Tim Petersdbd9ba62000-07-09 03:09:57 +00001163static int init_builtin(char *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001164
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001165/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001166 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001167
Guido van Rossum79f25d91997-04-29 20:08:16 +00001168static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001169load_module(char *name, FILE *fp, char *buf, int type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001170{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001171 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001172 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001173 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001174
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001175 /* First check that there's an open file (if we need one) */
1176 switch (type) {
1177 case PY_SOURCE:
1178 case PY_COMPILED:
1179 if (fp == NULL) {
1180 PyErr_Format(PyExc_ValueError,
1181 "file object required for import (type code %d)",
1182 type);
1183 return NULL;
1184 }
1185 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001186
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001187 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001188
1189 case PY_SOURCE:
1190 m = load_source_module(name, buf, fp);
1191 break;
1192
1193 case PY_COMPILED:
1194 m = load_compiled_module(name, buf, fp);
1195 break;
1196
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001197#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001198 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001199 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001200 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001201#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001202
Jack Jansen9c96a921995-02-15 22:57:06 +00001203#ifdef macintosh
1204 case PY_RESOURCE:
1205 m = PyMac_LoadResourceModule(name, buf);
1206 break;
Guido van Rossum0f84a341998-08-06 13:36:01 +00001207 case PY_CODERESOURCE:
1208 m = PyMac_LoadCodeResourceModule(name, buf);
1209 break;
Jack Jansen9c96a921995-02-15 22:57:06 +00001210#endif
1211
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001212 case PKG_DIRECTORY:
1213 m = load_package(name, buf);
1214 break;
1215
1216 case C_BUILTIN:
1217 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001218 if (buf != NULL && buf[0] != '\0')
1219 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001220 if (type == C_BUILTIN)
1221 err = init_builtin(name);
1222 else
1223 err = PyImport_ImportFrozenModule(name);
1224 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001225 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001226 if (err == 0) {
1227 PyErr_Format(PyExc_ImportError,
1228 "Purported %s module %.200s not found",
1229 type == C_BUILTIN ?
1230 "builtin" : "frozen",
1231 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001232 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001233 }
1234 modules = PyImport_GetModuleDict();
1235 m = PyDict_GetItemString(modules, name);
1236 if (m == NULL) {
1237 PyErr_Format(
1238 PyExc_ImportError,
1239 "%s module %.200s not properly initialized",
1240 type == C_BUILTIN ?
1241 "builtin" : "frozen",
1242 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001243 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001244 }
1245 Py_INCREF(m);
1246 break;
1247
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001248 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001249 PyErr_Format(PyExc_ImportError,
1250 "Don't know how to import %.200s (type code %d)",
1251 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001252 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001253
1254 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001255
1256 return m;
1257}
1258
1259
1260/* Initialize a built-in module.
1261 Return 1 for succes, 0 if the module is not found, and -1 with
1262 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001263
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001264static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001265init_builtin(char *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001266{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001267 struct _inittab *p;
1268 PyObject *mod;
1269
1270 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
1271 return 1;
1272
Guido van Rossum771c6c81997-10-31 18:37:24 +00001273 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001274 if (strcmp(name, p->name) == 0) {
1275 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001276 PyErr_Format(PyExc_ImportError,
1277 "Cannot re-init internal module %.200s",
1278 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001279 return -1;
1280 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001281 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001282 PySys_WriteStderr("import %s # builtin\n", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001283 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001284 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001285 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001286 if (_PyImport_FixupExtension(name, name) == NULL)
1287 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001288 return 1;
1289 }
1290 }
1291 return 0;
1292}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001293
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001294
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001295/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001296
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001297static struct _frozen *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001298find_frozen(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001299{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001300 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001301
Guido van Rossum79f25d91997-04-29 20:08:16 +00001302 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001303 if (p->name == NULL)
1304 return NULL;
1305 if (strcmp(p->name, name) == 0)
1306 break;
1307 }
1308 return p;
1309}
1310
Guido van Rossum79f25d91997-04-29 20:08:16 +00001311static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001312get_frozen_object(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001313{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001314 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001315 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001316
1317 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001318 PyErr_Format(PyExc_ImportError,
1319 "No such frozen object named %.200s",
1320 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001321 return NULL;
1322 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001323 size = p->size;
1324 if (size < 0)
1325 size = -size;
1326 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001327}
1328
1329/* Initialize a frozen module.
1330 Return 1 for succes, 0 if the module is not found, and -1 with
1331 an exception set if the initialization failed.
1332 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001333
1334int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001335PyImport_ImportFrozenModule(char *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001336{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001337 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001338 PyObject *co;
1339 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001340 int ispackage;
1341 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001342
1343 if (p == NULL)
1344 return 0;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001345 size = p->size;
1346 ispackage = (size < 0);
1347 if (ispackage)
1348 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001349 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001350 PySys_WriteStderr("import %s # frozen%s\n",
Guido van Rossuma5568d31998-03-05 03:45:08 +00001351 name, ispackage ? " package" : "");
1352 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001353 if (co == NULL)
1354 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001355 if (!PyCode_Check(co)) {
1356 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001357 PyErr_Format(PyExc_TypeError,
1358 "frozen object %.200s is not a code object",
1359 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001360 return -1;
1361 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001362 if (ispackage) {
1363 /* Set __path__ to the package name */
1364 PyObject *d, *s;
1365 int err;
1366 m = PyImport_AddModule(name);
1367 if (m == NULL)
1368 return -1;
1369 d = PyModule_GetDict(m);
1370 s = PyString_InternFromString(name);
1371 if (s == NULL)
1372 return -1;
1373 err = PyDict_SetItemString(d, "__path__", s);
1374 Py_DECREF(s);
1375 if (err != 0)
1376 return err;
1377 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001378 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001379 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001380 if (m == NULL)
1381 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001382 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001383 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001384}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001385
1386
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001387/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001388 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001389
Guido van Rossum79f25d91997-04-29 20:08:16 +00001390PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001391PyImport_ImportModule(char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00001392{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001393 static PyObject *fromlist = NULL;
1394 if (fromlist == NULL && strchr(name, '.') != NULL) {
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001395 fromlist = Py_BuildValue("(s)", "*");
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001396 if (fromlist == NULL)
1397 return NULL;
1398 }
1399 return PyImport_ImportModuleEx(name, NULL, NULL, fromlist);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001400}
1401
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001402/* Forward declarations for helper routines */
Tim Petersdbd9ba62000-07-09 03:09:57 +00001403static PyObject *get_parent(PyObject *globals, char *buf, int *p_buflen);
1404static PyObject *load_next(PyObject *mod, PyObject *altmod,
1405 char **p_name, char *buf, int *p_buflen);
1406static int mark_miss(char *name);
1407static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
1408 char *buf, int buflen, int recursive);
1409static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001410
1411/* The Magnum Opus of dotted-name import :-) */
1412
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001413static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001414import_module_ex(char *name, PyObject *globals, PyObject *locals,
1415 PyObject *fromlist)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001416{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001417 char buf[MAXPATHLEN+1];
1418 int buflen = 0;
1419 PyObject *parent, *head, *next, *tail;
1420
1421 parent = get_parent(globals, buf, &buflen);
1422 if (parent == NULL)
1423 return NULL;
1424
1425 head = load_next(parent, Py_None, &name, buf, &buflen);
1426 if (head == NULL)
1427 return NULL;
1428
1429 tail = head;
1430 Py_INCREF(tail);
1431 while (name) {
1432 next = load_next(tail, tail, &name, buf, &buflen);
1433 Py_DECREF(tail);
1434 if (next == NULL) {
1435 Py_DECREF(head);
1436 return NULL;
1437 }
1438 tail = next;
1439 }
1440
1441 if (fromlist != NULL) {
1442 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1443 fromlist = NULL;
1444 }
1445
1446 if (fromlist == NULL) {
1447 Py_DECREF(tail);
1448 return head;
1449 }
1450
1451 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001452 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001453 Py_DECREF(tail);
1454 return NULL;
1455 }
1456
1457 return tail;
1458}
1459
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001460PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001461PyImport_ImportModuleEx(char *name, PyObject *globals, PyObject *locals,
1462 PyObject *fromlist)
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001463{
1464 PyObject *result;
1465 lock_import();
Guido van Rossumd65911b1998-03-03 22:33:27 +00001466 result = import_module_ex(name, globals, locals, fromlist);
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001467 unlock_import();
1468 return result;
1469}
1470
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001471static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001472get_parent(PyObject *globals, char *buf, int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001473{
1474 static PyObject *namestr = NULL;
1475 static PyObject *pathstr = NULL;
1476 PyObject *modname, *modpath, *modules, *parent;
1477
1478 if (globals == NULL || !PyDict_Check(globals))
1479 return Py_None;
1480
1481 if (namestr == NULL) {
1482 namestr = PyString_InternFromString("__name__");
1483 if (namestr == NULL)
1484 return NULL;
1485 }
1486 if (pathstr == NULL) {
1487 pathstr = PyString_InternFromString("__path__");
1488 if (pathstr == NULL)
1489 return NULL;
1490 }
1491
1492 *buf = '\0';
1493 *p_buflen = 0;
1494 modname = PyDict_GetItem(globals, namestr);
1495 if (modname == NULL || !PyString_Check(modname))
1496 return Py_None;
1497
1498 modpath = PyDict_GetItem(globals, pathstr);
1499 if (modpath != NULL) {
1500 int len = PyString_GET_SIZE(modname);
1501 if (len > MAXPATHLEN) {
1502 PyErr_SetString(PyExc_ValueError,
1503 "Module name too long");
1504 return NULL;
1505 }
1506 strcpy(buf, PyString_AS_STRING(modname));
1507 *p_buflen = len;
1508 }
1509 else {
1510 char *start = PyString_AS_STRING(modname);
1511 char *lastdot = strrchr(start, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001512 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001513 if (lastdot == NULL)
1514 return Py_None;
1515 len = lastdot - start;
1516 if (len >= MAXPATHLEN) {
1517 PyErr_SetString(PyExc_ValueError,
1518 "Module name too long");
1519 return NULL;
1520 }
1521 strncpy(buf, start, len);
1522 buf[len] = '\0';
1523 *p_buflen = len;
1524 }
1525
1526 modules = PyImport_GetModuleDict();
1527 parent = PyDict_GetItemString(modules, buf);
1528 if (parent == NULL)
1529 parent = Py_None;
1530 return parent;
1531 /* We expect, but can't guarantee, if parent != None, that:
1532 - parent.__name__ == buf
1533 - parent.__dict__ is globals
1534 If this is violated... Who cares? */
1535}
1536
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001537/* altmod is either None or same as mod */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001538static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001539load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
1540 int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001541{
1542 char *name = *p_name;
1543 char *dot = strchr(name, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001544 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001545 char *p;
1546 PyObject *result;
1547
1548 if (dot == NULL) {
1549 *p_name = NULL;
1550 len = strlen(name);
1551 }
1552 else {
1553 *p_name = dot+1;
1554 len = dot-name;
1555 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00001556 if (len == 0) {
1557 PyErr_SetString(PyExc_ValueError,
1558 "Empty module name");
1559 return NULL;
1560 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001561
1562 p = buf + *p_buflen;
1563 if (p != buf)
1564 *p++ = '.';
1565 if (p+len-buf >= MAXPATHLEN) {
1566 PyErr_SetString(PyExc_ValueError,
1567 "Module name too long");
1568 return NULL;
1569 }
1570 strncpy(p, name, len);
1571 p[len] = '\0';
1572 *p_buflen = p+len-buf;
1573
1574 result = import_submodule(mod, p, buf);
1575 if (result == Py_None && altmod != mod) {
1576 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001577 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001578 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001579 if (result != NULL && result != Py_None) {
1580 if (mark_miss(buf) != 0) {
1581 Py_DECREF(result);
1582 return NULL;
1583 }
1584 strncpy(buf, name, len);
1585 buf[len] = '\0';
1586 *p_buflen = len;
1587 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001588 }
1589 if (result == NULL)
1590 return NULL;
1591
1592 if (result == Py_None) {
1593 Py_DECREF(result);
1594 PyErr_Format(PyExc_ImportError,
1595 "No module named %.200s", name);
1596 return NULL;
1597 }
1598
1599 return result;
1600}
1601
1602static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001603mark_miss(char *name)
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001604{
1605 PyObject *modules = PyImport_GetModuleDict();
1606 return PyDict_SetItemString(modules, name, Py_None);
1607}
1608
1609static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001610ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, int buflen,
1611 int recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001612{
1613 int i;
1614
1615 if (!PyObject_HasAttrString(mod, "__path__"))
1616 return 1;
1617
1618 for (i = 0; ; i++) {
1619 PyObject *item = PySequence_GetItem(fromlist, i);
1620 int hasit;
1621 if (item == NULL) {
1622 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1623 PyErr_Clear();
1624 return 1;
1625 }
1626 return 0;
1627 }
1628 if (!PyString_Check(item)) {
1629 PyErr_SetString(PyExc_TypeError,
1630 "Item in ``from list'' not a string");
1631 Py_DECREF(item);
1632 return 0;
1633 }
1634 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001635 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001636 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001637 /* See if the package defines __all__ */
1638 if (recursive)
1639 continue; /* Avoid endless recursion */
1640 all = PyObject_GetAttrString(mod, "__all__");
1641 if (all == NULL)
1642 PyErr_Clear();
1643 else {
1644 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1645 return 0;
1646 Py_DECREF(all);
1647 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001648 continue;
1649 }
1650 hasit = PyObject_HasAttr(mod, item);
1651 if (!hasit) {
1652 char *subname = PyString_AS_STRING(item);
1653 PyObject *submod;
1654 char *p;
1655 if (buflen + strlen(subname) >= MAXPATHLEN) {
1656 PyErr_SetString(PyExc_ValueError,
1657 "Module name too long");
1658 Py_DECREF(item);
1659 return 0;
1660 }
1661 p = buf + buflen;
1662 *p++ = '.';
1663 strcpy(p, subname);
1664 submod = import_submodule(mod, subname, buf);
1665 Py_XDECREF(submod);
1666 if (submod == NULL) {
1667 Py_DECREF(item);
1668 return 0;
1669 }
1670 }
1671 Py_DECREF(item);
1672 }
1673
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001674 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001675}
1676
1677static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001678import_submodule(PyObject *mod, char *subname, char *fullname)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001679{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001680 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001681 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001682
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001683 /* Require:
1684 if mod == None: subname == fullname
1685 else: mod.__name__ + "." + subname == fullname
1686 */
1687
1688 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001689 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001690 }
1691 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001692 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001693 char buf[MAXPATHLEN+1];
1694 struct filedescr *fdp;
1695 FILE *fp = NULL;
1696
Guido van Rossum9c0afe51998-05-19 15:09:05 +00001697 if (mod == Py_None)
1698 path = NULL;
1699 else {
1700 path = PyObject_GetAttrString(mod, "__path__");
1701 if (path == NULL) {
1702 PyErr_Clear();
1703 Py_INCREF(Py_None);
1704 return Py_None;
1705 }
1706 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001707
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001708 buf[0] = '\0';
Guido van Rossumb68cd421998-07-01 17:36:26 +00001709 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1710 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001711 if (fdp == NULL) {
1712 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1713 return NULL;
1714 PyErr_Clear();
1715 Py_INCREF(Py_None);
1716 return Py_None;
1717 }
1718 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001719 if (fp)
1720 fclose(fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001721 if (m != NULL && mod != Py_None) {
1722 if (PyObject_SetAttrString(mod, subname, m) < 0) {
1723 Py_DECREF(m);
1724 m = NULL;
1725 }
1726 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001727 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001728
1729 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001730}
1731
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001732
1733/* Re-import a module of any kind and return its module object, WITH
1734 INCREMENTED REFERENCE COUNT */
1735
Guido van Rossum79f25d91997-04-29 20:08:16 +00001736PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001737PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001738{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001739 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001740 PyObject *path = NULL;
1741 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001742 char buf[MAXPATHLEN+1];
1743 struct filedescr *fdp;
1744 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001745
Guido van Rossum79f25d91997-04-29 20:08:16 +00001746 if (m == NULL || !PyModule_Check(m)) {
1747 PyErr_SetString(PyExc_TypeError,
1748 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001749 return NULL;
1750 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001751 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001752 if (name == NULL)
1753 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001754 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001755 PyErr_Format(PyExc_ImportError,
1756 "reload(): module %.200s not in sys.modules",
1757 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001758 return NULL;
1759 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001760 subname = strrchr(name, '.');
1761 if (subname == NULL)
1762 subname = name;
1763 else {
1764 PyObject *parentname, *parent;
1765 parentname = PyString_FromStringAndSize(name, (subname-name));
1766 if (parentname == NULL)
1767 return NULL;
1768 parent = PyDict_GetItem(modules, parentname);
Barry Warsaw38793331999-01-27 17:54:20 +00001769 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00001770 if (parent == NULL) {
1771 PyErr_Format(PyExc_ImportError,
1772 "reload(): parent %.200s not in sys.modules",
1773 name);
1774 return NULL;
1775 }
1776 subname++;
1777 path = PyObject_GetAttrString(parent, "__path__");
1778 if (path == NULL)
1779 PyErr_Clear();
1780 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001781 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001782 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1783 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001784 if (fdp == NULL)
1785 return NULL;
1786 m = load_module(name, fp, buf, fdp->type);
1787 if (fp)
1788 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001789 return m;
1790}
1791
1792
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001793/* Higher-level import emulator which emulates the "import" statement
1794 more accurately -- it invokes the __import__() function from the
1795 builtins of the current globals. This means that the import is
1796 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00001797 environment, e.g. by "rexec".
1798 A dummy list ["__doc__"] is passed as the 4th argument so that
1799 e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
1800 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001801
1802PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001803PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001804{
1805 static PyObject *silly_list = NULL;
1806 static PyObject *builtins_str = NULL;
1807 static PyObject *import_str = NULL;
1808 static PyObject *standard_builtins = NULL;
1809 PyObject *globals = NULL;
1810 PyObject *import = NULL;
1811 PyObject *builtins = NULL;
1812 PyObject *r = NULL;
1813
1814 /* Initialize constant string objects */
1815 if (silly_list == NULL) {
1816 import_str = PyString_InternFromString("__import__");
1817 if (import_str == NULL)
1818 return NULL;
1819 builtins_str = PyString_InternFromString("__builtins__");
1820 if (builtins_str == NULL)
1821 return NULL;
1822 silly_list = Py_BuildValue("[s]", "__doc__");
1823 if (silly_list == NULL)
1824 return NULL;
1825 }
1826
1827 /* Get the builtins from current globals */
1828 globals = PyEval_GetGlobals();
1829 if(globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00001830 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001831 builtins = PyObject_GetItem(globals, builtins_str);
1832 if (builtins == NULL)
1833 goto err;
1834 }
1835 else {
1836 /* No globals -- use standard builtins, and fake globals */
1837 PyErr_Clear();
1838
1839 if (standard_builtins == NULL) {
1840 standard_builtins =
1841 PyImport_ImportModule("__builtin__");
1842 if (standard_builtins == NULL)
1843 return NULL;
1844 }
1845
1846 builtins = standard_builtins;
1847 Py_INCREF(builtins);
1848 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1849 if (globals == NULL)
1850 goto err;
1851 }
1852
1853 /* Get the __import__ function from the builtins */
1854 if (PyDict_Check(builtins))
1855 import=PyObject_GetItem(builtins, import_str);
1856 else
1857 import=PyObject_GetAttr(builtins, import_str);
1858 if (import == NULL)
1859 goto err;
1860
1861 /* Call the _import__ function with the proper argument list */
1862 r = PyObject_CallFunction(import, "OOOO",
1863 module_name, globals, globals, silly_list);
1864
1865 err:
1866 Py_XDECREF(globals);
1867 Py_XDECREF(builtins);
1868 Py_XDECREF(import);
1869
1870 return r;
1871}
1872
1873
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001874/* Module 'imp' provides Python access to the primitives used for
1875 importing modules.
1876*/
1877
Guido van Rossum79f25d91997-04-29 20:08:16 +00001878static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001879imp_get_magic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001880{
1881 char buf[4];
1882
Guido van Rossum43713e52000-02-29 13:59:29 +00001883 if (!PyArg_ParseTuple(args, ":get_magic"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001884 return NULL;
Guido van Rossum96774c12000-05-01 20:19:08 +00001885 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
1886 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
1887 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
1888 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001889
Guido van Rossum79f25d91997-04-29 20:08:16 +00001890 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001891}
1892
Guido van Rossum79f25d91997-04-29 20:08:16 +00001893static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001894imp_get_suffixes(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001895{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001896 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001897 struct filedescr *fdp;
1898
Guido van Rossum43713e52000-02-29 13:59:29 +00001899 if (!PyArg_ParseTuple(args, ":get_suffixes"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001900 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001901 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001902 if (list == NULL)
1903 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001904 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
1905 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001906 fdp->suffix, fdp->mode, fdp->type);
1907 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001908 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001909 return NULL;
1910 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001911 if (PyList_Append(list, item) < 0) {
1912 Py_DECREF(list);
1913 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001914 return NULL;
1915 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001916 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001917 }
1918 return list;
1919}
1920
Guido van Rossum79f25d91997-04-29 20:08:16 +00001921static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001922call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001923{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001924 extern int fclose(FILE *);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001925 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001926 struct filedescr *fdp;
1927 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001928 FILE *fp = NULL;
1929
1930 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001931 if (path == Py_None)
1932 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001933 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
1934 if (fdp == NULL)
1935 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001936 if (fp != NULL) {
1937 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
1938 if (fob == NULL) {
1939 fclose(fp);
1940 return NULL;
1941 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001942 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001943 else {
1944 fob = Py_None;
1945 Py_INCREF(fob);
1946 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001947 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001948 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001949 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001950 return ret;
1951}
1952
Guido van Rossum79f25d91997-04-29 20:08:16 +00001953static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001954imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001955{
1956 char *name;
1957 PyObject *path = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00001958 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001959 return NULL;
1960 return call_find_module(name, path);
1961}
1962
1963static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001964imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001965{
1966 char *name;
1967 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001968 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00001969 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001970 return NULL;
1971 ret = init_builtin(name);
1972 if (ret < 0)
1973 return NULL;
1974 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001975 Py_INCREF(Py_None);
1976 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001977 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001978 m = PyImport_AddModule(name);
1979 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001980 return m;
1981}
1982
Guido van Rossum79f25d91997-04-29 20:08:16 +00001983static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001984imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001985{
1986 char *name;
1987 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001988 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00001989 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001990 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001991 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001992 if (ret < 0)
1993 return NULL;
1994 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001995 Py_INCREF(Py_None);
1996 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001997 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001998 m = PyImport_AddModule(name);
1999 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002000 return m;
2001}
2002
Guido van Rossum79f25d91997-04-29 20:08:16 +00002003static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002004imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002005{
2006 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002007
Guido van Rossum43713e52000-02-29 13:59:29 +00002008 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002009 return NULL;
2010 return get_frozen_object(name);
2011}
2012
Guido van Rossum79f25d91997-04-29 20:08:16 +00002013static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002014imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002015{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002016 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002017 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002018 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002019 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002020}
2021
Guido van Rossum79f25d91997-04-29 20:08:16 +00002022static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002023imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002024{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002025 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002026 struct _frozen *p;
Guido van Rossum43713e52000-02-29 13:59:29 +00002027 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002028 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002029 p = find_frozen(name);
2030 return PyInt_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002031}
2032
2033static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002034get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002035{
2036 FILE *fp;
2037 if (fob == NULL) {
2038 fp = fopen(pathname, mode);
2039 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002040 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002041 }
2042 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002043 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002044 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002045 PyErr_SetString(PyExc_ValueError,
2046 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002047 }
2048 return fp;
2049}
2050
Guido van Rossum79f25d91997-04-29 20:08:16 +00002051static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002052imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002053{
2054 char *name;
2055 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002056 PyObject *fob = NULL;
2057 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002058 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002059 if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002060 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002061 return NULL;
2062 fp = get_file(pathname, fob, "rb");
2063 if (fp == NULL)
2064 return NULL;
2065 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002066 if (fob == NULL)
2067 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002068 return m;
2069}
2070
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002071#ifdef HAVE_DYNAMIC_LOADING
2072
Guido van Rossum79f25d91997-04-29 20:08:16 +00002073static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002074imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002075{
2076 char *name;
2077 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002078 PyObject *fob = NULL;
2079 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002080 FILE *fp = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002081 if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002082 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002083 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002084 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002085 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002086 if (fp == NULL)
2087 return NULL;
2088 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002089 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002090 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002091}
2092
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002093#endif /* HAVE_DYNAMIC_LOADING */
2094
Guido van Rossum79f25d91997-04-29 20:08:16 +00002095static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002096imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002097{
2098 char *name;
2099 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002100 PyObject *fob = NULL;
2101 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002102 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002103 if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002104 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002105 return NULL;
2106 fp = get_file(pathname, fob, "r");
2107 if (fp == NULL)
2108 return NULL;
2109 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002110 if (fob == NULL)
2111 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002112 return m;
2113}
2114
Jack Jansen9c96a921995-02-15 22:57:06 +00002115#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002116static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002117imp_load_resource(PyObject *self, PyObject *args)
Jack Jansen9c96a921995-02-15 22:57:06 +00002118{
2119 char *name;
2120 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002121 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002122
Guido van Rossum43713e52000-02-29 13:59:29 +00002123 if (!PyArg_ParseTuple(args, "ss:load_resource", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002124 return NULL;
2125 m = PyMac_LoadResourceModule(name, pathname);
2126 return m;
2127}
2128#endif /* macintosh */
2129
Guido van Rossum79f25d91997-04-29 20:08:16 +00002130static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002131imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002132{
2133 char *name;
2134 PyObject *fob;
2135 char *pathname;
2136 char *suffix; /* Unused */
2137 char *mode;
2138 int type;
2139 FILE *fp;
2140
Guido van Rossum43713e52000-02-29 13:59:29 +00002141 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002142 &name, &fob, &pathname,
2143 &suffix, &mode, &type))
2144 return NULL;
2145 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
2146 PyErr_Format(PyExc_ValueError,
2147 "invalid file open mode %.200s", mode);
2148 return NULL;
2149 }
2150 if (fob == Py_None)
2151 fp = NULL;
2152 else {
2153 if (!PyFile_Check(fob)) {
2154 PyErr_SetString(PyExc_ValueError,
2155 "load_module arg#2 should be a file or None");
2156 return NULL;
2157 }
2158 fp = get_file(pathname, fob, mode);
2159 if (fp == NULL)
2160 return NULL;
2161 }
2162 return load_module(name, fp, pathname, type);
2163}
2164
2165static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002166imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002167{
2168 char *name;
2169 char *pathname;
Guido van Rossum43713e52000-02-29 13:59:29 +00002170 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002171 return NULL;
2172 return load_package(name, pathname);
2173}
2174
2175static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002176imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002177{
2178 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002179 if (!PyArg_ParseTuple(args, "s:new_module", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002180 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002181 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002182}
2183
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002184/* Doc strings */
2185
2186static char doc_imp[] = "\
2187This module provides the components needed to build your own\n\
2188__import__ function. Undocumented functions are obsolete.\n\
2189";
2190
2191static char doc_find_module[] = "\
2192find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
2193Search for a module. If path is omitted or None, search for a\n\
2194built-in, frozen or special module and continue search in sys.path.\n\
2195The module name cannot contain '.'; to search for a submodule of a\n\
2196package, pass the submodule name and the package's __path__.\
2197";
2198
2199static char doc_load_module[] = "\
2200load_module(name, file, filename, (suffix, mode, type)) -> module\n\
2201Load a module, given information returned by find_module().\n\
2202The module name must include the full package name, if any.\
2203";
2204
2205static char doc_get_magic[] = "\
2206get_magic() -> string\n\
2207Return the magic number for .pyc or .pyo files.\
2208";
2209
2210static char doc_get_suffixes[] = "\
2211get_suffixes() -> [(suffix, mode, type), ...]\n\
2212Return a list of (suffix, mode, type) tuples describing the files\n\
2213that find_module() looks for.\
2214";
2215
2216static char doc_new_module[] = "\
2217new_module(name) -> module\n\
2218Create a new module. Do not enter it in sys.modules.\n\
2219The module name must include the full package name, if any.\
2220";
2221
Guido van Rossum79f25d91997-04-29 20:08:16 +00002222static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002223 {"find_module", imp_find_module, 1, doc_find_module},
2224 {"get_magic", imp_get_magic, 1, doc_get_magic},
2225 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2226 {"load_module", imp_load_module, 1, doc_load_module},
2227 {"new_module", imp_new_module, 1, doc_new_module},
2228 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002229 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002230 {"init_builtin", imp_init_builtin, 1},
2231 {"init_frozen", imp_init_frozen, 1},
2232 {"is_builtin", imp_is_builtin, 1},
2233 {"is_frozen", imp_is_frozen, 1},
2234 {"load_compiled", imp_load_compiled, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002235#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002236 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002237#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002238 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002239#ifdef macintosh
2240 {"load_resource", imp_load_resource, 1},
2241#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002242 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002243 {NULL, NULL} /* sentinel */
2244};
2245
Guido van Rossum1a8791e1998-08-04 22:46:29 +00002246static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002247setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002248{
2249 PyObject *v;
2250 int err;
2251
2252 v = PyInt_FromLong((long)value);
2253 err = PyDict_SetItemString(d, name, v);
2254 Py_XDECREF(v);
2255 return err;
2256}
2257
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002258void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002259initimp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002260{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002261 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002262
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002263 m = Py_InitModule4("imp", imp_methods, doc_imp,
2264 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002265 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002266
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002267 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2268 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2269 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2270 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2271 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2272 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2273 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2274 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00002275 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002276
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002277 failure:
2278 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002279}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002280
2281
Guido van Rossumb18618d2000-05-03 23:44:39 +00002282/* API for embedding applications that want to add their own entries
2283 to the table of built-in modules. This should normally be called
2284 *before* Py_Initialize(). When the table resize fails, -1 is
2285 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002286
2287 After a similar function by Just van Rossum. */
2288
2289int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002290PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002291{
2292 static struct _inittab *our_copy = NULL;
2293 struct _inittab *p;
2294 int i, n;
2295
2296 /* Count the number of entries in both tables */
2297 for (n = 0; newtab[n].name != NULL; n++)
2298 ;
2299 if (n == 0)
2300 return 0; /* Nothing to do */
2301 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2302 ;
2303
2304 /* Allocate new memory for the combined table */
Guido van Rossumb18618d2000-05-03 23:44:39 +00002305 p = our_copy;
2306 PyMem_RESIZE(p, struct _inittab, i+n+1);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002307 if (p == NULL)
2308 return -1;
2309
2310 /* Copy the tables into the new memory */
2311 if (our_copy != PyImport_Inittab)
2312 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2313 PyImport_Inittab = our_copy = p;
2314 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
2315
2316 return 0;
2317}
2318
2319/* Shorthand to add a single entry given a name and a function */
2320
2321int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002322PyImport_AppendInittab(char *name, void (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002323{
2324 struct _inittab newtab[2];
2325
2326 memset(newtab, '\0', sizeof newtab);
2327
2328 newtab[0].name = name;
2329 newtab[0].initfunc = initfunc;
2330
2331 return PyImport_ExtendInittab(newtab);
2332}