blob: b859c2b5690cc36c50cdc63c5edda94e88e9ead3 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/* Module definition and import implementation */
33
Guido van Rossum79f25d91997-04-29 20:08:16 +000034#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000035
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000036#include "node.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000037#include "token.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000038#include "errcode.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +000039#include "marshal.h"
40#include "compile.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000041#include "eval.h"
Guido van Rossumd8bac6d1992-02-26 15:19:13 +000042#include "osdefs.h"
Guido van Rossum1ae940a1995-01-02 19:04:15 +000043#include "importdl.h"
Jack Jansen9c96a921995-02-15 22:57:06 +000044#ifdef macintosh
45#include "macglue.h"
46#endif
Guido van Rossumc405b7b1991-06-04 19:39:42 +000047
Guido van Rossum80bb9651996-12-05 23:27:02 +000048#ifdef HAVE_UNISTD_H
49#include <unistd.h>
50#endif
51
Guido van Rossumaee0bad1997-09-05 07:33:22 +000052/* We expect that stat exists on most systems.
53 It's confirmed on Unix, Mac and Windows.
54 If you don't have it, add #define DONT_HAVE_STAT to your config.h. */
55#ifndef DONT_HAVE_STAT
56#define HAVE_STAT
57
58#include <sys/types.h>
59#include <sys/stat.h>
60
Guido van Rossum595d7ba1997-12-05 21:45:29 +000061#if defined(PYCC_VACPP)
62/* VisualAge C/C++ Failed to Define MountType Field in sys/stat.h */
63#define S_IFMT (S_IFDIR|S_IFCHR|S_IFREG)
64#endif
65
Guido van Rossumaee0bad1997-09-05 07:33:22 +000066#ifndef S_ISDIR
67#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
68#endif
69
70#endif
71
72
Guido van Rossum79f25d91997-04-29 20:08:16 +000073extern long PyOS_GetLastModificationTime(); /* In getmtime.c */
Guido van Rossum21d335e1993-10-15 13:01:11 +000074
Guido van Rossum6c849691994-09-26 15:47:17 +000075/* Magic word to reject .pyc files generated by other Python versions */
Guido van Rossum7faeab31995-07-07 22:50:36 +000076/* Change for each incompatible change */
77/* The value of CR and LF is incorporated so if you ever read or write
78 a .pyc file in text mode the magic number will be wrong; also, the
79 Apple MPW compiler swaps their values, botching string constants */
80/* XXX Perhaps the magic number should be frozen and a version field
81 added to the .pyc file header? */
Guido van Rossumdd5db431997-01-17 21:06:11 +000082/* New way to come up with the magic number: (YEAR-1995), MONTH, DAY */
Guido van Rossum99d18251997-01-24 03:44:53 +000083#define MAGIC (20121 | ((long)'\r'<<16) | ((long)'\n'<<24))
Guido van Rossum3ddee711991-12-16 13:06:34 +000084
Guido van Rossum25ce5661997-08-02 03:10:38 +000085/* See _PyImport_FixupExtension() below */
86static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000087
Guido van Rossum771c6c81997-10-31 18:37:24 +000088/* This table is defined in config.c: */
89extern struct _inittab _PyImport_Inittab[];
90
91struct _inittab *PyImport_Inittab = _PyImport_Inittab;
Guido van Rossum66f1fa81991-04-03 19:03:52 +000092
Guido van Rossum1ae940a1995-01-02 19:04:15 +000093/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000094
95void
Guido van Rossum25ce5661997-08-02 03:10:38 +000096_PyImport_Init()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000097{
Guido van Rossum0824f631997-03-11 18:37:35 +000098 if (Py_OptimizeFlag) {
99 /* Replace ".pyc" with ".pyo" in import_filetab */
100 struct filedescr *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000101 for (p = _PyImport_Filetab; p->suffix != NULL; p++) {
Guido van Rossum0824f631997-03-11 18:37:35 +0000102 if (strcmp(p->suffix, ".pyc") == 0)
103 p->suffix = ".pyo";
104 }
105 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000106}
107
Guido van Rossum25ce5661997-08-02 03:10:38 +0000108void
109_PyImport_Fini()
110{
111 Py_XDECREF(extensions);
112 extensions = NULL;
113}
114
115
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000116/* Locking primitives to prevent parallel imports of the same module
117 in different threads to return with a partially loaded module.
118 These calls are serialized by the global interpreter lock. */
119
120#ifdef WITH_THREAD
121
122#include "thread.h"
123
124static type_lock import_lock = 0;
125static long import_lock_thread = -1;
126static int import_lock_level = 0;
127
128static void
129lock_import()
130{
131 long me = get_thread_ident();
132 if (me == -1)
133 return; /* Too bad */
134 if (import_lock == NULL)
135 import_lock = allocate_lock();
136 if (import_lock_thread == me) {
137 import_lock_level++;
138 return;
139 }
140 if (import_lock_thread != -1 || !acquire_lock(import_lock, 0)) {
141 PyThreadState *tstate = PyEval_SaveThread();
142 acquire_lock(import_lock, 1);
143 PyEval_RestoreThread(tstate);
144 }
145 import_lock_thread = me;
146 import_lock_level = 1;
147}
148
149static void
150unlock_import()
151{
152 long me = get_thread_ident();
153 if (me == -1)
154 return; /* Too bad */
155 if (import_lock_thread != me)
156 Py_FatalError("unlock_import: not holding the import lock");
157 import_lock_level--;
158 if (import_lock_level == 0) {
159 import_lock_thread = -1;
160 release_lock(import_lock);
161 }
162}
163
164#else
165
166#define lock_import()
167#define unlock_import()
168
169#endif
170
Guido van Rossum25ce5661997-08-02 03:10:38 +0000171/* Helper for sys */
172
173PyObject *
174PyImport_GetModuleDict()
175{
176 PyInterpreterState *interp = PyThreadState_Get()->interp;
177 if (interp->modules == NULL)
178 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
179 return interp->modules;
180}
181
Guido van Rossum3f5da241990-12-20 15:06:42 +0000182
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000183/* List of names to clear in sys */
184static char* sys_deletes[] = {
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000185 "path", "argv", "ps1", "ps2", "exitfunc",
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000186 "exc_type", "exc_value", "exc_traceback",
187 "last_type", "last_value", "last_traceback",
188 NULL
189};
190
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000191static char* sys_files[] = {
192 "stdin", "__stdin__",
193 "stdout", "__stdout__",
194 "stderr", "__stderr__",
195 NULL
196};
197
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000198
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000199/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000200
Guido van Rossum3f5da241990-12-20 15:06:42 +0000201void
Guido van Rossum79f25d91997-04-29 20:08:16 +0000202PyImport_Cleanup()
Guido van Rossum3f5da241990-12-20 15:06:42 +0000203{
Guido van Rossum758eec01998-01-19 21:58:26 +0000204 int pos, ndone;
205 char *name;
206 PyObject *key, *value, *dict;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000207 PyInterpreterState *interp = PyThreadState_Get()->interp;
Guido van Rossum758eec01998-01-19 21:58:26 +0000208 PyObject *modules = interp->modules;
209
210 if (modules == NULL)
211 return; /* Already done */
212
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000213 /* Delete some special variables first. These are common
214 places where user values hide and people complain when their
215 destructors fail. Since the modules containing them are
216 deleted *last* of all, they would come too late in the normal
217 destruction order. Sigh. */
218
219 value = PyDict_GetItemString(modules, "__builtin__");
220 if (value != NULL && PyModule_Check(value)) {
221 dict = PyModule_GetDict(value);
222 if (Py_VerboseFlag)
223 fprintf(stderr, "# clear __builtin__._\n");
224 PyDict_SetItemString(dict, "_", Py_None);
225 }
226 value = PyDict_GetItemString(modules, "sys");
227 if (value != NULL && PyModule_Check(value)) {
228 char **p;
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000229 PyObject *v;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000230 dict = PyModule_GetDict(value);
231 for (p = sys_deletes; *p != NULL; p++) {
232 if (Py_VerboseFlag)
233 fprintf(stderr, "# clear sys.%s\n", *p);
234 PyDict_SetItemString(dict, *p, Py_None);
235 }
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000236 for (p = sys_files; *p != NULL; p+=2) {
237 if (Py_VerboseFlag)
238 fprintf(stderr, "# restore sys.%s\n", *p);
239 v = PyDict_GetItemString(dict, *(p+1));
240 if (v == NULL)
241 v = Py_None;
242 PyDict_SetItemString(dict, *p, v);
243 }
244 }
245
246 /* First, delete __main__ */
247 value = PyDict_GetItemString(modules, "__main__");
248 if (value != NULL && PyModule_Check(value)) {
249 if (Py_VerboseFlag)
250 fprintf(stderr, "# cleanup __main__\n");
251 _PyModule_Clear(value);
252 PyDict_SetItemString(modules, "__main__", Py_None);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000253 }
254
Guido van Rossum758eec01998-01-19 21:58:26 +0000255 /* The special treatment of __builtin__ here is because even
256 when it's not referenced as a module, its dictionary is
257 referenced by almost every module's __builtins__. Since
258 deleting a module clears its dictionary (even if there are
259 references left to it), we need to delete the __builtin__
260 module last. Likewise, we don't delete sys until the very
261 end because it is implicitly referenced (e.g. by print).
262
263 Also note that we 'delete' modules by replacing their entry
264 in the modules dict with None, rather than really deleting
265 them; this avoids a rehash of the modules dictionary and
266 also marks them as "non existent" so they won't be
267 re-imported. */
268
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000269 /* Next, repeatedly delete modules with a reference count of
Guido van Rossum758eec01998-01-19 21:58:26 +0000270 one (skipping __builtin__ and sys) and delete them */
271 do {
272 ndone = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000273 pos = 0;
Guido van Rossum758eec01998-01-19 21:58:26 +0000274 while (PyDict_Next(modules, &pos, &key, &value)) {
275 if (value->ob_refcnt != 1)
276 continue;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000277 if (PyModule_Check(value)) {
Guido van Rossum758eec01998-01-19 21:58:26 +0000278 name = PyString_AsString(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000279 if (strcmp(name, "__builtin__") == 0)
280 continue;
281 if (strcmp(name, "sys") == 0)
282 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000283 if (Py_VerboseFlag)
284 fprintf(stderr,
285 "# cleanup[1] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000286 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000287 PyDict_SetItem(modules, key, Py_None);
288 ndone++;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000289 }
290 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000291 } while (ndone > 0);
292
Guido van Rossum758eec01998-01-19 21:58:26 +0000293 /* Next, delete all modules (still skipping __builtin__ and sys) */
294 pos = 0;
295 while (PyDict_Next(modules, &pos, &key, &value)) {
296 if (PyModule_Check(value)) {
297 name = PyString_AsString(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000298 if (strcmp(name, "__builtin__") == 0)
299 continue;
300 if (strcmp(name, "sys") == 0)
301 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000302 if (Py_VerboseFlag)
303 fprintf(stderr, "# cleanup[2] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000304 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000305 PyDict_SetItem(modules, key, Py_None);
306 }
307 }
308
309 /* Next, delete sys and __builtin__ (in that order) */
310 value = PyDict_GetItemString(modules, "sys");
311 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000312 if (Py_VerboseFlag)
313 fprintf(stderr, "# cleanup sys\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000314 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000315 PyDict_SetItemString(modules, "sys", Py_None);
316 }
317 value = PyDict_GetItemString(modules, "__builtin__");
318 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000319 if (Py_VerboseFlag)
320 fprintf(stderr, "# cleanup __builtin__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000321 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000322 PyDict_SetItemString(modules, "__builtin__", Py_None);
323 }
324
325 /* Finally, clear and delete the modules directory */
326 PyDict_Clear(modules);
327 interp->modules = NULL;
328 Py_DECREF(modules);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000329}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000330
331
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000332/* Helper for pythonrun.c -- return magic number */
333
334long
Guido van Rossum79f25d91997-04-29 20:08:16 +0000335PyImport_GetMagicNumber()
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000336{
337 return MAGIC;
338}
339
340
Guido van Rossum25ce5661997-08-02 03:10:38 +0000341/* Magic for extension modules (built-in as well as dynamically
342 loaded). To prevent initializing an extension module more than
343 once, we keep a static dictionary 'extensions' keyed by module name
344 (for built-in modules) or by filename (for dynamically loaded
345 modules), containing these modules. A copy od the module's
346 dictionary is stored by calling _PyImport_FixupExtension()
347 immediately after the module initialization function succeeds. A
348 copy can be retrieved from there by calling
349 _PyImport_FindExtension(). */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000350
Guido van Rossum79f25d91997-04-29 20:08:16 +0000351PyObject *
Guido van Rossum25ce5661997-08-02 03:10:38 +0000352_PyImport_FixupExtension(name, filename)
353 char *name;
354 char *filename;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000355{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000356 PyObject *modules, *mod, *dict, *copy;
357 if (extensions == NULL) {
358 extensions = PyDict_New();
359 if (extensions == NULL)
360 return NULL;
361 }
362 modules = PyImport_GetModuleDict();
363 mod = PyDict_GetItemString(modules, name);
364 if (mod == NULL || !PyModule_Check(mod)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000365 PyErr_Format(PyExc_SystemError,
366 "_PyImport_FixupExtension: module %.200s not loaded", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000367 return NULL;
368 }
369 dict = PyModule_GetDict(mod);
370 if (dict == NULL)
371 return NULL;
372 copy = PyObject_CallMethod(dict, "copy", "");
373 if (copy == NULL)
374 return NULL;
375 PyDict_SetItemString(extensions, filename, copy);
376 Py_DECREF(copy);
377 return copy;
378}
379
380PyObject *
381_PyImport_FindExtension(name, filename)
382 char *name;
383 char *filename;
384{
385 PyObject *dict, *mod, *mdict, *result;
386 if (extensions == NULL)
387 return NULL;
388 dict = PyDict_GetItemString(extensions, filename);
389 if (dict == NULL)
390 return NULL;
391 mod = PyImport_AddModule(name);
392 if (mod == NULL)
393 return NULL;
394 mdict = PyModule_GetDict(mod);
395 if (mdict == NULL)
396 return NULL;
397 result = PyObject_CallMethod(mdict, "update", "O", dict);
398 if (result == NULL)
399 return NULL;
400 Py_DECREF(result);
401 if (Py_VerboseFlag)
402 fprintf(stderr, "import %s # previously loaded (%s)\n",
403 name, filename);
404 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000405}
406
407
408/* Get the module object corresponding to a module name.
409 First check the modules dictionary if there's one there,
410 if not, create a new one and insert in in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000411 Because the former action is most common, THIS DOES NOT RETURN A
412 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000413
Guido van Rossum79f25d91997-04-29 20:08:16 +0000414PyObject *
415PyImport_AddModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000416 char *name;
417{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000418 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000419 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000420
Guido van Rossum25ce5661997-08-02 03:10:38 +0000421 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
Guido van Rossum79f25d91997-04-29 20:08:16 +0000422 PyModule_Check(m))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000423 return m;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000424 m = PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000425 if (m == NULL)
426 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000427 if (PyDict_SetItemString(modules, name, m) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000428 Py_DECREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000429 return NULL;
430 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000431 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000432
433 return m;
434}
435
436
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000437/* Execute a code object in a module and return the module object
438 WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000439
Guido van Rossum79f25d91997-04-29 20:08:16 +0000440PyObject *
441PyImport_ExecCodeModule(name, co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000442 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000443 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000444{
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000445 return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
446}
447
448PyObject *
449PyImport_ExecCodeModuleEx(name, co, pathname)
450 char *name;
451 PyObject *co;
452 char *pathname;
453{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000454 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000455 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000456
Guido van Rossum79f25d91997-04-29 20:08:16 +0000457 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000458 if (m == NULL)
459 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000460 d = PyModule_GetDict(m);
461 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
462 if (PyDict_SetItemString(d, "__builtins__",
463 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000464 return NULL;
465 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000466 /* Remember the filename as the __file__ attribute */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000467 v = NULL;
468 if (pathname != NULL) {
469 v = PyString_FromString(pathname);
470 if (v == NULL)
471 PyErr_Clear();
472 }
473 if (v == NULL) {
474 v = ((PyCodeObject *)co)->co_filename;
475 Py_INCREF(v);
476 }
477 if (PyDict_SetItemString(d, "__file__", v) != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000478 PyErr_Clear(); /* Not important enough to report */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000479 Py_DECREF(v);
480
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000481 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000482 if (v == NULL)
483 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000484 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000485
Guido van Rossum25ce5661997-08-02 03:10:38 +0000486 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000487 PyErr_Format(PyExc_ImportError,
488 "Loaded module %.200s not found in sys.modules",
489 name);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000490 return NULL;
491 }
492
Guido van Rossum79f25d91997-04-29 20:08:16 +0000493 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000494
495 return m;
496}
497
498
499/* Given a pathname for a Python source file, fill a buffer with the
500 pathname for the corresponding compiled file. Return the pathname
501 for the compiled file, or NULL if there's no space in the buffer.
502 Doesn't set an exception. */
503
504static char *
505make_compiled_pathname(pathname, buf, buflen)
506 char *pathname;
507 char *buf;
508 int buflen;
509{
510 int len;
511
512 len = strlen(pathname);
513 if (len+2 > buflen)
514 return NULL;
515 strcpy(buf, pathname);
Guido van Rossum0824f631997-03-11 18:37:35 +0000516 strcpy(buf+len, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000517
518 return buf;
519}
520
521
522/* Given a pathname for a Python source file, its time of last
523 modification, and a pathname for a compiled file, check whether the
524 compiled file represents the same version of the source. If so,
525 return a FILE pointer for the compiled file, positioned just after
526 the header; if not, return NULL.
527 Doesn't set an exception. */
528
529static FILE *
530check_compiled_module(pathname, mtime, cpathname)
531 char *pathname;
532 long mtime;
533 char *cpathname;
534{
535 FILE *fp;
536 long magic;
537 long pyc_mtime;
538
539 fp = fopen(cpathname, "rb");
540 if (fp == NULL)
541 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000542 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000543 if (magic != MAGIC) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000544 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000545 fprintf(stderr, "# %s has bad magic\n", cpathname);
546 fclose(fp);
547 return NULL;
548 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000549 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000550 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000551 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000552 fprintf(stderr, "# %s has bad mtime\n", cpathname);
553 fclose(fp);
554 return NULL;
555 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000556 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000557 fprintf(stderr, "# %s matches %s\n", cpathname, pathname);
558 return fp;
559}
560
561
562/* Read a code object from a file and check it for validity */
563
Guido van Rossum79f25d91997-04-29 20:08:16 +0000564static PyCodeObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000565read_compiled_module(cpathname, fp)
566 char *cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000567 FILE *fp;
568{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000569 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000570
Guido van Rossum79f25d91997-04-29 20:08:16 +0000571 co = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000572 /* Ugly: rd_object() may return NULL with or without error */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000573 if (co == NULL || !PyCode_Check(co)) {
574 if (!PyErr_Occurred())
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000575 PyErr_Format(PyExc_ImportError,
576 "Non-code object in %.200s", cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000577 Py_XDECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000578 return NULL;
579 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000580 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000581}
582
583
584/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000585 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000586
Guido van Rossum79f25d91997-04-29 20:08:16 +0000587static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000588load_compiled_module(name, cpathname, fp)
589 char *name;
590 char *cpathname;
591 FILE *fp;
592{
593 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000594 PyCodeObject *co;
595 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000596
Guido van Rossum79f25d91997-04-29 20:08:16 +0000597 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000598 if (magic != MAGIC) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000599 PyErr_Format(PyExc_ImportError,
600 "Bad magic number in %.200s", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000601 return NULL;
602 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000603 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000604 co = read_compiled_module(cpathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000605 if (co == NULL)
606 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000607 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000608 fprintf(stderr, "import %s # precompiled from %s\n",
609 name, cpathname);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000610 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000611 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000612
613 return m;
614}
615
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000616/* Parse a source file and return the corresponding code object */
617
Guido van Rossum79f25d91997-04-29 20:08:16 +0000618static PyCodeObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000619parse_source_module(pathname, fp)
620 char *pathname;
621 FILE *fp;
622{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000623 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000624 node *n;
625
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000626 n = PyParser_SimpleParseFile(fp, pathname, Py_file_input);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000627 if (n == NULL)
628 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000629 co = PyNode_Compile(n, pathname);
630 PyNode_Free(n);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000631
632 return co;
633}
634
635
636/* Write a compiled module to a file, placing the time of last
637 modification of its source into the header.
638 Errors are ignored, if a write error occurs an attempt is made to
639 remove the file. */
640
641static void
642write_compiled_module(co, cpathname, mtime)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000643 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000644 char *cpathname;
645 long mtime;
646{
647 FILE *fp;
648
649 fp = fopen(cpathname, "wb");
650 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000651 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000652 fprintf(stderr,
653 "# can't create %s\n", cpathname);
654 return;
655 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000656 PyMarshal_WriteLongToFile(MAGIC, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000657 /* First write a 0 for mtime */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000658 PyMarshal_WriteLongToFile(0L, fp);
659 PyMarshal_WriteObjectToFile((PyObject *)co, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000660 if (ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000661 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000662 fprintf(stderr, "# can't write %s\n", cpathname);
663 /* Don't keep partial file */
664 fclose(fp);
665 (void) unlink(cpathname);
666 return;
667 }
668 /* Now write the true mtime */
669 fseek(fp, 4L, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000670 PyMarshal_WriteLongToFile(mtime, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000671 fflush(fp);
672 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000673 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000674 fprintf(stderr, "# wrote %s\n", cpathname);
675#ifdef macintosh
Guido van Rossumbe1a6e21996-02-21 15:29:20 +0000676 setfiletype(cpathname, 'Pyth', 'PYC ');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000677#endif
678}
679
680
681/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000682 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
683 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000684
Guido van Rossum79f25d91997-04-29 20:08:16 +0000685static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000686load_source_module(name, pathname, fp)
687 char *name;
688 char *pathname;
689 FILE *fp;
690{
691 long mtime;
692 FILE *fpc;
693 char buf[MAXPATHLEN+1];
694 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000695 PyCodeObject *co;
696 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000697
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000698 mtime = PyOS_GetLastModificationTime(pathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000699 cpathname = make_compiled_pathname(pathname, buf, MAXPATHLEN+1);
700 if (cpathname != NULL &&
701 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000702 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000703 fclose(fpc);
704 if (co == NULL)
705 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000706 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000707 fprintf(stderr, "import %s # precompiled from %s\n",
708 name, cpathname);
709 }
710 else {
711 co = parse_source_module(pathname, fp);
712 if (co == NULL)
713 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000714 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000715 fprintf(stderr, "import %s # from %s\n",
716 name, pathname);
717 write_compiled_module(co, cpathname, mtime);
718 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000719 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000720 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000721
722 return m;
723}
724
725
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000726/* Forward */
727static PyObject *load_module Py_PROTO((char *, FILE *, char *, int));
728static struct filedescr *find_module Py_PROTO((char *, PyObject *,
729 char *, int, FILE **));
Guido van Rossuma86f77d1997-09-09 18:53:47 +0000730static struct _frozen *find_frozen Py_PROTO((char *name));
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000731
732/* Load a package and return its module object WITH INCREMENTED
733 REFERENCE COUNT */
734
735static PyObject *
736load_package(name, pathname)
737 char *name;
738 char *pathname;
739{
740 PyObject *m, *d, *file, *path;
741 int err;
742 char buf[MAXPATHLEN+1];
743 FILE *fp = NULL;
744 struct filedescr *fdp;
745
746 m = PyImport_AddModule(name);
747 if (m == NULL)
748 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000749 if (Py_VerboseFlag)
750 fprintf(stderr, "import %s # directory %s\n",
751 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000752 d = PyModule_GetDict(m);
753 file = PyString_FromString(pathname);
754 if (file == NULL)
755 return NULL;
756 path = Py_BuildValue("[O]", file);
757 if (path == NULL) {
758 Py_DECREF(file);
759 return NULL;
760 }
761 err = PyDict_SetItemString(d, "__file__", file);
762 if (err == 0)
763 err = PyDict_SetItemString(d, "__path__", path);
764 if (err != 0) {
765 m = NULL;
766 goto cleanup;
767 }
768 buf[0] = '\0';
769 fdp = find_module("__init__", path, buf, sizeof(buf), &fp);
770 if (fdp == NULL) {
771 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
772 PyErr_Clear();
773 }
774 else
775 m = NULL;
776 goto cleanup;
777 }
778 m = load_module(name, fp, buf, fdp->type);
779 if (fp != NULL)
780 fclose(fp);
781 cleanup:
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000782 Py_XDECREF(path);
783 Py_XDECREF(file);
784 return m;
785}
786
787
788/* Helper to test for built-in module */
789
790static int
791is_builtin(name)
792 char *name;
793{
794 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +0000795 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
796 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
797 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000798 return -1;
799 else
800 return 1;
801 }
802 }
803 return 0;
804}
805
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000806
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000807/* Search the path (default sys.path) for a module. Return the
808 corresponding filedescr struct, and (via return arguments) the
809 pathname and an open file. Return NULL if the module is not found. */
810
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000811#ifdef MS_COREDLL
812extern FILE *PyWin_FindRegisteredModule();
813#endif
814
Guido van Rossum0980bd91998-02-13 17:18:36 +0000815#ifdef CHECK_IMPORT_CASE
816static int check_case(char *, int, int, char *);
817#endif
818
Guido van Rossum197346f1997-10-31 18:38:52 +0000819static int find_init_module Py_PROTO((char *)); /* Forward */
820
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000821static struct filedescr *
822find_module(name, path, buf, buflen, p_fp)
823 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000824 PyObject *path;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000825 /* Output parameters: */
826 char *buf;
827 int buflen;
828 FILE **p_fp;
829{
830 int i, npath, len, namelen;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000831 struct _frozen *f;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000832 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000833 FILE *fp = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000834 struct stat statbuf;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000835 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
836 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
837 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000838
839 if (path == NULL) {
840 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000841 strcpy(buf, name);
842 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000843 }
Guido van Rossuma5568d31998-03-05 03:45:08 +0000844 if ((f = find_frozen(name)) != NULL) {
845 strcpy(buf, name);
846 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000847 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000848
Guido van Rossumac279101996-08-22 23:10:58 +0000849#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000850 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
851 if (fp != NULL) {
852 *p_fp = fp;
853 return fdp;
854 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000855#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000856 path = PySys_GetObject("path");
857 }
858 else if (PyString_Check(path)) {
859 /* Submodule of frozen package */
Guido van Rossum39b0f891998-04-10 21:52:06 +0000860 if (PyString_Size(path) + 1 + strlen(name) >= (unsigned int)buflen) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000861 PyErr_SetString(PyExc_ImportError,
862 "full frozen module name too long");
863 return NULL;
864 }
865 strcpy(buf, PyString_AsString(path));
866 strcat(buf, ".");
867 strcat(buf, name);
868 if (find_frozen(buf) != NULL)
869 return &fd_frozen;
870 PyErr_Format(PyExc_ImportError,
871 "frozen module %.200s not found", buf);
872 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000873 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000874
Guido van Rossum79f25d91997-04-29 20:08:16 +0000875 if (path == NULL || !PyList_Check(path)) {
876 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +0000877 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000878 return NULL;
879 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000880 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000881 namelen = strlen(name);
882 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000883 PyObject *v = PyList_GetItem(path, i);
884 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000885 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000886 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000887 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000888 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000889 strcpy(buf, PyString_AsString(v));
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000890 if ((int)strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000891 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000892#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000893#ifdef INTERN_STRINGS
894 /*
895 ** Speedup: each sys.path item is interned, and
896 ** FindResourceModule remembers which items refer to
897 ** folders (so we don't have to bother trying to look
898 ** into them for resources).
899 */
900 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
901 v = PyList_GET_ITEM(path, i);
902#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000903 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000904 static struct filedescr resfiledescr =
905 {"", "", PY_RESOURCE};
Jack Jansen9c96a921995-02-15 22:57:06 +0000906
907 return &resfiledescr;
908 }
909#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000910 if (len > 0 && buf[len-1] != SEP
911#ifdef ALTSEP
912 && buf[len-1] != ALTSEP
913#endif
914 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000915 buf[len++] = SEP;
Guido van Rossum40f470f1996-05-23 22:51:04 +0000916#ifdef IMPORT_8x3_NAMES
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000917 /* see if we are searching in directory dos-8x3 */
918 if (len > 7 && !strncmp(buf + len - 8, "dos-8x3", 7)){
Guido van Rossum40f470f1996-05-23 22:51:04 +0000919 int j;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000920 char ch; /* limit name to 8 lower-case characters */
Guido van Rossum40f470f1996-05-23 22:51:04 +0000921 for (j = 0; (ch = name[j]) && j < 8; j++)
922 if (isupper(ch))
923 buf[len++] = tolower(ch);
924 else
925 buf[len++] = ch;
926 }
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000927 else /* Not in dos-8x3, use the full name */
Guido van Rossum6f489d91996-06-28 20:15:15 +0000928#endif
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000929 {
Guido van Rossum40f470f1996-05-23 22:51:04 +0000930 strcpy(buf+len, name);
931 len += namelen;
932 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000933#ifdef HAVE_STAT
934 if (stat(buf, &statbuf) == 0) {
Guido van Rossum197346f1997-10-31 18:38:52 +0000935 if (S_ISDIR(statbuf.st_mode)) {
Guido van Rossum0980bd91998-02-13 17:18:36 +0000936 if (find_init_module(buf)) {
937#ifdef CHECK_IMPORT_CASE
938 if (!check_case(buf, len, namelen,
939 name))
940 return NULL;
941#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000942 return &fd_package;
Guido van Rossum0980bd91998-02-13 17:18:36 +0000943 }
Guido van Rossum197346f1997-10-31 18:38:52 +0000944 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000945 }
946#else
947 /* XXX How are you going to test for directories? */
948#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000949#ifdef macintosh
950 fdp = PyMac_FindModuleExtension(buf, &len, name);
951 if (fdp)
952 fp = fopen(buf, fdp->mode);
953#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000954 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000955 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000956 if (Py_VerboseFlag > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000957 fprintf(stderr, "# trying %s\n", buf);
958 fp = fopen(buf, fdp->mode);
959 if (fp != NULL)
960 break;
961 }
Guido van Rossum741689d1997-08-12 14:53:39 +0000962#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000963 if (fp != NULL)
964 break;
965 }
966 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000967 PyErr_Format(PyExc_ImportError,
968 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000969 return NULL;
970 }
Guido van Rossum0980bd91998-02-13 17:18:36 +0000971#ifdef CHECK_IMPORT_CASE
972 if (!check_case(buf, len, namelen, name)) {
973 fclose(fp);
974 return NULL;
975 }
976#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000977
978 *p_fp = fp;
979 return fdp;
980}
981
Guido van Rossum0980bd91998-02-13 17:18:36 +0000982#ifdef CHECK_IMPORT_CASE
983
984#ifdef MS_WIN32
985#include <windows.h>
Guido van Rossum323bf5e1998-06-24 03:54:06 +0000986#include <ctype.h>
987
988static int
989allcaps8x3(s)
990 char *s;
991{
992 /* Return 1 if s is an 8.3 filename in ALLCAPS */
993 char c;
994 char *dot = strchr(s, '.');
995 char *end = strchr(s, '\0');
996 if (dot != NULL) {
997 if (dot-s > 8)
998 return 1; /* More than 8 before '.' */
999 if (end-dot > 4)
1000 return 1; /* More than 3 after '.' */
1001 end = strchr(dot+1, '.');
1002 if (end != NULL)
1003 return 1; /* More than one dot */
1004 }
1005 else if (end-s > 8)
1006 return 1; /* More than 8 and no dot */
1007 while ((c = *s++)) {
1008 if (islower(c))
1009 return 0;
1010 }
1011 return 1;
1012}
1013
Guido van Rossum0980bd91998-02-13 17:18:36 +00001014static int
1015check_case(char *buf, int len, int namelen, char *name)
1016{
1017 WIN32_FIND_DATA data;
1018 HANDLE h;
1019 if (getenv("PYTHONCASEOK") != NULL)
1020 return 1;
1021 h = FindFirstFile(buf, &data);
1022 if (h == INVALID_HANDLE_VALUE) {
1023 PyErr_Format(PyExc_NameError,
1024 "Can't find file for module %.100s\n(filename %.300s)",
1025 name, buf);
1026 return 0;
1027 }
1028 FindClose(h);
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001029 if (allcaps8x3(data.cFileName)) {
1030 /* Skip the test if the filename is ALL.CAPS. This can
1031 happen in certain circumstances beyond our control,
1032 e.g. when software is installed under NT on a FAT
1033 filesystem and then the same FAT filesystem is used
1034 under Windows 95. */
1035 return 1;
1036 }
Guido van Rossum0980bd91998-02-13 17:18:36 +00001037 if (strncmp(data.cFileName, name, namelen) != 0) {
1038 strcpy(buf+len-namelen, data.cFileName);
1039 PyErr_Format(PyExc_NameError,
1040 "Case mismatch for module name %.100s\n(filename %.300s)",
1041 name, buf);
1042 return 0;
1043 }
1044 return 1;
1045}
1046#endif /* MS_WIN32 */
1047
1048#ifdef macintosh
1049#include <TextUtils.h>
1050static int
1051check_case(char *buf, int len, int namelen, char *name)
1052{
1053 FSSpec fss;
1054 OSErr err;
1055 unsigned char mybuf[MAXPATHLEN+1];
1056
1057 strcpy((char *)mybuf, buf);
1058 c2pstr((char *)mybuf);
1059 err = FSMakeFSSpec(0, 0, mybuf, &fss);
1060 if (err) {
1061 PyErr_Format(PyExc_NameError,
1062 "Can't find file for module %.100s\n(filename %.300s)",
1063 name, buf);
1064 return 0;
1065 }
1066 p2cstr(fss.name);
1067 if ( strncmp(name, (char *)fss.name, namelen) != 0 ) {
1068 PyErr_Format(PyExc_NameError,
1069 "Case mismatch for module name %.100s\n(filename %.300s)",
1070 name, fss.name);
1071 return 0;
1072 }
1073 return 1;
1074}
1075#endif /* macintosh */
1076
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001077#ifdef DJGPP
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001078#include <dir.h>
1079
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001080static int
1081check_case(char *buf, int len, int namelen, char *name)
1082{
1083 struct ffblk ffblk;
1084 int done;
1085
1086 if (getenv("PYTHONCASEOK") != NULL)
1087 return 1;
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001088 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001089 if (done) {
1090 PyErr_Format(PyExc_NameError,
1091 "Can't find file for module %.100s\n(filename %.300s)",
1092 name, buf);
1093 return 0;
1094 }
1095
1096 if (strncmp(ffblk.ff_name, name, namelen) != 0) {
1097 strcpy(buf+len-namelen, ffblk.ff_name);
1098 PyErr_Format(PyExc_NameError,
1099 "Case mismatch for module name %.100s\n(filename %.300s)",
1100 name, buf);
1101 return 0;
1102 }
1103 return 1;
1104}
1105#endif
1106
Guido van Rossum8766a771998-04-10 23:44:32 +00001107#endif /* CHECK_IMPORT_CASE */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001108
Guido van Rossum197346f1997-10-31 18:38:52 +00001109#ifdef HAVE_STAT
1110/* Helper to look for __init__.py or __init__.py[co] in potential package */
1111static int
1112find_init_module(buf)
1113 char *buf;
1114{
1115 int save_len = strlen(buf);
1116 int i = save_len;
1117 struct stat statbuf;
1118
1119 if (save_len + 13 >= MAXPATHLEN)
1120 return 0;
1121 buf[i++] = SEP;
1122 strcpy(buf+i, "__init__.py");
1123 if (stat(buf, &statbuf) == 0) {
1124 buf[save_len] = '\0';
1125 return 1;
1126 }
1127 i += strlen(buf+i);
1128 if (Py_OptimizeFlag)
1129 strcpy(buf+i, "o");
1130 else
1131 strcpy(buf+i, "c");
1132 if (stat(buf, &statbuf) == 0) {
1133 buf[save_len] = '\0';
1134 return 1;
1135 }
1136 buf[save_len] = '\0';
1137 return 0;
1138}
1139#endif /* HAVE_STAT */
1140
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001141
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001142static int init_builtin Py_PROTO((char *)); /* Forward */
1143
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001144/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001145 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001146
Guido van Rossum79f25d91997-04-29 20:08:16 +00001147static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001148load_module(name, fp, buf, type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001149 char *name;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001150 FILE *fp;
1151 char *buf;
1152 int type;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001153{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001154 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001155 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001156 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001157
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001158 /* First check that there's an open file (if we need one) */
1159 switch (type) {
1160 case PY_SOURCE:
1161 case PY_COMPILED:
1162 if (fp == NULL) {
1163 PyErr_Format(PyExc_ValueError,
1164 "file object required for import (type code %d)",
1165 type);
1166 return NULL;
1167 }
1168 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001169
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001170 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001171
1172 case PY_SOURCE:
1173 m = load_source_module(name, buf, fp);
1174 break;
1175
1176 case PY_COMPILED:
1177 m = load_compiled_module(name, buf, fp);
1178 break;
1179
1180 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001181 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001182 break;
1183
Jack Jansen9c96a921995-02-15 22:57:06 +00001184#ifdef macintosh
1185 case PY_RESOURCE:
1186 m = PyMac_LoadResourceModule(name, buf);
1187 break;
1188#endif
1189
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001190 case PKG_DIRECTORY:
1191 m = load_package(name, buf);
1192 break;
1193
1194 case C_BUILTIN:
1195 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001196 if (buf != NULL && buf[0] != '\0')
1197 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001198 if (type == C_BUILTIN)
1199 err = init_builtin(name);
1200 else
1201 err = PyImport_ImportFrozenModule(name);
1202 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001203 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001204 if (err == 0) {
1205 PyErr_Format(PyExc_ImportError,
1206 "Purported %s module %.200s not found",
1207 type == C_BUILTIN ?
1208 "builtin" : "frozen",
1209 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001210 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001211 }
1212 modules = PyImport_GetModuleDict();
1213 m = PyDict_GetItemString(modules, name);
1214 if (m == NULL) {
1215 PyErr_Format(
1216 PyExc_ImportError,
1217 "%s module %.200s not properly initialized",
1218 type == C_BUILTIN ?
1219 "builtin" : "frozen",
1220 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001221 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001222 }
1223 Py_INCREF(m);
1224 break;
1225
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001226 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001227 PyErr_Format(PyExc_ImportError,
1228 "Don't know how to import %.200s (type code %d)",
1229 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001230 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001231
1232 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001233
1234 return m;
1235}
1236
1237
1238/* Initialize a built-in module.
1239 Return 1 for succes, 0 if the module is not found, and -1 with
1240 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001241
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001242static int
1243init_builtin(name)
1244 char *name;
1245{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001246 struct _inittab *p;
1247 PyObject *mod;
1248
1249 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
1250 return 1;
1251
Guido van Rossum771c6c81997-10-31 18:37:24 +00001252 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001253 if (strcmp(name, p->name) == 0) {
1254 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001255 PyErr_Format(PyExc_ImportError,
1256 "Cannot re-init internal module %.200s",
1257 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001258 return -1;
1259 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001260 if (Py_VerboseFlag)
Guido van Rossum25ce5661997-08-02 03:10:38 +00001261 fprintf(stderr, "import %s # builtin\n", name);
1262 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001263 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001264 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001265 if (_PyImport_FixupExtension(name, name) == NULL)
1266 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001267 return 1;
1268 }
1269 }
1270 return 0;
1271}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001272
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001273
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001274/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001275
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001276static struct _frozen *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001277find_frozen(name)
1278 char *name;
1279{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001280 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001281
Guido van Rossum79f25d91997-04-29 20:08:16 +00001282 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001283 if (p->name == NULL)
1284 return NULL;
1285 if (strcmp(p->name, name) == 0)
1286 break;
1287 }
1288 return p;
1289}
1290
Guido van Rossum79f25d91997-04-29 20:08:16 +00001291static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001292get_frozen_object(name)
1293 char *name;
1294{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001295 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001296 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001297
1298 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001299 PyErr_Format(PyExc_ImportError,
1300 "No such frozen object named %.200s",
1301 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001302 return NULL;
1303 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001304 size = p->size;
1305 if (size < 0)
1306 size = -size;
1307 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001308}
1309
1310/* Initialize a frozen module.
1311 Return 1 for succes, 0 if the module is not found, and -1 with
1312 an exception set if the initialization failed.
1313 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001314
1315int
Guido van Rossum79f25d91997-04-29 20:08:16 +00001316PyImport_ImportFrozenModule(name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001317 char *name;
1318{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001319 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001320 PyObject *co;
1321 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001322 int ispackage;
1323 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001324
1325 if (p == NULL)
1326 return 0;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001327 size = p->size;
1328 ispackage = (size < 0);
1329 if (ispackage)
1330 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001331 if (Py_VerboseFlag)
Guido van Rossuma5568d31998-03-05 03:45:08 +00001332 fprintf(stderr, "import %s # frozen%s\n",
1333 name, ispackage ? " package" : "");
1334 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001335 if (co == NULL)
1336 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001337 if (!PyCode_Check(co)) {
1338 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001339 PyErr_Format(PyExc_TypeError,
1340 "frozen object %.200s is not a code object",
1341 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001342 return -1;
1343 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001344 if (ispackage) {
1345 /* Set __path__ to the package name */
1346 PyObject *d, *s;
1347 int err;
1348 m = PyImport_AddModule(name);
1349 if (m == NULL)
1350 return -1;
1351 d = PyModule_GetDict(m);
1352 s = PyString_InternFromString(name);
1353 if (s == NULL)
1354 return -1;
1355 err = PyDict_SetItemString(d, "__path__", s);
1356 Py_DECREF(s);
1357 if (err != 0)
1358 return err;
1359 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001360 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001361 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001362 if (m == NULL)
1363 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001364 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001365 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001366}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001367
1368
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001369/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001370 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001371
Guido van Rossum79f25d91997-04-29 20:08:16 +00001372PyObject *
1373PyImport_ImportModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001374 char *name;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001375{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001376 static PyObject *fromlist = NULL;
1377 if (fromlist == NULL && strchr(name, '.') != NULL) {
1378 fromlist = Py_BuildValue("[s]", "*");
1379 if (fromlist == NULL)
1380 return NULL;
1381 }
1382 return PyImport_ImportModuleEx(name, NULL, NULL, fromlist);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001383}
1384
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001385/* Forward declarations for helper routines */
1386static PyObject *get_parent Py_PROTO((PyObject *globals,
1387 char *buf, int *p_buflen));
1388static PyObject *load_next Py_PROTO((PyObject *mod, PyObject *altmod,
1389 char **p_name, char *buf, int *p_buflen));
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001390static int mark_miss Py_PROTO((char *name));
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001391static int ensure_fromlist Py_PROTO((PyObject *mod, PyObject *fromlist,
Guido van Rossum9905ef91997-09-08 16:07:11 +00001392 char *buf, int buflen, int recursive));
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001393static PyObject * import_submodule Py_PROTO((PyObject *mod,
1394 char *name, char *fullname));
1395
1396/* The Magnum Opus of dotted-name import :-) */
1397
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001398static PyObject *
1399import_module_ex(name, globals, locals, fromlist)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001400 char *name;
1401 PyObject *globals;
1402 PyObject *locals;
1403 PyObject *fromlist;
1404{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001405 char buf[MAXPATHLEN+1];
1406 int buflen = 0;
1407 PyObject *parent, *head, *next, *tail;
1408
1409 parent = get_parent(globals, buf, &buflen);
1410 if (parent == NULL)
1411 return NULL;
1412
1413 head = load_next(parent, Py_None, &name, buf, &buflen);
1414 if (head == NULL)
1415 return NULL;
1416
1417 tail = head;
1418 Py_INCREF(tail);
1419 while (name) {
1420 next = load_next(tail, tail, &name, buf, &buflen);
1421 Py_DECREF(tail);
1422 if (next == NULL) {
1423 Py_DECREF(head);
1424 return NULL;
1425 }
1426 tail = next;
1427 }
1428
1429 if (fromlist != NULL) {
1430 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1431 fromlist = NULL;
1432 }
1433
1434 if (fromlist == NULL) {
1435 Py_DECREF(tail);
1436 return head;
1437 }
1438
1439 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001440 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001441 Py_DECREF(tail);
1442 return NULL;
1443 }
1444
1445 return tail;
1446}
1447
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001448PyObject *
1449PyImport_ImportModuleEx(name, globals, locals, fromlist)
1450 char *name;
1451 PyObject *globals;
1452 PyObject *locals;
1453 PyObject *fromlist;
1454{
1455 PyObject *result;
1456 lock_import();
Guido van Rossumd65911b1998-03-03 22:33:27 +00001457 result = import_module_ex(name, globals, locals, fromlist);
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001458 unlock_import();
1459 return result;
1460}
1461
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001462static PyObject *
1463get_parent(globals, buf, p_buflen)
1464 PyObject *globals;
1465 char *buf;
1466 int *p_buflen;
1467{
1468 static PyObject *namestr = NULL;
1469 static PyObject *pathstr = NULL;
1470 PyObject *modname, *modpath, *modules, *parent;
1471
1472 if (globals == NULL || !PyDict_Check(globals))
1473 return Py_None;
1474
1475 if (namestr == NULL) {
1476 namestr = PyString_InternFromString("__name__");
1477 if (namestr == NULL)
1478 return NULL;
1479 }
1480 if (pathstr == NULL) {
1481 pathstr = PyString_InternFromString("__path__");
1482 if (pathstr == NULL)
1483 return NULL;
1484 }
1485
1486 *buf = '\0';
1487 *p_buflen = 0;
1488 modname = PyDict_GetItem(globals, namestr);
1489 if (modname == NULL || !PyString_Check(modname))
1490 return Py_None;
1491
1492 modpath = PyDict_GetItem(globals, pathstr);
1493 if (modpath != NULL) {
1494 int len = PyString_GET_SIZE(modname);
1495 if (len > MAXPATHLEN) {
1496 PyErr_SetString(PyExc_ValueError,
1497 "Module name too long");
1498 return NULL;
1499 }
1500 strcpy(buf, PyString_AS_STRING(modname));
1501 *p_buflen = len;
1502 }
1503 else {
1504 char *start = PyString_AS_STRING(modname);
1505 char *lastdot = strrchr(start, '.');
1506 int len;
1507 if (lastdot == NULL)
1508 return Py_None;
1509 len = lastdot - start;
1510 if (len >= MAXPATHLEN) {
1511 PyErr_SetString(PyExc_ValueError,
1512 "Module name too long");
1513 return NULL;
1514 }
1515 strncpy(buf, start, len);
1516 buf[len] = '\0';
1517 *p_buflen = len;
1518 }
1519
1520 modules = PyImport_GetModuleDict();
1521 parent = PyDict_GetItemString(modules, buf);
1522 if (parent == NULL)
1523 parent = Py_None;
1524 return parent;
1525 /* We expect, but can't guarantee, if parent != None, that:
1526 - parent.__name__ == buf
1527 - parent.__dict__ is globals
1528 If this is violated... Who cares? */
1529}
1530
1531static PyObject *
1532load_next(mod, altmod, p_name, buf, p_buflen)
1533 PyObject *mod;
1534 PyObject *altmod; /* Either None or same as mod */
1535 char **p_name;
1536 char *buf;
1537 int *p_buflen;
1538{
1539 char *name = *p_name;
1540 char *dot = strchr(name, '.');
1541 int len;
1542 char *p;
1543 PyObject *result;
1544
1545 if (dot == NULL) {
1546 *p_name = NULL;
1547 len = strlen(name);
1548 }
1549 else {
1550 *p_name = dot+1;
1551 len = dot-name;
1552 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00001553 if (len == 0) {
1554 PyErr_SetString(PyExc_ValueError,
1555 "Empty module name");
1556 return NULL;
1557 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001558
1559 p = buf + *p_buflen;
1560 if (p != buf)
1561 *p++ = '.';
1562 if (p+len-buf >= MAXPATHLEN) {
1563 PyErr_SetString(PyExc_ValueError,
1564 "Module name too long");
1565 return NULL;
1566 }
1567 strncpy(p, name, len);
1568 p[len] = '\0';
1569 *p_buflen = p+len-buf;
1570
1571 result = import_submodule(mod, p, buf);
1572 if (result == Py_None && altmod != mod) {
1573 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001574 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001575 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001576 if (result != NULL && result != Py_None) {
1577 if (mark_miss(buf) != 0) {
1578 Py_DECREF(result);
1579 return NULL;
1580 }
1581 strncpy(buf, name, len);
1582 buf[len] = '\0';
1583 *p_buflen = len;
1584 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001585 }
1586 if (result == NULL)
1587 return NULL;
1588
1589 if (result == Py_None) {
1590 Py_DECREF(result);
1591 PyErr_Format(PyExc_ImportError,
1592 "No module named %.200s", name);
1593 return NULL;
1594 }
1595
1596 return result;
1597}
1598
1599static int
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001600mark_miss(name)
1601 char *name;
1602{
1603 PyObject *modules = PyImport_GetModuleDict();
1604 return PyDict_SetItemString(modules, name, Py_None);
1605}
1606
1607static int
Guido van Rossum9905ef91997-09-08 16:07:11 +00001608ensure_fromlist(mod, fromlist, buf, buflen, recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001609 PyObject *mod;
1610 PyObject *fromlist;
1611 char *buf;
1612 int buflen;
Guido van Rossum9905ef91997-09-08 16:07:11 +00001613 int recursive;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001614{
1615 int i;
1616
1617 if (!PyObject_HasAttrString(mod, "__path__"))
1618 return 1;
1619
1620 for (i = 0; ; i++) {
1621 PyObject *item = PySequence_GetItem(fromlist, i);
1622 int hasit;
1623 if (item == NULL) {
1624 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1625 PyErr_Clear();
1626 return 1;
1627 }
1628 return 0;
1629 }
1630 if (!PyString_Check(item)) {
1631 PyErr_SetString(PyExc_TypeError,
1632 "Item in ``from list'' not a string");
1633 Py_DECREF(item);
1634 return 0;
1635 }
1636 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001637 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001638 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001639 /* See if the package defines __all__ */
1640 if (recursive)
1641 continue; /* Avoid endless recursion */
1642 all = PyObject_GetAttrString(mod, "__all__");
1643 if (all == NULL)
1644 PyErr_Clear();
1645 else {
1646 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1647 return 0;
1648 Py_DECREF(all);
1649 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001650 continue;
1651 }
1652 hasit = PyObject_HasAttr(mod, item);
1653 if (!hasit) {
1654 char *subname = PyString_AS_STRING(item);
1655 PyObject *submod;
1656 char *p;
1657 if (buflen + strlen(subname) >= MAXPATHLEN) {
1658 PyErr_SetString(PyExc_ValueError,
1659 "Module name too long");
1660 Py_DECREF(item);
1661 return 0;
1662 }
1663 p = buf + buflen;
1664 *p++ = '.';
1665 strcpy(p, subname);
1666 submod = import_submodule(mod, subname, buf);
1667 Py_XDECREF(submod);
1668 if (submod == NULL) {
1669 Py_DECREF(item);
1670 return 0;
1671 }
1672 }
1673 Py_DECREF(item);
1674 }
1675
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001676 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001677}
1678
1679static PyObject *
1680import_submodule(mod, subname, fullname)
1681 PyObject *mod; /* May be None */
1682 char *subname;
1683 char *fullname;
1684{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001685 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001686 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001687
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001688 /* Require:
1689 if mod == None: subname == fullname
1690 else: mod.__name__ + "." + subname == fullname
1691 */
1692
1693 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001694 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001695 }
1696 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001697 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001698 char buf[MAXPATHLEN+1];
1699 struct filedescr *fdp;
1700 FILE *fp = NULL;
1701
Guido van Rossum9c0afe51998-05-19 15:09:05 +00001702 if (mod == Py_None)
1703 path = NULL;
1704 else {
1705 path = PyObject_GetAttrString(mod, "__path__");
1706 if (path == NULL) {
1707 PyErr_Clear();
1708 Py_INCREF(Py_None);
1709 return Py_None;
1710 }
1711 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001712
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001713 buf[0] = '\0';
Guido van Rossumb68cd421998-07-01 17:36:26 +00001714 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1715 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001716 if (fdp == NULL) {
1717 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1718 return NULL;
1719 PyErr_Clear();
1720 Py_INCREF(Py_None);
1721 return Py_None;
1722 }
1723 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001724 if (fp)
1725 fclose(fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001726 if (m != NULL && mod != Py_None) {
1727 if (PyObject_SetAttrString(mod, subname, m) < 0) {
1728 Py_DECREF(m);
1729 m = NULL;
1730 }
1731 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001732 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001733
1734 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001735}
1736
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001737
1738/* Re-import a module of any kind and return its module object, WITH
1739 INCREMENTED REFERENCE COUNT */
1740
Guido van Rossum79f25d91997-04-29 20:08:16 +00001741PyObject *
1742PyImport_ReloadModule(m)
1743 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001744{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001745 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001746 PyObject *path = NULL;
1747 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001748 char buf[MAXPATHLEN+1];
1749 struct filedescr *fdp;
1750 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001751
Guido van Rossum79f25d91997-04-29 20:08:16 +00001752 if (m == NULL || !PyModule_Check(m)) {
1753 PyErr_SetString(PyExc_TypeError,
1754 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001755 return NULL;
1756 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001757 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001758 if (name == NULL)
1759 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001760 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001761 PyErr_Format(PyExc_ImportError,
1762 "reload(): module %.200s not in sys.modules",
1763 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001764 return NULL;
1765 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001766 subname = strrchr(name, '.');
1767 if (subname == NULL)
1768 subname = name;
1769 else {
1770 PyObject *parentname, *parent;
1771 parentname = PyString_FromStringAndSize(name, (subname-name));
1772 if (parentname == NULL)
1773 return NULL;
1774 parent = PyDict_GetItem(modules, parentname);
1775 if (parent == NULL) {
1776 PyErr_Format(PyExc_ImportError,
1777 "reload(): parent %.200s not in sys.modules",
1778 name);
1779 return NULL;
1780 }
1781 subname++;
1782 path = PyObject_GetAttrString(parent, "__path__");
1783 if (path == NULL)
1784 PyErr_Clear();
1785 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001786 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001787 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1788 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001789 if (fdp == NULL)
1790 return NULL;
1791 m = load_module(name, fp, buf, fdp->type);
1792 if (fp)
1793 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001794 return m;
1795}
1796
1797
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001798/* Higher-level import emulator which emulates the "import" statement
1799 more accurately -- it invokes the __import__() function from the
1800 builtins of the current globals. This means that the import is
1801 done using whatever import hooks are installed in the current
1802 environment, e.g. by "ni" or "rexec". */
1803
1804PyObject *
1805PyImport_Import(module_name)
1806 PyObject *module_name;
1807{
1808 static PyObject *silly_list = NULL;
1809 static PyObject *builtins_str = NULL;
1810 static PyObject *import_str = NULL;
1811 static PyObject *standard_builtins = NULL;
1812 PyObject *globals = NULL;
1813 PyObject *import = NULL;
1814 PyObject *builtins = NULL;
1815 PyObject *r = NULL;
1816
1817 /* Initialize constant string objects */
1818 if (silly_list == NULL) {
1819 import_str = PyString_InternFromString("__import__");
1820 if (import_str == NULL)
1821 return NULL;
1822 builtins_str = PyString_InternFromString("__builtins__");
1823 if (builtins_str == NULL)
1824 return NULL;
1825 silly_list = Py_BuildValue("[s]", "__doc__");
1826 if (silly_list == NULL)
1827 return NULL;
1828 }
1829
1830 /* Get the builtins from current globals */
1831 globals = PyEval_GetGlobals();
1832 if(globals != NULL) {
1833 builtins = PyObject_GetItem(globals, builtins_str);
1834 if (builtins == NULL)
1835 goto err;
1836 }
1837 else {
1838 /* No globals -- use standard builtins, and fake globals */
1839 PyErr_Clear();
1840
1841 if (standard_builtins == NULL) {
1842 standard_builtins =
1843 PyImport_ImportModule("__builtin__");
1844 if (standard_builtins == NULL)
1845 return NULL;
1846 }
1847
1848 builtins = standard_builtins;
1849 Py_INCREF(builtins);
1850 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1851 if (globals == NULL)
1852 goto err;
1853 }
1854
1855 /* Get the __import__ function from the builtins */
1856 if (PyDict_Check(builtins))
1857 import=PyObject_GetItem(builtins, import_str);
1858 else
1859 import=PyObject_GetAttr(builtins, import_str);
1860 if (import == NULL)
1861 goto err;
1862
1863 /* Call the _import__ function with the proper argument list */
1864 r = PyObject_CallFunction(import, "OOOO",
1865 module_name, globals, globals, silly_list);
1866
1867 err:
1868 Py_XDECREF(globals);
1869 Py_XDECREF(builtins);
1870 Py_XDECREF(import);
1871
1872 return r;
1873}
1874
1875
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001876/* Module 'imp' provides Python access to the primitives used for
1877 importing modules.
1878*/
1879
Guido van Rossum79f25d91997-04-29 20:08:16 +00001880static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001881imp_get_magic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001882 PyObject *self;
1883 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001884{
1885 char buf[4];
1886
Guido van Rossum79f25d91997-04-29 20:08:16 +00001887 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001888 return NULL;
Guido van Rossum6bf62da1997-04-11 20:37:35 +00001889 buf[0] = (char) ((MAGIC >> 0) & 0xff);
1890 buf[1] = (char) ((MAGIC >> 8) & 0xff);
1891 buf[2] = (char) ((MAGIC >> 16) & 0xff);
1892 buf[3] = (char) ((MAGIC >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001893
Guido van Rossum79f25d91997-04-29 20:08:16 +00001894 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001895}
1896
Guido van Rossum79f25d91997-04-29 20:08:16 +00001897static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001898imp_get_suffixes(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001899 PyObject *self;
1900 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001901{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001902 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001903 struct filedescr *fdp;
1904
Guido van Rossum79f25d91997-04-29 20:08:16 +00001905 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001906 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001907 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001908 if (list == NULL)
1909 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001910 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
1911 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001912 fdp->suffix, fdp->mode, fdp->type);
1913 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001914 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001915 return NULL;
1916 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001917 if (PyList_Append(list, item) < 0) {
1918 Py_DECREF(list);
1919 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001920 return NULL;
1921 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001922 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001923 }
1924 return list;
1925}
1926
Guido van Rossum79f25d91997-04-29 20:08:16 +00001927static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001928call_find_module(name, path)
1929 char *name;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001930 PyObject *path; /* list or None or NULL */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001931{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001932 extern int fclose Py_PROTO((FILE *));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001933 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001934 struct filedescr *fdp;
1935 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001936 FILE *fp = NULL;
1937
1938 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001939 if (path == Py_None)
1940 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001941 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
1942 if (fdp == NULL)
1943 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001944 if (fp != NULL) {
1945 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
1946 if (fob == NULL) {
1947 fclose(fp);
1948 return NULL;
1949 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001950 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001951 else {
1952 fob = Py_None;
1953 Py_INCREF(fob);
1954 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001955 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001956 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001957 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001958 return ret;
1959}
1960
Guido van Rossum79f25d91997-04-29 20:08:16 +00001961static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001962imp_find_module(self, args)
1963 PyObject *self;
1964 PyObject *args;
1965{
1966 char *name;
1967 PyObject *path = NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001968 if (!PyArg_ParseTuple(args, "s|O", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001969 return NULL;
1970 return call_find_module(name, path);
1971}
1972
1973static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001974imp_init_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001975 PyObject *self;
1976 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001977{
1978 char *name;
1979 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001980 PyObject *m;
1981 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001982 return NULL;
1983 ret = init_builtin(name);
1984 if (ret < 0)
1985 return NULL;
1986 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001987 Py_INCREF(Py_None);
1988 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001989 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001990 m = PyImport_AddModule(name);
1991 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001992 return m;
1993}
1994
Guido van Rossum79f25d91997-04-29 20:08:16 +00001995static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001996imp_init_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001997 PyObject *self;
1998 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001999{
2000 char *name;
2001 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002002 PyObject *m;
2003 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002004 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002005 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002006 if (ret < 0)
2007 return NULL;
2008 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002009 Py_INCREF(Py_None);
2010 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002011 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002012 m = PyImport_AddModule(name);
2013 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002014 return m;
2015}
2016
Guido van Rossum79f25d91997-04-29 20:08:16 +00002017static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002018imp_get_frozen_object(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002019 PyObject *self;
2020 PyObject *args;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002021{
2022 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002023
Guido van Rossum79f25d91997-04-29 20:08:16 +00002024 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002025 return NULL;
2026 return get_frozen_object(name);
2027}
2028
Guido van Rossum79f25d91997-04-29 20:08:16 +00002029static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002030imp_is_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002031 PyObject *self;
2032 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002033{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002034 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002035 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002036 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002037 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002038}
2039
Guido van Rossum79f25d91997-04-29 20:08:16 +00002040static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002041imp_is_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002042 PyObject *self;
2043 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002044{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002045 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002046 struct _frozen *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002047 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002048 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002049 p = find_frozen(name);
2050 return PyInt_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002051}
2052
2053static FILE *
2054get_file(pathname, fob, mode)
2055 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002056 PyObject *fob;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002057 char *mode;
2058{
2059 FILE *fp;
2060 if (fob == NULL) {
2061 fp = fopen(pathname, mode);
2062 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002063 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002064 }
2065 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002066 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002067 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002068 PyErr_SetString(PyExc_ValueError,
2069 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002070 }
2071 return fp;
2072}
2073
Guido van Rossum79f25d91997-04-29 20:08:16 +00002074static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002075imp_load_compiled(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002076 PyObject *self;
2077 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002078{
2079 char *name;
2080 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002081 PyObject *fob = NULL;
2082 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002083 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002084 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002085 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002086 return NULL;
2087 fp = get_file(pathname, fob, "rb");
2088 if (fp == NULL)
2089 return NULL;
2090 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002091 if (fob == NULL)
2092 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002093 return m;
2094}
2095
Guido van Rossum79f25d91997-04-29 20:08:16 +00002096static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002097imp_load_dynamic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002098 PyObject *self;
2099 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002100{
2101 char *name;
2102 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002103 PyObject *fob = NULL;
2104 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002105 FILE *fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002106 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
2107 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002108 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002109 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002110 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002111 if (fp == NULL)
2112 return NULL;
2113 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002114 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002115 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002116}
2117
Guido van Rossum79f25d91997-04-29 20:08:16 +00002118static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002119imp_load_source(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002120 PyObject *self;
2121 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002122{
2123 char *name;
2124 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002125 PyObject *fob = NULL;
2126 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002127 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002128 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002129 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002130 return NULL;
2131 fp = get_file(pathname, fob, "r");
2132 if (fp == NULL)
2133 return NULL;
2134 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002135 if (fob == NULL)
2136 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002137 return m;
2138}
2139
Jack Jansen9c96a921995-02-15 22:57:06 +00002140#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002141static PyObject *
Jack Jansen9c96a921995-02-15 22:57:06 +00002142imp_load_resource(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002143 PyObject *self;
2144 PyObject *args;
Jack Jansen9c96a921995-02-15 22:57:06 +00002145{
2146 char *name;
2147 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002148 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002149
Guido van Rossum79f25d91997-04-29 20:08:16 +00002150 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002151 return NULL;
2152 m = PyMac_LoadResourceModule(name, pathname);
2153 return m;
2154}
2155#endif /* macintosh */
2156
Guido van Rossum79f25d91997-04-29 20:08:16 +00002157static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002158imp_load_module(self, args)
2159 PyObject *self;
2160 PyObject *args;
2161{
2162 char *name;
2163 PyObject *fob;
2164 char *pathname;
2165 char *suffix; /* Unused */
2166 char *mode;
2167 int type;
2168 FILE *fp;
2169
2170 if (!PyArg_ParseTuple(args, "sOs(ssi)",
2171 &name, &fob, &pathname,
2172 &suffix, &mode, &type))
2173 return NULL;
2174 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
2175 PyErr_Format(PyExc_ValueError,
2176 "invalid file open mode %.200s", mode);
2177 return NULL;
2178 }
2179 if (fob == Py_None)
2180 fp = NULL;
2181 else {
2182 if (!PyFile_Check(fob)) {
2183 PyErr_SetString(PyExc_ValueError,
2184 "load_module arg#2 should be a file or None");
2185 return NULL;
2186 }
2187 fp = get_file(pathname, fob, mode);
2188 if (fp == NULL)
2189 return NULL;
2190 }
2191 return load_module(name, fp, pathname, type);
2192}
2193
2194static PyObject *
2195imp_load_package(self, args)
2196 PyObject *self;
2197 PyObject *args;
2198{
2199 char *name;
2200 char *pathname;
2201 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
2202 return NULL;
2203 return load_package(name, pathname);
2204}
2205
2206static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002207imp_new_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002208 PyObject *self;
2209 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002210{
2211 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002212 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002213 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002214 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002215}
2216
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002217/* Doc strings */
2218
2219static char doc_imp[] = "\
2220This module provides the components needed to build your own\n\
2221__import__ function. Undocumented functions are obsolete.\n\
2222";
2223
2224static char doc_find_module[] = "\
2225find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
2226Search for a module. If path is omitted or None, search for a\n\
2227built-in, frozen or special module and continue search in sys.path.\n\
2228The module name cannot contain '.'; to search for a submodule of a\n\
2229package, pass the submodule name and the package's __path__.\
2230";
2231
2232static char doc_load_module[] = "\
2233load_module(name, file, filename, (suffix, mode, type)) -> module\n\
2234Load a module, given information returned by find_module().\n\
2235The module name must include the full package name, if any.\
2236";
2237
2238static char doc_get_magic[] = "\
2239get_magic() -> string\n\
2240Return the magic number for .pyc or .pyo files.\
2241";
2242
2243static char doc_get_suffixes[] = "\
2244get_suffixes() -> [(suffix, mode, type), ...]\n\
2245Return a list of (suffix, mode, type) tuples describing the files\n\
2246that find_module() looks for.\
2247";
2248
2249static char doc_new_module[] = "\
2250new_module(name) -> module\n\
2251Create a new module. Do not enter it in sys.modules.\n\
2252The module name must include the full package name, if any.\
2253";
2254
Guido van Rossum79f25d91997-04-29 20:08:16 +00002255static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002256 {"find_module", imp_find_module, 1, doc_find_module},
2257 {"get_magic", imp_get_magic, 1, doc_get_magic},
2258 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2259 {"load_module", imp_load_module, 1, doc_load_module},
2260 {"new_module", imp_new_module, 1, doc_new_module},
2261 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002262 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002263 {"init_builtin", imp_init_builtin, 1},
2264 {"init_frozen", imp_init_frozen, 1},
2265 {"is_builtin", imp_is_builtin, 1},
2266 {"is_frozen", imp_is_frozen, 1},
2267 {"load_compiled", imp_load_compiled, 1},
2268 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002269 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002270#ifdef macintosh
2271 {"load_resource", imp_load_resource, 1},
2272#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002273 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002274 {NULL, NULL} /* sentinel */
2275};
2276
Guido van Rossum1a8791e1998-08-04 22:46:29 +00002277static int
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002278setint(d, name, value)
2279 PyObject *d;
2280 char *name;
2281 int value;
2282{
2283 PyObject *v;
2284 int err;
2285
2286 v = PyInt_FromLong((long)value);
2287 err = PyDict_SetItemString(d, name, v);
2288 Py_XDECREF(v);
2289 return err;
2290}
2291
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002292void
2293initimp()
2294{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002295 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002296
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002297 m = Py_InitModule4("imp", imp_methods, doc_imp,
2298 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002299 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002300
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002301 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2302 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2303 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2304 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2305 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2306 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2307 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2308 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002309
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002310 failure:
2311 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002312}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002313
2314
2315/* API for embedding applications that want to add their own entries to the
2316 table of built-in modules. This should normally be called *before*
2317 Py_Initialize(). When the malloc() or realloc() call fails, -1 is returned
2318 and the existing table is unchanged.
2319
2320 After a similar function by Just van Rossum. */
2321
2322int
2323PyImport_ExtendInittab(newtab)
2324 struct _inittab *newtab;
2325{
2326 static struct _inittab *our_copy = NULL;
2327 struct _inittab *p;
2328 int i, n;
2329
2330 /* Count the number of entries in both tables */
2331 for (n = 0; newtab[n].name != NULL; n++)
2332 ;
2333 if (n == 0)
2334 return 0; /* Nothing to do */
2335 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2336 ;
2337
2338 /* Allocate new memory for the combined table */
2339 if (our_copy == NULL)
2340 p = malloc((i+n+1) * sizeof(struct _inittab));
2341 else
2342 p = realloc(our_copy, (i+n+1) * sizeof(struct _inittab));
2343 if (p == NULL)
2344 return -1;
2345
2346 /* Copy the tables into the new memory */
2347 if (our_copy != PyImport_Inittab)
2348 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2349 PyImport_Inittab = our_copy = p;
2350 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
2351
2352 return 0;
2353}
2354
2355/* Shorthand to add a single entry given a name and a function */
2356
2357int
2358PyImport_AppendInittab(name, initfunc)
2359 char *name;
2360 void (*initfunc)();
2361{
2362 struct _inittab newtab[2];
2363
2364 memset(newtab, '\0', sizeof newtab);
2365
2366 newtab[0].name = name;
2367 newtab[0].initfunc = initfunc;
2368
2369 return PyImport_ExtendInittab(newtab);
2370}