blob: 0b4cd0f7cce147d50553b49253e45c5cecd3557a [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
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000026extern time_t PyOS_GetLastModificationTime(char *, FILE *);
27 /* In getmtime.c */
Guido van Rossum21d335e1993-10-15 13:01:11 +000028
Guido van Rossum6c849691994-09-26 15:47:17 +000029/* Magic word to reject .pyc files generated by other Python versions */
Guido van Rossum7faeab31995-07-07 22:50:36 +000030/* Change for each incompatible change */
31/* The value of CR and LF is incorporated so if you ever read or write
32 a .pyc file in text mode the magic number will be wrong; also, the
Tim Peters36515e22001-11-18 04:06:29 +000033 Apple MPW compiler swaps their values, botching string constants.
34 XXX That probably isn't important anymore.
35*/
Guido van Rossum7faeab31995-07-07 22:50:36 +000036/* XXX Perhaps the magic number should be frozen and a version field
37 added to the .pyc file header? */
Tim Peters36515e22001-11-18 04:06:29 +000038/* New way to come up with the low 16 bits of the magic number:
39 (YEAR-1995) * 10000 + MONTH * 100 + DAY
40 where MONTH and DAY are 1-based.
41 XXX Whatever the "old way" may have been isn't documented.
42 XXX This scheme breaks in 2002, as (2002-1995)*10000 = 70000 doesn't
43 fit in 16 bits.
44 XXX Later, sometimes 1 gets added to MAGIC in order to record that
45 the Unicode -U option is in use. IMO (Tim's), that's a Bad Idea
46 (quite apart from that the -U option doesn't work so isn't used
47 anyway).
48*/
Tim Peters6d6c1a32001-08-02 04:15:00 +000049#define MAGIC (60717 | ((long)'\r'<<16) | ((long)'\n'<<24))
Guido van Rossum3ddee711991-12-16 13:06:34 +000050
Guido van Rossum96774c12000-05-01 20:19:08 +000051/* Magic word as global; note that _PyImport_Init() can change the
Jeremy Hylton9262b8a2000-06-30 04:59:17 +000052 value of this global to accommodate for alterations of how the
Guido van Rossum96774c12000-05-01 20:19:08 +000053 compiler works which are enabled by command line switches. */
54static long pyc_magic = MAGIC;
55
Guido van Rossum25ce5661997-08-02 03:10:38 +000056/* See _PyImport_FixupExtension() below */
57static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000058
Guido van Rossum771c6c81997-10-31 18:37:24 +000059/* This table is defined in config.c: */
60extern struct _inittab _PyImport_Inittab[];
61
62struct _inittab *PyImport_Inittab = _PyImport_Inittab;
Guido van Rossum66f1fa81991-04-03 19:03:52 +000063
Guido van Rossumed1170e1999-12-20 21:23:41 +000064/* these tables define the module suffixes that Python recognizes */
65struct filedescr * _PyImport_Filetab = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +000066
67#ifdef RISCOS
68static const struct filedescr _PyImport_StandardFiletab[] = {
69 {"/py", "r", PY_SOURCE},
70 {"/pyc", "rb", PY_COMPILED},
71 {0, 0}
72};
73#else
Guido van Rossumed1170e1999-12-20 21:23:41 +000074static const struct filedescr _PyImport_StandardFiletab[] = {
75 {".py", "r", PY_SOURCE},
Tim Petersc1731372001-08-04 08:12:36 +000076#ifdef MS_WIN32
77 {".pyw", "r", PY_SOURCE},
Tim Peters36515e22001-11-18 04:06:29 +000078#endif
Guido van Rossumed1170e1999-12-20 21:23:41 +000079 {".pyc", "rb", PY_COMPILED},
80 {0, 0}
81};
Guido van Rossum48a680c2001-03-02 06:34:14 +000082#endif
Guido van Rossumed1170e1999-12-20 21:23:41 +000083
Guido van Rossum1ae940a1995-01-02 19:04:15 +000084/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000085
86void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000087_PyImport_Init(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000088{
Guido van Rossumed1170e1999-12-20 21:23:41 +000089 const struct filedescr *scan;
90 struct filedescr *filetab;
91 int countD = 0;
92 int countS = 0;
93
94 /* prepare _PyImport_Filetab: copy entries from
95 _PyImport_DynLoadFiletab and _PyImport_StandardFiletab.
96 */
97 for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan)
98 ++countD;
99 for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan)
100 ++countS;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000101 filetab = PyMem_NEW(struct filedescr, countD + countS + 1);
Guido van Rossumed1170e1999-12-20 21:23:41 +0000102 memcpy(filetab, _PyImport_DynLoadFiletab,
103 countD * sizeof(struct filedescr));
104 memcpy(filetab + countD, _PyImport_StandardFiletab,
105 countS * sizeof(struct filedescr));
106 filetab[countD + countS].suffix = NULL;
107
108 _PyImport_Filetab = filetab;
109
Guido van Rossum0824f631997-03-11 18:37:35 +0000110 if (Py_OptimizeFlag) {
Guido van Rossumed1170e1999-12-20 21:23:41 +0000111 /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */
112 for (; filetab->suffix != NULL; filetab++) {
Guido van Rossum48a680c2001-03-02 06:34:14 +0000113#ifndef RISCOS
Guido van Rossumed1170e1999-12-20 21:23:41 +0000114 if (strcmp(filetab->suffix, ".pyc") == 0)
115 filetab->suffix = ".pyo";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000116#else
117 if (strcmp(filetab->suffix, "/pyc") == 0)
118 filetab->suffix = "/pyo";
119#endif
Guido van Rossum0824f631997-03-11 18:37:35 +0000120 }
121 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000122
123 if (Py_UnicodeFlag) {
124 /* Fix the pyc_magic so that byte compiled code created
125 using the all-Unicode method doesn't interfere with
126 code created in normal operation mode. */
127 pyc_magic = MAGIC + 1;
128 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000129}
130
Guido van Rossum25ce5661997-08-02 03:10:38 +0000131void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000132_PyImport_Fini(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000133{
134 Py_XDECREF(extensions);
135 extensions = NULL;
Barry Warsaw84294482000-10-03 16:02:05 +0000136 PyMem_DEL(_PyImport_Filetab);
137 _PyImport_Filetab = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000138}
139
140
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000141/* Locking primitives to prevent parallel imports of the same module
142 in different threads to return with a partially loaded module.
143 These calls are serialized by the global interpreter lock. */
144
145#ifdef WITH_THREAD
146
Guido van Rossum49b56061998-10-01 20:42:43 +0000147#include "pythread.h"
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000148
Guido van Rossum65d5b571998-12-21 19:32:43 +0000149static PyThread_type_lock import_lock = 0;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000150static long import_lock_thread = -1;
151static int import_lock_level = 0;
152
153static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000154lock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000155{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000156 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000157 if (me == -1)
158 return; /* Too bad */
159 if (import_lock == NULL)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000160 import_lock = PyThread_allocate_lock();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000161 if (import_lock_thread == me) {
162 import_lock_level++;
163 return;
164 }
Guido van Rossum65d5b571998-12-21 19:32:43 +0000165 if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0)) {
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000166 PyThreadState *tstate = PyEval_SaveThread();
Guido van Rossum65d5b571998-12-21 19:32:43 +0000167 PyThread_acquire_lock(import_lock, 1);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000168 PyEval_RestoreThread(tstate);
169 }
170 import_lock_thread = me;
171 import_lock_level = 1;
172}
173
174static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000175unlock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000176{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000177 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000178 if (me == -1)
179 return; /* Too bad */
180 if (import_lock_thread != me)
181 Py_FatalError("unlock_import: not holding the import lock");
182 import_lock_level--;
183 if (import_lock_level == 0) {
184 import_lock_thread = -1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000185 PyThread_release_lock(import_lock);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000186 }
187}
188
189#else
190
191#define lock_import()
192#define unlock_import()
193
194#endif
195
Tim Peters69232342001-08-30 05:16:13 +0000196static PyObject *
197imp_lock_held(PyObject *self, PyObject *args)
198{
199 if (!PyArg_ParseTuple(args, ":lock_held"))
200 return NULL;
201#ifdef WITH_THREAD
202 return PyInt_FromLong(import_lock_thread != -1);
203#else
204 return PyInt_FromLong(0);
205#endif
206}
207
Guido van Rossum25ce5661997-08-02 03:10:38 +0000208/* Helper for sys */
209
210PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000211PyImport_GetModuleDict(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000212{
213 PyInterpreterState *interp = PyThreadState_Get()->interp;
214 if (interp->modules == NULL)
215 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
216 return interp->modules;
217}
218
Guido van Rossum3f5da241990-12-20 15:06:42 +0000219
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000220/* List of names to clear in sys */
221static char* sys_deletes[] = {
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000222 "path", "argv", "ps1", "ps2", "exitfunc",
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000223 "exc_type", "exc_value", "exc_traceback",
224 "last_type", "last_value", "last_traceback",
225 NULL
226};
227
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000228static char* sys_files[] = {
229 "stdin", "__stdin__",
230 "stdout", "__stdout__",
231 "stderr", "__stderr__",
232 NULL
233};
234
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000235
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000236/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000237
Guido van Rossum3f5da241990-12-20 15:06:42 +0000238void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000239PyImport_Cleanup(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000240{
Guido van Rossum758eec01998-01-19 21:58:26 +0000241 int pos, ndone;
242 char *name;
243 PyObject *key, *value, *dict;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000244 PyInterpreterState *interp = PyThreadState_Get()->interp;
Guido van Rossum758eec01998-01-19 21:58:26 +0000245 PyObject *modules = interp->modules;
246
247 if (modules == NULL)
248 return; /* Already done */
249
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000250 /* Delete some special variables first. These are common
251 places where user values hide and people complain when their
252 destructors fail. Since the modules containing them are
253 deleted *last* of all, they would come too late in the normal
254 destruction order. Sigh. */
255
256 value = PyDict_GetItemString(modules, "__builtin__");
257 if (value != NULL && PyModule_Check(value)) {
258 dict = PyModule_GetDict(value);
259 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000260 PySys_WriteStderr("# clear __builtin__._\n");
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000261 PyDict_SetItemString(dict, "_", Py_None);
262 }
263 value = PyDict_GetItemString(modules, "sys");
264 if (value != NULL && PyModule_Check(value)) {
265 char **p;
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000266 PyObject *v;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000267 dict = PyModule_GetDict(value);
268 for (p = sys_deletes; *p != NULL; p++) {
269 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000270 PySys_WriteStderr("# clear sys.%s\n", *p);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000271 PyDict_SetItemString(dict, *p, Py_None);
272 }
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000273 for (p = sys_files; *p != NULL; p+=2) {
274 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000275 PySys_WriteStderr("# restore sys.%s\n", *p);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000276 v = PyDict_GetItemString(dict, *(p+1));
277 if (v == NULL)
278 v = Py_None;
279 PyDict_SetItemString(dict, *p, v);
280 }
281 }
282
283 /* First, delete __main__ */
284 value = PyDict_GetItemString(modules, "__main__");
285 if (value != NULL && PyModule_Check(value)) {
286 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000287 PySys_WriteStderr("# cleanup __main__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000288 _PyModule_Clear(value);
289 PyDict_SetItemString(modules, "__main__", Py_None);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000290 }
291
Guido van Rossum758eec01998-01-19 21:58:26 +0000292 /* The special treatment of __builtin__ here is because even
293 when it's not referenced as a module, its dictionary is
294 referenced by almost every module's __builtins__. Since
295 deleting a module clears its dictionary (even if there are
296 references left to it), we need to delete the __builtin__
297 module last. Likewise, we don't delete sys until the very
298 end because it is implicitly referenced (e.g. by print).
299
300 Also note that we 'delete' modules by replacing their entry
301 in the modules dict with None, rather than really deleting
302 them; this avoids a rehash of the modules dictionary and
303 also marks them as "non existent" so they won't be
304 re-imported. */
305
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000306 /* Next, repeatedly delete modules with a reference count of
Guido van Rossum758eec01998-01-19 21:58:26 +0000307 one (skipping __builtin__ and sys) and delete them */
308 do {
309 ndone = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000310 pos = 0;
Guido van Rossum758eec01998-01-19 21:58:26 +0000311 while (PyDict_Next(modules, &pos, &key, &value)) {
312 if (value->ob_refcnt != 1)
313 continue;
Guido van Rossum566373e1998-10-01 15:24:50 +0000314 if (PyString_Check(key) && PyModule_Check(value)) {
315 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000316 if (strcmp(name, "__builtin__") == 0)
317 continue;
318 if (strcmp(name, "sys") == 0)
319 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000320 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000321 PySys_WriteStderr(
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000322 "# cleanup[1] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000323 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000324 PyDict_SetItem(modules, key, Py_None);
325 ndone++;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000326 }
327 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000328 } while (ndone > 0);
329
Guido van Rossum758eec01998-01-19 21:58:26 +0000330 /* Next, delete all modules (still skipping __builtin__ and sys) */
331 pos = 0;
332 while (PyDict_Next(modules, &pos, &key, &value)) {
Guido van Rossum566373e1998-10-01 15:24:50 +0000333 if (PyString_Check(key) && PyModule_Check(value)) {
334 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000335 if (strcmp(name, "__builtin__") == 0)
336 continue;
337 if (strcmp(name, "sys") == 0)
338 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000339 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000340 PySys_WriteStderr("# cleanup[2] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000341 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000342 PyDict_SetItem(modules, key, Py_None);
343 }
344 }
345
346 /* Next, delete sys and __builtin__ (in that order) */
347 value = PyDict_GetItemString(modules, "sys");
348 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000349 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000350 PySys_WriteStderr("# cleanup sys\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000351 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000352 PyDict_SetItemString(modules, "sys", Py_None);
353 }
354 value = PyDict_GetItemString(modules, "__builtin__");
355 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000356 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000357 PySys_WriteStderr("# cleanup __builtin__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000358 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000359 PyDict_SetItemString(modules, "__builtin__", Py_None);
360 }
361
362 /* Finally, clear and delete the modules directory */
363 PyDict_Clear(modules);
364 interp->modules = NULL;
365 Py_DECREF(modules);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000366}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000367
368
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000369/* Helper for pythonrun.c -- return magic number */
370
371long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000372PyImport_GetMagicNumber(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000373{
Guido van Rossum96774c12000-05-01 20:19:08 +0000374 return pyc_magic;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000375}
376
377
Guido van Rossum25ce5661997-08-02 03:10:38 +0000378/* Magic for extension modules (built-in as well as dynamically
379 loaded). To prevent initializing an extension module more than
380 once, we keep a static dictionary 'extensions' keyed by module name
381 (for built-in modules) or by filename (for dynamically loaded
Barry Warsaw92883382001-08-13 23:05:44 +0000382 modules), containing these modules. A copy of the module's
Guido van Rossum25ce5661997-08-02 03:10:38 +0000383 dictionary is stored by calling _PyImport_FixupExtension()
384 immediately after the module initialization function succeeds. A
385 copy can be retrieved from there by calling
386 _PyImport_FindExtension(). */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000387
Guido van Rossum79f25d91997-04-29 20:08:16 +0000388PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000389_PyImport_FixupExtension(char *name, char *filename)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000390{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000391 PyObject *modules, *mod, *dict, *copy;
392 if (extensions == NULL) {
393 extensions = PyDict_New();
394 if (extensions == NULL)
395 return NULL;
396 }
397 modules = PyImport_GetModuleDict();
398 mod = PyDict_GetItemString(modules, name);
399 if (mod == NULL || !PyModule_Check(mod)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000400 PyErr_Format(PyExc_SystemError,
401 "_PyImport_FixupExtension: module %.200s not loaded", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000402 return NULL;
403 }
404 dict = PyModule_GetDict(mod);
405 if (dict == NULL)
406 return NULL;
Fred Drake9cd0efc2001-10-25 21:38:59 +0000407 copy = PyDict_Copy(dict);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000408 if (copy == NULL)
409 return NULL;
410 PyDict_SetItemString(extensions, filename, copy);
411 Py_DECREF(copy);
412 return copy;
413}
414
415PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000416_PyImport_FindExtension(char *name, char *filename)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000417{
Fred Drake9cd0efc2001-10-25 21:38:59 +0000418 PyObject *dict, *mod, *mdict;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000419 if (extensions == NULL)
420 return NULL;
421 dict = PyDict_GetItemString(extensions, filename);
422 if (dict == NULL)
423 return NULL;
424 mod = PyImport_AddModule(name);
425 if (mod == NULL)
426 return NULL;
427 mdict = PyModule_GetDict(mod);
428 if (mdict == NULL)
429 return NULL;
Fred Drake9cd0efc2001-10-25 21:38:59 +0000430 if (PyDict_Update(mdict, dict))
Guido van Rossum25ce5661997-08-02 03:10:38 +0000431 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000432 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000433 PySys_WriteStderr("import %s # previously loaded (%s)\n",
Guido van Rossum25ce5661997-08-02 03:10:38 +0000434 name, filename);
435 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000436}
437
438
439/* Get the module object corresponding to a module name.
440 First check the modules dictionary if there's one there,
441 if not, create a new one and insert in in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000442 Because the former action is most common, THIS DOES NOT RETURN A
443 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000444
Guido van Rossum79f25d91997-04-29 20:08:16 +0000445PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000446PyImport_AddModule(char *name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000447{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000448 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000449 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000450
Guido van Rossum25ce5661997-08-02 03:10:38 +0000451 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
Guido van Rossum79f25d91997-04-29 20:08:16 +0000452 PyModule_Check(m))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000453 return m;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000454 m = PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000455 if (m == NULL)
456 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000457 if (PyDict_SetItemString(modules, name, m) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000458 Py_DECREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000459 return NULL;
460 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000461 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000462
463 return m;
464}
465
466
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000467/* Execute a code object in a module and return the module object
468 WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000469
Guido van Rossum79f25d91997-04-29 20:08:16 +0000470PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000471PyImport_ExecCodeModule(char *name, PyObject *co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000472{
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000473 return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
474}
475
476PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000477PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname)
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000478{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000479 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000480 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000481
Guido van Rossum79f25d91997-04-29 20:08:16 +0000482 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000483 if (m == NULL)
484 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000485 d = PyModule_GetDict(m);
486 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
487 if (PyDict_SetItemString(d, "__builtins__",
488 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000489 return NULL;
490 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000491 /* Remember the filename as the __file__ attribute */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000492 v = NULL;
493 if (pathname != NULL) {
494 v = PyString_FromString(pathname);
495 if (v == NULL)
496 PyErr_Clear();
497 }
498 if (v == NULL) {
499 v = ((PyCodeObject *)co)->co_filename;
500 Py_INCREF(v);
501 }
502 if (PyDict_SetItemString(d, "__file__", v) != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000503 PyErr_Clear(); /* Not important enough to report */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000504 Py_DECREF(v);
505
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000506 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000507 if (v == NULL)
508 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000509 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000510
Guido van Rossum25ce5661997-08-02 03:10:38 +0000511 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000512 PyErr_Format(PyExc_ImportError,
513 "Loaded module %.200s not found in sys.modules",
514 name);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000515 return NULL;
516 }
517
Guido van Rossum79f25d91997-04-29 20:08:16 +0000518 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000519
520 return m;
521}
522
523
524/* Given a pathname for a Python source file, fill a buffer with the
525 pathname for the corresponding compiled file. Return the pathname
526 for the compiled file, or NULL if there's no space in the buffer.
527 Doesn't set an exception. */
528
529static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000530make_compiled_pathname(char *pathname, char *buf, size_t buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000531{
Tim Petersc1731372001-08-04 08:12:36 +0000532 size_t len = strlen(pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000533 if (len+2 > buflen)
534 return NULL;
Tim Petersc1731372001-08-04 08:12:36 +0000535
536#ifdef MS_WIN32
537 /* Treat .pyw as if it were .py. The case of ".pyw" must match
538 that used in _PyImport_StandardFiletab. */
539 if (len >= 4 && strcmp(&pathname[len-4], ".pyw") == 0)
540 --len; /* pretend 'w' isn't there */
541#endif
542 memcpy(buf, pathname, len);
543 buf[len] = Py_OptimizeFlag ? 'o' : 'c';
544 buf[len+1] = '\0';
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000545
546 return buf;
547}
548
549
550/* Given a pathname for a Python source file, its time of last
551 modification, and a pathname for a compiled file, check whether the
552 compiled file represents the same version of the source. If so,
553 return a FILE pointer for the compiled file, positioned just after
554 the header; if not, return NULL.
555 Doesn't set an exception. */
556
557static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000558check_compiled_module(char *pathname, long mtime, char *cpathname)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000559{
560 FILE *fp;
561 long magic;
562 long pyc_mtime;
563
564 fp = fopen(cpathname, "rb");
565 if (fp == NULL)
566 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000567 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000568 if (magic != pyc_magic) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000569 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000570 PySys_WriteStderr("# %s has bad magic\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000571 fclose(fp);
572 return NULL;
573 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000574 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000575 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000576 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000577 PySys_WriteStderr("# %s has bad mtime\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000578 fclose(fp);
579 return NULL;
580 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000581 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000582 PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000583 return fp;
584}
585
586
587/* Read a code object from a file and check it for validity */
588
Guido van Rossum79f25d91997-04-29 20:08:16 +0000589static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000590read_compiled_module(char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000591{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000592 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000593
Tim Petersd9b9ac82001-01-28 00:27:39 +0000594 co = PyMarshal_ReadLastObjectFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000595 /* Ugly: rd_object() may return NULL with or without error */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000596 if (co == NULL || !PyCode_Check(co)) {
597 if (!PyErr_Occurred())
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000598 PyErr_Format(PyExc_ImportError,
599 "Non-code object in %.200s", cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000600 Py_XDECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000601 return NULL;
602 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000603 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000604}
605
606
607/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000608 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000609
Guido van Rossum79f25d91997-04-29 20:08:16 +0000610static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000611load_compiled_module(char *name, char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000612{
613 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000614 PyCodeObject *co;
615 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000616
Guido van Rossum79f25d91997-04-29 20:08:16 +0000617 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000618 if (magic != pyc_magic) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000619 PyErr_Format(PyExc_ImportError,
620 "Bad magic number in %.200s", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000621 return NULL;
622 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000623 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000624 co = read_compiled_module(cpathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000625 if (co == NULL)
626 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000627 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000628 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000629 name, cpathname);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000630 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000631 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000632
633 return m;
634}
635
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000636/* Parse a source file and return the corresponding code object */
637
Guido van Rossum79f25d91997-04-29 20:08:16 +0000638static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000639parse_source_module(char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000640{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000641 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000642 node *n;
643
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000644 n = PyParser_SimpleParseFile(fp, pathname, Py_file_input);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000645 if (n == NULL)
646 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000647 co = PyNode_Compile(n, pathname);
648 PyNode_Free(n);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000649
650 return co;
651}
652
653
Guido van Rossum55a83382000-09-20 20:31:38 +0000654/* Helper to open a bytecode file for writing in exclusive mode */
655
656static FILE *
657open_exclusive(char *filename)
658{
659#if defined(O_EXCL)&&defined(O_CREAT)&&defined(O_WRONLY)&&defined(O_TRUNC)
660 /* Use O_EXCL to avoid a race condition when another process tries to
661 write the same file. When that happens, our open() call fails,
662 which is just fine (since it's only a cache).
663 XXX If the file exists and is writable but the directory is not
664 writable, the file will never be written. Oh well.
665 */
666 int fd;
667 (void) unlink(filename);
Tim Peters42c83af2000-09-29 04:03:10 +0000668 fd = open(filename, O_EXCL|O_CREAT|O_WRONLY|O_TRUNC
669#ifdef O_BINARY
670 |O_BINARY /* necessary for Windows */
671#endif
Tim Peters50d8d372001-02-28 05:34:27 +0000672
Tim Peters42c83af2000-09-29 04:03:10 +0000673 , 0666);
Guido van Rossum55a83382000-09-20 20:31:38 +0000674 if (fd < 0)
675 return NULL;
676 return fdopen(fd, "wb");
677#else
678 /* Best we can do -- on Windows this can't happen anyway */
679 return fopen(filename, "wb");
680#endif
681}
682
683
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000684/* Write a compiled module to a file, placing the time of last
685 modification of its source into the header.
686 Errors are ignored, if a write error occurs an attempt is made to
687 remove the file. */
688
689static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000690write_compiled_module(PyCodeObject *co, char *cpathname, long mtime)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000691{
692 FILE *fp;
693
Guido van Rossum55a83382000-09-20 20:31:38 +0000694 fp = open_exclusive(cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000695 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000696 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000697 PySys_WriteStderr(
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000698 "# can't create %s\n", cpathname);
699 return;
700 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000701 PyMarshal_WriteLongToFile(pyc_magic, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000702 /* First write a 0 for mtime */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000703 PyMarshal_WriteLongToFile(0L, fp);
704 PyMarshal_WriteObjectToFile((PyObject *)co, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000705 if (ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000706 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000707 PySys_WriteStderr("# can't write %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000708 /* Don't keep partial file */
709 fclose(fp);
710 (void) unlink(cpathname);
711 return;
712 }
713 /* Now write the true mtime */
714 fseek(fp, 4L, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000715 PyMarshal_WriteLongToFile(mtime, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000716 fflush(fp);
717 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000718 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000719 PySys_WriteStderr("# wrote %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000720#ifdef macintosh
Jack Jansencbf630f2000-07-11 21:59:16 +0000721 PyMac_setfiletype(cpathname, 'Pyth', 'PYC ');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000722#endif
723}
724
725
726/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000727 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
728 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000729
Guido van Rossum79f25d91997-04-29 20:08:16 +0000730static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000731load_source_module(char *name, char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000732{
Fred Drake4c82b232000-06-30 16:18:57 +0000733 time_t mtime;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000734 FILE *fpc;
735 char buf[MAXPATHLEN+1];
736 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000737 PyCodeObject *co;
738 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000739
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000740 mtime = PyOS_GetLastModificationTime(pathname, fp);
Fred Drakec63d3e92001-03-01 06:33:32 +0000741 if (mtime == (time_t)(-1))
Fred Drake4c82b232000-06-30 16:18:57 +0000742 return NULL;
743#if SIZEOF_TIME_T > 4
744 /* Python's .pyc timestamp handling presumes that the timestamp fits
745 in 4 bytes. This will be fine until sometime in the year 2038,
746 when a 4-byte signed time_t will overflow.
747 */
748 if (mtime >> 32) {
749 PyErr_SetString(PyExc_OverflowError,
Fred Drakec63d3e92001-03-01 06:33:32 +0000750 "modification time overflows a 4 byte field");
Fred Drake4c82b232000-06-30 16:18:57 +0000751 return NULL;
752 }
753#endif
Tim Peters36515e22001-11-18 04:06:29 +0000754 cpathname = make_compiled_pathname(pathname, buf,
Jeremy Hylton37832f02001-04-13 17:50:20 +0000755 (size_t)MAXPATHLEN + 1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000756 if (cpathname != NULL &&
757 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000758 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000759 fclose(fpc);
760 if (co == NULL)
761 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000762 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000763 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000764 name, cpathname);
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000765 pathname = cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000766 }
767 else {
768 co = parse_source_module(pathname, fp);
769 if (co == NULL)
770 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000771 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000772 PySys_WriteStderr("import %s # from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000773 name, pathname);
774 write_compiled_module(co, cpathname, mtime);
775 }
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000776 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000777 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000778
779 return m;
780}
781
782
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000783/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +0000784static PyObject *load_module(char *, FILE *, char *, int);
785static struct filedescr *find_module(char *, PyObject *,
786 char *, size_t, FILE **);
787static struct _frozen *find_frozen(char *name);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000788
789/* Load a package and return its module object WITH INCREMENTED
790 REFERENCE COUNT */
791
792static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000793load_package(char *name, char *pathname)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000794{
795 PyObject *m, *d, *file, *path;
796 int err;
797 char buf[MAXPATHLEN+1];
798 FILE *fp = NULL;
799 struct filedescr *fdp;
800
801 m = PyImport_AddModule(name);
802 if (m == NULL)
803 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000804 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000805 PySys_WriteStderr("import %s # directory %s\n",
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000806 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000807 d = PyModule_GetDict(m);
808 file = PyString_FromString(pathname);
809 if (file == NULL)
810 return NULL;
811 path = Py_BuildValue("[O]", file);
812 if (path == NULL) {
813 Py_DECREF(file);
814 return NULL;
815 }
816 err = PyDict_SetItemString(d, "__file__", file);
817 if (err == 0)
818 err = PyDict_SetItemString(d, "__path__", path);
819 if (err != 0) {
820 m = NULL;
821 goto cleanup;
822 }
823 buf[0] = '\0';
824 fdp = find_module("__init__", path, buf, sizeof(buf), &fp);
825 if (fdp == NULL) {
826 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
827 PyErr_Clear();
828 }
829 else
830 m = NULL;
831 goto cleanup;
832 }
833 m = load_module(name, fp, buf, fdp->type);
834 if (fp != NULL)
835 fclose(fp);
836 cleanup:
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000837 Py_XDECREF(path);
838 Py_XDECREF(file);
839 return m;
840}
841
842
843/* Helper to test for built-in module */
844
845static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000846is_builtin(char *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000847{
848 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +0000849 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
850 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
851 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000852 return -1;
853 else
854 return 1;
855 }
856 }
857 return 0;
858}
859
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000860
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000861/* Search the path (default sys.path) for a module. Return the
862 corresponding filedescr struct, and (via return arguments) the
863 pathname and an open file. Return NULL if the module is not found. */
864
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000865#ifdef MS_COREDLL
Thomas Woutersb4bd21c2000-07-22 23:38:01 +0000866extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **,
867 char *, int);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000868#endif
869
Tim Peters50d8d372001-02-28 05:34:27 +0000870static int case_ok(char *, int, int, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000871static int find_init_module(char *); /* Forward */
Guido van Rossum197346f1997-10-31 18:38:52 +0000872
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 Rossum80bb9651996-12-05 23:27:02 +0000879 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000880 FILE *fp = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000881#ifndef RISCOS
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000882 struct stat statbuf;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000883#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000884 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
885 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
886 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossum0506a431998-08-11 15:07:39 +0000887 char name[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000888
Fred Drake4c82b232000-06-30 16:18:57 +0000889 if (strlen(realname) > MAXPATHLEN) {
Guido van Rossum8f4d3312001-10-18 18:54:11 +0000890 PyErr_SetString(PyExc_OverflowError,
891 "module name is too long");
Fred Drake4c82b232000-06-30 16:18:57 +0000892 return NULL;
893 }
Guido van Rossum0506a431998-08-11 15:07:39 +0000894 strcpy(name, realname);
895
896 if (path != NULL && PyString_Check(path)) {
Guido van Rossum8f4d3312001-10-18 18:54:11 +0000897 /* The only type of submodule allowed inside a "frozen"
898 package are other frozen modules or packages. */
Guido van Rossum0506a431998-08-11 15:07:39 +0000899 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
900 PyErr_SetString(PyExc_ImportError,
901 "full frozen module name too long");
902 return NULL;
903 }
904 strcpy(buf, PyString_AsString(path));
905 strcat(buf, ".");
906 strcat(buf, name);
907 strcpy(name, buf);
Jack Jansen550fdae2001-10-30 13:08:39 +0000908#ifdef macintosh
909 /* Freezing on the mac works different, and the modules are
910 ** actually on sys.path. So we don't take the quick exit but
911 ** continue with the normal flow.
912 */
913 path = NULL;
914#else
Guido van Rossum8f4d3312001-10-18 18:54:11 +0000915 if (find_frozen(name) != NULL) {
916 strcpy(buf, name);
917 return &fd_frozen;
918 }
919 PyErr_Format(PyExc_ImportError,
920 "No frozen submodule named %.200s", name);
921 return NULL;
Jack Jansen550fdae2001-10-30 13:08:39 +0000922#endif
Guido van Rossum0506a431998-08-11 15:07:39 +0000923 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000924 if (path == NULL) {
925 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000926 strcpy(buf, name);
927 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000928 }
Greg Ward201baee2001-10-04 14:52:06 +0000929 if ((find_frozen(name)) != NULL) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000930 strcpy(buf, name);
931 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000932 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000933
Guido van Rossumac279101996-08-22 23:10:58 +0000934#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000935 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
936 if (fp != NULL) {
937 *p_fp = fp;
938 return fdp;
939 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000940#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000941 path = PySys_GetObject("path");
942 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000943 if (path == NULL || !PyList_Check(path)) {
944 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +0000945 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000946 return NULL;
947 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000948 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000949 namelen = strlen(name);
950 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000951 PyObject *v = PyList_GetItem(path, i);
952 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000953 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000954 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000955 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000956 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000957 strcpy(buf, PyString_AsString(v));
Fred Drake4c82b232000-06-30 16:18:57 +0000958 if (strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000959 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000960#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000961#ifdef INTERN_STRINGS
Tim Peters50d8d372001-02-28 05:34:27 +0000962 /*
Guido van Rossum741689d1997-08-12 14:53:39 +0000963 ** Speedup: each sys.path item is interned, and
964 ** FindResourceModule remembers which items refer to
965 ** folders (so we don't have to bother trying to look
Tim Peters50d8d372001-02-28 05:34:27 +0000966 ** into them for resources).
Guido van Rossum741689d1997-08-12 14:53:39 +0000967 */
968 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
969 v = PyList_GET_ITEM(path, i);
970#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000971 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000972 static struct filedescr resfiledescr =
973 {"", "", PY_RESOURCE};
Tim Peters50d8d372001-02-28 05:34:27 +0000974
Jack Jansen9c96a921995-02-15 22:57:06 +0000975 return &resfiledescr;
976 }
Guido van Rossum0f84a341998-08-06 13:36:01 +0000977 if (PyMac_FindCodeResourceModule((PyStringObject *)v, name, buf)) {
978 static struct filedescr resfiledescr =
979 {"", "", PY_CODERESOURCE};
Tim Peters50d8d372001-02-28 05:34:27 +0000980
Guido van Rossum0f84a341998-08-06 13:36:01 +0000981 return &resfiledescr;
982 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000983#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000984 if (len > 0 && buf[len-1] != SEP
985#ifdef ALTSEP
986 && buf[len-1] != ALTSEP
987#endif
988 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000989 buf[len++] = SEP;
Guido van Rossum215c3402000-11-13 17:26:32 +0000990 strcpy(buf+len, name);
991 len += namelen;
Tim Peters50d8d372001-02-28 05:34:27 +0000992
993 /* Check for package import (buf holds a directory name,
994 and there's an __init__ module in that directory */
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000995#ifdef HAVE_STAT
Tim Peterscab3f682001-04-29 22:21:25 +0000996 if (stat(buf, &statbuf) == 0 && /* it exists */
997 S_ISDIR(statbuf.st_mode) && /* it's a directory */
998 find_init_module(buf) && /* it has __init__.py */
999 case_ok(buf, len, namelen, name)) /* and case matches */
1000 return &fd_package;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001001#else
1002 /* XXX How are you going to test for directories? */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001003#ifdef RISCOS
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001004 if (isdir(buf) &&
1005 find_init_module(buf) &&
1006 case_ok(buf, len, namelen, name))
1007 return &fd_package;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001008#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001009#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +00001010#ifdef macintosh
1011 fdp = PyMac_FindModuleExtension(buf, &len, name);
Jack Jansen4df3c522001-03-20 23:09:54 +00001012 if (fdp) {
Guido van Rossum9a61dc91997-10-08 15:25:08 +00001013#else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001014 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001015 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001016 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001017 PySys_WriteStderr("# trying %s\n", buf);
Jack Jansen4df3c522001-03-20 23:09:54 +00001018#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001019 fp = fopen(buf, fdp->mode);
Tim Peters50d8d372001-02-28 05:34:27 +00001020 if (fp != NULL) {
1021 if (case_ok(buf, len, namelen, name))
1022 break;
1023 else { /* continue search */
1024 fclose(fp);
1025 fp = NULL;
Barry Warsaw914a0b12001-02-02 19:12:16 +00001026 }
Barry Warsaw914a0b12001-02-02 19:12:16 +00001027 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001028 }
1029 if (fp != NULL)
1030 break;
1031 }
1032 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001033 PyErr_Format(PyExc_ImportError,
1034 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001035 return NULL;
1036 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001037 *p_fp = fp;
1038 return fdp;
1039}
1040
Tim Petersd1e87a82001-03-01 18:12:00 +00001041/* case_ok(char* buf, int len, int namelen, char* name)
1042 * The arguments here are tricky, best shown by example:
1043 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1044 * ^ ^ ^ ^
1045 * |--------------------- buf ---------------------|
1046 * |------------------- len ------------------|
1047 * |------ name -------|
1048 * |----- namelen -----|
1049 * buf is the full path, but len only counts up to (& exclusive of) the
1050 * extension. name is the module name, also exclusive of extension.
1051 *
1052 * We've already done a successful stat() or fopen() on buf, so know that
1053 * there's some match, possibly case-insensitive.
1054 *
Tim Peters50d8d372001-02-28 05:34:27 +00001055 * case_ok() is to return 1 if there's a case-sensitive match for
1056 * name, else 0. case_ok() is also to return 1 if envar PYTHONCASEOK
1057 * exists.
Tim Petersd1e87a82001-03-01 18:12:00 +00001058 *
Tim Peters50d8d372001-02-28 05:34:27 +00001059 * case_ok() is used to implement case-sensitive import semantics even
1060 * on platforms with case-insensitive filesystems. It's trivial to implement
1061 * for case-sensitive filesystems. It's pretty much a cross-platform
1062 * nightmare for systems with case-insensitive filesystems.
1063 */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001064
Tim Peters50d8d372001-02-28 05:34:27 +00001065/* First we may need a pile of platform-specific header files; the sequence
1066 * of #if's here should match the sequence in the body of case_ok().
1067 */
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001068#if defined(MS_WIN32) || defined(__CYGWIN__)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001069#include <windows.h>
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001070#ifdef __CYGWIN__
1071#include <sys/cygwin.h>
1072#endif
1073
Tim Peters50d8d372001-02-28 05:34:27 +00001074#elif defined(DJGPP)
1075#include <dir.h>
1076
1077#elif defined(macintosh)
1078#include <TextUtils.h>
1079#ifdef USE_GUSI1
1080#include "TFileSpec.h" /* for Path2FSSpec() */
1081#endif
1082
Tim Petersd1e87a82001-03-01 18:12:00 +00001083#elif defined(__MACH__) && defined(__APPLE__) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001084#include <sys/types.h>
1085#include <dirent.h>
1086
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001087#elif defined(RISCOS)
1088#include "oslib/osfscontrol.h"
Tim Peters50d8d372001-02-28 05:34:27 +00001089#endif
1090
Guido van Rossum0980bd91998-02-13 17:18:36 +00001091static int
Tim Peters50d8d372001-02-28 05:34:27 +00001092case_ok(char *buf, int len, int namelen, char *name)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001093{
Tim Peters50d8d372001-02-28 05:34:27 +00001094/* Pick a platform-specific implementation; the sequence of #if's here should
1095 * match the sequence just above.
1096 */
1097
1098/* MS_WIN32 || __CYGWIN__ */
1099#if defined(MS_WIN32) || defined(__CYGWIN__)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001100 WIN32_FIND_DATA data;
1101 HANDLE h;
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001102#ifdef __CYGWIN__
1103 char tempbuf[MAX_PATH];
1104#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001105
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001106 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001107 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001108
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001109#ifdef __CYGWIN__
1110 cygwin32_conv_to_win32_path(buf, tempbuf);
1111 h = FindFirstFile(tempbuf, &data);
1112#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001113 h = FindFirstFile(buf, &data);
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001114#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001115 if (h == INVALID_HANDLE_VALUE) {
1116 PyErr_Format(PyExc_NameError,
1117 "Can't find file for module %.100s\n(filename %.300s)",
1118 name, buf);
1119 return 0;
1120 }
1121 FindClose(h);
Tim Peters50d8d372001-02-28 05:34:27 +00001122 return strncmp(data.cFileName, name, namelen) == 0;
1123
1124/* DJGPP */
1125#elif defined(DJGPP)
1126 struct ffblk ffblk;
1127 int done;
1128
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001129 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001130 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001131
1132 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
1133 if (done) {
Guido van Rossum0980bd91998-02-13 17:18:36 +00001134 PyErr_Format(PyExc_NameError,
Tim Peters50d8d372001-02-28 05:34:27 +00001135 "Can't find file for module %.100s\n(filename %.300s)",
Guido van Rossum0980bd91998-02-13 17:18:36 +00001136 name, buf);
1137 return 0;
1138 }
Tim Peters50d8d372001-02-28 05:34:27 +00001139 return strncmp(ffblk.ff_name, name, namelen) == 0;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001140
Tim Peters50d8d372001-02-28 05:34:27 +00001141/* macintosh */
1142#elif defined(macintosh)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001143 FSSpec fss;
1144 OSErr err;
Tim Peters50d8d372001-02-28 05:34:27 +00001145
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001146 if (Py_GETENV("PYTHONCASEOK") != NULL)
Tim Peters50d8d372001-02-28 05:34:27 +00001147 return 1;
1148
Guido van Rossumb33aa1a2000-04-24 15:08:18 +00001149#ifndef USE_GUSI1
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001150 err = FSMakeFSSpec(0, 0, Pstring(buf), &fss);
1151#else
1152 /* GUSI's Path2FSSpec() resolves all possible aliases nicely on
1153 the way, which is fine for all directories, but here we need
1154 the original name of the alias file (say, Dlg.ppc.slb, not
1155 toolboxmodules.ppc.slb). */
1156 char *colon;
1157 err = Path2FSSpec(buf, &fss);
1158 if (err == noErr) {
1159 colon = strrchr(buf, ':'); /* find filename */
1160 if (colon != NULL)
1161 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1162 Pstring(colon+1), &fss);
1163 else
1164 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1165 fss.name, &fss);
1166 }
1167#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001168 if (err) {
1169 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001170 "Can't find file for module %.100s\n(filename %.300s)",
1171 name, buf);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001172 return 0;
1173 }
Tim Peters50d8d372001-02-28 05:34:27 +00001174 return fss.name[0] >= namelen &&
1175 strncmp(name, (char *)fss.name+1, namelen) == 0;
1176
Tim Peters677898a2001-03-02 03:28:03 +00001177/* new-fangled macintosh (macosx) */
Tim Petersd1e87a82001-03-01 18:12:00 +00001178#elif defined(__MACH__) && defined(__APPLE__) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001179 DIR *dirp;
1180 struct dirent *dp;
Tim Petersd1e87a82001-03-01 18:12:00 +00001181 char dirname[MAXPATHLEN + 1];
1182 const int dirlen = len - namelen - 1; /* don't want trailing SEP */
Tim Peters430f5d42001-03-01 01:30:56 +00001183
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001184 if (Py_GETENV("PYTHONCASEOK") != NULL)
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001185 return 1;
1186
Tim Petersd1e87a82001-03-01 18:12:00 +00001187 /* Copy the dir component into dirname; substitute "." if empty */
1188 if (dirlen <= 0) {
1189 dirname[0] = '.';
1190 dirname[1] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001191 }
1192 else {
Tim Petersd1e87a82001-03-01 18:12:00 +00001193 assert(dirlen <= MAXPATHLEN);
1194 memcpy(dirname, buf, dirlen);
1195 dirname[dirlen] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001196 }
1197 /* Open the directory and search the entries for an exact match. */
Tim Petersd1e87a82001-03-01 18:12:00 +00001198 dirp = opendir(dirname);
Tim Peters430f5d42001-03-01 01:30:56 +00001199 if (dirp) {
Tim Peters677898a2001-03-02 03:28:03 +00001200 char *nameWithExt = buf + len - namelen;
Tim Peters430f5d42001-03-01 01:30:56 +00001201 while ((dp = readdir(dirp)) != NULL) {
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001202 const int thislen =
Tim Peters430f5d42001-03-01 01:30:56 +00001203#ifdef _DIRENT_HAVE_D_NAMELEN
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001204 dp->d_namlen;
Tim Peters430f5d42001-03-01 01:30:56 +00001205#else
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001206 strlen(dp->d_name);
Tim Peters430f5d42001-03-01 01:30:56 +00001207#endif
Tim Petersd1e87a82001-03-01 18:12:00 +00001208 if (thislen >= namelen &&
Tim Peters677898a2001-03-02 03:28:03 +00001209 strcmp(dp->d_name, nameWithExt) == 0) {
Tim Peters430f5d42001-03-01 01:30:56 +00001210 (void)closedir(dirp);
1211 return 1; /* Found */
1212 }
1213 }
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001214 (void)closedir(dirp);
Tim Peters430f5d42001-03-01 01:30:56 +00001215 }
Tim Peters430f5d42001-03-01 01:30:56 +00001216 return 0 ; /* Not found */
Tim Peters430f5d42001-03-01 01:30:56 +00001217
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001218/* RISC OS */
1219#elif defined(RISCOS)
1220 char canon[MAXPATHLEN+1]; /* buffer for the canonical form of the path */
1221 char buf2[MAXPATHLEN+2];
1222 char *nameWithExt = buf+len-namelen;
1223 int canonlen;
1224 os_error *e;
1225
1226 if (Py_GETENV("PYTHONCASEOK") != NULL)
1227 return 1;
1228
1229 /* workaround:
1230 append wildcard, otherwise case of filename wouldn't be touched */
1231 strcpy(buf2, buf);
1232 strcat(buf2, "*");
1233
1234 e = xosfscontrol_canonicalise_path(buf2,canon,0,0,MAXPATHLEN+1,&canonlen);
1235 canonlen = MAXPATHLEN+1-canonlen;
1236 if (e || canonlen<=0 || canonlen>(MAXPATHLEN+1) )
1237 return 0;
1238 if (strcmp(nameWithExt, canon+canonlen-strlen(nameWithExt))==0)
1239 return 1; /* match */
1240
1241 return 0;
1242
Tim Peters50d8d372001-02-28 05:34:27 +00001243/* assuming it's a case-sensitive filesystem, so there's nothing to do! */
1244#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001245 return 1;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001246
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001247#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001248}
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001249
Guido van Rossum0980bd91998-02-13 17:18:36 +00001250
Guido van Rossum197346f1997-10-31 18:38:52 +00001251#ifdef HAVE_STAT
1252/* Helper to look for __init__.py or __init__.py[co] in potential package */
1253static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001254find_init_module(char *buf)
Guido van Rossum197346f1997-10-31 18:38:52 +00001255{
Tim Peters0f9431f2001-07-05 03:47:53 +00001256 const size_t save_len = strlen(buf);
Fred Drake4c82b232000-06-30 16:18:57 +00001257 size_t i = save_len;
Tim Peters0f9431f2001-07-05 03:47:53 +00001258 char *pname; /* pointer to start of __init__ */
Guido van Rossum197346f1997-10-31 18:38:52 +00001259 struct stat statbuf;
1260
Tim Peters0f9431f2001-07-05 03:47:53 +00001261/* For calling case_ok(buf, len, namelen, name):
1262 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1263 * ^ ^ ^ ^
1264 * |--------------------- buf ---------------------|
1265 * |------------------- len ------------------|
1266 * |------ name -------|
1267 * |----- namelen -----|
1268 */
Guido van Rossum197346f1997-10-31 18:38:52 +00001269 if (save_len + 13 >= MAXPATHLEN)
1270 return 0;
1271 buf[i++] = SEP;
Tim Peters0f9431f2001-07-05 03:47:53 +00001272 pname = buf + i;
1273 strcpy(pname, "__init__.py");
Guido van Rossum197346f1997-10-31 18:38:52 +00001274 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001275 if (case_ok(buf,
1276 save_len + 9, /* len("/__init__") */
1277 8, /* len("__init__") */
1278 pname)) {
1279 buf[save_len] = '\0';
1280 return 1;
1281 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001282 }
Tim Peters0f9431f2001-07-05 03:47:53 +00001283 i += strlen(pname);
1284 strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum197346f1997-10-31 18:38:52 +00001285 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001286 if (case_ok(buf,
1287 save_len + 9, /* len("/__init__") */
1288 8, /* len("__init__") */
1289 pname)) {
1290 buf[save_len] = '\0';
1291 return 1;
1292 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001293 }
1294 buf[save_len] = '\0';
1295 return 0;
1296}
Guido van Rossum48a680c2001-03-02 06:34:14 +00001297
1298#else
1299
1300#ifdef RISCOS
1301static int
1302find_init_module(buf)
1303 char *buf;
1304{
1305 int save_len = strlen(buf);
1306 int i = save_len;
1307
1308 if (save_len + 13 >= MAXPATHLEN)
1309 return 0;
1310 buf[i++] = SEP;
1311 strcpy(buf+i, "__init__/py");
1312 if (isfile(buf)) {
1313 buf[save_len] = '\0';
1314 return 1;
1315 }
1316
1317 if (Py_OptimizeFlag)
1318 strcpy(buf+i, "o");
1319 else
1320 strcpy(buf+i, "c");
1321 if (isfile(buf)) {
1322 buf[save_len] = '\0';
1323 return 1;
1324 }
1325 buf[save_len] = '\0';
1326 return 0;
1327}
1328#endif /*RISCOS*/
1329
Guido van Rossum197346f1997-10-31 18:38:52 +00001330#endif /* HAVE_STAT */
1331
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001332
Tim Petersdbd9ba62000-07-09 03:09:57 +00001333static int init_builtin(char *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001334
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001335/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001336 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001337
Guido van Rossum79f25d91997-04-29 20:08:16 +00001338static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001339load_module(char *name, FILE *fp, char *buf, int type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001340{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001341 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001342 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001343 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001344
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001345 /* First check that there's an open file (if we need one) */
1346 switch (type) {
1347 case PY_SOURCE:
1348 case PY_COMPILED:
1349 if (fp == NULL) {
1350 PyErr_Format(PyExc_ValueError,
1351 "file object required for import (type code %d)",
1352 type);
1353 return NULL;
1354 }
1355 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001356
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001357 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001358
1359 case PY_SOURCE:
1360 m = load_source_module(name, buf, fp);
1361 break;
1362
1363 case PY_COMPILED:
1364 m = load_compiled_module(name, buf, fp);
1365 break;
1366
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001367#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001368 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001369 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001370 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001371#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001372
Jack Jansen9c96a921995-02-15 22:57:06 +00001373#ifdef macintosh
1374 case PY_RESOURCE:
1375 m = PyMac_LoadResourceModule(name, buf);
1376 break;
Guido van Rossum0f84a341998-08-06 13:36:01 +00001377 case PY_CODERESOURCE:
1378 m = PyMac_LoadCodeResourceModule(name, buf);
1379 break;
Jack Jansen9c96a921995-02-15 22:57:06 +00001380#endif
1381
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001382 case PKG_DIRECTORY:
1383 m = load_package(name, buf);
1384 break;
1385
1386 case C_BUILTIN:
1387 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001388 if (buf != NULL && buf[0] != '\0')
1389 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001390 if (type == C_BUILTIN)
1391 err = init_builtin(name);
1392 else
1393 err = PyImport_ImportFrozenModule(name);
1394 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001395 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001396 if (err == 0) {
1397 PyErr_Format(PyExc_ImportError,
1398 "Purported %s module %.200s not found",
1399 type == C_BUILTIN ?
1400 "builtin" : "frozen",
1401 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001402 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001403 }
1404 modules = PyImport_GetModuleDict();
1405 m = PyDict_GetItemString(modules, name);
1406 if (m == NULL) {
1407 PyErr_Format(
1408 PyExc_ImportError,
1409 "%s module %.200s not properly initialized",
1410 type == C_BUILTIN ?
1411 "builtin" : "frozen",
1412 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001413 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001414 }
1415 Py_INCREF(m);
1416 break;
1417
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001418 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001419 PyErr_Format(PyExc_ImportError,
1420 "Don't know how to import %.200s (type code %d)",
1421 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001422 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001423
1424 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001425
1426 return m;
1427}
1428
1429
1430/* Initialize a built-in module.
1431 Return 1 for succes, 0 if the module is not found, and -1 with
1432 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001433
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001434static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001435init_builtin(char *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001436{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001437 struct _inittab *p;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001438
Greg Ward201baee2001-10-04 14:52:06 +00001439 if (_PyImport_FindExtension(name, name) != NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00001440 return 1;
1441
Guido van Rossum771c6c81997-10-31 18:37:24 +00001442 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001443 if (strcmp(name, p->name) == 0) {
1444 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001445 PyErr_Format(PyExc_ImportError,
1446 "Cannot re-init internal module %.200s",
1447 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001448 return -1;
1449 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001450 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001451 PySys_WriteStderr("import %s # builtin\n", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001452 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001453 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001454 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001455 if (_PyImport_FixupExtension(name, name) == NULL)
1456 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001457 return 1;
1458 }
1459 }
1460 return 0;
1461}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001462
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001463
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001464/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001465
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001466static struct _frozen *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001467find_frozen(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001468{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001469 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001470
Guido van Rossum79f25d91997-04-29 20:08:16 +00001471 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001472 if (p->name == NULL)
1473 return NULL;
1474 if (strcmp(p->name, name) == 0)
1475 break;
1476 }
1477 return p;
1478}
1479
Guido van Rossum79f25d91997-04-29 20:08:16 +00001480static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001481get_frozen_object(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001482{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001483 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001484 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001485
1486 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001487 PyErr_Format(PyExc_ImportError,
1488 "No such frozen object named %.200s",
1489 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001490 return NULL;
1491 }
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001492 if (p->code == NULL) {
1493 PyErr_Format(PyExc_ImportError,
1494 "Excluded frozen object named %.200s",
1495 name);
1496 return NULL;
1497 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001498 size = p->size;
1499 if (size < 0)
1500 size = -size;
1501 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001502}
1503
1504/* Initialize a frozen module.
1505 Return 1 for succes, 0 if the module is not found, and -1 with
1506 an exception set if the initialization failed.
1507 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001508
1509int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001510PyImport_ImportFrozenModule(char *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001511{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001512 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001513 PyObject *co;
1514 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001515 int ispackage;
1516 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001517
1518 if (p == NULL)
1519 return 0;
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001520 if (p->code == NULL) {
1521 PyErr_Format(PyExc_ImportError,
1522 "Excluded frozen object named %.200s",
1523 name);
1524 return -1;
1525 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001526 size = p->size;
1527 ispackage = (size < 0);
1528 if (ispackage)
1529 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001530 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001531 PySys_WriteStderr("import %s # frozen%s\n",
Guido van Rossuma5568d31998-03-05 03:45:08 +00001532 name, ispackage ? " package" : "");
1533 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001534 if (co == NULL)
1535 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001536 if (!PyCode_Check(co)) {
1537 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001538 PyErr_Format(PyExc_TypeError,
1539 "frozen object %.200s is not a code object",
1540 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001541 return -1;
1542 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001543 if (ispackage) {
1544 /* Set __path__ to the package name */
1545 PyObject *d, *s;
1546 int err;
1547 m = PyImport_AddModule(name);
1548 if (m == NULL)
1549 return -1;
1550 d = PyModule_GetDict(m);
1551 s = PyString_InternFromString(name);
1552 if (s == NULL)
1553 return -1;
1554 err = PyDict_SetItemString(d, "__path__", s);
1555 Py_DECREF(s);
1556 if (err != 0)
1557 return err;
1558 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001559 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001560 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001561 if (m == NULL)
1562 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001563 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001564 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001565}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001566
1567
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001568/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001569 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001570
Guido van Rossum79f25d91997-04-29 20:08:16 +00001571PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001572PyImport_ImportModule(char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00001573{
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00001574 PyObject *pname;
1575 PyObject *result;
1576
1577 pname = PyString_FromString(name);
1578 result = PyImport_Import(pname);
1579 Py_DECREF(pname);
1580 return result;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001581}
1582
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001583/* Forward declarations for helper routines */
Tim Petersdbd9ba62000-07-09 03:09:57 +00001584static PyObject *get_parent(PyObject *globals, char *buf, int *p_buflen);
1585static PyObject *load_next(PyObject *mod, PyObject *altmod,
1586 char **p_name, char *buf, int *p_buflen);
1587static int mark_miss(char *name);
1588static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
1589 char *buf, int buflen, int recursive);
1590static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001591
1592/* The Magnum Opus of dotted-name import :-) */
1593
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001594static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001595import_module_ex(char *name, PyObject *globals, PyObject *locals,
1596 PyObject *fromlist)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001597{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001598 char buf[MAXPATHLEN+1];
1599 int buflen = 0;
1600 PyObject *parent, *head, *next, *tail;
1601
1602 parent = get_parent(globals, buf, &buflen);
1603 if (parent == NULL)
1604 return NULL;
1605
1606 head = load_next(parent, Py_None, &name, buf, &buflen);
1607 if (head == NULL)
1608 return NULL;
1609
1610 tail = head;
1611 Py_INCREF(tail);
1612 while (name) {
1613 next = load_next(tail, tail, &name, buf, &buflen);
1614 Py_DECREF(tail);
1615 if (next == NULL) {
1616 Py_DECREF(head);
1617 return NULL;
1618 }
1619 tail = next;
1620 }
1621
1622 if (fromlist != NULL) {
1623 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1624 fromlist = NULL;
1625 }
1626
1627 if (fromlist == NULL) {
1628 Py_DECREF(tail);
1629 return head;
1630 }
1631
1632 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001633 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001634 Py_DECREF(tail);
1635 return NULL;
1636 }
1637
1638 return tail;
1639}
1640
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001641PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001642PyImport_ImportModuleEx(char *name, PyObject *globals, PyObject *locals,
1643 PyObject *fromlist)
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001644{
1645 PyObject *result;
1646 lock_import();
Guido van Rossumd65911b1998-03-03 22:33:27 +00001647 result = import_module_ex(name, globals, locals, fromlist);
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001648 unlock_import();
1649 return result;
1650}
1651
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001652static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001653get_parent(PyObject *globals, char *buf, int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001654{
1655 static PyObject *namestr = NULL;
1656 static PyObject *pathstr = NULL;
1657 PyObject *modname, *modpath, *modules, *parent;
1658
1659 if (globals == NULL || !PyDict_Check(globals))
1660 return Py_None;
1661
1662 if (namestr == NULL) {
1663 namestr = PyString_InternFromString("__name__");
1664 if (namestr == NULL)
1665 return NULL;
1666 }
1667 if (pathstr == NULL) {
1668 pathstr = PyString_InternFromString("__path__");
1669 if (pathstr == NULL)
1670 return NULL;
1671 }
1672
1673 *buf = '\0';
1674 *p_buflen = 0;
1675 modname = PyDict_GetItem(globals, namestr);
1676 if (modname == NULL || !PyString_Check(modname))
1677 return Py_None;
1678
1679 modpath = PyDict_GetItem(globals, pathstr);
1680 if (modpath != NULL) {
1681 int len = PyString_GET_SIZE(modname);
1682 if (len > MAXPATHLEN) {
1683 PyErr_SetString(PyExc_ValueError,
1684 "Module name too long");
1685 return NULL;
1686 }
1687 strcpy(buf, PyString_AS_STRING(modname));
1688 *p_buflen = len;
1689 }
1690 else {
1691 char *start = PyString_AS_STRING(modname);
1692 char *lastdot = strrchr(start, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001693 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001694 if (lastdot == NULL)
1695 return Py_None;
1696 len = lastdot - start;
1697 if (len >= MAXPATHLEN) {
1698 PyErr_SetString(PyExc_ValueError,
1699 "Module name too long");
1700 return NULL;
1701 }
1702 strncpy(buf, start, len);
1703 buf[len] = '\0';
1704 *p_buflen = len;
1705 }
1706
1707 modules = PyImport_GetModuleDict();
1708 parent = PyDict_GetItemString(modules, buf);
1709 if (parent == NULL)
1710 parent = Py_None;
1711 return parent;
1712 /* We expect, but can't guarantee, if parent != None, that:
1713 - parent.__name__ == buf
1714 - parent.__dict__ is globals
1715 If this is violated... Who cares? */
1716}
1717
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001718/* altmod is either None or same as mod */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001719static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001720load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
1721 int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001722{
1723 char *name = *p_name;
1724 char *dot = strchr(name, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001725 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001726 char *p;
1727 PyObject *result;
1728
1729 if (dot == NULL) {
1730 *p_name = NULL;
1731 len = strlen(name);
1732 }
1733 else {
1734 *p_name = dot+1;
1735 len = dot-name;
1736 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00001737 if (len == 0) {
1738 PyErr_SetString(PyExc_ValueError,
1739 "Empty module name");
1740 return NULL;
1741 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001742
1743 p = buf + *p_buflen;
1744 if (p != buf)
1745 *p++ = '.';
1746 if (p+len-buf >= MAXPATHLEN) {
1747 PyErr_SetString(PyExc_ValueError,
1748 "Module name too long");
1749 return NULL;
1750 }
1751 strncpy(p, name, len);
1752 p[len] = '\0';
1753 *p_buflen = p+len-buf;
1754
1755 result = import_submodule(mod, p, buf);
1756 if (result == Py_None && altmod != mod) {
1757 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001758 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001759 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001760 if (result != NULL && result != Py_None) {
1761 if (mark_miss(buf) != 0) {
1762 Py_DECREF(result);
1763 return NULL;
1764 }
1765 strncpy(buf, name, len);
1766 buf[len] = '\0';
1767 *p_buflen = len;
1768 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001769 }
1770 if (result == NULL)
1771 return NULL;
1772
1773 if (result == Py_None) {
1774 Py_DECREF(result);
1775 PyErr_Format(PyExc_ImportError,
1776 "No module named %.200s", name);
1777 return NULL;
1778 }
1779
1780 return result;
1781}
1782
1783static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001784mark_miss(char *name)
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001785{
1786 PyObject *modules = PyImport_GetModuleDict();
1787 return PyDict_SetItemString(modules, name, Py_None);
1788}
1789
1790static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001791ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, int buflen,
1792 int recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001793{
1794 int i;
1795
1796 if (!PyObject_HasAttrString(mod, "__path__"))
1797 return 1;
1798
1799 for (i = 0; ; i++) {
1800 PyObject *item = PySequence_GetItem(fromlist, i);
1801 int hasit;
1802 if (item == NULL) {
1803 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1804 PyErr_Clear();
1805 return 1;
1806 }
1807 return 0;
1808 }
1809 if (!PyString_Check(item)) {
1810 PyErr_SetString(PyExc_TypeError,
1811 "Item in ``from list'' not a string");
1812 Py_DECREF(item);
1813 return 0;
1814 }
1815 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001816 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001817 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001818 /* See if the package defines __all__ */
1819 if (recursive)
1820 continue; /* Avoid endless recursion */
1821 all = PyObject_GetAttrString(mod, "__all__");
1822 if (all == NULL)
1823 PyErr_Clear();
1824 else {
1825 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1826 return 0;
1827 Py_DECREF(all);
1828 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001829 continue;
1830 }
1831 hasit = PyObject_HasAttr(mod, item);
1832 if (!hasit) {
1833 char *subname = PyString_AS_STRING(item);
1834 PyObject *submod;
1835 char *p;
1836 if (buflen + strlen(subname) >= MAXPATHLEN) {
1837 PyErr_SetString(PyExc_ValueError,
1838 "Module name too long");
1839 Py_DECREF(item);
1840 return 0;
1841 }
1842 p = buf + buflen;
1843 *p++ = '.';
1844 strcpy(p, subname);
1845 submod = import_submodule(mod, subname, buf);
1846 Py_XDECREF(submod);
1847 if (submod == NULL) {
1848 Py_DECREF(item);
1849 return 0;
1850 }
1851 }
1852 Py_DECREF(item);
1853 }
1854
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001855 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001856}
1857
1858static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001859import_submodule(PyObject *mod, char *subname, char *fullname)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001860{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001861 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossumf48f11c2001-07-23 13:27:49 +00001862 PyObject *m, *res = NULL;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001863
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001864 /* Require:
1865 if mod == None: subname == fullname
1866 else: mod.__name__ + "." + subname == fullname
1867 */
1868
Tim Peters50d8d372001-02-28 05:34:27 +00001869 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001870 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001871 }
1872 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001873 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001874 char buf[MAXPATHLEN+1];
1875 struct filedescr *fdp;
1876 FILE *fp = NULL;
1877
Guido van Rossum9c0afe51998-05-19 15:09:05 +00001878 if (mod == Py_None)
1879 path = NULL;
1880 else {
1881 path = PyObject_GetAttrString(mod, "__path__");
1882 if (path == NULL) {
1883 PyErr_Clear();
1884 Py_INCREF(Py_None);
1885 return Py_None;
1886 }
1887 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001888
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001889 buf[0] = '\0';
Guido van Rossumb68cd421998-07-01 17:36:26 +00001890 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1891 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001892 if (fdp == NULL) {
1893 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1894 return NULL;
1895 PyErr_Clear();
1896 Py_INCREF(Py_None);
1897 return Py_None;
1898 }
1899 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001900 if (fp)
1901 fclose(fp);
Guido van Rossumf48f11c2001-07-23 13:27:49 +00001902 if (mod != Py_None) {
1903 /* Irrespective of the success of this load, make a
1904 reference to it in the parent package module.
1905 A copy gets saved in the modules dictionary
1906 under the full name, so get a reference from
1907 there, if need be. (The exception is when
1908 the load failed with a SyntaxError -- then
1909 there's no trace in sys.modules. In that case,
1910 of course, do nothing extra.) */
1911 res = m;
1912 if (res == NULL)
1913 res = PyDict_GetItemString(modules, fullname);
1914 if (res != NULL &&
1915 PyObject_SetAttrString(mod, subname, res) < 0) {
1916 Py_XDECREF(m);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001917 m = NULL;
1918 }
1919 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001920 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001921
1922 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001923}
1924
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001925
1926/* Re-import a module of any kind and return its module object, WITH
1927 INCREMENTED REFERENCE COUNT */
1928
Guido van Rossum79f25d91997-04-29 20:08:16 +00001929PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001930PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001931{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001932 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001933 PyObject *path = NULL;
1934 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001935 char buf[MAXPATHLEN+1];
1936 struct filedescr *fdp;
1937 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001938
Guido van Rossum79f25d91997-04-29 20:08:16 +00001939 if (m == NULL || !PyModule_Check(m)) {
1940 PyErr_SetString(PyExc_TypeError,
1941 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001942 return NULL;
1943 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001944 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001945 if (name == NULL)
1946 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001947 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001948 PyErr_Format(PyExc_ImportError,
1949 "reload(): module %.200s not in sys.modules",
1950 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001951 return NULL;
1952 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001953 subname = strrchr(name, '.');
1954 if (subname == NULL)
1955 subname = name;
1956 else {
1957 PyObject *parentname, *parent;
1958 parentname = PyString_FromStringAndSize(name, (subname-name));
1959 if (parentname == NULL)
1960 return NULL;
1961 parent = PyDict_GetItem(modules, parentname);
Barry Warsaw38793331999-01-27 17:54:20 +00001962 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00001963 if (parent == NULL) {
1964 PyErr_Format(PyExc_ImportError,
1965 "reload(): parent %.200s not in sys.modules",
1966 name);
1967 return NULL;
1968 }
1969 subname++;
1970 path = PyObject_GetAttrString(parent, "__path__");
1971 if (path == NULL)
1972 PyErr_Clear();
1973 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001974 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001975 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1976 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001977 if (fdp == NULL)
1978 return NULL;
1979 m = load_module(name, fp, buf, fdp->type);
1980 if (fp)
1981 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001982 return m;
1983}
1984
1985
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001986/* Higher-level import emulator which emulates the "import" statement
1987 more accurately -- it invokes the __import__() function from the
1988 builtins of the current globals. This means that the import is
1989 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00001990 environment, e.g. by "rexec".
1991 A dummy list ["__doc__"] is passed as the 4th argument so that
1992 e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
1993 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001994
1995PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001996PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001997{
1998 static PyObject *silly_list = NULL;
1999 static PyObject *builtins_str = NULL;
2000 static PyObject *import_str = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002001 PyObject *globals = NULL;
2002 PyObject *import = NULL;
2003 PyObject *builtins = NULL;
2004 PyObject *r = NULL;
2005
2006 /* Initialize constant string objects */
2007 if (silly_list == NULL) {
2008 import_str = PyString_InternFromString("__import__");
2009 if (import_str == NULL)
2010 return NULL;
2011 builtins_str = PyString_InternFromString("__builtins__");
2012 if (builtins_str == NULL)
2013 return NULL;
2014 silly_list = Py_BuildValue("[s]", "__doc__");
2015 if (silly_list == NULL)
2016 return NULL;
2017 }
2018
2019 /* Get the builtins from current globals */
2020 globals = PyEval_GetGlobals();
Guido van Rossum85cd1d62001-02-20 21:43:24 +00002021 if (globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00002022 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002023 builtins = PyObject_GetItem(globals, builtins_str);
2024 if (builtins == NULL)
2025 goto err;
2026 }
2027 else {
2028 /* No globals -- use standard builtins, and fake globals */
2029 PyErr_Clear();
2030
Guido van Rossum85cd1d62001-02-20 21:43:24 +00002031 builtins = PyImport_ImportModuleEx("__builtin__",
2032 NULL, NULL, NULL);
2033 if (builtins == NULL)
2034 return NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002035 globals = Py_BuildValue("{OO}", builtins_str, builtins);
2036 if (globals == NULL)
2037 goto err;
2038 }
2039
2040 /* Get the __import__ function from the builtins */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002041 if (PyDict_Check(builtins)) {
Fred Drakea76ba6e2001-03-06 06:31:15 +00002042 import = PyObject_GetItem(builtins, import_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002043 if (import == NULL)
2044 PyErr_SetObject(PyExc_KeyError, import_str);
2045 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002046 else
Fred Drakea76ba6e2001-03-06 06:31:15 +00002047 import = PyObject_GetAttr(builtins, import_str);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002048 if (import == NULL)
2049 goto err;
2050
2051 /* Call the _import__ function with the proper argument list */
2052 r = PyObject_CallFunction(import, "OOOO",
2053 module_name, globals, globals, silly_list);
2054
2055 err:
2056 Py_XDECREF(globals);
2057 Py_XDECREF(builtins);
2058 Py_XDECREF(import);
Tim Peters50d8d372001-02-28 05:34:27 +00002059
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002060 return r;
2061}
2062
2063
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002064/* Module 'imp' provides Python access to the primitives used for
2065 importing modules.
2066*/
2067
Guido van Rossum79f25d91997-04-29 20:08:16 +00002068static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002069imp_get_magic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002070{
2071 char buf[4];
2072
Guido van Rossum43713e52000-02-29 13:59:29 +00002073 if (!PyArg_ParseTuple(args, ":get_magic"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002074 return NULL;
Guido van Rossum96774c12000-05-01 20:19:08 +00002075 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
2076 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
2077 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
2078 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002079
Guido van Rossum79f25d91997-04-29 20:08:16 +00002080 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002081}
2082
Guido van Rossum79f25d91997-04-29 20:08:16 +00002083static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002084imp_get_suffixes(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002085{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002086 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002087 struct filedescr *fdp;
2088
Guido van Rossum43713e52000-02-29 13:59:29 +00002089 if (!PyArg_ParseTuple(args, ":get_suffixes"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002090 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002091 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002092 if (list == NULL)
2093 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002094 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
2095 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002096 fdp->suffix, fdp->mode, fdp->type);
2097 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002098 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002099 return NULL;
2100 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002101 if (PyList_Append(list, item) < 0) {
2102 Py_DECREF(list);
2103 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002104 return NULL;
2105 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002106 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002107 }
2108 return list;
2109}
2110
Guido van Rossum79f25d91997-04-29 20:08:16 +00002111static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002112call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002113{
Tim Petersdbd9ba62000-07-09 03:09:57 +00002114 extern int fclose(FILE *);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002115 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002116 struct filedescr *fdp;
2117 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002118 FILE *fp = NULL;
2119
2120 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002121 if (path == Py_None)
2122 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002123 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
2124 if (fdp == NULL)
2125 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002126 if (fp != NULL) {
2127 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
2128 if (fob == NULL) {
2129 fclose(fp);
2130 return NULL;
2131 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002132 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002133 else {
2134 fob = Py_None;
2135 Py_INCREF(fob);
Tim Peters50d8d372001-02-28 05:34:27 +00002136 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002137 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002138 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002139 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002140 return ret;
2141}
2142
Guido van Rossum79f25d91997-04-29 20:08:16 +00002143static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002144imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002145{
2146 char *name;
2147 PyObject *path = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002148 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002149 return NULL;
2150 return call_find_module(name, path);
2151}
2152
2153static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002154imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002155{
2156 char *name;
2157 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002158 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002159 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002160 return NULL;
2161 ret = init_builtin(name);
2162 if (ret < 0)
2163 return NULL;
2164 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002165 Py_INCREF(Py_None);
2166 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002167 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002168 m = PyImport_AddModule(name);
2169 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002170 return m;
2171}
2172
Guido van Rossum79f25d91997-04-29 20:08:16 +00002173static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002174imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002175{
2176 char *name;
2177 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002178 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002179 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002180 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002181 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002182 if (ret < 0)
2183 return NULL;
2184 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002185 Py_INCREF(Py_None);
2186 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002187 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002188 m = PyImport_AddModule(name);
2189 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002190 return m;
2191}
2192
Guido van Rossum79f25d91997-04-29 20:08:16 +00002193static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002194imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002195{
2196 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002197
Guido van Rossum43713e52000-02-29 13:59:29 +00002198 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002199 return NULL;
2200 return get_frozen_object(name);
2201}
2202
Guido van Rossum79f25d91997-04-29 20:08:16 +00002203static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002204imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002205{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002206 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002207 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002208 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002209 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002210}
2211
Guido van Rossum79f25d91997-04-29 20:08:16 +00002212static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002213imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002214{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002215 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002216 struct _frozen *p;
Guido van Rossum43713e52000-02-29 13:59:29 +00002217 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002218 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002219 p = find_frozen(name);
2220 return PyInt_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002221}
2222
2223static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002224get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002225{
2226 FILE *fp;
2227 if (fob == NULL) {
2228 fp = fopen(pathname, mode);
2229 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002230 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002231 }
2232 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002233 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002234 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002235 PyErr_SetString(PyExc_ValueError,
2236 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002237 }
2238 return fp;
2239}
2240
Guido van Rossum79f25d91997-04-29 20:08:16 +00002241static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002242imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002243{
2244 char *name;
2245 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002246 PyObject *fob = NULL;
2247 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002248 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002249 if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002250 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002251 return NULL;
2252 fp = get_file(pathname, fob, "rb");
2253 if (fp == NULL)
2254 return NULL;
2255 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002256 if (fob == NULL)
2257 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002258 return m;
2259}
2260
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002261#ifdef HAVE_DYNAMIC_LOADING
2262
Guido van Rossum79f25d91997-04-29 20:08:16 +00002263static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002264imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002265{
2266 char *name;
2267 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002268 PyObject *fob = NULL;
2269 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002270 FILE *fp = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002271 if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002272 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002273 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002274 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002275 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002276 if (fp == NULL)
2277 return NULL;
2278 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002279 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002280 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002281}
2282
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002283#endif /* HAVE_DYNAMIC_LOADING */
2284
Guido van Rossum79f25d91997-04-29 20:08:16 +00002285static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002286imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002287{
2288 char *name;
2289 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002290 PyObject *fob = NULL;
2291 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002292 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002293 if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002294 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002295 return NULL;
2296 fp = get_file(pathname, fob, "r");
2297 if (fp == NULL)
2298 return NULL;
2299 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002300 if (fob == NULL)
2301 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002302 return m;
2303}
2304
Jack Jansen9c96a921995-02-15 22:57:06 +00002305#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002306static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002307imp_load_resource(PyObject *self, PyObject *args)
Jack Jansen9c96a921995-02-15 22:57:06 +00002308{
2309 char *name;
2310 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002311 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002312
Guido van Rossum43713e52000-02-29 13:59:29 +00002313 if (!PyArg_ParseTuple(args, "ss:load_resource", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002314 return NULL;
2315 m = PyMac_LoadResourceModule(name, pathname);
2316 return m;
2317}
2318#endif /* macintosh */
2319
Guido van Rossum79f25d91997-04-29 20:08:16 +00002320static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002321imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002322{
2323 char *name;
2324 PyObject *fob;
2325 char *pathname;
2326 char *suffix; /* Unused */
2327 char *mode;
2328 int type;
2329 FILE *fp;
2330
Guido van Rossum43713e52000-02-29 13:59:29 +00002331 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002332 &name, &fob, &pathname,
2333 &suffix, &mode, &type))
2334 return NULL;
2335 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
2336 PyErr_Format(PyExc_ValueError,
2337 "invalid file open mode %.200s", mode);
2338 return NULL;
2339 }
2340 if (fob == Py_None)
2341 fp = NULL;
2342 else {
2343 if (!PyFile_Check(fob)) {
2344 PyErr_SetString(PyExc_ValueError,
2345 "load_module arg#2 should be a file or None");
2346 return NULL;
2347 }
2348 fp = get_file(pathname, fob, mode);
2349 if (fp == NULL)
2350 return NULL;
2351 }
2352 return load_module(name, fp, pathname, type);
2353}
2354
2355static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002356imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002357{
2358 char *name;
2359 char *pathname;
Guido van Rossum43713e52000-02-29 13:59:29 +00002360 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002361 return NULL;
2362 return load_package(name, pathname);
2363}
2364
2365static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002366imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002367{
2368 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002369 if (!PyArg_ParseTuple(args, "s:new_module", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002370 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002371 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002372}
2373
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002374/* Doc strings */
2375
2376static char doc_imp[] = "\
2377This module provides the components needed to build your own\n\
2378__import__ function. Undocumented functions are obsolete.\n\
2379";
2380
2381static char doc_find_module[] = "\
2382find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
2383Search for a module. If path is omitted or None, search for a\n\
2384built-in, frozen or special module and continue search in sys.path.\n\
2385The module name cannot contain '.'; to search for a submodule of a\n\
2386package, pass the submodule name and the package's __path__.\
2387";
2388
2389static char doc_load_module[] = "\
2390load_module(name, file, filename, (suffix, mode, type)) -> module\n\
2391Load a module, given information returned by find_module().\n\
2392The module name must include the full package name, if any.\
2393";
2394
2395static char doc_get_magic[] = "\
2396get_magic() -> string\n\
2397Return the magic number for .pyc or .pyo files.\
2398";
2399
2400static char doc_get_suffixes[] = "\
2401get_suffixes() -> [(suffix, mode, type), ...]\n\
2402Return a list of (suffix, mode, type) tuples describing the files\n\
2403that find_module() looks for.\
2404";
2405
2406static char doc_new_module[] = "\
2407new_module(name) -> module\n\
2408Create a new module. Do not enter it in sys.modules.\n\
2409The module name must include the full package name, if any.\
2410";
2411
Tim Peters69232342001-08-30 05:16:13 +00002412static char doc_lock_held[] = "\
2413lock_held() -> 0 or 1\n\
2414Return 1 if the import lock is currently held.\n\
2415On platforms without threads, return 0.\
2416";
2417
Guido van Rossum79f25d91997-04-29 20:08:16 +00002418static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002419 {"find_module", imp_find_module, 1, doc_find_module},
2420 {"get_magic", imp_get_magic, 1, doc_get_magic},
2421 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2422 {"load_module", imp_load_module, 1, doc_load_module},
2423 {"new_module", imp_new_module, 1, doc_new_module},
Tim Peters69232342001-08-30 05:16:13 +00002424 {"lock_held", imp_lock_held, 1, doc_lock_held},
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002425 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002426 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002427 {"init_builtin", imp_init_builtin, 1},
2428 {"init_frozen", imp_init_frozen, 1},
2429 {"is_builtin", imp_is_builtin, 1},
2430 {"is_frozen", imp_is_frozen, 1},
2431 {"load_compiled", imp_load_compiled, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002432#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002433 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002434#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002435 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002436#ifdef macintosh
2437 {"load_resource", imp_load_resource, 1},
2438#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002439 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002440 {NULL, NULL} /* sentinel */
2441};
2442
Guido van Rossum1a8791e1998-08-04 22:46:29 +00002443static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002444setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002445{
2446 PyObject *v;
2447 int err;
2448
2449 v = PyInt_FromLong((long)value);
2450 err = PyDict_SetItemString(d, name, v);
2451 Py_XDECREF(v);
2452 return err;
2453}
2454
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002455void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002456initimp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002457{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002458 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002459
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002460 m = Py_InitModule4("imp", imp_methods, doc_imp,
2461 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002462 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002463
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002464 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2465 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2466 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2467 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2468 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2469 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2470 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2471 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00002472 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002473
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002474 failure:
2475 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002476}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002477
2478
Guido van Rossumb18618d2000-05-03 23:44:39 +00002479/* API for embedding applications that want to add their own entries
2480 to the table of built-in modules. This should normally be called
2481 *before* Py_Initialize(). When the table resize fails, -1 is
2482 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002483
2484 After a similar function by Just van Rossum. */
2485
2486int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002487PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002488{
2489 static struct _inittab *our_copy = NULL;
2490 struct _inittab *p;
2491 int i, n;
2492
2493 /* Count the number of entries in both tables */
2494 for (n = 0; newtab[n].name != NULL; n++)
2495 ;
2496 if (n == 0)
2497 return 0; /* Nothing to do */
2498 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2499 ;
2500
2501 /* Allocate new memory for the combined table */
Guido van Rossumb18618d2000-05-03 23:44:39 +00002502 p = our_copy;
2503 PyMem_RESIZE(p, struct _inittab, i+n+1);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002504 if (p == NULL)
2505 return -1;
2506
2507 /* Copy the tables into the new memory */
2508 if (our_copy != PyImport_Inittab)
2509 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2510 PyImport_Inittab = our_copy = p;
2511 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
2512
2513 return 0;
2514}
2515
2516/* Shorthand to add a single entry given a name and a function */
2517
2518int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002519PyImport_AppendInittab(char *name, void (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002520{
2521 struct _inittab newtab[2];
2522
2523 memset(newtab, '\0', sizeof newtab);
2524
2525 newtab[0].name = name;
2526 newtab[0].initfunc = initfunc;
2527
2528 return PyImport_ExtendInittab(newtab);
2529}