blob: 533fed5ae0778d21c3a79d678e6cb2754cb78e82 [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 Rossum55a83382000-09-20 20:31:38 +000022#ifdef HAVE_FCNTL_H
23#include <fcntl.h>
24#endif
25
Guido van Rossum595d7ba1997-12-05 21:45:29 +000026#if defined(PYCC_VACPP)
27/* VisualAge C/C++ Failed to Define MountType Field in sys/stat.h */
28#define S_IFMT (S_IFDIR|S_IFCHR|S_IFREG)
29#endif
30
Guido van Rossumaee0bad1997-09-05 07:33:22 +000031#ifndef S_ISDIR
32#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
33#endif
34
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000035extern time_t PyOS_GetLastModificationTime(char *, FILE *);
36 /* In getmtime.c */
Guido van Rossum21d335e1993-10-15 13:01:11 +000037
Guido van Rossum6c849691994-09-26 15:47:17 +000038/* Magic word to reject .pyc files generated by other Python versions */
Guido van Rossum7faeab31995-07-07 22:50:36 +000039/* Change for each incompatible change */
40/* The value of CR and LF is incorporated so if you ever read or write
41 a .pyc file in text mode the magic number will be wrong; also, the
42 Apple MPW compiler swaps their values, botching string constants */
43/* XXX Perhaps the magic number should be frozen and a version field
44 added to the .pyc file header? */
Guido van Rossumdd5db431997-01-17 21:06:11 +000045/* New way to come up with the magic number: (YEAR-1995), MONTH, DAY */
Jeremy Hylton64949cb2001-01-25 20:06:59 +000046#define MAGIC (60124 | ((long)'\r'<<16) | ((long)'\n'<<24))
Guido van Rossum3ddee711991-12-16 13:06:34 +000047
Guido van Rossum96774c12000-05-01 20:19:08 +000048/* Magic word as global; note that _PyImport_Init() can change the
Jeremy Hylton9262b8a2000-06-30 04:59:17 +000049 value of this global to accommodate for alterations of how the
Guido van Rossum96774c12000-05-01 20:19:08 +000050 compiler works which are enabled by command line switches. */
51static long pyc_magic = MAGIC;
52
Guido van Rossum25ce5661997-08-02 03:10:38 +000053/* See _PyImport_FixupExtension() below */
54static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000055
Guido van Rossum771c6c81997-10-31 18:37:24 +000056/* This table is defined in config.c: */
57extern struct _inittab _PyImport_Inittab[];
58
59struct _inittab *PyImport_Inittab = _PyImport_Inittab;
Guido van Rossum66f1fa81991-04-03 19:03:52 +000060
Guido van Rossumed1170e1999-12-20 21:23:41 +000061/* these tables define the module suffixes that Python recognizes */
62struct filedescr * _PyImport_Filetab = NULL;
63static const struct filedescr _PyImport_StandardFiletab[] = {
64 {".py", "r", PY_SOURCE},
65 {".pyc", "rb", PY_COMPILED},
66 {0, 0}
67};
68
Guido van Rossum1ae940a1995-01-02 19:04:15 +000069/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000070
71void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000072_PyImport_Init(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000073{
Guido van Rossumed1170e1999-12-20 21:23:41 +000074 const struct filedescr *scan;
75 struct filedescr *filetab;
76 int countD = 0;
77 int countS = 0;
78
79 /* prepare _PyImport_Filetab: copy entries from
80 _PyImport_DynLoadFiletab and _PyImport_StandardFiletab.
81 */
82 for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan)
83 ++countD;
84 for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan)
85 ++countS;
Guido van Rossumb18618d2000-05-03 23:44:39 +000086 filetab = PyMem_NEW(struct filedescr, countD + countS + 1);
Guido van Rossumed1170e1999-12-20 21:23:41 +000087 memcpy(filetab, _PyImport_DynLoadFiletab,
88 countD * sizeof(struct filedescr));
89 memcpy(filetab + countD, _PyImport_StandardFiletab,
90 countS * sizeof(struct filedescr));
91 filetab[countD + countS].suffix = NULL;
92
93 _PyImport_Filetab = filetab;
94
Guido van Rossum0824f631997-03-11 18:37:35 +000095 if (Py_OptimizeFlag) {
Guido van Rossumed1170e1999-12-20 21:23:41 +000096 /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */
97 for (; filetab->suffix != NULL; filetab++) {
98 if (strcmp(filetab->suffix, ".pyc") == 0)
99 filetab->suffix = ".pyo";
Guido van Rossum0824f631997-03-11 18:37:35 +0000100 }
101 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000102
103 if (Py_UnicodeFlag) {
104 /* Fix the pyc_magic so that byte compiled code created
105 using the all-Unicode method doesn't interfere with
106 code created in normal operation mode. */
107 pyc_magic = MAGIC + 1;
108 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000109}
110
Guido van Rossum25ce5661997-08-02 03:10:38 +0000111void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000112_PyImport_Fini(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000113{
114 Py_XDECREF(extensions);
115 extensions = NULL;
Barry Warsaw84294482000-10-03 16:02:05 +0000116 PyMem_DEL(_PyImport_Filetab);
117 _PyImport_Filetab = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000118}
119
120
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000121/* Locking primitives to prevent parallel imports of the same module
122 in different threads to return with a partially loaded module.
123 These calls are serialized by the global interpreter lock. */
124
125#ifdef WITH_THREAD
126
Guido van Rossum49b56061998-10-01 20:42:43 +0000127#include "pythread.h"
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000128
Guido van Rossum65d5b571998-12-21 19:32:43 +0000129static PyThread_type_lock import_lock = 0;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000130static long import_lock_thread = -1;
131static int import_lock_level = 0;
132
133static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000134lock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000135{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000136 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000137 if (me == -1)
138 return; /* Too bad */
139 if (import_lock == NULL)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000140 import_lock = PyThread_allocate_lock();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000141 if (import_lock_thread == me) {
142 import_lock_level++;
143 return;
144 }
Guido van Rossum65d5b571998-12-21 19:32:43 +0000145 if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0)) {
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000146 PyThreadState *tstate = PyEval_SaveThread();
Guido van Rossum65d5b571998-12-21 19:32:43 +0000147 PyThread_acquire_lock(import_lock, 1);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000148 PyEval_RestoreThread(tstate);
149 }
150 import_lock_thread = me;
151 import_lock_level = 1;
152}
153
154static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000155unlock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000156{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000157 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000158 if (me == -1)
159 return; /* Too bad */
160 if (import_lock_thread != me)
161 Py_FatalError("unlock_import: not holding the import lock");
162 import_lock_level--;
163 if (import_lock_level == 0) {
164 import_lock_thread = -1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000165 PyThread_release_lock(import_lock);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000166 }
167}
168
169#else
170
171#define lock_import()
172#define unlock_import()
173
174#endif
175
Guido van Rossum25ce5661997-08-02 03:10:38 +0000176/* Helper for sys */
177
178PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000179PyImport_GetModuleDict(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000180{
181 PyInterpreterState *interp = PyThreadState_Get()->interp;
182 if (interp->modules == NULL)
183 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
184 return interp->modules;
185}
186
Guido van Rossum3f5da241990-12-20 15:06:42 +0000187
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000188/* List of names to clear in sys */
189static char* sys_deletes[] = {
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000190 "path", "argv", "ps1", "ps2", "exitfunc",
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000191 "exc_type", "exc_value", "exc_traceback",
192 "last_type", "last_value", "last_traceback",
193 NULL
194};
195
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000196static char* sys_files[] = {
197 "stdin", "__stdin__",
198 "stdout", "__stdout__",
199 "stderr", "__stderr__",
200 NULL
201};
202
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000203
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000204/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000205
Guido van Rossum3f5da241990-12-20 15:06:42 +0000206void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000207PyImport_Cleanup(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000208{
Guido van Rossum758eec01998-01-19 21:58:26 +0000209 int pos, ndone;
210 char *name;
211 PyObject *key, *value, *dict;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000212 PyInterpreterState *interp = PyThreadState_Get()->interp;
Guido van Rossum758eec01998-01-19 21:58:26 +0000213 PyObject *modules = interp->modules;
214
215 if (modules == NULL)
216 return; /* Already done */
217
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000218 /* Delete some special variables first. These are common
219 places where user values hide and people complain when their
220 destructors fail. Since the modules containing them are
221 deleted *last* of all, they would come too late in the normal
222 destruction order. Sigh. */
223
224 value = PyDict_GetItemString(modules, "__builtin__");
225 if (value != NULL && PyModule_Check(value)) {
226 dict = PyModule_GetDict(value);
227 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000228 PySys_WriteStderr("# clear __builtin__._\n");
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000229 PyDict_SetItemString(dict, "_", Py_None);
230 }
231 value = PyDict_GetItemString(modules, "sys");
232 if (value != NULL && PyModule_Check(value)) {
233 char **p;
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000234 PyObject *v;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000235 dict = PyModule_GetDict(value);
236 for (p = sys_deletes; *p != NULL; p++) {
237 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000238 PySys_WriteStderr("# clear sys.%s\n", *p);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000239 PyDict_SetItemString(dict, *p, Py_None);
240 }
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000241 for (p = sys_files; *p != NULL; p+=2) {
242 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000243 PySys_WriteStderr("# restore sys.%s\n", *p);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000244 v = PyDict_GetItemString(dict, *(p+1));
245 if (v == NULL)
246 v = Py_None;
247 PyDict_SetItemString(dict, *p, v);
248 }
249 }
250
251 /* First, delete __main__ */
252 value = PyDict_GetItemString(modules, "__main__");
253 if (value != NULL && PyModule_Check(value)) {
254 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000255 PySys_WriteStderr("# cleanup __main__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000256 _PyModule_Clear(value);
257 PyDict_SetItemString(modules, "__main__", Py_None);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000258 }
259
Guido van Rossum758eec01998-01-19 21:58:26 +0000260 /* The special treatment of __builtin__ here is because even
261 when it's not referenced as a module, its dictionary is
262 referenced by almost every module's __builtins__. Since
263 deleting a module clears its dictionary (even if there are
264 references left to it), we need to delete the __builtin__
265 module last. Likewise, we don't delete sys until the very
266 end because it is implicitly referenced (e.g. by print).
267
268 Also note that we 'delete' modules by replacing their entry
269 in the modules dict with None, rather than really deleting
270 them; this avoids a rehash of the modules dictionary and
271 also marks them as "non existent" so they won't be
272 re-imported. */
273
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000274 /* Next, repeatedly delete modules with a reference count of
Guido van Rossum758eec01998-01-19 21:58:26 +0000275 one (skipping __builtin__ and sys) and delete them */
276 do {
277 ndone = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000278 pos = 0;
Guido van Rossum758eec01998-01-19 21:58:26 +0000279 while (PyDict_Next(modules, &pos, &key, &value)) {
280 if (value->ob_refcnt != 1)
281 continue;
Guido van Rossum566373e1998-10-01 15:24:50 +0000282 if (PyString_Check(key) && PyModule_Check(value)) {
283 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000284 if (strcmp(name, "__builtin__") == 0)
285 continue;
286 if (strcmp(name, "sys") == 0)
287 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000288 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000289 PySys_WriteStderr(
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000290 "# cleanup[1] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000291 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000292 PyDict_SetItem(modules, key, Py_None);
293 ndone++;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000294 }
295 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000296 } while (ndone > 0);
297
Guido van Rossum758eec01998-01-19 21:58:26 +0000298 /* Next, delete all modules (still skipping __builtin__ and sys) */
299 pos = 0;
300 while (PyDict_Next(modules, &pos, &key, &value)) {
Guido van Rossum566373e1998-10-01 15:24:50 +0000301 if (PyString_Check(key) && PyModule_Check(value)) {
302 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000303 if (strcmp(name, "__builtin__") == 0)
304 continue;
305 if (strcmp(name, "sys") == 0)
306 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000307 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000308 PySys_WriteStderr("# cleanup[2] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000309 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000310 PyDict_SetItem(modules, key, Py_None);
311 }
312 }
313
314 /* Next, delete sys and __builtin__ (in that order) */
315 value = PyDict_GetItemString(modules, "sys");
316 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000317 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000318 PySys_WriteStderr("# cleanup sys\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000319 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000320 PyDict_SetItemString(modules, "sys", Py_None);
321 }
322 value = PyDict_GetItemString(modules, "__builtin__");
323 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000324 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000325 PySys_WriteStderr("# cleanup __builtin__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000326 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000327 PyDict_SetItemString(modules, "__builtin__", Py_None);
328 }
329
330 /* Finally, clear and delete the modules directory */
331 PyDict_Clear(modules);
332 interp->modules = NULL;
333 Py_DECREF(modules);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000334}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000335
336
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000337/* Helper for pythonrun.c -- return magic number */
338
339long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000340PyImport_GetMagicNumber(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000341{
Guido van Rossum96774c12000-05-01 20:19:08 +0000342 return pyc_magic;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000343}
344
345
Guido van Rossum25ce5661997-08-02 03:10:38 +0000346/* Magic for extension modules (built-in as well as dynamically
347 loaded). To prevent initializing an extension module more than
348 once, we keep a static dictionary 'extensions' keyed by module name
349 (for built-in modules) or by filename (for dynamically loaded
350 modules), containing these modules. A copy od the module's
351 dictionary is stored by calling _PyImport_FixupExtension()
352 immediately after the module initialization function succeeds. A
353 copy can be retrieved from there by calling
354 _PyImport_FindExtension(). */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000355
Guido van Rossum79f25d91997-04-29 20:08:16 +0000356PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000357_PyImport_FixupExtension(char *name, char *filename)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000358{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000359 PyObject *modules, *mod, *dict, *copy;
360 if (extensions == NULL) {
361 extensions = PyDict_New();
362 if (extensions == NULL)
363 return NULL;
364 }
365 modules = PyImport_GetModuleDict();
366 mod = PyDict_GetItemString(modules, name);
367 if (mod == NULL || !PyModule_Check(mod)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000368 PyErr_Format(PyExc_SystemError,
369 "_PyImport_FixupExtension: module %.200s not loaded", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000370 return NULL;
371 }
372 dict = PyModule_GetDict(mod);
373 if (dict == NULL)
374 return NULL;
375 copy = PyObject_CallMethod(dict, "copy", "");
376 if (copy == NULL)
377 return NULL;
378 PyDict_SetItemString(extensions, filename, copy);
379 Py_DECREF(copy);
380 return copy;
381}
382
383PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000384_PyImport_FindExtension(char *name, char *filename)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000385{
386 PyObject *dict, *mod, *mdict, *result;
387 if (extensions == NULL)
388 return NULL;
389 dict = PyDict_GetItemString(extensions, filename);
390 if (dict == NULL)
391 return NULL;
392 mod = PyImport_AddModule(name);
393 if (mod == NULL)
394 return NULL;
395 mdict = PyModule_GetDict(mod);
396 if (mdict == NULL)
397 return NULL;
398 result = PyObject_CallMethod(mdict, "update", "O", dict);
399 if (result == NULL)
400 return NULL;
401 Py_DECREF(result);
402 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000403 PySys_WriteStderr("import %s # previously loaded (%s)\n",
Guido van Rossum25ce5661997-08-02 03:10:38 +0000404 name, filename);
405 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000406}
407
408
409/* Get the module object corresponding to a module name.
410 First check the modules dictionary if there's one there,
411 if not, create a new one and insert in in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000412 Because the former action is most common, THIS DOES NOT RETURN A
413 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000414
Guido van Rossum79f25d91997-04-29 20:08:16 +0000415PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000416PyImport_AddModule(char *name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000417{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000418 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000419 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000420
Guido van Rossum25ce5661997-08-02 03:10:38 +0000421 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
Guido van Rossum79f25d91997-04-29 20:08:16 +0000422 PyModule_Check(m))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000423 return m;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000424 m = PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000425 if (m == NULL)
426 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000427 if (PyDict_SetItemString(modules, name, m) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000428 Py_DECREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000429 return NULL;
430 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000431 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000432
433 return m;
434}
435
436
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000437/* Execute a code object in a module and return the module object
438 WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000439
Guido van Rossum79f25d91997-04-29 20:08:16 +0000440PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000441PyImport_ExecCodeModule(char *name, PyObject *co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000442{
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000443 return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
444}
445
446PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000447PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname)
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000448{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000449 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000450 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000451
Guido van Rossum79f25d91997-04-29 20:08:16 +0000452 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000453 if (m == NULL)
454 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000455 d = PyModule_GetDict(m);
456 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
457 if (PyDict_SetItemString(d, "__builtins__",
458 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000459 return NULL;
460 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000461 /* Remember the filename as the __file__ attribute */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000462 v = NULL;
463 if (pathname != NULL) {
464 v = PyString_FromString(pathname);
465 if (v == NULL)
466 PyErr_Clear();
467 }
468 if (v == NULL) {
469 v = ((PyCodeObject *)co)->co_filename;
470 Py_INCREF(v);
471 }
472 if (PyDict_SetItemString(d, "__file__", v) != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000473 PyErr_Clear(); /* Not important enough to report */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000474 Py_DECREF(v);
475
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000476 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000477 if (v == NULL)
478 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000479 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000480
Guido van Rossum25ce5661997-08-02 03:10:38 +0000481 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000482 PyErr_Format(PyExc_ImportError,
483 "Loaded module %.200s not found in sys.modules",
484 name);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000485 return NULL;
486 }
487
Guido van Rossum79f25d91997-04-29 20:08:16 +0000488 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000489
490 return m;
491}
492
493
494/* Given a pathname for a Python source file, fill a buffer with the
495 pathname for the corresponding compiled file. Return the pathname
496 for the compiled file, or NULL if there's no space in the buffer.
497 Doesn't set an exception. */
498
499static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000500make_compiled_pathname(char *pathname, char *buf, size_t buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000501{
Fred Drake4c82b232000-06-30 16:18:57 +0000502 size_t len;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000503
504 len = strlen(pathname);
505 if (len+2 > buflen)
506 return NULL;
507 strcpy(buf, pathname);
Guido van Rossum0824f631997-03-11 18:37:35 +0000508 strcpy(buf+len, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000509
510 return buf;
511}
512
513
514/* Given a pathname for a Python source file, its time of last
515 modification, and a pathname for a compiled file, check whether the
516 compiled file represents the same version of the source. If so,
517 return a FILE pointer for the compiled file, positioned just after
518 the header; if not, return NULL.
519 Doesn't set an exception. */
520
521static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000522check_compiled_module(char *pathname, long mtime, char *cpathname)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000523{
524 FILE *fp;
525 long magic;
526 long pyc_mtime;
527
528 fp = fopen(cpathname, "rb");
529 if (fp == NULL)
530 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000531 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000532 if (magic != pyc_magic) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000533 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000534 PySys_WriteStderr("# %s has bad magic\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000535 fclose(fp);
536 return NULL;
537 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000538 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000539 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000540 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000541 PySys_WriteStderr("# %s has bad mtime\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000542 fclose(fp);
543 return NULL;
544 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000545 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000546 PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000547 return fp;
548}
549
550
551/* Read a code object from a file and check it for validity */
552
Guido van Rossum79f25d91997-04-29 20:08:16 +0000553static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000554read_compiled_module(char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000555{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000556 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000557
Tim Petersd9b9ac82001-01-28 00:27:39 +0000558 co = PyMarshal_ReadLastObjectFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000559 /* Ugly: rd_object() may return NULL with or without error */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000560 if (co == NULL || !PyCode_Check(co)) {
561 if (!PyErr_Occurred())
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000562 PyErr_Format(PyExc_ImportError,
563 "Non-code object in %.200s", cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000564 Py_XDECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000565 return NULL;
566 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000567 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000568}
569
570
571/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000572 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000573
Guido van Rossum79f25d91997-04-29 20:08:16 +0000574static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000575load_compiled_module(char *name, char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000576{
577 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000578 PyCodeObject *co;
579 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000580
Guido van Rossum79f25d91997-04-29 20:08:16 +0000581 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000582 if (magic != pyc_magic) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000583 PyErr_Format(PyExc_ImportError,
584 "Bad magic number in %.200s", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000585 return NULL;
586 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000587 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000588 co = read_compiled_module(cpathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000589 if (co == NULL)
590 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000591 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000592 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000593 name, cpathname);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000594 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000595 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000596
597 return m;
598}
599
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000600/* Parse a source file and return the corresponding code object */
601
Guido van Rossum79f25d91997-04-29 20:08:16 +0000602static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000603parse_source_module(char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000604{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000605 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000606 node *n;
607
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000608 n = PyParser_SimpleParseFile(fp, pathname, Py_file_input);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000609 if (n == NULL)
610 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000611 co = PyNode_Compile(n, pathname);
612 PyNode_Free(n);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000613
614 return co;
615}
616
617
Guido van Rossum55a83382000-09-20 20:31:38 +0000618/* Helper to open a bytecode file for writing in exclusive mode */
619
620static FILE *
621open_exclusive(char *filename)
622{
623#if defined(O_EXCL)&&defined(O_CREAT)&&defined(O_WRONLY)&&defined(O_TRUNC)
624 /* Use O_EXCL to avoid a race condition when another process tries to
625 write the same file. When that happens, our open() call fails,
626 which is just fine (since it's only a cache).
627 XXX If the file exists and is writable but the directory is not
628 writable, the file will never be written. Oh well.
629 */
630 int fd;
631 (void) unlink(filename);
Tim Peters42c83af2000-09-29 04:03:10 +0000632 fd = open(filename, O_EXCL|O_CREAT|O_WRONLY|O_TRUNC
633#ifdef O_BINARY
634 |O_BINARY /* necessary for Windows */
635#endif
636
637 , 0666);
Guido van Rossum55a83382000-09-20 20:31:38 +0000638 if (fd < 0)
639 return NULL;
640 return fdopen(fd, "wb");
641#else
642 /* Best we can do -- on Windows this can't happen anyway */
643 return fopen(filename, "wb");
644#endif
645}
646
647
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000648/* Write a compiled module to a file, placing the time of last
649 modification of its source into the header.
650 Errors are ignored, if a write error occurs an attempt is made to
651 remove the file. */
652
653static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000654write_compiled_module(PyCodeObject *co, char *cpathname, long mtime)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000655{
656 FILE *fp;
657
Guido van Rossum55a83382000-09-20 20:31:38 +0000658 fp = open_exclusive(cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000659 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000660 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000661 PySys_WriteStderr(
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000662 "# can't create %s\n", cpathname);
663 return;
664 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000665 PyMarshal_WriteLongToFile(pyc_magic, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000666 /* First write a 0 for mtime */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000667 PyMarshal_WriteLongToFile(0L, fp);
668 PyMarshal_WriteObjectToFile((PyObject *)co, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000669 if (ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000670 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000671 PySys_WriteStderr("# can't write %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000672 /* Don't keep partial file */
673 fclose(fp);
674 (void) unlink(cpathname);
675 return;
676 }
677 /* Now write the true mtime */
678 fseek(fp, 4L, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000679 PyMarshal_WriteLongToFile(mtime, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000680 fflush(fp);
681 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000682 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000683 PySys_WriteStderr("# wrote %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000684#ifdef macintosh
Jack Jansencbf630f2000-07-11 21:59:16 +0000685 PyMac_setfiletype(cpathname, 'Pyth', 'PYC ');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000686#endif
687}
688
689
690/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000691 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
692 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000693
Guido van Rossum79f25d91997-04-29 20:08:16 +0000694static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000695load_source_module(char *name, char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000696{
Fred Drake4c82b232000-06-30 16:18:57 +0000697 time_t mtime;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000698 FILE *fpc;
699 char buf[MAXPATHLEN+1];
700 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000701 PyCodeObject *co;
702 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000703
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000704 mtime = PyOS_GetLastModificationTime(pathname, fp);
Fred Drake4c82b232000-06-30 16:18:57 +0000705 if (mtime == -1)
706 return NULL;
707#if SIZEOF_TIME_T > 4
708 /* Python's .pyc timestamp handling presumes that the timestamp fits
709 in 4 bytes. This will be fine until sometime in the year 2038,
710 when a 4-byte signed time_t will overflow.
711 */
712 if (mtime >> 32) {
713 PyErr_SetString(PyExc_OverflowError,
714 "modification time overflows a 4 bytes");
715 return NULL;
716 }
717#endif
718 cpathname = make_compiled_pathname(pathname, buf, (size_t)MAXPATHLEN+1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000719 if (cpathname != NULL &&
720 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000721 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000722 fclose(fpc);
723 if (co == NULL)
724 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000725 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000726 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000727 name, cpathname);
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000728 pathname = cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000729 }
730 else {
731 co = parse_source_module(pathname, fp);
732 if (co == NULL)
733 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000734 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000735 PySys_WriteStderr("import %s # from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000736 name, pathname);
737 write_compiled_module(co, cpathname, mtime);
738 }
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000739 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000740 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000741
742 return m;
743}
744
745
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000746/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +0000747static PyObject *load_module(char *, FILE *, char *, int);
748static struct filedescr *find_module(char *, PyObject *,
749 char *, size_t, FILE **);
750static struct _frozen *find_frozen(char *name);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000751
752/* Load a package and return its module object WITH INCREMENTED
753 REFERENCE COUNT */
754
755static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000756load_package(char *name, char *pathname)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000757{
758 PyObject *m, *d, *file, *path;
759 int err;
760 char buf[MAXPATHLEN+1];
761 FILE *fp = NULL;
762 struct filedescr *fdp;
763
764 m = PyImport_AddModule(name);
765 if (m == NULL)
766 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000767 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000768 PySys_WriteStderr("import %s # directory %s\n",
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000769 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000770 d = PyModule_GetDict(m);
771 file = PyString_FromString(pathname);
772 if (file == NULL)
773 return NULL;
774 path = Py_BuildValue("[O]", file);
775 if (path == NULL) {
776 Py_DECREF(file);
777 return NULL;
778 }
779 err = PyDict_SetItemString(d, "__file__", file);
780 if (err == 0)
781 err = PyDict_SetItemString(d, "__path__", path);
782 if (err != 0) {
783 m = NULL;
784 goto cleanup;
785 }
786 buf[0] = '\0';
787 fdp = find_module("__init__", path, buf, sizeof(buf), &fp);
788 if (fdp == NULL) {
789 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
790 PyErr_Clear();
791 }
792 else
793 m = NULL;
794 goto cleanup;
795 }
796 m = load_module(name, fp, buf, fdp->type);
797 if (fp != NULL)
798 fclose(fp);
799 cleanup:
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000800 Py_XDECREF(path);
801 Py_XDECREF(file);
802 return m;
803}
804
805
806/* Helper to test for built-in module */
807
808static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000809is_builtin(char *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000810{
811 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +0000812 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
813 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
814 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000815 return -1;
816 else
817 return 1;
818 }
819 }
820 return 0;
821}
822
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000823
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000824/* Search the path (default sys.path) for a module. Return the
825 corresponding filedescr struct, and (via return arguments) the
826 pathname and an open file. Return NULL if the module is not found. */
827
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000828#ifdef MS_COREDLL
Thomas Woutersb4bd21c2000-07-22 23:38:01 +0000829extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **,
830 char *, int);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000831#endif
832
Guido van Rossum0980bd91998-02-13 17:18:36 +0000833#ifdef CHECK_IMPORT_CASE
834static int check_case(char *, int, int, char *);
835#endif
836
Tim Petersdbd9ba62000-07-09 03:09:57 +0000837static int find_init_module(char *); /* Forward */
Guido van Rossum197346f1997-10-31 18:38:52 +0000838
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000839static struct filedescr *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000840find_module(char *realname, PyObject *path, char *buf, size_t buflen,
841 FILE **p_fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000842{
Fred Drake4c82b232000-06-30 16:18:57 +0000843 int i, npath;
844 size_t len, namelen;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000845 struct _frozen *f;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000846 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000847 FILE *fp = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000848 struct stat statbuf;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000849 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
850 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
851 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossum0506a431998-08-11 15:07:39 +0000852 char name[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000853
Fred Drake4c82b232000-06-30 16:18:57 +0000854 if (strlen(realname) > MAXPATHLEN) {
855 PyErr_SetString(PyExc_OverflowError, "module name is too long");
856 return NULL;
857 }
Guido van Rossum0506a431998-08-11 15:07:39 +0000858 strcpy(name, realname);
859
860 if (path != NULL && PyString_Check(path)) {
861 /* Submodule of "frozen" package:
862 Set name to the fullname, path to NULL
863 and continue as "usual" */
864 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
865 PyErr_SetString(PyExc_ImportError,
866 "full frozen module name too long");
867 return NULL;
868 }
869 strcpy(buf, PyString_AsString(path));
870 strcat(buf, ".");
871 strcat(buf, name);
872 strcpy(name, buf);
873 path = NULL;
874 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000875 if (path == NULL) {
876 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000877 strcpy(buf, name);
878 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000879 }
Guido van Rossuma5568d31998-03-05 03:45:08 +0000880 if ((f = find_frozen(name)) != NULL) {
881 strcpy(buf, name);
882 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000883 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000884
Guido van Rossumac279101996-08-22 23:10:58 +0000885#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000886 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
887 if (fp != NULL) {
888 *p_fp = fp;
889 return fdp;
890 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000891#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000892 path = PySys_GetObject("path");
893 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000894 if (path == NULL || !PyList_Check(path)) {
895 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +0000896 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000897 return NULL;
898 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000899 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000900 namelen = strlen(name);
901 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000902 PyObject *v = PyList_GetItem(path, i);
903 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000904 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000905 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000906 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000907 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000908 strcpy(buf, PyString_AsString(v));
Fred Drake4c82b232000-06-30 16:18:57 +0000909 if (strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000910 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000911#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000912#ifdef INTERN_STRINGS
913 /*
914 ** Speedup: each sys.path item is interned, and
915 ** FindResourceModule remembers which items refer to
916 ** folders (so we don't have to bother trying to look
917 ** into them for resources).
918 */
919 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
920 v = PyList_GET_ITEM(path, i);
921#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000922 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000923 static struct filedescr resfiledescr =
924 {"", "", PY_RESOURCE};
Jack Jansen9c96a921995-02-15 22:57:06 +0000925
926 return &resfiledescr;
927 }
Guido van Rossum0f84a341998-08-06 13:36:01 +0000928 if (PyMac_FindCodeResourceModule((PyStringObject *)v, name, buf)) {
929 static struct filedescr resfiledescr =
930 {"", "", PY_CODERESOURCE};
931
932 return &resfiledescr;
933 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000934#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000935 if (len > 0 && buf[len-1] != SEP
936#ifdef ALTSEP
937 && buf[len-1] != ALTSEP
938#endif
939 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000940 buf[len++] = SEP;
Guido van Rossum215c3402000-11-13 17:26:32 +0000941 strcpy(buf+len, name);
942 len += namelen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000943#ifdef HAVE_STAT
944 if (stat(buf, &statbuf) == 0) {
Guido van Rossum197346f1997-10-31 18:38:52 +0000945 if (S_ISDIR(statbuf.st_mode)) {
Guido van Rossum0980bd91998-02-13 17:18:36 +0000946 if (find_init_module(buf)) {
947#ifdef CHECK_IMPORT_CASE
948 if (!check_case(buf, len, namelen,
949 name))
950 return NULL;
951#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000952 return &fd_package;
Guido van Rossum0980bd91998-02-13 17:18:36 +0000953 }
Guido van Rossum197346f1997-10-31 18:38:52 +0000954 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000955 }
956#else
957 /* XXX How are you going to test for directories? */
958#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000959#ifdef macintosh
960 fdp = PyMac_FindModuleExtension(buf, &len, name);
961 if (fdp)
962 fp = fopen(buf, fdp->mode);
963#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000964 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000965 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000966 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000967 PySys_WriteStderr("# trying %s\n", buf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000968 fp = fopen(buf, fdp->mode);
969 if (fp != NULL)
970 break;
971 }
Guido van Rossum741689d1997-08-12 14:53:39 +0000972#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000973 if (fp != NULL)
974 break;
975 }
976 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000977 PyErr_Format(PyExc_ImportError,
978 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000979 return NULL;
980 }
Guido van Rossum0980bd91998-02-13 17:18:36 +0000981#ifdef CHECK_IMPORT_CASE
982 if (!check_case(buf, len, namelen, name)) {
983 fclose(fp);
984 return NULL;
985 }
986#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000987
988 *p_fp = fp;
989 return fdp;
990}
991
Guido van Rossum0980bd91998-02-13 17:18:36 +0000992#ifdef CHECK_IMPORT_CASE
993
Guido van Rossum4c3f57c2001-01-10 20:40:46 +0000994#if defined(MS_WIN32) || defined(__CYGWIN__)
Guido van Rossum0980bd91998-02-13 17:18:36 +0000995#include <windows.h>
Guido van Rossum323bf5e1998-06-24 03:54:06 +0000996#include <ctype.h>
997
998static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000999allcaps8x3(char *s)
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001000{
1001 /* Return 1 if s is an 8.3 filename in ALLCAPS */
1002 char c;
1003 char *dot = strchr(s, '.');
1004 char *end = strchr(s, '\0');
1005 if (dot != NULL) {
1006 if (dot-s > 8)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001007 return 0; /* More than 8 before '.' */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001008 if (end-dot > 4)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001009 return 0; /* More than 3 after '.' */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001010 end = strchr(dot+1, '.');
1011 if (end != NULL)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001012 return 0; /* More than one dot */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001013 }
1014 else if (end-s > 8)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001015 return 0; /* More than 8 and no dot */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001016 while ((c = *s++)) {
1017 if (islower(c))
1018 return 0;
1019 }
1020 return 1;
1021}
1022
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001023#ifdef __CYGWIN__
1024#include <sys/cygwin.h>
1025#endif
1026
Guido van Rossum0980bd91998-02-13 17:18:36 +00001027static int
1028check_case(char *buf, int len, int namelen, char *name)
1029{
1030 WIN32_FIND_DATA data;
1031 HANDLE h;
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001032#ifdef __CYGWIN__
1033 char tempbuf[MAX_PATH];
1034#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001035 if (getenv("PYTHONCASEOK") != NULL)
1036 return 1;
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001037#ifdef __CYGWIN__
1038 cygwin32_conv_to_win32_path(buf, tempbuf);
1039 h = FindFirstFile(tempbuf, &data);
1040#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001041 h = FindFirstFile(buf, &data);
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001042#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001043 if (h == INVALID_HANDLE_VALUE) {
1044 PyErr_Format(PyExc_NameError,
1045 "Can't find file for module %.100s\n(filename %.300s)",
1046 name, buf);
1047 return 0;
1048 }
1049 FindClose(h);
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001050 if (allcaps8x3(data.cFileName)) {
1051 /* Skip the test if the filename is ALL.CAPS. This can
1052 happen in certain circumstances beyond our control,
1053 e.g. when software is installed under NT on a FAT
1054 filesystem and then the same FAT filesystem is used
1055 under Windows 95. */
1056 return 1;
1057 }
Guido van Rossum0980bd91998-02-13 17:18:36 +00001058 if (strncmp(data.cFileName, name, namelen) != 0) {
1059 strcpy(buf+len-namelen, data.cFileName);
1060 PyErr_Format(PyExc_NameError,
1061 "Case mismatch for module name %.100s\n(filename %.300s)",
1062 name, buf);
1063 return 0;
1064 }
1065 return 1;
1066}
1067#endif /* MS_WIN32 */
1068
1069#ifdef macintosh
1070#include <TextUtils.h>
Guido van Rossumb33aa1a2000-04-24 15:08:18 +00001071#ifdef USE_GUSI1
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001072#include "TFileSpec.h" /* for Path2FSSpec() */
1073#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001074static int
1075check_case(char *buf, int len, int namelen, char *name)
1076{
1077 FSSpec fss;
1078 OSErr err;
Guido van Rossumb33aa1a2000-04-24 15:08:18 +00001079#ifndef USE_GUSI1
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001080 err = FSMakeFSSpec(0, 0, Pstring(buf), &fss);
1081#else
1082 /* GUSI's Path2FSSpec() resolves all possible aliases nicely on
1083 the way, which is fine for all directories, but here we need
1084 the original name of the alias file (say, Dlg.ppc.slb, not
1085 toolboxmodules.ppc.slb). */
1086 char *colon;
1087 err = Path2FSSpec(buf, &fss);
1088 if (err == noErr) {
1089 colon = strrchr(buf, ':'); /* find filename */
1090 if (colon != NULL)
1091 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1092 Pstring(colon+1), &fss);
1093 else
1094 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1095 fss.name, &fss);
1096 }
1097#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001098 if (err) {
1099 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001100 "Can't find file for module %.100s\n(filename %.300s)",
1101 name, buf);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001102 return 0;
1103 }
Guido van Rossum63e97ad2000-07-01 01:06:56 +00001104 if ( namelen > fss.name[0] || strncmp(name, (char *)fss.name+1, namelen) != 0 ) {
Guido van Rossum0980bd91998-02-13 17:18:36 +00001105 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001106 "Case mismatch for module name %.100s\n(filename %.300s)",
1107 name, fss.name);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001108 return 0;
1109 }
1110 return 1;
1111}
1112#endif /* macintosh */
1113
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001114#ifdef DJGPP
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001115#include <dir.h>
1116
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001117static int
1118check_case(char *buf, int len, int namelen, char *name)
1119{
1120 struct ffblk ffblk;
1121 int done;
1122
1123 if (getenv("PYTHONCASEOK") != NULL)
1124 return 1;
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001125 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001126 if (done) {
1127 PyErr_Format(PyExc_NameError,
1128 "Can't find file for module %.100s\n(filename %.300s)",
1129 name, buf);
1130 return 0;
1131 }
1132
1133 if (strncmp(ffblk.ff_name, name, namelen) != 0) {
1134 strcpy(buf+len-namelen, ffblk.ff_name);
1135 PyErr_Format(PyExc_NameError,
1136 "Case mismatch for module name %.100s\n(filename %.300s)",
1137 name, buf);
1138 return 0;
1139 }
1140 return 1;
1141}
1142#endif
1143
Guido van Rossum8766a771998-04-10 23:44:32 +00001144#endif /* CHECK_IMPORT_CASE */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001145
Guido van Rossum197346f1997-10-31 18:38:52 +00001146#ifdef HAVE_STAT
1147/* Helper to look for __init__.py or __init__.py[co] in potential package */
1148static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001149find_init_module(char *buf)
Guido van Rossum197346f1997-10-31 18:38:52 +00001150{
Fred Drake4c82b232000-06-30 16:18:57 +00001151 size_t save_len = strlen(buf);
1152 size_t i = save_len;
Guido van Rossum197346f1997-10-31 18:38:52 +00001153 struct stat statbuf;
1154
1155 if (save_len + 13 >= MAXPATHLEN)
1156 return 0;
1157 buf[i++] = SEP;
1158 strcpy(buf+i, "__init__.py");
1159 if (stat(buf, &statbuf) == 0) {
1160 buf[save_len] = '\0';
1161 return 1;
1162 }
1163 i += strlen(buf+i);
1164 if (Py_OptimizeFlag)
1165 strcpy(buf+i, "o");
1166 else
1167 strcpy(buf+i, "c");
1168 if (stat(buf, &statbuf) == 0) {
1169 buf[save_len] = '\0';
1170 return 1;
1171 }
1172 buf[save_len] = '\0';
1173 return 0;
1174}
1175#endif /* HAVE_STAT */
1176
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001177
Tim Petersdbd9ba62000-07-09 03:09:57 +00001178static int init_builtin(char *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001179
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001180/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001181 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001182
Guido van Rossum79f25d91997-04-29 20:08:16 +00001183static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001184load_module(char *name, FILE *fp, char *buf, int type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001185{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001186 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001187 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001188 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001189
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001190 /* First check that there's an open file (if we need one) */
1191 switch (type) {
1192 case PY_SOURCE:
1193 case PY_COMPILED:
1194 if (fp == NULL) {
1195 PyErr_Format(PyExc_ValueError,
1196 "file object required for import (type code %d)",
1197 type);
1198 return NULL;
1199 }
1200 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001201
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001202 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001203
1204 case PY_SOURCE:
1205 m = load_source_module(name, buf, fp);
1206 break;
1207
1208 case PY_COMPILED:
1209 m = load_compiled_module(name, buf, fp);
1210 break;
1211
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001212#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001213 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001214 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001215 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001216#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001217
Jack Jansen9c96a921995-02-15 22:57:06 +00001218#ifdef macintosh
1219 case PY_RESOURCE:
1220 m = PyMac_LoadResourceModule(name, buf);
1221 break;
Guido van Rossum0f84a341998-08-06 13:36:01 +00001222 case PY_CODERESOURCE:
1223 m = PyMac_LoadCodeResourceModule(name, buf);
1224 break;
Jack Jansen9c96a921995-02-15 22:57:06 +00001225#endif
1226
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001227 case PKG_DIRECTORY:
1228 m = load_package(name, buf);
1229 break;
1230
1231 case C_BUILTIN:
1232 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001233 if (buf != NULL && buf[0] != '\0')
1234 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001235 if (type == C_BUILTIN)
1236 err = init_builtin(name);
1237 else
1238 err = PyImport_ImportFrozenModule(name);
1239 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001240 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001241 if (err == 0) {
1242 PyErr_Format(PyExc_ImportError,
1243 "Purported %s module %.200s not found",
1244 type == C_BUILTIN ?
1245 "builtin" : "frozen",
1246 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001247 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001248 }
1249 modules = PyImport_GetModuleDict();
1250 m = PyDict_GetItemString(modules, name);
1251 if (m == NULL) {
1252 PyErr_Format(
1253 PyExc_ImportError,
1254 "%s module %.200s not properly initialized",
1255 type == C_BUILTIN ?
1256 "builtin" : "frozen",
1257 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001258 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001259 }
1260 Py_INCREF(m);
1261 break;
1262
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001263 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001264 PyErr_Format(PyExc_ImportError,
1265 "Don't know how to import %.200s (type code %d)",
1266 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001267 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001268
1269 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001270
1271 return m;
1272}
1273
1274
1275/* Initialize a built-in module.
1276 Return 1 for succes, 0 if the module is not found, and -1 with
1277 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001278
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001279static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001280init_builtin(char *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001281{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001282 struct _inittab *p;
1283 PyObject *mod;
1284
1285 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
1286 return 1;
1287
Guido van Rossum771c6c81997-10-31 18:37:24 +00001288 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001289 if (strcmp(name, p->name) == 0) {
1290 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001291 PyErr_Format(PyExc_ImportError,
1292 "Cannot re-init internal module %.200s",
1293 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001294 return -1;
1295 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001296 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001297 PySys_WriteStderr("import %s # builtin\n", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001298 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001299 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001300 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001301 if (_PyImport_FixupExtension(name, name) == NULL)
1302 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001303 return 1;
1304 }
1305 }
1306 return 0;
1307}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001308
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001309
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001310/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001311
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001312static struct _frozen *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001313find_frozen(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001314{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001315 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001316
Guido van Rossum79f25d91997-04-29 20:08:16 +00001317 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001318 if (p->name == NULL)
1319 return NULL;
1320 if (strcmp(p->name, name) == 0)
1321 break;
1322 }
1323 return p;
1324}
1325
Guido van Rossum79f25d91997-04-29 20:08:16 +00001326static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001327get_frozen_object(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001328{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001329 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001330 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001331
1332 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001333 PyErr_Format(PyExc_ImportError,
1334 "No such frozen object named %.200s",
1335 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001336 return NULL;
1337 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001338 size = p->size;
1339 if (size < 0)
1340 size = -size;
1341 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001342}
1343
1344/* Initialize a frozen module.
1345 Return 1 for succes, 0 if the module is not found, and -1 with
1346 an exception set if the initialization failed.
1347 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001348
1349int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001350PyImport_ImportFrozenModule(char *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001351{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001352 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001353 PyObject *co;
1354 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001355 int ispackage;
1356 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001357
1358 if (p == NULL)
1359 return 0;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001360 size = p->size;
1361 ispackage = (size < 0);
1362 if (ispackage)
1363 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001364 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001365 PySys_WriteStderr("import %s # frozen%s\n",
Guido van Rossuma5568d31998-03-05 03:45:08 +00001366 name, ispackage ? " package" : "");
1367 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001368 if (co == NULL)
1369 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001370 if (!PyCode_Check(co)) {
1371 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001372 PyErr_Format(PyExc_TypeError,
1373 "frozen object %.200s is not a code object",
1374 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001375 return -1;
1376 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001377 if (ispackage) {
1378 /* Set __path__ to the package name */
1379 PyObject *d, *s;
1380 int err;
1381 m = PyImport_AddModule(name);
1382 if (m == NULL)
1383 return -1;
1384 d = PyModule_GetDict(m);
1385 s = PyString_InternFromString(name);
1386 if (s == NULL)
1387 return -1;
1388 err = PyDict_SetItemString(d, "__path__", s);
1389 Py_DECREF(s);
1390 if (err != 0)
1391 return err;
1392 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001393 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001394 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001395 if (m == NULL)
1396 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001397 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001398 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001399}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001400
1401
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001402/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001403 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001404
Guido van Rossum79f25d91997-04-29 20:08:16 +00001405PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001406PyImport_ImportModule(char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00001407{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001408 static PyObject *fromlist = NULL;
1409 if (fromlist == NULL && strchr(name, '.') != NULL) {
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001410 fromlist = Py_BuildValue("(s)", "*");
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001411 if (fromlist == NULL)
1412 return NULL;
1413 }
1414 return PyImport_ImportModuleEx(name, NULL, NULL, fromlist);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001415}
1416
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001417/* Forward declarations for helper routines */
Tim Petersdbd9ba62000-07-09 03:09:57 +00001418static PyObject *get_parent(PyObject *globals, char *buf, int *p_buflen);
1419static PyObject *load_next(PyObject *mod, PyObject *altmod,
1420 char **p_name, char *buf, int *p_buflen);
1421static int mark_miss(char *name);
1422static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
1423 char *buf, int buflen, int recursive);
1424static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001425
1426/* The Magnum Opus of dotted-name import :-) */
1427
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001428static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001429import_module_ex(char *name, PyObject *globals, PyObject *locals,
1430 PyObject *fromlist)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001431{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001432 char buf[MAXPATHLEN+1];
1433 int buflen = 0;
1434 PyObject *parent, *head, *next, *tail;
1435
1436 parent = get_parent(globals, buf, &buflen);
1437 if (parent == NULL)
1438 return NULL;
1439
1440 head = load_next(parent, Py_None, &name, buf, &buflen);
1441 if (head == NULL)
1442 return NULL;
1443
1444 tail = head;
1445 Py_INCREF(tail);
1446 while (name) {
1447 next = load_next(tail, tail, &name, buf, &buflen);
1448 Py_DECREF(tail);
1449 if (next == NULL) {
1450 Py_DECREF(head);
1451 return NULL;
1452 }
1453 tail = next;
1454 }
1455
1456 if (fromlist != NULL) {
1457 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1458 fromlist = NULL;
1459 }
1460
1461 if (fromlist == NULL) {
1462 Py_DECREF(tail);
1463 return head;
1464 }
1465
1466 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001467 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001468 Py_DECREF(tail);
1469 return NULL;
1470 }
1471
1472 return tail;
1473}
1474
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001475PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001476PyImport_ImportModuleEx(char *name, PyObject *globals, PyObject *locals,
1477 PyObject *fromlist)
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001478{
1479 PyObject *result;
1480 lock_import();
Guido van Rossumd65911b1998-03-03 22:33:27 +00001481 result = import_module_ex(name, globals, locals, fromlist);
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001482 unlock_import();
1483 return result;
1484}
1485
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001486static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001487get_parent(PyObject *globals, char *buf, int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001488{
1489 static PyObject *namestr = NULL;
1490 static PyObject *pathstr = NULL;
1491 PyObject *modname, *modpath, *modules, *parent;
1492
1493 if (globals == NULL || !PyDict_Check(globals))
1494 return Py_None;
1495
1496 if (namestr == NULL) {
1497 namestr = PyString_InternFromString("__name__");
1498 if (namestr == NULL)
1499 return NULL;
1500 }
1501 if (pathstr == NULL) {
1502 pathstr = PyString_InternFromString("__path__");
1503 if (pathstr == NULL)
1504 return NULL;
1505 }
1506
1507 *buf = '\0';
1508 *p_buflen = 0;
1509 modname = PyDict_GetItem(globals, namestr);
1510 if (modname == NULL || !PyString_Check(modname))
1511 return Py_None;
1512
1513 modpath = PyDict_GetItem(globals, pathstr);
1514 if (modpath != NULL) {
1515 int len = PyString_GET_SIZE(modname);
1516 if (len > MAXPATHLEN) {
1517 PyErr_SetString(PyExc_ValueError,
1518 "Module name too long");
1519 return NULL;
1520 }
1521 strcpy(buf, PyString_AS_STRING(modname));
1522 *p_buflen = len;
1523 }
1524 else {
1525 char *start = PyString_AS_STRING(modname);
1526 char *lastdot = strrchr(start, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001527 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001528 if (lastdot == NULL)
1529 return Py_None;
1530 len = lastdot - start;
1531 if (len >= MAXPATHLEN) {
1532 PyErr_SetString(PyExc_ValueError,
1533 "Module name too long");
1534 return NULL;
1535 }
1536 strncpy(buf, start, len);
1537 buf[len] = '\0';
1538 *p_buflen = len;
1539 }
1540
1541 modules = PyImport_GetModuleDict();
1542 parent = PyDict_GetItemString(modules, buf);
1543 if (parent == NULL)
1544 parent = Py_None;
1545 return parent;
1546 /* We expect, but can't guarantee, if parent != None, that:
1547 - parent.__name__ == buf
1548 - parent.__dict__ is globals
1549 If this is violated... Who cares? */
1550}
1551
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001552/* altmod is either None or same as mod */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001553static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001554load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
1555 int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001556{
1557 char *name = *p_name;
1558 char *dot = strchr(name, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001559 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001560 char *p;
1561 PyObject *result;
1562
1563 if (dot == NULL) {
1564 *p_name = NULL;
1565 len = strlen(name);
1566 }
1567 else {
1568 *p_name = dot+1;
1569 len = dot-name;
1570 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00001571 if (len == 0) {
1572 PyErr_SetString(PyExc_ValueError,
1573 "Empty module name");
1574 return NULL;
1575 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001576
1577 p = buf + *p_buflen;
1578 if (p != buf)
1579 *p++ = '.';
1580 if (p+len-buf >= MAXPATHLEN) {
1581 PyErr_SetString(PyExc_ValueError,
1582 "Module name too long");
1583 return NULL;
1584 }
1585 strncpy(p, name, len);
1586 p[len] = '\0';
1587 *p_buflen = p+len-buf;
1588
1589 result = import_submodule(mod, p, buf);
1590 if (result == Py_None && altmod != mod) {
1591 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001592 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001593 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001594 if (result != NULL && result != Py_None) {
1595 if (mark_miss(buf) != 0) {
1596 Py_DECREF(result);
1597 return NULL;
1598 }
1599 strncpy(buf, name, len);
1600 buf[len] = '\0';
1601 *p_buflen = len;
1602 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001603 }
1604 if (result == NULL)
1605 return NULL;
1606
1607 if (result == Py_None) {
1608 Py_DECREF(result);
1609 PyErr_Format(PyExc_ImportError,
1610 "No module named %.200s", name);
1611 return NULL;
1612 }
1613
1614 return result;
1615}
1616
1617static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001618mark_miss(char *name)
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001619{
1620 PyObject *modules = PyImport_GetModuleDict();
1621 return PyDict_SetItemString(modules, name, Py_None);
1622}
1623
1624static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001625ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, int buflen,
1626 int recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001627{
1628 int i;
1629
1630 if (!PyObject_HasAttrString(mod, "__path__"))
1631 return 1;
1632
1633 for (i = 0; ; i++) {
1634 PyObject *item = PySequence_GetItem(fromlist, i);
1635 int hasit;
1636 if (item == NULL) {
1637 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1638 PyErr_Clear();
1639 return 1;
1640 }
1641 return 0;
1642 }
1643 if (!PyString_Check(item)) {
1644 PyErr_SetString(PyExc_TypeError,
1645 "Item in ``from list'' not a string");
1646 Py_DECREF(item);
1647 return 0;
1648 }
1649 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001650 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001651 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001652 /* See if the package defines __all__ */
1653 if (recursive)
1654 continue; /* Avoid endless recursion */
1655 all = PyObject_GetAttrString(mod, "__all__");
1656 if (all == NULL)
1657 PyErr_Clear();
1658 else {
1659 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1660 return 0;
1661 Py_DECREF(all);
1662 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001663 continue;
1664 }
1665 hasit = PyObject_HasAttr(mod, item);
1666 if (!hasit) {
1667 char *subname = PyString_AS_STRING(item);
1668 PyObject *submod;
1669 char *p;
1670 if (buflen + strlen(subname) >= MAXPATHLEN) {
1671 PyErr_SetString(PyExc_ValueError,
1672 "Module name too long");
1673 Py_DECREF(item);
1674 return 0;
1675 }
1676 p = buf + buflen;
1677 *p++ = '.';
1678 strcpy(p, subname);
1679 submod = import_submodule(mod, subname, buf);
1680 Py_XDECREF(submod);
1681 if (submod == NULL) {
1682 Py_DECREF(item);
1683 return 0;
1684 }
1685 }
1686 Py_DECREF(item);
1687 }
1688
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001689 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001690}
1691
1692static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001693import_submodule(PyObject *mod, char *subname, char *fullname)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001694{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001695 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001696 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001697
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001698 /* Require:
1699 if mod == None: subname == fullname
1700 else: mod.__name__ + "." + subname == fullname
1701 */
1702
1703 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001704 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001705 }
1706 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001707 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001708 char buf[MAXPATHLEN+1];
1709 struct filedescr *fdp;
1710 FILE *fp = NULL;
1711
Guido van Rossum9c0afe51998-05-19 15:09:05 +00001712 if (mod == Py_None)
1713 path = NULL;
1714 else {
1715 path = PyObject_GetAttrString(mod, "__path__");
1716 if (path == NULL) {
1717 PyErr_Clear();
1718 Py_INCREF(Py_None);
1719 return Py_None;
1720 }
1721 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001722
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001723 buf[0] = '\0';
Guido van Rossumb68cd421998-07-01 17:36:26 +00001724 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1725 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001726 if (fdp == NULL) {
1727 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1728 return NULL;
1729 PyErr_Clear();
1730 Py_INCREF(Py_None);
1731 return Py_None;
1732 }
1733 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001734 if (fp)
1735 fclose(fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001736 if (m != NULL && mod != Py_None) {
1737 if (PyObject_SetAttrString(mod, subname, m) < 0) {
1738 Py_DECREF(m);
1739 m = NULL;
1740 }
1741 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001742 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001743
1744 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001745}
1746
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001747
1748/* Re-import a module of any kind and return its module object, WITH
1749 INCREMENTED REFERENCE COUNT */
1750
Guido van Rossum79f25d91997-04-29 20:08:16 +00001751PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001752PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001753{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001754 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001755 PyObject *path = NULL;
1756 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001757 char buf[MAXPATHLEN+1];
1758 struct filedescr *fdp;
1759 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001760
Guido van Rossum79f25d91997-04-29 20:08:16 +00001761 if (m == NULL || !PyModule_Check(m)) {
1762 PyErr_SetString(PyExc_TypeError,
1763 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001764 return NULL;
1765 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001766 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001767 if (name == NULL)
1768 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001769 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001770 PyErr_Format(PyExc_ImportError,
1771 "reload(): module %.200s not in sys.modules",
1772 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001773 return NULL;
1774 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001775 subname = strrchr(name, '.');
1776 if (subname == NULL)
1777 subname = name;
1778 else {
1779 PyObject *parentname, *parent;
1780 parentname = PyString_FromStringAndSize(name, (subname-name));
1781 if (parentname == NULL)
1782 return NULL;
1783 parent = PyDict_GetItem(modules, parentname);
Barry Warsaw38793331999-01-27 17:54:20 +00001784 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00001785 if (parent == NULL) {
1786 PyErr_Format(PyExc_ImportError,
1787 "reload(): parent %.200s not in sys.modules",
1788 name);
1789 return NULL;
1790 }
1791 subname++;
1792 path = PyObject_GetAttrString(parent, "__path__");
1793 if (path == NULL)
1794 PyErr_Clear();
1795 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001796 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001797 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1798 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001799 if (fdp == NULL)
1800 return NULL;
1801 m = load_module(name, fp, buf, fdp->type);
1802 if (fp)
1803 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001804 return m;
1805}
1806
1807
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001808/* Higher-level import emulator which emulates the "import" statement
1809 more accurately -- it invokes the __import__() function from the
1810 builtins of the current globals. This means that the import is
1811 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00001812 environment, e.g. by "rexec".
1813 A dummy list ["__doc__"] is passed as the 4th argument so that
1814 e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
1815 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001816
1817PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001818PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001819{
1820 static PyObject *silly_list = NULL;
1821 static PyObject *builtins_str = NULL;
1822 static PyObject *import_str = NULL;
1823 static PyObject *standard_builtins = NULL;
1824 PyObject *globals = NULL;
1825 PyObject *import = NULL;
1826 PyObject *builtins = NULL;
1827 PyObject *r = NULL;
1828
1829 /* Initialize constant string objects */
1830 if (silly_list == NULL) {
1831 import_str = PyString_InternFromString("__import__");
1832 if (import_str == NULL)
1833 return NULL;
1834 builtins_str = PyString_InternFromString("__builtins__");
1835 if (builtins_str == NULL)
1836 return NULL;
1837 silly_list = Py_BuildValue("[s]", "__doc__");
1838 if (silly_list == NULL)
1839 return NULL;
1840 }
1841
1842 /* Get the builtins from current globals */
1843 globals = PyEval_GetGlobals();
1844 if(globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00001845 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001846 builtins = PyObject_GetItem(globals, builtins_str);
1847 if (builtins == NULL)
1848 goto err;
1849 }
1850 else {
1851 /* No globals -- use standard builtins, and fake globals */
1852 PyErr_Clear();
1853
1854 if (standard_builtins == NULL) {
1855 standard_builtins =
1856 PyImport_ImportModule("__builtin__");
1857 if (standard_builtins == NULL)
1858 return NULL;
1859 }
1860
1861 builtins = standard_builtins;
1862 Py_INCREF(builtins);
1863 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1864 if (globals == NULL)
1865 goto err;
1866 }
1867
1868 /* Get the __import__ function from the builtins */
1869 if (PyDict_Check(builtins))
1870 import=PyObject_GetItem(builtins, import_str);
1871 else
1872 import=PyObject_GetAttr(builtins, import_str);
1873 if (import == NULL)
1874 goto err;
1875
1876 /* Call the _import__ function with the proper argument list */
1877 r = PyObject_CallFunction(import, "OOOO",
1878 module_name, globals, globals, silly_list);
1879
1880 err:
1881 Py_XDECREF(globals);
1882 Py_XDECREF(builtins);
1883 Py_XDECREF(import);
1884
1885 return r;
1886}
1887
1888
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001889/* Module 'imp' provides Python access to the primitives used for
1890 importing modules.
1891*/
1892
Guido van Rossum79f25d91997-04-29 20:08:16 +00001893static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001894imp_get_magic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001895{
1896 char buf[4];
1897
Guido van Rossum43713e52000-02-29 13:59:29 +00001898 if (!PyArg_ParseTuple(args, ":get_magic"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001899 return NULL;
Guido van Rossum96774c12000-05-01 20:19:08 +00001900 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
1901 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
1902 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
1903 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001904
Guido van Rossum79f25d91997-04-29 20:08:16 +00001905 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001906}
1907
Guido van Rossum79f25d91997-04-29 20:08:16 +00001908static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001909imp_get_suffixes(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001910{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001911 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001912 struct filedescr *fdp;
1913
Guido van Rossum43713e52000-02-29 13:59:29 +00001914 if (!PyArg_ParseTuple(args, ":get_suffixes"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001915 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001916 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001917 if (list == NULL)
1918 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001919 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
1920 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001921 fdp->suffix, fdp->mode, fdp->type);
1922 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001923 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001924 return NULL;
1925 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001926 if (PyList_Append(list, item) < 0) {
1927 Py_DECREF(list);
1928 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001929 return NULL;
1930 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001931 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001932 }
1933 return list;
1934}
1935
Guido van Rossum79f25d91997-04-29 20:08:16 +00001936static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001937call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001938{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001939 extern int fclose(FILE *);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001940 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001941 struct filedescr *fdp;
1942 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001943 FILE *fp = NULL;
1944
1945 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001946 if (path == Py_None)
1947 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001948 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
1949 if (fdp == NULL)
1950 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001951 if (fp != NULL) {
1952 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
1953 if (fob == NULL) {
1954 fclose(fp);
1955 return NULL;
1956 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001957 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001958 else {
1959 fob = Py_None;
1960 Py_INCREF(fob);
1961 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001962 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001963 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001964 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001965 return ret;
1966}
1967
Guido van Rossum79f25d91997-04-29 20:08:16 +00001968static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001969imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001970{
1971 char *name;
1972 PyObject *path = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00001973 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001974 return NULL;
1975 return call_find_module(name, path);
1976}
1977
1978static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001979imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001980{
1981 char *name;
1982 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001983 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00001984 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001985 return NULL;
1986 ret = init_builtin(name);
1987 if (ret < 0)
1988 return NULL;
1989 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001990 Py_INCREF(Py_None);
1991 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001992 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001993 m = PyImport_AddModule(name);
1994 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001995 return m;
1996}
1997
Guido van Rossum79f25d91997-04-29 20:08:16 +00001998static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001999imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002000{
2001 char *name;
2002 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002003 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002004 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002005 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002006 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002007 if (ret < 0)
2008 return NULL;
2009 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002010 Py_INCREF(Py_None);
2011 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002012 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002013 m = PyImport_AddModule(name);
2014 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002015 return m;
2016}
2017
Guido van Rossum79f25d91997-04-29 20:08:16 +00002018static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002019imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002020{
2021 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002022
Guido van Rossum43713e52000-02-29 13:59:29 +00002023 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002024 return NULL;
2025 return get_frozen_object(name);
2026}
2027
Guido van Rossum79f25d91997-04-29 20:08:16 +00002028static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002029imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002030{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002031 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002032 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002033 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002034 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002035}
2036
Guido van Rossum79f25d91997-04-29 20:08:16 +00002037static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002038imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002039{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002040 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002041 struct _frozen *p;
Guido van Rossum43713e52000-02-29 13:59:29 +00002042 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002043 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002044 p = find_frozen(name);
2045 return PyInt_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002046}
2047
2048static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002049get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002050{
2051 FILE *fp;
2052 if (fob == NULL) {
2053 fp = fopen(pathname, mode);
2054 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002055 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002056 }
2057 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002058 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002059 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002060 PyErr_SetString(PyExc_ValueError,
2061 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002062 }
2063 return fp;
2064}
2065
Guido van Rossum79f25d91997-04-29 20:08:16 +00002066static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002067imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002068{
2069 char *name;
2070 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002071 PyObject *fob = NULL;
2072 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002073 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002074 if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002075 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002076 return NULL;
2077 fp = get_file(pathname, fob, "rb");
2078 if (fp == NULL)
2079 return NULL;
2080 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002081 if (fob == NULL)
2082 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002083 return m;
2084}
2085
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002086#ifdef HAVE_DYNAMIC_LOADING
2087
Guido van Rossum79f25d91997-04-29 20:08:16 +00002088static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002089imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002090{
2091 char *name;
2092 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002093 PyObject *fob = NULL;
2094 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002095 FILE *fp = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002096 if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002097 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002098 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002099 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002100 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002101 if (fp == NULL)
2102 return NULL;
2103 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002104 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002105 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002106}
2107
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002108#endif /* HAVE_DYNAMIC_LOADING */
2109
Guido van Rossum79f25d91997-04-29 20:08:16 +00002110static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002111imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002112{
2113 char *name;
2114 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002115 PyObject *fob = NULL;
2116 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002117 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002118 if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002119 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002120 return NULL;
2121 fp = get_file(pathname, fob, "r");
2122 if (fp == NULL)
2123 return NULL;
2124 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002125 if (fob == NULL)
2126 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002127 return m;
2128}
2129
Jack Jansen9c96a921995-02-15 22:57:06 +00002130#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002131static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002132imp_load_resource(PyObject *self, PyObject *args)
Jack Jansen9c96a921995-02-15 22:57:06 +00002133{
2134 char *name;
2135 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002136 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002137
Guido van Rossum43713e52000-02-29 13:59:29 +00002138 if (!PyArg_ParseTuple(args, "ss:load_resource", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002139 return NULL;
2140 m = PyMac_LoadResourceModule(name, pathname);
2141 return m;
2142}
2143#endif /* macintosh */
2144
Guido van Rossum79f25d91997-04-29 20:08:16 +00002145static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002146imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002147{
2148 char *name;
2149 PyObject *fob;
2150 char *pathname;
2151 char *suffix; /* Unused */
2152 char *mode;
2153 int type;
2154 FILE *fp;
2155
Guido van Rossum43713e52000-02-29 13:59:29 +00002156 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002157 &name, &fob, &pathname,
2158 &suffix, &mode, &type))
2159 return NULL;
2160 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
2161 PyErr_Format(PyExc_ValueError,
2162 "invalid file open mode %.200s", mode);
2163 return NULL;
2164 }
2165 if (fob == Py_None)
2166 fp = NULL;
2167 else {
2168 if (!PyFile_Check(fob)) {
2169 PyErr_SetString(PyExc_ValueError,
2170 "load_module arg#2 should be a file or None");
2171 return NULL;
2172 }
2173 fp = get_file(pathname, fob, mode);
2174 if (fp == NULL)
2175 return NULL;
2176 }
2177 return load_module(name, fp, pathname, type);
2178}
2179
2180static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002181imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002182{
2183 char *name;
2184 char *pathname;
Guido van Rossum43713e52000-02-29 13:59:29 +00002185 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002186 return NULL;
2187 return load_package(name, pathname);
2188}
2189
2190static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002191imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002192{
2193 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002194 if (!PyArg_ParseTuple(args, "s:new_module", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002195 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002196 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002197}
2198
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002199/* Doc strings */
2200
2201static char doc_imp[] = "\
2202This module provides the components needed to build your own\n\
2203__import__ function. Undocumented functions are obsolete.\n\
2204";
2205
2206static char doc_find_module[] = "\
2207find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
2208Search for a module. If path is omitted or None, search for a\n\
2209built-in, frozen or special module and continue search in sys.path.\n\
2210The module name cannot contain '.'; to search for a submodule of a\n\
2211package, pass the submodule name and the package's __path__.\
2212";
2213
2214static char doc_load_module[] = "\
2215load_module(name, file, filename, (suffix, mode, type)) -> module\n\
2216Load a module, given information returned by find_module().\n\
2217The module name must include the full package name, if any.\
2218";
2219
2220static char doc_get_magic[] = "\
2221get_magic() -> string\n\
2222Return the magic number for .pyc or .pyo files.\
2223";
2224
2225static char doc_get_suffixes[] = "\
2226get_suffixes() -> [(suffix, mode, type), ...]\n\
2227Return a list of (suffix, mode, type) tuples describing the files\n\
2228that find_module() looks for.\
2229";
2230
2231static char doc_new_module[] = "\
2232new_module(name) -> module\n\
2233Create a new module. Do not enter it in sys.modules.\n\
2234The module name must include the full package name, if any.\
2235";
2236
Guido van Rossum79f25d91997-04-29 20:08:16 +00002237static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002238 {"find_module", imp_find_module, 1, doc_find_module},
2239 {"get_magic", imp_get_magic, 1, doc_get_magic},
2240 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2241 {"load_module", imp_load_module, 1, doc_load_module},
2242 {"new_module", imp_new_module, 1, doc_new_module},
2243 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002244 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002245 {"init_builtin", imp_init_builtin, 1},
2246 {"init_frozen", imp_init_frozen, 1},
2247 {"is_builtin", imp_is_builtin, 1},
2248 {"is_frozen", imp_is_frozen, 1},
2249 {"load_compiled", imp_load_compiled, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002250#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002251 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002252#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002253 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002254#ifdef macintosh
2255 {"load_resource", imp_load_resource, 1},
2256#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002257 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002258 {NULL, NULL} /* sentinel */
2259};
2260
Guido van Rossum1a8791e1998-08-04 22:46:29 +00002261static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002262setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002263{
2264 PyObject *v;
2265 int err;
2266
2267 v = PyInt_FromLong((long)value);
2268 err = PyDict_SetItemString(d, name, v);
2269 Py_XDECREF(v);
2270 return err;
2271}
2272
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002273void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002274initimp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002275{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002276 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002277
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002278 m = Py_InitModule4("imp", imp_methods, doc_imp,
2279 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002280 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002281
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002282 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2283 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2284 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2285 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2286 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2287 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2288 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2289 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00002290 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002291
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002292 failure:
2293 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002294}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002295
2296
Guido van Rossumb18618d2000-05-03 23:44:39 +00002297/* API for embedding applications that want to add their own entries
2298 to the table of built-in modules. This should normally be called
2299 *before* Py_Initialize(). When the table resize fails, -1 is
2300 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002301
2302 After a similar function by Just van Rossum. */
2303
2304int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002305PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002306{
2307 static struct _inittab *our_copy = NULL;
2308 struct _inittab *p;
2309 int i, n;
2310
2311 /* Count the number of entries in both tables */
2312 for (n = 0; newtab[n].name != NULL; n++)
2313 ;
2314 if (n == 0)
2315 return 0; /* Nothing to do */
2316 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2317 ;
2318
2319 /* Allocate new memory for the combined table */
Guido van Rossumb18618d2000-05-03 23:44:39 +00002320 p = our_copy;
2321 PyMem_RESIZE(p, struct _inittab, i+n+1);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002322 if (p == NULL)
2323 return -1;
2324
2325 /* Copy the tables into the new memory */
2326 if (our_copy != PyImport_Inittab)
2327 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2328 PyImport_Inittab = our_copy = p;
2329 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
2330
2331 return 0;
2332}
2333
2334/* Shorthand to add a single entry given a name and a function */
2335
2336int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002337PyImport_AppendInittab(char *name, void (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002338{
2339 struct _inittab newtab[2];
2340
2341 memset(newtab, '\0', sizeof newtab);
2342
2343 newtab[0].name = name;
2344 newtab[0].initfunc = initfunc;
2345
2346 return PyImport_ExtendInittab(newtab);
2347}