blob: 71af3bd3f2172c9966e92854cdba161582346e24 [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 Hyltonb1cbc1e2001-02-02 20:13:24 +000046#define MAGIC (60202 | ((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
Barry Warsaw914a0b12001-02-02 19:12:16 +0000839#ifdef HAVE_DIRENT_H
840
841static int MatchFilename(char *pathname, char *filename);
842
843#include <sys/types.h>
844#include <dirent.h>
845
846static int MatchFilename(char *pathname, char *filename)
847{
848 DIR *dirp;
849 struct dirent *dp;
850 int len = strlen(filename);
851
852 if ((pathname == NULL) || (strlen(pathname) == 0))
853 pathname = ".";
854 dirp = opendir(pathname);
855 if (dirp) {
856 while ((dp = readdir(dirp)) != NULL) {
857#ifdef _DIRENT_HAVE_D_NAMELINE
858 int namelen = dp->d_namlen;
859#else /* !_DIRENT_HAVE_D_NAMELINE */
860 int namelen = strlen(dp->d_name);
861#endif /* _DIRENT_HAVE_D_NAMELINE */
862 if (namelen == len && !strcmp(dp->d_name, filename)) {
863 (void)closedir(dirp);
864 return 1; /* Found */
865 }
866 }
867 }
868 (void)closedir(dirp);
869 return 0 ; /* Not found */
870}
871#endif /* HAVE_DIRENT_H */
872
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000873static struct filedescr *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000874find_module(char *realname, PyObject *path, char *buf, size_t buflen,
875 FILE **p_fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000876{
Fred Drake4c82b232000-06-30 16:18:57 +0000877 int i, npath;
878 size_t len, namelen;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000879 struct _frozen *f;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000880 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000881 FILE *fp = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000882 struct stat statbuf;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000883 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
884 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
885 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossum0506a431998-08-11 15:07:39 +0000886 char name[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000887
Fred Drake4c82b232000-06-30 16:18:57 +0000888 if (strlen(realname) > MAXPATHLEN) {
889 PyErr_SetString(PyExc_OverflowError, "module name is too long");
890 return NULL;
891 }
Guido van Rossum0506a431998-08-11 15:07:39 +0000892 strcpy(name, realname);
893
894 if (path != NULL && PyString_Check(path)) {
895 /* Submodule of "frozen" package:
896 Set name to the fullname, path to NULL
897 and continue as "usual" */
898 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
899 PyErr_SetString(PyExc_ImportError,
900 "full frozen module name too long");
901 return NULL;
902 }
903 strcpy(buf, PyString_AsString(path));
904 strcat(buf, ".");
905 strcat(buf, name);
906 strcpy(name, buf);
907 path = NULL;
908 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000909 if (path == NULL) {
910 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000911 strcpy(buf, name);
912 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000913 }
Guido van Rossuma5568d31998-03-05 03:45:08 +0000914 if ((f = find_frozen(name)) != NULL) {
915 strcpy(buf, name);
916 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000917 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000918
Guido van Rossumac279101996-08-22 23:10:58 +0000919#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000920 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
921 if (fp != NULL) {
922 *p_fp = fp;
923 return fdp;
924 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000925#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000926 path = PySys_GetObject("path");
927 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000928 if (path == NULL || !PyList_Check(path)) {
929 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +0000930 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000931 return NULL;
932 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000933 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000934 namelen = strlen(name);
935 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000936 PyObject *v = PyList_GetItem(path, i);
937 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000938 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000939 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000940 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000941 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000942 strcpy(buf, PyString_AsString(v));
Fred Drake4c82b232000-06-30 16:18:57 +0000943 if (strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000944 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000945#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000946#ifdef INTERN_STRINGS
947 /*
948 ** Speedup: each sys.path item is interned, and
949 ** FindResourceModule remembers which items refer to
950 ** folders (so we don't have to bother trying to look
951 ** into them for resources).
952 */
953 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
954 v = PyList_GET_ITEM(path, i);
955#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000956 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000957 static struct filedescr resfiledescr =
958 {"", "", PY_RESOURCE};
Jack Jansen9c96a921995-02-15 22:57:06 +0000959
960 return &resfiledescr;
961 }
Guido van Rossum0f84a341998-08-06 13:36:01 +0000962 if (PyMac_FindCodeResourceModule((PyStringObject *)v, name, buf)) {
963 static struct filedescr resfiledescr =
964 {"", "", PY_CODERESOURCE};
965
966 return &resfiledescr;
967 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000968#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000969 if (len > 0 && buf[len-1] != SEP
970#ifdef ALTSEP
971 && buf[len-1] != ALTSEP
972#endif
973 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000974 buf[len++] = SEP;
Guido van Rossum215c3402000-11-13 17:26:32 +0000975 strcpy(buf+len, name);
976 len += namelen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000977#ifdef HAVE_STAT
978 if (stat(buf, &statbuf) == 0) {
Guido van Rossum197346f1997-10-31 18:38:52 +0000979 if (S_ISDIR(statbuf.st_mode)) {
Guido van Rossum0980bd91998-02-13 17:18:36 +0000980 if (find_init_module(buf)) {
981#ifdef CHECK_IMPORT_CASE
982 if (!check_case(buf, len, namelen,
983 name))
984 return NULL;
985#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000986 return &fd_package;
Guido van Rossum0980bd91998-02-13 17:18:36 +0000987 }
Guido van Rossum197346f1997-10-31 18:38:52 +0000988 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000989 }
990#else
991 /* XXX How are you going to test for directories? */
992#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000993#ifdef macintosh
994 fdp = PyMac_FindModuleExtension(buf, &len, name);
995 if (fdp)
996 fp = fopen(buf, fdp->mode);
997#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000998 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000999 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001000 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001001 PySys_WriteStderr("# trying %s\n", buf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001002 fp = fopen(buf, fdp->mode);
Barry Warsaw914a0b12001-02-02 19:12:16 +00001003#ifdef HAVE_DIRENT_H
1004
1005 if (fp != NULL) { /* check case */
1006 char *curpath = PyString_AsString(v);
1007 char *nstart = buf + strlen(curpath);
1008 if (*nstart == SEP)
1009 nstart++;
1010 if (MatchFilename(curpath, nstart)) {
1011 break; /* Found */
1012 }
1013 fclose(fp); /* No. Close & continue search */
1014 fp = NULL;
1015 if (Py_VerboseFlag > 1)
1016 PySys_WriteStderr(
1017 "# case mismatch for %s: %s\n",
1018 name, buf);
1019 }
1020#else /* !HAVE_DIRENT_H */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001021 if (fp != NULL)
1022 break;
Barry Warsaw914a0b12001-02-02 19:12:16 +00001023#endif /* HAVE_DIRENT_H */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001024 }
Guido van Rossum741689d1997-08-12 14:53:39 +00001025#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001026 if (fp != NULL)
1027 break;
1028 }
1029 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001030 PyErr_Format(PyExc_ImportError,
1031 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001032 return NULL;
1033 }
Guido van Rossum0980bd91998-02-13 17:18:36 +00001034#ifdef CHECK_IMPORT_CASE
1035 if (!check_case(buf, len, namelen, name)) {
1036 fclose(fp);
1037 return NULL;
1038 }
1039#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001040
1041 *p_fp = fp;
1042 return fdp;
1043}
1044
Guido van Rossum0980bd91998-02-13 17:18:36 +00001045#ifdef CHECK_IMPORT_CASE
1046
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001047#if defined(MS_WIN32) || defined(__CYGWIN__)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001048#include <windows.h>
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001049#include <ctype.h>
1050
1051static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001052allcaps8x3(char *s)
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001053{
1054 /* Return 1 if s is an 8.3 filename in ALLCAPS */
1055 char c;
1056 char *dot = strchr(s, '.');
1057 char *end = strchr(s, '\0');
1058 if (dot != NULL) {
1059 if (dot-s > 8)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001060 return 0; /* More than 8 before '.' */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001061 if (end-dot > 4)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001062 return 0; /* More than 3 after '.' */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001063 end = strchr(dot+1, '.');
1064 if (end != NULL)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001065 return 0; /* More than one dot */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001066 }
1067 else if (end-s > 8)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001068 return 0; /* More than 8 and no dot */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001069 while ((c = *s++)) {
1070 if (islower(c))
1071 return 0;
1072 }
1073 return 1;
1074}
1075
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001076#ifdef __CYGWIN__
1077#include <sys/cygwin.h>
1078#endif
1079
Guido van Rossum0980bd91998-02-13 17:18:36 +00001080static int
1081check_case(char *buf, int len, int namelen, char *name)
1082{
1083 WIN32_FIND_DATA data;
1084 HANDLE h;
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001085#ifdef __CYGWIN__
1086 char tempbuf[MAX_PATH];
1087#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001088 if (getenv("PYTHONCASEOK") != NULL)
1089 return 1;
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001090#ifdef __CYGWIN__
1091 cygwin32_conv_to_win32_path(buf, tempbuf);
1092 h = FindFirstFile(tempbuf, &data);
1093#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001094 h = FindFirstFile(buf, &data);
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001095#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001096 if (h == INVALID_HANDLE_VALUE) {
1097 PyErr_Format(PyExc_NameError,
1098 "Can't find file for module %.100s\n(filename %.300s)",
1099 name, buf);
1100 return 0;
1101 }
1102 FindClose(h);
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001103 if (allcaps8x3(data.cFileName)) {
1104 /* Skip the test if the filename is ALL.CAPS. This can
1105 happen in certain circumstances beyond our control,
1106 e.g. when software is installed under NT on a FAT
1107 filesystem and then the same FAT filesystem is used
1108 under Windows 95. */
1109 return 1;
1110 }
Guido van Rossum0980bd91998-02-13 17:18:36 +00001111 if (strncmp(data.cFileName, name, namelen) != 0) {
1112 strcpy(buf+len-namelen, data.cFileName);
1113 PyErr_Format(PyExc_NameError,
1114 "Case mismatch for module name %.100s\n(filename %.300s)",
1115 name, buf);
1116 return 0;
1117 }
1118 return 1;
1119}
1120#endif /* MS_WIN32 */
1121
1122#ifdef macintosh
1123#include <TextUtils.h>
Guido van Rossumb33aa1a2000-04-24 15:08:18 +00001124#ifdef USE_GUSI1
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001125#include "TFileSpec.h" /* for Path2FSSpec() */
1126#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001127static int
1128check_case(char *buf, int len, int namelen, char *name)
1129{
1130 FSSpec fss;
1131 OSErr err;
Guido van Rossumb33aa1a2000-04-24 15:08:18 +00001132#ifndef USE_GUSI1
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001133 err = FSMakeFSSpec(0, 0, Pstring(buf), &fss);
1134#else
1135 /* GUSI's Path2FSSpec() resolves all possible aliases nicely on
1136 the way, which is fine for all directories, but here we need
1137 the original name of the alias file (say, Dlg.ppc.slb, not
1138 toolboxmodules.ppc.slb). */
1139 char *colon;
1140 err = Path2FSSpec(buf, &fss);
1141 if (err == noErr) {
1142 colon = strrchr(buf, ':'); /* find filename */
1143 if (colon != NULL)
1144 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1145 Pstring(colon+1), &fss);
1146 else
1147 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1148 fss.name, &fss);
1149 }
1150#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001151 if (err) {
1152 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001153 "Can't find file for module %.100s\n(filename %.300s)",
1154 name, buf);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001155 return 0;
1156 }
Guido van Rossum63e97ad2000-07-01 01:06:56 +00001157 if ( namelen > fss.name[0] || strncmp(name, (char *)fss.name+1, namelen) != 0 ) {
Guido van Rossum0980bd91998-02-13 17:18:36 +00001158 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001159 "Case mismatch for module name %.100s\n(filename %.300s)",
1160 name, fss.name);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001161 return 0;
1162 }
1163 return 1;
1164}
1165#endif /* macintosh */
1166
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001167#ifdef DJGPP
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001168#include <dir.h>
1169
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001170static int
1171check_case(char *buf, int len, int namelen, char *name)
1172{
1173 struct ffblk ffblk;
1174 int done;
1175
1176 if (getenv("PYTHONCASEOK") != NULL)
1177 return 1;
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001178 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001179 if (done) {
1180 PyErr_Format(PyExc_NameError,
1181 "Can't find file for module %.100s\n(filename %.300s)",
1182 name, buf);
1183 return 0;
1184 }
1185
1186 if (strncmp(ffblk.ff_name, name, namelen) != 0) {
1187 strcpy(buf+len-namelen, ffblk.ff_name);
1188 PyErr_Format(PyExc_NameError,
1189 "Case mismatch for module name %.100s\n(filename %.300s)",
1190 name, buf);
1191 return 0;
1192 }
1193 return 1;
1194}
1195#endif
1196
Guido van Rossum8766a771998-04-10 23:44:32 +00001197#endif /* CHECK_IMPORT_CASE */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001198
Guido van Rossum197346f1997-10-31 18:38:52 +00001199#ifdef HAVE_STAT
1200/* Helper to look for __init__.py or __init__.py[co] in potential package */
1201static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001202find_init_module(char *buf)
Guido van Rossum197346f1997-10-31 18:38:52 +00001203{
Fred Drake4c82b232000-06-30 16:18:57 +00001204 size_t save_len = strlen(buf);
1205 size_t i = save_len;
Guido van Rossum197346f1997-10-31 18:38:52 +00001206 struct stat statbuf;
1207
1208 if (save_len + 13 >= MAXPATHLEN)
1209 return 0;
1210 buf[i++] = SEP;
1211 strcpy(buf+i, "__init__.py");
1212 if (stat(buf, &statbuf) == 0) {
1213 buf[save_len] = '\0';
1214 return 1;
1215 }
1216 i += strlen(buf+i);
1217 if (Py_OptimizeFlag)
1218 strcpy(buf+i, "o");
1219 else
1220 strcpy(buf+i, "c");
1221 if (stat(buf, &statbuf) == 0) {
1222 buf[save_len] = '\0';
1223 return 1;
1224 }
1225 buf[save_len] = '\0';
1226 return 0;
1227}
1228#endif /* HAVE_STAT */
1229
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001230
Tim Petersdbd9ba62000-07-09 03:09:57 +00001231static int init_builtin(char *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001232
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001233/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001234 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001235
Guido van Rossum79f25d91997-04-29 20:08:16 +00001236static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001237load_module(char *name, FILE *fp, char *buf, int type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001238{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001239 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001240 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001241 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001242
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001243 /* First check that there's an open file (if we need one) */
1244 switch (type) {
1245 case PY_SOURCE:
1246 case PY_COMPILED:
1247 if (fp == NULL) {
1248 PyErr_Format(PyExc_ValueError,
1249 "file object required for import (type code %d)",
1250 type);
1251 return NULL;
1252 }
1253 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001254
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001255 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001256
1257 case PY_SOURCE:
1258 m = load_source_module(name, buf, fp);
1259 break;
1260
1261 case PY_COMPILED:
1262 m = load_compiled_module(name, buf, fp);
1263 break;
1264
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001265#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001266 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001267 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001268 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001269#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001270
Jack Jansen9c96a921995-02-15 22:57:06 +00001271#ifdef macintosh
1272 case PY_RESOURCE:
1273 m = PyMac_LoadResourceModule(name, buf);
1274 break;
Guido van Rossum0f84a341998-08-06 13:36:01 +00001275 case PY_CODERESOURCE:
1276 m = PyMac_LoadCodeResourceModule(name, buf);
1277 break;
Jack Jansen9c96a921995-02-15 22:57:06 +00001278#endif
1279
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001280 case PKG_DIRECTORY:
1281 m = load_package(name, buf);
1282 break;
1283
1284 case C_BUILTIN:
1285 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001286 if (buf != NULL && buf[0] != '\0')
1287 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001288 if (type == C_BUILTIN)
1289 err = init_builtin(name);
1290 else
1291 err = PyImport_ImportFrozenModule(name);
1292 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001293 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001294 if (err == 0) {
1295 PyErr_Format(PyExc_ImportError,
1296 "Purported %s module %.200s not found",
1297 type == C_BUILTIN ?
1298 "builtin" : "frozen",
1299 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001300 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001301 }
1302 modules = PyImport_GetModuleDict();
1303 m = PyDict_GetItemString(modules, name);
1304 if (m == NULL) {
1305 PyErr_Format(
1306 PyExc_ImportError,
1307 "%s module %.200s not properly initialized",
1308 type == C_BUILTIN ?
1309 "builtin" : "frozen",
1310 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001311 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001312 }
1313 Py_INCREF(m);
1314 break;
1315
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001316 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001317 PyErr_Format(PyExc_ImportError,
1318 "Don't know how to import %.200s (type code %d)",
1319 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001320 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001321
1322 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001323
1324 return m;
1325}
1326
1327
1328/* Initialize a built-in module.
1329 Return 1 for succes, 0 if the module is not found, and -1 with
1330 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001331
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001332static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001333init_builtin(char *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001334{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001335 struct _inittab *p;
1336 PyObject *mod;
1337
1338 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
1339 return 1;
1340
Guido van Rossum771c6c81997-10-31 18:37:24 +00001341 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001342 if (strcmp(name, p->name) == 0) {
1343 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001344 PyErr_Format(PyExc_ImportError,
1345 "Cannot re-init internal module %.200s",
1346 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001347 return -1;
1348 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001349 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001350 PySys_WriteStderr("import %s # builtin\n", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001351 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001352 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001353 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001354 if (_PyImport_FixupExtension(name, name) == NULL)
1355 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001356 return 1;
1357 }
1358 }
1359 return 0;
1360}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001361
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001362
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001363/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001364
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001365static struct _frozen *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001366find_frozen(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001367{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001368 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001369
Guido van Rossum79f25d91997-04-29 20:08:16 +00001370 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001371 if (p->name == NULL)
1372 return NULL;
1373 if (strcmp(p->name, name) == 0)
1374 break;
1375 }
1376 return p;
1377}
1378
Guido van Rossum79f25d91997-04-29 20:08:16 +00001379static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001380get_frozen_object(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001381{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001382 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001383 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001384
1385 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001386 PyErr_Format(PyExc_ImportError,
1387 "No such frozen object named %.200s",
1388 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001389 return NULL;
1390 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001391 size = p->size;
1392 if (size < 0)
1393 size = -size;
1394 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001395}
1396
1397/* Initialize a frozen module.
1398 Return 1 for succes, 0 if the module is not found, and -1 with
1399 an exception set if the initialization failed.
1400 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001401
1402int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001403PyImport_ImportFrozenModule(char *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001404{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001405 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001406 PyObject *co;
1407 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001408 int ispackage;
1409 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001410
1411 if (p == NULL)
1412 return 0;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001413 size = p->size;
1414 ispackage = (size < 0);
1415 if (ispackage)
1416 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001417 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001418 PySys_WriteStderr("import %s # frozen%s\n",
Guido van Rossuma5568d31998-03-05 03:45:08 +00001419 name, ispackage ? " package" : "");
1420 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001421 if (co == NULL)
1422 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001423 if (!PyCode_Check(co)) {
1424 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001425 PyErr_Format(PyExc_TypeError,
1426 "frozen object %.200s is not a code object",
1427 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001428 return -1;
1429 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001430 if (ispackage) {
1431 /* Set __path__ to the package name */
1432 PyObject *d, *s;
1433 int err;
1434 m = PyImport_AddModule(name);
1435 if (m == NULL)
1436 return -1;
1437 d = PyModule_GetDict(m);
1438 s = PyString_InternFromString(name);
1439 if (s == NULL)
1440 return -1;
1441 err = PyDict_SetItemString(d, "__path__", s);
1442 Py_DECREF(s);
1443 if (err != 0)
1444 return err;
1445 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001446 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001447 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001448 if (m == NULL)
1449 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001450 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001451 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001452}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001453
1454
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001455/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001456 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001457
Guido van Rossum79f25d91997-04-29 20:08:16 +00001458PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001459PyImport_ImportModule(char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00001460{
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00001461 PyObject *pname;
1462 PyObject *result;
1463
1464 pname = PyString_FromString(name);
1465 result = PyImport_Import(pname);
1466 Py_DECREF(pname);
1467 return result;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001468}
1469
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001470/* Forward declarations for helper routines */
Tim Petersdbd9ba62000-07-09 03:09:57 +00001471static PyObject *get_parent(PyObject *globals, char *buf, int *p_buflen);
1472static PyObject *load_next(PyObject *mod, PyObject *altmod,
1473 char **p_name, char *buf, int *p_buflen);
1474static int mark_miss(char *name);
1475static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
1476 char *buf, int buflen, int recursive);
1477static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001478
1479/* The Magnum Opus of dotted-name import :-) */
1480
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001481static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001482import_module_ex(char *name, PyObject *globals, PyObject *locals,
1483 PyObject *fromlist)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001484{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001485 char buf[MAXPATHLEN+1];
1486 int buflen = 0;
1487 PyObject *parent, *head, *next, *tail;
1488
1489 parent = get_parent(globals, buf, &buflen);
1490 if (parent == NULL)
1491 return NULL;
1492
1493 head = load_next(parent, Py_None, &name, buf, &buflen);
1494 if (head == NULL)
1495 return NULL;
1496
1497 tail = head;
1498 Py_INCREF(tail);
1499 while (name) {
1500 next = load_next(tail, tail, &name, buf, &buflen);
1501 Py_DECREF(tail);
1502 if (next == NULL) {
1503 Py_DECREF(head);
1504 return NULL;
1505 }
1506 tail = next;
1507 }
1508
1509 if (fromlist != NULL) {
1510 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1511 fromlist = NULL;
1512 }
1513
1514 if (fromlist == NULL) {
1515 Py_DECREF(tail);
1516 return head;
1517 }
1518
1519 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001520 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001521 Py_DECREF(tail);
1522 return NULL;
1523 }
1524
1525 return tail;
1526}
1527
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001528PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001529PyImport_ImportModuleEx(char *name, PyObject *globals, PyObject *locals,
1530 PyObject *fromlist)
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001531{
1532 PyObject *result;
1533 lock_import();
Guido van Rossumd65911b1998-03-03 22:33:27 +00001534 result = import_module_ex(name, globals, locals, fromlist);
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001535 unlock_import();
1536 return result;
1537}
1538
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001539static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001540get_parent(PyObject *globals, char *buf, int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001541{
1542 static PyObject *namestr = NULL;
1543 static PyObject *pathstr = NULL;
1544 PyObject *modname, *modpath, *modules, *parent;
1545
1546 if (globals == NULL || !PyDict_Check(globals))
1547 return Py_None;
1548
1549 if (namestr == NULL) {
1550 namestr = PyString_InternFromString("__name__");
1551 if (namestr == NULL)
1552 return NULL;
1553 }
1554 if (pathstr == NULL) {
1555 pathstr = PyString_InternFromString("__path__");
1556 if (pathstr == NULL)
1557 return NULL;
1558 }
1559
1560 *buf = '\0';
1561 *p_buflen = 0;
1562 modname = PyDict_GetItem(globals, namestr);
1563 if (modname == NULL || !PyString_Check(modname))
1564 return Py_None;
1565
1566 modpath = PyDict_GetItem(globals, pathstr);
1567 if (modpath != NULL) {
1568 int len = PyString_GET_SIZE(modname);
1569 if (len > MAXPATHLEN) {
1570 PyErr_SetString(PyExc_ValueError,
1571 "Module name too long");
1572 return NULL;
1573 }
1574 strcpy(buf, PyString_AS_STRING(modname));
1575 *p_buflen = len;
1576 }
1577 else {
1578 char *start = PyString_AS_STRING(modname);
1579 char *lastdot = strrchr(start, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001580 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001581 if (lastdot == NULL)
1582 return Py_None;
1583 len = lastdot - start;
1584 if (len >= MAXPATHLEN) {
1585 PyErr_SetString(PyExc_ValueError,
1586 "Module name too long");
1587 return NULL;
1588 }
1589 strncpy(buf, start, len);
1590 buf[len] = '\0';
1591 *p_buflen = len;
1592 }
1593
1594 modules = PyImport_GetModuleDict();
1595 parent = PyDict_GetItemString(modules, buf);
1596 if (parent == NULL)
1597 parent = Py_None;
1598 return parent;
1599 /* We expect, but can't guarantee, if parent != None, that:
1600 - parent.__name__ == buf
1601 - parent.__dict__ is globals
1602 If this is violated... Who cares? */
1603}
1604
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001605/* altmod is either None or same as mod */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001606static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001607load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
1608 int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001609{
1610 char *name = *p_name;
1611 char *dot = strchr(name, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001612 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001613 char *p;
1614 PyObject *result;
1615
1616 if (dot == NULL) {
1617 *p_name = NULL;
1618 len = strlen(name);
1619 }
1620 else {
1621 *p_name = dot+1;
1622 len = dot-name;
1623 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00001624 if (len == 0) {
1625 PyErr_SetString(PyExc_ValueError,
1626 "Empty module name");
1627 return NULL;
1628 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001629
1630 p = buf + *p_buflen;
1631 if (p != buf)
1632 *p++ = '.';
1633 if (p+len-buf >= MAXPATHLEN) {
1634 PyErr_SetString(PyExc_ValueError,
1635 "Module name too long");
1636 return NULL;
1637 }
1638 strncpy(p, name, len);
1639 p[len] = '\0';
1640 *p_buflen = p+len-buf;
1641
1642 result = import_submodule(mod, p, buf);
1643 if (result == Py_None && altmod != mod) {
1644 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001645 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001646 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001647 if (result != NULL && result != Py_None) {
1648 if (mark_miss(buf) != 0) {
1649 Py_DECREF(result);
1650 return NULL;
1651 }
1652 strncpy(buf, name, len);
1653 buf[len] = '\0';
1654 *p_buflen = len;
1655 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001656 }
1657 if (result == NULL)
1658 return NULL;
1659
1660 if (result == Py_None) {
1661 Py_DECREF(result);
1662 PyErr_Format(PyExc_ImportError,
1663 "No module named %.200s", name);
1664 return NULL;
1665 }
1666
1667 return result;
1668}
1669
1670static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001671mark_miss(char *name)
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001672{
1673 PyObject *modules = PyImport_GetModuleDict();
1674 return PyDict_SetItemString(modules, name, Py_None);
1675}
1676
1677static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001678ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, int buflen,
1679 int recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001680{
1681 int i;
1682
1683 if (!PyObject_HasAttrString(mod, "__path__"))
1684 return 1;
1685
1686 for (i = 0; ; i++) {
1687 PyObject *item = PySequence_GetItem(fromlist, i);
1688 int hasit;
1689 if (item == NULL) {
1690 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1691 PyErr_Clear();
1692 return 1;
1693 }
1694 return 0;
1695 }
1696 if (!PyString_Check(item)) {
1697 PyErr_SetString(PyExc_TypeError,
1698 "Item in ``from list'' not a string");
1699 Py_DECREF(item);
1700 return 0;
1701 }
1702 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001703 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001704 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001705 /* See if the package defines __all__ */
1706 if (recursive)
1707 continue; /* Avoid endless recursion */
1708 all = PyObject_GetAttrString(mod, "__all__");
1709 if (all == NULL)
1710 PyErr_Clear();
1711 else {
1712 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1713 return 0;
1714 Py_DECREF(all);
1715 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001716 continue;
1717 }
1718 hasit = PyObject_HasAttr(mod, item);
1719 if (!hasit) {
1720 char *subname = PyString_AS_STRING(item);
1721 PyObject *submod;
1722 char *p;
1723 if (buflen + strlen(subname) >= MAXPATHLEN) {
1724 PyErr_SetString(PyExc_ValueError,
1725 "Module name too long");
1726 Py_DECREF(item);
1727 return 0;
1728 }
1729 p = buf + buflen;
1730 *p++ = '.';
1731 strcpy(p, subname);
1732 submod = import_submodule(mod, subname, buf);
1733 Py_XDECREF(submod);
1734 if (submod == NULL) {
1735 Py_DECREF(item);
1736 return 0;
1737 }
1738 }
1739 Py_DECREF(item);
1740 }
1741
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001742 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001743}
1744
1745static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001746import_submodule(PyObject *mod, char *subname, char *fullname)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001747{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001748 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001749 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001750
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001751 /* Require:
1752 if mod == None: subname == fullname
1753 else: mod.__name__ + "." + subname == fullname
1754 */
1755
1756 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001757 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001758 }
1759 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001760 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001761 char buf[MAXPATHLEN+1];
1762 struct filedescr *fdp;
1763 FILE *fp = NULL;
1764
Guido van Rossum9c0afe51998-05-19 15:09:05 +00001765 if (mod == Py_None)
1766 path = NULL;
1767 else {
1768 path = PyObject_GetAttrString(mod, "__path__");
1769 if (path == NULL) {
1770 PyErr_Clear();
1771 Py_INCREF(Py_None);
1772 return Py_None;
1773 }
1774 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001775
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001776 buf[0] = '\0';
Guido van Rossumb68cd421998-07-01 17:36:26 +00001777 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1778 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001779 if (fdp == NULL) {
1780 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1781 return NULL;
1782 PyErr_Clear();
1783 Py_INCREF(Py_None);
1784 return Py_None;
1785 }
1786 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001787 if (fp)
1788 fclose(fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001789 if (m != NULL && mod != Py_None) {
1790 if (PyObject_SetAttrString(mod, subname, m) < 0) {
1791 Py_DECREF(m);
1792 m = NULL;
1793 }
1794 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001795 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001796
1797 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001798}
1799
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001800
1801/* Re-import a module of any kind and return its module object, WITH
1802 INCREMENTED REFERENCE COUNT */
1803
Guido van Rossum79f25d91997-04-29 20:08:16 +00001804PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001805PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001806{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001807 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001808 PyObject *path = NULL;
1809 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001810 char buf[MAXPATHLEN+1];
1811 struct filedescr *fdp;
1812 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001813
Guido van Rossum79f25d91997-04-29 20:08:16 +00001814 if (m == NULL || !PyModule_Check(m)) {
1815 PyErr_SetString(PyExc_TypeError,
1816 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001817 return NULL;
1818 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001819 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001820 if (name == NULL)
1821 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001822 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001823 PyErr_Format(PyExc_ImportError,
1824 "reload(): module %.200s not in sys.modules",
1825 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001826 return NULL;
1827 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001828 subname = strrchr(name, '.');
1829 if (subname == NULL)
1830 subname = name;
1831 else {
1832 PyObject *parentname, *parent;
1833 parentname = PyString_FromStringAndSize(name, (subname-name));
1834 if (parentname == NULL)
1835 return NULL;
1836 parent = PyDict_GetItem(modules, parentname);
Barry Warsaw38793331999-01-27 17:54:20 +00001837 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00001838 if (parent == NULL) {
1839 PyErr_Format(PyExc_ImportError,
1840 "reload(): parent %.200s not in sys.modules",
1841 name);
1842 return NULL;
1843 }
1844 subname++;
1845 path = PyObject_GetAttrString(parent, "__path__");
1846 if (path == NULL)
1847 PyErr_Clear();
1848 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001849 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001850 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1851 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001852 if (fdp == NULL)
1853 return NULL;
1854 m = load_module(name, fp, buf, fdp->type);
1855 if (fp)
1856 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001857 return m;
1858}
1859
1860
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001861/* Higher-level import emulator which emulates the "import" statement
1862 more accurately -- it invokes the __import__() function from the
1863 builtins of the current globals. This means that the import is
1864 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00001865 environment, e.g. by "rexec".
1866 A dummy list ["__doc__"] is passed as the 4th argument so that
1867 e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
1868 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001869
1870PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001871PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001872{
1873 static PyObject *silly_list = NULL;
1874 static PyObject *builtins_str = NULL;
1875 static PyObject *import_str = NULL;
1876 static PyObject *standard_builtins = NULL;
1877 PyObject *globals = NULL;
1878 PyObject *import = NULL;
1879 PyObject *builtins = NULL;
1880 PyObject *r = NULL;
1881
1882 /* Initialize constant string objects */
1883 if (silly_list == NULL) {
1884 import_str = PyString_InternFromString("__import__");
1885 if (import_str == NULL)
1886 return NULL;
1887 builtins_str = PyString_InternFromString("__builtins__");
1888 if (builtins_str == NULL)
1889 return NULL;
1890 silly_list = Py_BuildValue("[s]", "__doc__");
1891 if (silly_list == NULL)
1892 return NULL;
1893 }
1894
1895 /* Get the builtins from current globals */
1896 globals = PyEval_GetGlobals();
1897 if(globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00001898 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001899 builtins = PyObject_GetItem(globals, builtins_str);
1900 if (builtins == NULL)
1901 goto err;
1902 }
1903 else {
1904 /* No globals -- use standard builtins, and fake globals */
1905 PyErr_Clear();
1906
1907 if (standard_builtins == NULL) {
1908 standard_builtins =
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00001909 PyImport_ImportModuleEx("__builtin__",
1910 NULL, NULL, NULL);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001911 if (standard_builtins == NULL)
1912 return NULL;
1913 }
1914
1915 builtins = standard_builtins;
1916 Py_INCREF(builtins);
1917 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1918 if (globals == NULL)
1919 goto err;
1920 }
1921
1922 /* Get the __import__ function from the builtins */
1923 if (PyDict_Check(builtins))
1924 import=PyObject_GetItem(builtins, import_str);
1925 else
1926 import=PyObject_GetAttr(builtins, import_str);
1927 if (import == NULL)
1928 goto err;
1929
1930 /* Call the _import__ function with the proper argument list */
1931 r = PyObject_CallFunction(import, "OOOO",
1932 module_name, globals, globals, silly_list);
1933
1934 err:
1935 Py_XDECREF(globals);
1936 Py_XDECREF(builtins);
1937 Py_XDECREF(import);
1938
1939 return r;
1940}
1941
1942
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001943/* Module 'imp' provides Python access to the primitives used for
1944 importing modules.
1945*/
1946
Guido van Rossum79f25d91997-04-29 20:08:16 +00001947static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001948imp_get_magic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001949{
1950 char buf[4];
1951
Guido van Rossum43713e52000-02-29 13:59:29 +00001952 if (!PyArg_ParseTuple(args, ":get_magic"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001953 return NULL;
Guido van Rossum96774c12000-05-01 20:19:08 +00001954 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
1955 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
1956 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
1957 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001958
Guido van Rossum79f25d91997-04-29 20:08:16 +00001959 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001960}
1961
Guido van Rossum79f25d91997-04-29 20:08:16 +00001962static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001963imp_get_suffixes(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001964{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001965 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001966 struct filedescr *fdp;
1967
Guido van Rossum43713e52000-02-29 13:59:29 +00001968 if (!PyArg_ParseTuple(args, ":get_suffixes"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001969 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001970 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001971 if (list == NULL)
1972 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001973 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
1974 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001975 fdp->suffix, fdp->mode, fdp->type);
1976 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001977 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001978 return NULL;
1979 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001980 if (PyList_Append(list, item) < 0) {
1981 Py_DECREF(list);
1982 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001983 return NULL;
1984 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001985 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001986 }
1987 return list;
1988}
1989
Guido van Rossum79f25d91997-04-29 20:08:16 +00001990static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001991call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001992{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001993 extern int fclose(FILE *);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001994 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001995 struct filedescr *fdp;
1996 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001997 FILE *fp = NULL;
1998
1999 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002000 if (path == Py_None)
2001 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002002 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
2003 if (fdp == NULL)
2004 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002005 if (fp != NULL) {
2006 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
2007 if (fob == NULL) {
2008 fclose(fp);
2009 return NULL;
2010 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002011 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002012 else {
2013 fob = Py_None;
2014 Py_INCREF(fob);
2015 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002016 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002017 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002018 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002019 return ret;
2020}
2021
Guido van Rossum79f25d91997-04-29 20:08:16 +00002022static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002023imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002024{
2025 char *name;
2026 PyObject *path = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002027 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002028 return NULL;
2029 return call_find_module(name, path);
2030}
2031
2032static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002033imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002034{
2035 char *name;
2036 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002037 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002038 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002039 return NULL;
2040 ret = init_builtin(name);
2041 if (ret < 0)
2042 return NULL;
2043 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002044 Py_INCREF(Py_None);
2045 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002046 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002047 m = PyImport_AddModule(name);
2048 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002049 return m;
2050}
2051
Guido van Rossum79f25d91997-04-29 20:08:16 +00002052static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002053imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002054{
2055 char *name;
2056 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002057 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002058 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002059 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002060 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002061 if (ret < 0)
2062 return NULL;
2063 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002064 Py_INCREF(Py_None);
2065 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002066 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002067 m = PyImport_AddModule(name);
2068 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002069 return m;
2070}
2071
Guido van Rossum79f25d91997-04-29 20:08:16 +00002072static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002073imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002074{
2075 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002076
Guido van Rossum43713e52000-02-29 13:59:29 +00002077 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002078 return NULL;
2079 return get_frozen_object(name);
2080}
2081
Guido van Rossum79f25d91997-04-29 20:08:16 +00002082static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002083imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002084{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002085 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002086 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002087 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002088 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002089}
2090
Guido van Rossum79f25d91997-04-29 20:08:16 +00002091static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002092imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002093{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002094 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002095 struct _frozen *p;
Guido van Rossum43713e52000-02-29 13:59:29 +00002096 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002097 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002098 p = find_frozen(name);
2099 return PyInt_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002100}
2101
2102static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002103get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002104{
2105 FILE *fp;
2106 if (fob == NULL) {
2107 fp = fopen(pathname, mode);
2108 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002109 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002110 }
2111 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002112 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002113 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002114 PyErr_SetString(PyExc_ValueError,
2115 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002116 }
2117 return fp;
2118}
2119
Guido van Rossum79f25d91997-04-29 20:08:16 +00002120static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002121imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002122{
2123 char *name;
2124 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002125 PyObject *fob = NULL;
2126 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002127 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002128 if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002129 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002130 return NULL;
2131 fp = get_file(pathname, fob, "rb");
2132 if (fp == NULL)
2133 return NULL;
2134 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002135 if (fob == NULL)
2136 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002137 return m;
2138}
2139
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002140#ifdef HAVE_DYNAMIC_LOADING
2141
Guido van Rossum79f25d91997-04-29 20:08:16 +00002142static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002143imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002144{
2145 char *name;
2146 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002147 PyObject *fob = NULL;
2148 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002149 FILE *fp = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002150 if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002151 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002152 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002153 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002154 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002155 if (fp == NULL)
2156 return NULL;
2157 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002158 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002159 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002160}
2161
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002162#endif /* HAVE_DYNAMIC_LOADING */
2163
Guido van Rossum79f25d91997-04-29 20:08:16 +00002164static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002165imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002166{
2167 char *name;
2168 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002169 PyObject *fob = NULL;
2170 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002171 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002172 if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002173 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002174 return NULL;
2175 fp = get_file(pathname, fob, "r");
2176 if (fp == NULL)
2177 return NULL;
2178 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002179 if (fob == NULL)
2180 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002181 return m;
2182}
2183
Jack Jansen9c96a921995-02-15 22:57:06 +00002184#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002185static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002186imp_load_resource(PyObject *self, PyObject *args)
Jack Jansen9c96a921995-02-15 22:57:06 +00002187{
2188 char *name;
2189 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002190 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002191
Guido van Rossum43713e52000-02-29 13:59:29 +00002192 if (!PyArg_ParseTuple(args, "ss:load_resource", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002193 return NULL;
2194 m = PyMac_LoadResourceModule(name, pathname);
2195 return m;
2196}
2197#endif /* macintosh */
2198
Guido van Rossum79f25d91997-04-29 20:08:16 +00002199static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002200imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002201{
2202 char *name;
2203 PyObject *fob;
2204 char *pathname;
2205 char *suffix; /* Unused */
2206 char *mode;
2207 int type;
2208 FILE *fp;
2209
Guido van Rossum43713e52000-02-29 13:59:29 +00002210 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002211 &name, &fob, &pathname,
2212 &suffix, &mode, &type))
2213 return NULL;
2214 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
2215 PyErr_Format(PyExc_ValueError,
2216 "invalid file open mode %.200s", mode);
2217 return NULL;
2218 }
2219 if (fob == Py_None)
2220 fp = NULL;
2221 else {
2222 if (!PyFile_Check(fob)) {
2223 PyErr_SetString(PyExc_ValueError,
2224 "load_module arg#2 should be a file or None");
2225 return NULL;
2226 }
2227 fp = get_file(pathname, fob, mode);
2228 if (fp == NULL)
2229 return NULL;
2230 }
2231 return load_module(name, fp, pathname, type);
2232}
2233
2234static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002235imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002236{
2237 char *name;
2238 char *pathname;
Guido van Rossum43713e52000-02-29 13:59:29 +00002239 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002240 return NULL;
2241 return load_package(name, pathname);
2242}
2243
2244static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002245imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002246{
2247 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002248 if (!PyArg_ParseTuple(args, "s:new_module", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002249 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002250 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002251}
2252
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002253/* Doc strings */
2254
2255static char doc_imp[] = "\
2256This module provides the components needed to build your own\n\
2257__import__ function. Undocumented functions are obsolete.\n\
2258";
2259
2260static char doc_find_module[] = "\
2261find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
2262Search for a module. If path is omitted or None, search for a\n\
2263built-in, frozen or special module and continue search in sys.path.\n\
2264The module name cannot contain '.'; to search for a submodule of a\n\
2265package, pass the submodule name and the package's __path__.\
2266";
2267
2268static char doc_load_module[] = "\
2269load_module(name, file, filename, (suffix, mode, type)) -> module\n\
2270Load a module, given information returned by find_module().\n\
2271The module name must include the full package name, if any.\
2272";
2273
2274static char doc_get_magic[] = "\
2275get_magic() -> string\n\
2276Return the magic number for .pyc or .pyo files.\
2277";
2278
2279static char doc_get_suffixes[] = "\
2280get_suffixes() -> [(suffix, mode, type), ...]\n\
2281Return a list of (suffix, mode, type) tuples describing the files\n\
2282that find_module() looks for.\
2283";
2284
2285static char doc_new_module[] = "\
2286new_module(name) -> module\n\
2287Create a new module. Do not enter it in sys.modules.\n\
2288The module name must include the full package name, if any.\
2289";
2290
Guido van Rossum79f25d91997-04-29 20:08:16 +00002291static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002292 {"find_module", imp_find_module, 1, doc_find_module},
2293 {"get_magic", imp_get_magic, 1, doc_get_magic},
2294 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2295 {"load_module", imp_load_module, 1, doc_load_module},
2296 {"new_module", imp_new_module, 1, doc_new_module},
2297 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002298 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002299 {"init_builtin", imp_init_builtin, 1},
2300 {"init_frozen", imp_init_frozen, 1},
2301 {"is_builtin", imp_is_builtin, 1},
2302 {"is_frozen", imp_is_frozen, 1},
2303 {"load_compiled", imp_load_compiled, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002304#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002305 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002306#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002307 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002308#ifdef macintosh
2309 {"load_resource", imp_load_resource, 1},
2310#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002311 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002312 {NULL, NULL} /* sentinel */
2313};
2314
Guido van Rossum1a8791e1998-08-04 22:46:29 +00002315static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002316setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002317{
2318 PyObject *v;
2319 int err;
2320
2321 v = PyInt_FromLong((long)value);
2322 err = PyDict_SetItemString(d, name, v);
2323 Py_XDECREF(v);
2324 return err;
2325}
2326
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002327void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002328initimp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002329{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002330 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002331
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002332 m = Py_InitModule4("imp", imp_methods, doc_imp,
2333 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002334 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002335
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002336 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2337 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2338 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2339 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2340 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2341 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2342 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2343 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00002344 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002345
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002346 failure:
2347 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002348}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002349
2350
Guido van Rossumb18618d2000-05-03 23:44:39 +00002351/* API for embedding applications that want to add their own entries
2352 to the table of built-in modules. This should normally be called
2353 *before* Py_Initialize(). When the table resize fails, -1 is
2354 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002355
2356 After a similar function by Just van Rossum. */
2357
2358int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002359PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002360{
2361 static struct _inittab *our_copy = NULL;
2362 struct _inittab *p;
2363 int i, n;
2364
2365 /* Count the number of entries in both tables */
2366 for (n = 0; newtab[n].name != NULL; n++)
2367 ;
2368 if (n == 0)
2369 return 0; /* Nothing to do */
2370 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2371 ;
2372
2373 /* Allocate new memory for the combined table */
Guido van Rossumb18618d2000-05-03 23:44:39 +00002374 p = our_copy;
2375 PyMem_RESIZE(p, struct _inittab, i+n+1);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002376 if (p == NULL)
2377 return -1;
2378
2379 /* Copy the tables into the new memory */
2380 if (our_copy != PyImport_Inittab)
2381 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2382 PyImport_Inittab = our_copy = p;
2383 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
2384
2385 return 0;
2386}
2387
2388/* Shorthand to add a single entry given a name and a function */
2389
2390int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002391PyImport_AppendInittab(char *name, void (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002392{
2393 struct _inittab newtab[2];
2394
2395 memset(newtab, '\0', sizeof newtab);
2396
2397 newtab[0].name = name;
2398 newtab[0].initfunc = initfunc;
2399
2400 return PyImport_ExtendInittab(newtab);
2401}