blob: e5ac2b7bcf1fe7167fb6e42f108b53fc6ebbbcf7 [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:
782 Py_XINCREF(m);
783 Py_XDECREF(path);
784 Py_XDECREF(file);
785 return m;
786}
787
788
789/* Helper to test for built-in module */
790
791static int
792is_builtin(name)
793 char *name;
794{
795 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +0000796 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
797 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
798 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000799 return -1;
800 else
801 return 1;
802 }
803 }
804 return 0;
805}
806
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000807
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000808/* Search the path (default sys.path) for a module. Return the
809 corresponding filedescr struct, and (via return arguments) the
810 pathname and an open file. Return NULL if the module is not found. */
811
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000812#ifdef MS_COREDLL
813extern FILE *PyWin_FindRegisteredModule();
814#endif
815
Guido van Rossum0980bd91998-02-13 17:18:36 +0000816#ifdef CHECK_IMPORT_CASE
817static int check_case(char *, int, int, char *);
818#endif
819
Guido van Rossum197346f1997-10-31 18:38:52 +0000820static int find_init_module Py_PROTO((char *)); /* Forward */
821
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000822static struct filedescr *
823find_module(name, path, buf, buflen, p_fp)
824 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000825 PyObject *path;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000826 /* Output parameters: */
827 char *buf;
828 int buflen;
829 FILE **p_fp;
830{
831 int i, npath, len, namelen;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000832 struct _frozen *f;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000833 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000834 FILE *fp = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000835 struct stat statbuf;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000836 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
837 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
838 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000839
840 if (path == NULL) {
841 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000842 strcpy(buf, name);
843 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000844 }
Guido van Rossuma5568d31998-03-05 03:45:08 +0000845 if ((f = find_frozen(name)) != NULL) {
846 strcpy(buf, name);
847 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000848 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000849
Guido van Rossumac279101996-08-22 23:10:58 +0000850#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000851 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
852 if (fp != NULL) {
853 *p_fp = fp;
854 return fdp;
855 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000856#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000857 path = PySys_GetObject("path");
858 }
859 else if (PyString_Check(path)) {
860 /* Submodule of frozen package */
Guido van Rossum39b0f891998-04-10 21:52:06 +0000861 if (PyString_Size(path) + 1 + strlen(name) >= (unsigned int)buflen) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000862 PyErr_SetString(PyExc_ImportError,
863 "full frozen module name too long");
864 return NULL;
865 }
866 strcpy(buf, PyString_AsString(path));
867 strcat(buf, ".");
868 strcat(buf, name);
869 if (find_frozen(buf) != NULL)
870 return &fd_frozen;
871 PyErr_Format(PyExc_ImportError,
872 "frozen module %.200s not found", buf);
873 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000874 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000875
Guido van Rossum79f25d91997-04-29 20:08:16 +0000876 if (path == NULL || !PyList_Check(path)) {
877 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +0000878 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000879 return NULL;
880 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000881 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000882 namelen = strlen(name);
883 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000884 PyObject *v = PyList_GetItem(path, i);
885 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000886 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000887 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000888 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000889 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000890 strcpy(buf, PyString_AsString(v));
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000891 if ((int)strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000892 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000893#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000894#ifdef INTERN_STRINGS
895 /*
896 ** Speedup: each sys.path item is interned, and
897 ** FindResourceModule remembers which items refer to
898 ** folders (so we don't have to bother trying to look
899 ** into them for resources).
900 */
901 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
902 v = PyList_GET_ITEM(path, i);
903#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000904 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000905 static struct filedescr resfiledescr =
906 {"", "", PY_RESOURCE};
Jack Jansen9c96a921995-02-15 22:57:06 +0000907
908 return &resfiledescr;
909 }
910#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000911 if (len > 0 && buf[len-1] != SEP
912#ifdef ALTSEP
913 && buf[len-1] != ALTSEP
914#endif
915 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000916 buf[len++] = SEP;
Guido van Rossum40f470f1996-05-23 22:51:04 +0000917#ifdef IMPORT_8x3_NAMES
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000918 /* see if we are searching in directory dos-8x3 */
919 if (len > 7 && !strncmp(buf + len - 8, "dos-8x3", 7)){
Guido van Rossum40f470f1996-05-23 22:51:04 +0000920 int j;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000921 char ch; /* limit name to 8 lower-case characters */
Guido van Rossum40f470f1996-05-23 22:51:04 +0000922 for (j = 0; (ch = name[j]) && j < 8; j++)
923 if (isupper(ch))
924 buf[len++] = tolower(ch);
925 else
926 buf[len++] = ch;
927 }
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000928 else /* Not in dos-8x3, use the full name */
Guido van Rossum6f489d91996-06-28 20:15:15 +0000929#endif
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000930 {
Guido van Rossum40f470f1996-05-23 22:51:04 +0000931 strcpy(buf+len, name);
932 len += namelen;
933 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000934#ifdef HAVE_STAT
935 if (stat(buf, &statbuf) == 0) {
Guido van Rossum197346f1997-10-31 18:38:52 +0000936 if (S_ISDIR(statbuf.st_mode)) {
Guido van Rossum0980bd91998-02-13 17:18:36 +0000937 if (find_init_module(buf)) {
938#ifdef CHECK_IMPORT_CASE
939 if (!check_case(buf, len, namelen,
940 name))
941 return NULL;
942#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000943 return &fd_package;
Guido van Rossum0980bd91998-02-13 17:18:36 +0000944 }
Guido van Rossum197346f1997-10-31 18:38:52 +0000945 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000946 }
947#else
948 /* XXX How are you going to test for directories? */
949#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000950#ifdef macintosh
951 fdp = PyMac_FindModuleExtension(buf, &len, name);
952 if (fdp)
953 fp = fopen(buf, fdp->mode);
954#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000955 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000956 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000957 if (Py_VerboseFlag > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000958 fprintf(stderr, "# trying %s\n", buf);
959 fp = fopen(buf, fdp->mode);
960 if (fp != NULL)
961 break;
962 }
Guido van Rossum741689d1997-08-12 14:53:39 +0000963#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000964 if (fp != NULL)
965 break;
966 }
967 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000968 PyErr_Format(PyExc_ImportError,
969 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000970 return NULL;
971 }
Guido van Rossum0980bd91998-02-13 17:18:36 +0000972#ifdef CHECK_IMPORT_CASE
973 if (!check_case(buf, len, namelen, name)) {
974 fclose(fp);
975 return NULL;
976 }
977#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000978
979 *p_fp = fp;
980 return fdp;
981}
982
Guido van Rossum0980bd91998-02-13 17:18:36 +0000983#ifdef CHECK_IMPORT_CASE
984
985#ifdef MS_WIN32
986#include <windows.h>
Guido van Rossum323bf5e1998-06-24 03:54:06 +0000987#include <ctype.h>
988
989static int
990allcaps8x3(s)
991 char *s;
992{
993 /* Return 1 if s is an 8.3 filename in ALLCAPS */
994 char c;
995 char *dot = strchr(s, '.');
996 char *end = strchr(s, '\0');
997 if (dot != NULL) {
998 if (dot-s > 8)
999 return 1; /* More than 8 before '.' */
1000 if (end-dot > 4)
1001 return 1; /* More than 3 after '.' */
1002 end = strchr(dot+1, '.');
1003 if (end != NULL)
1004 return 1; /* More than one dot */
1005 }
1006 else if (end-s > 8)
1007 return 1; /* More than 8 and no dot */
1008 while ((c = *s++)) {
1009 if (islower(c))
1010 return 0;
1011 }
1012 return 1;
1013}
1014
Guido van Rossum0980bd91998-02-13 17:18:36 +00001015static int
1016check_case(char *buf, int len, int namelen, char *name)
1017{
1018 WIN32_FIND_DATA data;
1019 HANDLE h;
1020 if (getenv("PYTHONCASEOK") != NULL)
1021 return 1;
1022 h = FindFirstFile(buf, &data);
1023 if (h == INVALID_HANDLE_VALUE) {
1024 PyErr_Format(PyExc_NameError,
1025 "Can't find file for module %.100s\n(filename %.300s)",
1026 name, buf);
1027 return 0;
1028 }
1029 FindClose(h);
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001030 if (allcaps8x3(data.cFileName)) {
1031 /* Skip the test if the filename is ALL.CAPS. This can
1032 happen in certain circumstances beyond our control,
1033 e.g. when software is installed under NT on a FAT
1034 filesystem and then the same FAT filesystem is used
1035 under Windows 95. */
1036 return 1;
1037 }
Guido van Rossum0980bd91998-02-13 17:18:36 +00001038 if (strncmp(data.cFileName, name, namelen) != 0) {
1039 strcpy(buf+len-namelen, data.cFileName);
1040 PyErr_Format(PyExc_NameError,
1041 "Case mismatch for module name %.100s\n(filename %.300s)",
1042 name, buf);
1043 return 0;
1044 }
1045 return 1;
1046}
1047#endif /* MS_WIN32 */
1048
1049#ifdef macintosh
1050#include <TextUtils.h>
1051static int
1052check_case(char *buf, int len, int namelen, char *name)
1053{
1054 FSSpec fss;
1055 OSErr err;
1056 unsigned char mybuf[MAXPATHLEN+1];
1057
1058 strcpy((char *)mybuf, buf);
1059 c2pstr((char *)mybuf);
1060 err = FSMakeFSSpec(0, 0, mybuf, &fss);
1061 if (err) {
1062 PyErr_Format(PyExc_NameError,
1063 "Can't find file for module %.100s\n(filename %.300s)",
1064 name, buf);
1065 return 0;
1066 }
1067 p2cstr(fss.name);
1068 if ( strncmp(name, (char *)fss.name, namelen) != 0 ) {
1069 PyErr_Format(PyExc_NameError,
1070 "Case mismatch for module name %.100s\n(filename %.300s)",
1071 name, fss.name);
1072 return 0;
1073 }
1074 return 1;
1075}
1076#endif /* macintosh */
1077
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001078#ifdef DJGPP
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001079#include <dir.h>
1080
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001081static int
1082check_case(char *buf, int len, int namelen, char *name)
1083{
1084 struct ffblk ffblk;
1085 int done;
1086
1087 if (getenv("PYTHONCASEOK") != NULL)
1088 return 1;
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001089 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001090 if (done) {
1091 PyErr_Format(PyExc_NameError,
1092 "Can't find file for module %.100s\n(filename %.300s)",
1093 name, buf);
1094 return 0;
1095 }
1096
1097 if (strncmp(ffblk.ff_name, name, namelen) != 0) {
1098 strcpy(buf+len-namelen, ffblk.ff_name);
1099 PyErr_Format(PyExc_NameError,
1100 "Case mismatch for module name %.100s\n(filename %.300s)",
1101 name, buf);
1102 return 0;
1103 }
1104 return 1;
1105}
1106#endif
1107
Guido van Rossum8766a771998-04-10 23:44:32 +00001108#endif /* CHECK_IMPORT_CASE */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001109
Guido van Rossum197346f1997-10-31 18:38:52 +00001110#ifdef HAVE_STAT
1111/* Helper to look for __init__.py or __init__.py[co] in potential package */
1112static int
1113find_init_module(buf)
1114 char *buf;
1115{
1116 int save_len = strlen(buf);
1117 int i = save_len;
1118 struct stat statbuf;
1119
1120 if (save_len + 13 >= MAXPATHLEN)
1121 return 0;
1122 buf[i++] = SEP;
1123 strcpy(buf+i, "__init__.py");
1124 if (stat(buf, &statbuf) == 0) {
1125 buf[save_len] = '\0';
1126 return 1;
1127 }
1128 i += strlen(buf+i);
1129 if (Py_OptimizeFlag)
1130 strcpy(buf+i, "o");
1131 else
1132 strcpy(buf+i, "c");
1133 if (stat(buf, &statbuf) == 0) {
1134 buf[save_len] = '\0';
1135 return 1;
1136 }
1137 buf[save_len] = '\0';
1138 return 0;
1139}
1140#endif /* HAVE_STAT */
1141
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001142
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001143static int init_builtin Py_PROTO((char *)); /* Forward */
1144
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001145/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001146 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001147
Guido van Rossum79f25d91997-04-29 20:08:16 +00001148static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001149load_module(name, fp, buf, type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001150 char *name;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001151 FILE *fp;
1152 char *buf;
1153 int type;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001154{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001155 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001156 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001157 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001158
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001159 /* First check that there's an open file (if we need one) */
1160 switch (type) {
1161 case PY_SOURCE:
1162 case PY_COMPILED:
1163 if (fp == NULL) {
1164 PyErr_Format(PyExc_ValueError,
1165 "file object required for import (type code %d)",
1166 type);
1167 return NULL;
1168 }
1169 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001170
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001171 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001172
1173 case PY_SOURCE:
1174 m = load_source_module(name, buf, fp);
1175 break;
1176
1177 case PY_COMPILED:
1178 m = load_compiled_module(name, buf, fp);
1179 break;
1180
1181 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001182 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001183 break;
1184
Jack Jansen9c96a921995-02-15 22:57:06 +00001185#ifdef macintosh
1186 case PY_RESOURCE:
1187 m = PyMac_LoadResourceModule(name, buf);
1188 break;
1189#endif
1190
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001191 case PKG_DIRECTORY:
1192 m = load_package(name, buf);
1193 break;
1194
1195 case C_BUILTIN:
1196 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001197 if (buf != NULL && buf[0] != '\0')
1198 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001199 if (type == C_BUILTIN)
1200 err = init_builtin(name);
1201 else
1202 err = PyImport_ImportFrozenModule(name);
1203 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001204 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001205 if (err == 0) {
1206 PyErr_Format(PyExc_ImportError,
1207 "Purported %s module %.200s not found",
1208 type == C_BUILTIN ?
1209 "builtin" : "frozen",
1210 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001211 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001212 }
1213 modules = PyImport_GetModuleDict();
1214 m = PyDict_GetItemString(modules, name);
1215 if (m == NULL) {
1216 PyErr_Format(
1217 PyExc_ImportError,
1218 "%s module %.200s not properly initialized",
1219 type == C_BUILTIN ?
1220 "builtin" : "frozen",
1221 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001222 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001223 }
1224 Py_INCREF(m);
1225 break;
1226
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001227 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001228 PyErr_Format(PyExc_ImportError,
1229 "Don't know how to import %.200s (type code %d)",
1230 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001231 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001232
1233 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001234
1235 return m;
1236}
1237
1238
1239/* Initialize a built-in module.
1240 Return 1 for succes, 0 if the module is not found, and -1 with
1241 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001242
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001243static int
1244init_builtin(name)
1245 char *name;
1246{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001247 struct _inittab *p;
1248 PyObject *mod;
1249
1250 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
1251 return 1;
1252
Guido van Rossum771c6c81997-10-31 18:37:24 +00001253 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001254 if (strcmp(name, p->name) == 0) {
1255 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001256 PyErr_Format(PyExc_ImportError,
1257 "Cannot re-init internal module %.200s",
1258 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001259 return -1;
1260 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001261 if (Py_VerboseFlag)
Guido van Rossum25ce5661997-08-02 03:10:38 +00001262 fprintf(stderr, "import %s # builtin\n", name);
1263 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001264 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001265 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001266 if (_PyImport_FixupExtension(name, name) == NULL)
1267 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001268 return 1;
1269 }
1270 }
1271 return 0;
1272}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001273
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001274
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001275/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001276
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001277static struct _frozen *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001278find_frozen(name)
1279 char *name;
1280{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001281 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001282
Guido van Rossum79f25d91997-04-29 20:08:16 +00001283 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001284 if (p->name == NULL)
1285 return NULL;
1286 if (strcmp(p->name, name) == 0)
1287 break;
1288 }
1289 return p;
1290}
1291
Guido van Rossum79f25d91997-04-29 20:08:16 +00001292static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001293get_frozen_object(name)
1294 char *name;
1295{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001296 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001297 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001298
1299 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001300 PyErr_Format(PyExc_ImportError,
1301 "No such frozen object named %.200s",
1302 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001303 return NULL;
1304 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001305 size = p->size;
1306 if (size < 0)
1307 size = -size;
1308 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001309}
1310
1311/* Initialize a frozen module.
1312 Return 1 for succes, 0 if the module is not found, and -1 with
1313 an exception set if the initialization failed.
1314 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001315
1316int
Guido van Rossum79f25d91997-04-29 20:08:16 +00001317PyImport_ImportFrozenModule(name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001318 char *name;
1319{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001320 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001321 PyObject *co;
1322 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001323 int ispackage;
1324 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001325
1326 if (p == NULL)
1327 return 0;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001328 size = p->size;
1329 ispackage = (size < 0);
1330 if (ispackage)
1331 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001332 if (Py_VerboseFlag)
Guido van Rossuma5568d31998-03-05 03:45:08 +00001333 fprintf(stderr, "import %s # frozen%s\n",
1334 name, ispackage ? " package" : "");
1335 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001336 if (co == NULL)
1337 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001338 if (!PyCode_Check(co)) {
1339 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001340 PyErr_Format(PyExc_TypeError,
1341 "frozen object %.200s is not a code object",
1342 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001343 return -1;
1344 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001345 if (ispackage) {
1346 /* Set __path__ to the package name */
1347 PyObject *d, *s;
1348 int err;
1349 m = PyImport_AddModule(name);
1350 if (m == NULL)
1351 return -1;
1352 d = PyModule_GetDict(m);
1353 s = PyString_InternFromString(name);
1354 if (s == NULL)
1355 return -1;
1356 err = PyDict_SetItemString(d, "__path__", s);
1357 Py_DECREF(s);
1358 if (err != 0)
1359 return err;
1360 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001361 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001362 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001363 if (m == NULL)
1364 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001365 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001366 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001367}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001368
1369
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001370/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001371 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001372
Guido van Rossum79f25d91997-04-29 20:08:16 +00001373PyObject *
1374PyImport_ImportModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001375 char *name;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001376{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001377 static PyObject *fromlist = NULL;
1378 if (fromlist == NULL && strchr(name, '.') != NULL) {
1379 fromlist = Py_BuildValue("[s]", "*");
1380 if (fromlist == NULL)
1381 return NULL;
1382 }
1383 return PyImport_ImportModuleEx(name, NULL, NULL, fromlist);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001384}
1385
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001386/* Forward declarations for helper routines */
1387static PyObject *get_parent Py_PROTO((PyObject *globals,
1388 char *buf, int *p_buflen));
1389static PyObject *load_next Py_PROTO((PyObject *mod, PyObject *altmod,
1390 char **p_name, char *buf, int *p_buflen));
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001391static int mark_miss Py_PROTO((char *name));
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001392static int ensure_fromlist Py_PROTO((PyObject *mod, PyObject *fromlist,
Guido van Rossum9905ef91997-09-08 16:07:11 +00001393 char *buf, int buflen, int recursive));
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001394static PyObject * import_submodule Py_PROTO((PyObject *mod,
1395 char *name, char *fullname));
1396
1397/* The Magnum Opus of dotted-name import :-) */
1398
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001399static PyObject *
1400import_module_ex(name, globals, locals, fromlist)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001401 char *name;
1402 PyObject *globals;
1403 PyObject *locals;
1404 PyObject *fromlist;
1405{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001406 char buf[MAXPATHLEN+1];
1407 int buflen = 0;
1408 PyObject *parent, *head, *next, *tail;
1409
1410 parent = get_parent(globals, buf, &buflen);
1411 if (parent == NULL)
1412 return NULL;
1413
1414 head = load_next(parent, Py_None, &name, buf, &buflen);
1415 if (head == NULL)
1416 return NULL;
1417
1418 tail = head;
1419 Py_INCREF(tail);
1420 while (name) {
1421 next = load_next(tail, tail, &name, buf, &buflen);
1422 Py_DECREF(tail);
1423 if (next == NULL) {
1424 Py_DECREF(head);
1425 return NULL;
1426 }
1427 tail = next;
1428 }
1429
1430 if (fromlist != NULL) {
1431 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1432 fromlist = NULL;
1433 }
1434
1435 if (fromlist == NULL) {
1436 Py_DECREF(tail);
1437 return head;
1438 }
1439
1440 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001441 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001442 Py_DECREF(tail);
1443 return NULL;
1444 }
1445
1446 return tail;
1447}
1448
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001449PyObject *
1450PyImport_ImportModuleEx(name, globals, locals, fromlist)
1451 char *name;
1452 PyObject *globals;
1453 PyObject *locals;
1454 PyObject *fromlist;
1455{
1456 PyObject *result;
1457 lock_import();
Guido van Rossumd65911b1998-03-03 22:33:27 +00001458 result = import_module_ex(name, globals, locals, fromlist);
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001459 unlock_import();
1460 return result;
1461}
1462
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001463static PyObject *
1464get_parent(globals, buf, p_buflen)
1465 PyObject *globals;
1466 char *buf;
1467 int *p_buflen;
1468{
1469 static PyObject *namestr = NULL;
1470 static PyObject *pathstr = NULL;
1471 PyObject *modname, *modpath, *modules, *parent;
1472
1473 if (globals == NULL || !PyDict_Check(globals))
1474 return Py_None;
1475
1476 if (namestr == NULL) {
1477 namestr = PyString_InternFromString("__name__");
1478 if (namestr == NULL)
1479 return NULL;
1480 }
1481 if (pathstr == NULL) {
1482 pathstr = PyString_InternFromString("__path__");
1483 if (pathstr == NULL)
1484 return NULL;
1485 }
1486
1487 *buf = '\0';
1488 *p_buflen = 0;
1489 modname = PyDict_GetItem(globals, namestr);
1490 if (modname == NULL || !PyString_Check(modname))
1491 return Py_None;
1492
1493 modpath = PyDict_GetItem(globals, pathstr);
1494 if (modpath != NULL) {
1495 int len = PyString_GET_SIZE(modname);
1496 if (len > MAXPATHLEN) {
1497 PyErr_SetString(PyExc_ValueError,
1498 "Module name too long");
1499 return NULL;
1500 }
1501 strcpy(buf, PyString_AS_STRING(modname));
1502 *p_buflen = len;
1503 }
1504 else {
1505 char *start = PyString_AS_STRING(modname);
1506 char *lastdot = strrchr(start, '.');
1507 int len;
1508 if (lastdot == NULL)
1509 return Py_None;
1510 len = lastdot - start;
1511 if (len >= MAXPATHLEN) {
1512 PyErr_SetString(PyExc_ValueError,
1513 "Module name too long");
1514 return NULL;
1515 }
1516 strncpy(buf, start, len);
1517 buf[len] = '\0';
1518 *p_buflen = len;
1519 }
1520
1521 modules = PyImport_GetModuleDict();
1522 parent = PyDict_GetItemString(modules, buf);
1523 if (parent == NULL)
1524 parent = Py_None;
1525 return parent;
1526 /* We expect, but can't guarantee, if parent != None, that:
1527 - parent.__name__ == buf
1528 - parent.__dict__ is globals
1529 If this is violated... Who cares? */
1530}
1531
1532static PyObject *
1533load_next(mod, altmod, p_name, buf, p_buflen)
1534 PyObject *mod;
1535 PyObject *altmod; /* Either None or same as mod */
1536 char **p_name;
1537 char *buf;
1538 int *p_buflen;
1539{
1540 char *name = *p_name;
1541 char *dot = strchr(name, '.');
1542 int len;
1543 char *p;
1544 PyObject *result;
1545
1546 if (dot == NULL) {
1547 *p_name = NULL;
1548 len = strlen(name);
1549 }
1550 else {
1551 *p_name = dot+1;
1552 len = dot-name;
1553 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00001554 if (len == 0) {
1555 PyErr_SetString(PyExc_ValueError,
1556 "Empty module name");
1557 return NULL;
1558 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001559
1560 p = buf + *p_buflen;
1561 if (p != buf)
1562 *p++ = '.';
1563 if (p+len-buf >= MAXPATHLEN) {
1564 PyErr_SetString(PyExc_ValueError,
1565 "Module name too long");
1566 return NULL;
1567 }
1568 strncpy(p, name, len);
1569 p[len] = '\0';
1570 *p_buflen = p+len-buf;
1571
1572 result = import_submodule(mod, p, buf);
1573 if (result == Py_None && altmod != mod) {
1574 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001575 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001576 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001577 if (result != NULL && result != Py_None) {
1578 if (mark_miss(buf) != 0) {
1579 Py_DECREF(result);
1580 return NULL;
1581 }
1582 strncpy(buf, name, len);
1583 buf[len] = '\0';
1584 *p_buflen = len;
1585 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001586 }
1587 if (result == NULL)
1588 return NULL;
1589
1590 if (result == Py_None) {
1591 Py_DECREF(result);
1592 PyErr_Format(PyExc_ImportError,
1593 "No module named %.200s", name);
1594 return NULL;
1595 }
1596
1597 return result;
1598}
1599
1600static int
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001601mark_miss(name)
1602 char *name;
1603{
1604 PyObject *modules = PyImport_GetModuleDict();
1605 return PyDict_SetItemString(modules, name, Py_None);
1606}
1607
1608static int
Guido van Rossum9905ef91997-09-08 16:07:11 +00001609ensure_fromlist(mod, fromlist, buf, buflen, recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001610 PyObject *mod;
1611 PyObject *fromlist;
1612 char *buf;
1613 int buflen;
Guido van Rossum9905ef91997-09-08 16:07:11 +00001614 int recursive;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001615{
1616 int i;
1617
1618 if (!PyObject_HasAttrString(mod, "__path__"))
1619 return 1;
1620
1621 for (i = 0; ; i++) {
1622 PyObject *item = PySequence_GetItem(fromlist, i);
1623 int hasit;
1624 if (item == NULL) {
1625 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1626 PyErr_Clear();
1627 return 1;
1628 }
1629 return 0;
1630 }
1631 if (!PyString_Check(item)) {
1632 PyErr_SetString(PyExc_TypeError,
1633 "Item in ``from list'' not a string");
1634 Py_DECREF(item);
1635 return 0;
1636 }
1637 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001638 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001639 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001640 /* See if the package defines __all__ */
1641 if (recursive)
1642 continue; /* Avoid endless recursion */
1643 all = PyObject_GetAttrString(mod, "__all__");
1644 if (all == NULL)
1645 PyErr_Clear();
1646 else {
1647 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1648 return 0;
1649 Py_DECREF(all);
1650 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001651 continue;
1652 }
1653 hasit = PyObject_HasAttr(mod, item);
1654 if (!hasit) {
1655 char *subname = PyString_AS_STRING(item);
1656 PyObject *submod;
1657 char *p;
1658 if (buflen + strlen(subname) >= MAXPATHLEN) {
1659 PyErr_SetString(PyExc_ValueError,
1660 "Module name too long");
1661 Py_DECREF(item);
1662 return 0;
1663 }
1664 p = buf + buflen;
1665 *p++ = '.';
1666 strcpy(p, subname);
1667 submod = import_submodule(mod, subname, buf);
1668 Py_XDECREF(submod);
1669 if (submod == NULL) {
1670 Py_DECREF(item);
1671 return 0;
1672 }
1673 }
1674 Py_DECREF(item);
1675 }
1676
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001677 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001678}
1679
1680static PyObject *
1681import_submodule(mod, subname, fullname)
1682 PyObject *mod; /* May be None */
1683 char *subname;
1684 char *fullname;
1685{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001686 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001687 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001688
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001689 /* Require:
1690 if mod == None: subname == fullname
1691 else: mod.__name__ + "." + subname == fullname
1692 */
1693
1694 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001695 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001696 }
1697 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001698 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001699 char buf[MAXPATHLEN+1];
1700 struct filedescr *fdp;
1701 FILE *fp = NULL;
1702
Guido van Rossum9c0afe51998-05-19 15:09:05 +00001703 if (mod == Py_None)
1704 path = NULL;
1705 else {
1706 path = PyObject_GetAttrString(mod, "__path__");
1707 if (path == NULL) {
1708 PyErr_Clear();
1709 Py_INCREF(Py_None);
1710 return Py_None;
1711 }
1712 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001713
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001714 buf[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001715 fdp = find_module(subname, path,
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001716 buf, MAXPATHLEN+1, &fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001717 if (fdp == NULL) {
1718 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1719 return NULL;
1720 PyErr_Clear();
1721 Py_INCREF(Py_None);
1722 return Py_None;
1723 }
1724 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001725 if (fp)
1726 fclose(fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001727 if (m != NULL && mod != Py_None) {
1728 if (PyObject_SetAttrString(mod, subname, m) < 0) {
1729 Py_DECREF(m);
1730 m = NULL;
1731 }
1732 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001733 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001734
1735 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001736}
1737
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001738
1739/* Re-import a module of any kind and return its module object, WITH
1740 INCREMENTED REFERENCE COUNT */
1741
Guido van Rossum79f25d91997-04-29 20:08:16 +00001742PyObject *
1743PyImport_ReloadModule(m)
1744 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001745{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001746 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001747 PyObject *path = NULL;
1748 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001749 char buf[MAXPATHLEN+1];
1750 struct filedescr *fdp;
1751 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001752
Guido van Rossum79f25d91997-04-29 20:08:16 +00001753 if (m == NULL || !PyModule_Check(m)) {
1754 PyErr_SetString(PyExc_TypeError,
1755 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001756 return NULL;
1757 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001758 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001759 if (name == NULL)
1760 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001761 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001762 PyErr_Format(PyExc_ImportError,
1763 "reload(): module %.200s not in sys.modules",
1764 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001765 return NULL;
1766 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001767 subname = strrchr(name, '.');
1768 if (subname == NULL)
1769 subname = name;
1770 else {
1771 PyObject *parentname, *parent;
1772 parentname = PyString_FromStringAndSize(name, (subname-name));
1773 if (parentname == NULL)
1774 return NULL;
1775 parent = PyDict_GetItem(modules, parentname);
1776 if (parent == NULL) {
1777 PyErr_Format(PyExc_ImportError,
1778 "reload(): parent %.200s not in sys.modules",
1779 name);
1780 return NULL;
1781 }
1782 subname++;
1783 path = PyObject_GetAttrString(parent, "__path__");
1784 if (path == NULL)
1785 PyErr_Clear();
1786 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001787 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001788 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1789 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001790 if (fdp == NULL)
1791 return NULL;
1792 m = load_module(name, fp, buf, fdp->type);
1793 if (fp)
1794 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001795 return m;
1796}
1797
1798
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001799/* Higher-level import emulator which emulates the "import" statement
1800 more accurately -- it invokes the __import__() function from the
1801 builtins of the current globals. This means that the import is
1802 done using whatever import hooks are installed in the current
1803 environment, e.g. by "ni" or "rexec". */
1804
1805PyObject *
1806PyImport_Import(module_name)
1807 PyObject *module_name;
1808{
1809 static PyObject *silly_list = NULL;
1810 static PyObject *builtins_str = NULL;
1811 static PyObject *import_str = NULL;
1812 static PyObject *standard_builtins = NULL;
1813 PyObject *globals = NULL;
1814 PyObject *import = NULL;
1815 PyObject *builtins = NULL;
1816 PyObject *r = NULL;
1817
1818 /* Initialize constant string objects */
1819 if (silly_list == NULL) {
1820 import_str = PyString_InternFromString("__import__");
1821 if (import_str == NULL)
1822 return NULL;
1823 builtins_str = PyString_InternFromString("__builtins__");
1824 if (builtins_str == NULL)
1825 return NULL;
1826 silly_list = Py_BuildValue("[s]", "__doc__");
1827 if (silly_list == NULL)
1828 return NULL;
1829 }
1830
1831 /* Get the builtins from current globals */
1832 globals = PyEval_GetGlobals();
1833 if(globals != NULL) {
1834 builtins = PyObject_GetItem(globals, builtins_str);
1835 if (builtins == NULL)
1836 goto err;
1837 }
1838 else {
1839 /* No globals -- use standard builtins, and fake globals */
1840 PyErr_Clear();
1841
1842 if (standard_builtins == NULL) {
1843 standard_builtins =
1844 PyImport_ImportModule("__builtin__");
1845 if (standard_builtins == NULL)
1846 return NULL;
1847 }
1848
1849 builtins = standard_builtins;
1850 Py_INCREF(builtins);
1851 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1852 if (globals == NULL)
1853 goto err;
1854 }
1855
1856 /* Get the __import__ function from the builtins */
1857 if (PyDict_Check(builtins))
1858 import=PyObject_GetItem(builtins, import_str);
1859 else
1860 import=PyObject_GetAttr(builtins, import_str);
1861 if (import == NULL)
1862 goto err;
1863
1864 /* Call the _import__ function with the proper argument list */
1865 r = PyObject_CallFunction(import, "OOOO",
1866 module_name, globals, globals, silly_list);
1867
1868 err:
1869 Py_XDECREF(globals);
1870 Py_XDECREF(builtins);
1871 Py_XDECREF(import);
1872
1873 return r;
1874}
1875
1876
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001877/* Module 'imp' provides Python access to the primitives used for
1878 importing modules.
1879*/
1880
Guido van Rossum79f25d91997-04-29 20:08:16 +00001881static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001882imp_get_magic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001883 PyObject *self;
1884 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001885{
1886 char buf[4];
1887
Guido van Rossum79f25d91997-04-29 20:08:16 +00001888 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001889 return NULL;
Guido van Rossum6bf62da1997-04-11 20:37:35 +00001890 buf[0] = (char) ((MAGIC >> 0) & 0xff);
1891 buf[1] = (char) ((MAGIC >> 8) & 0xff);
1892 buf[2] = (char) ((MAGIC >> 16) & 0xff);
1893 buf[3] = (char) ((MAGIC >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001894
Guido van Rossum79f25d91997-04-29 20:08:16 +00001895 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001896}
1897
Guido van Rossum79f25d91997-04-29 20:08:16 +00001898static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001899imp_get_suffixes(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001900 PyObject *self;
1901 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001902{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001903 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001904 struct filedescr *fdp;
1905
Guido van Rossum79f25d91997-04-29 20:08:16 +00001906 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001907 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001908 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001909 if (list == NULL)
1910 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001911 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
1912 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001913 fdp->suffix, fdp->mode, fdp->type);
1914 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001915 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001916 return NULL;
1917 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001918 if (PyList_Append(list, item) < 0) {
1919 Py_DECREF(list);
1920 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001921 return NULL;
1922 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001923 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001924 }
1925 return list;
1926}
1927
Guido van Rossum79f25d91997-04-29 20:08:16 +00001928static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001929call_find_module(name, path)
1930 char *name;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001931 PyObject *path; /* list or None or NULL */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001932{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001933 extern int fclose Py_PROTO((FILE *));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001934 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001935 struct filedescr *fdp;
1936 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001937 FILE *fp = NULL;
1938
1939 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001940 if (path == Py_None)
1941 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001942 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
1943 if (fdp == NULL)
1944 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001945 if (fp != NULL) {
1946 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
1947 if (fob == NULL) {
1948 fclose(fp);
1949 return NULL;
1950 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001951 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001952 else {
1953 fob = Py_None;
1954 Py_INCREF(fob);
1955 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001956 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001957 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001958 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001959 return ret;
1960}
1961
Guido van Rossum79f25d91997-04-29 20:08:16 +00001962static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001963imp_find_module(self, args)
1964 PyObject *self;
1965 PyObject *args;
1966{
1967 char *name;
1968 PyObject *path = NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001969 if (!PyArg_ParseTuple(args, "s|O", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001970 return NULL;
1971 return call_find_module(name, path);
1972}
1973
1974static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001975imp_init_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001976 PyObject *self;
1977 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001978{
1979 char *name;
1980 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001981 PyObject *m;
1982 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001983 return NULL;
1984 ret = init_builtin(name);
1985 if (ret < 0)
1986 return NULL;
1987 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001988 Py_INCREF(Py_None);
1989 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001990 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001991 m = PyImport_AddModule(name);
1992 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001993 return m;
1994}
1995
Guido van Rossum79f25d91997-04-29 20:08:16 +00001996static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001997imp_init_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001998 PyObject *self;
1999 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002000{
2001 char *name;
2002 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002003 PyObject *m;
2004 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002005 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002006 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002007 if (ret < 0)
2008 return NULL;
2009 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002010 Py_INCREF(Py_None);
2011 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002012 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002013 m = PyImport_AddModule(name);
2014 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002015 return m;
2016}
2017
Guido van Rossum79f25d91997-04-29 20:08:16 +00002018static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002019imp_get_frozen_object(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002020 PyObject *self;
2021 PyObject *args;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002022{
2023 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002024
Guido van Rossum79f25d91997-04-29 20:08:16 +00002025 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002026 return NULL;
2027 return get_frozen_object(name);
2028}
2029
Guido van Rossum79f25d91997-04-29 20:08:16 +00002030static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002031imp_is_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002032 PyObject *self;
2033 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002034{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002035 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002036 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002037 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002038 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002039}
2040
Guido van Rossum79f25d91997-04-29 20:08:16 +00002041static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002042imp_is_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002043 PyObject *self;
2044 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002045{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002046 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002047 struct _frozen *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002048 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002049 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002050 p = find_frozen(name);
2051 return PyInt_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002052}
2053
2054static FILE *
2055get_file(pathname, fob, mode)
2056 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002057 PyObject *fob;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002058 char *mode;
2059{
2060 FILE *fp;
2061 if (fob == NULL) {
2062 fp = fopen(pathname, mode);
2063 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002064 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002065 }
2066 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002067 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002068 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002069 PyErr_SetString(PyExc_ValueError,
2070 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002071 }
2072 return fp;
2073}
2074
Guido van Rossum79f25d91997-04-29 20:08:16 +00002075static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002076imp_load_compiled(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002077 PyObject *self;
2078 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002079{
2080 char *name;
2081 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002082 PyObject *fob = NULL;
2083 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002084 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002085 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002086 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002087 return NULL;
2088 fp = get_file(pathname, fob, "rb");
2089 if (fp == NULL)
2090 return NULL;
2091 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002092 if (fob == NULL)
2093 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002094 return m;
2095}
2096
Guido van Rossum79f25d91997-04-29 20:08:16 +00002097static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002098imp_load_dynamic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002099 PyObject *self;
2100 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002101{
2102 char *name;
2103 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002104 PyObject *fob = NULL;
2105 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002106 FILE *fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002107 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
2108 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002109 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002110 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002111 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002112 if (fp == NULL)
2113 return NULL;
2114 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002115 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002116 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002117}
2118
Guido van Rossum79f25d91997-04-29 20:08:16 +00002119static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002120imp_load_source(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002121 PyObject *self;
2122 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002123{
2124 char *name;
2125 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002126 PyObject *fob = NULL;
2127 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002128 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002129 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002130 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002131 return NULL;
2132 fp = get_file(pathname, fob, "r");
2133 if (fp == NULL)
2134 return NULL;
2135 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002136 if (fob == NULL)
2137 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002138 return m;
2139}
2140
Jack Jansen9c96a921995-02-15 22:57:06 +00002141#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002142static PyObject *
Jack Jansen9c96a921995-02-15 22:57:06 +00002143imp_load_resource(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002144 PyObject *self;
2145 PyObject *args;
Jack Jansen9c96a921995-02-15 22:57:06 +00002146{
2147 char *name;
2148 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002149 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002150
Guido van Rossum79f25d91997-04-29 20:08:16 +00002151 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002152 return NULL;
2153 m = PyMac_LoadResourceModule(name, pathname);
2154 return m;
2155}
2156#endif /* macintosh */
2157
Guido van Rossum79f25d91997-04-29 20:08:16 +00002158static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002159imp_load_module(self, args)
2160 PyObject *self;
2161 PyObject *args;
2162{
2163 char *name;
2164 PyObject *fob;
2165 char *pathname;
2166 char *suffix; /* Unused */
2167 char *mode;
2168 int type;
2169 FILE *fp;
2170
2171 if (!PyArg_ParseTuple(args, "sOs(ssi)",
2172 &name, &fob, &pathname,
2173 &suffix, &mode, &type))
2174 return NULL;
2175 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
2176 PyErr_Format(PyExc_ValueError,
2177 "invalid file open mode %.200s", mode);
2178 return NULL;
2179 }
2180 if (fob == Py_None)
2181 fp = NULL;
2182 else {
2183 if (!PyFile_Check(fob)) {
2184 PyErr_SetString(PyExc_ValueError,
2185 "load_module arg#2 should be a file or None");
2186 return NULL;
2187 }
2188 fp = get_file(pathname, fob, mode);
2189 if (fp == NULL)
2190 return NULL;
2191 }
2192 return load_module(name, fp, pathname, type);
2193}
2194
2195static PyObject *
2196imp_load_package(self, args)
2197 PyObject *self;
2198 PyObject *args;
2199{
2200 char *name;
2201 char *pathname;
2202 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
2203 return NULL;
2204 return load_package(name, pathname);
2205}
2206
2207static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002208imp_new_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002209 PyObject *self;
2210 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002211{
2212 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002213 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002214 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002215 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002216}
2217
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002218/* Doc strings */
2219
2220static char doc_imp[] = "\
2221This module provides the components needed to build your own\n\
2222__import__ function. Undocumented functions are obsolete.\n\
2223";
2224
2225static char doc_find_module[] = "\
2226find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
2227Search for a module. If path is omitted or None, search for a\n\
2228built-in, frozen or special module and continue search in sys.path.\n\
2229The module name cannot contain '.'; to search for a submodule of a\n\
2230package, pass the submodule name and the package's __path__.\
2231";
2232
2233static char doc_load_module[] = "\
2234load_module(name, file, filename, (suffix, mode, type)) -> module\n\
2235Load a module, given information returned by find_module().\n\
2236The module name must include the full package name, if any.\
2237";
2238
2239static char doc_get_magic[] = "\
2240get_magic() -> string\n\
2241Return the magic number for .pyc or .pyo files.\
2242";
2243
2244static char doc_get_suffixes[] = "\
2245get_suffixes() -> [(suffix, mode, type), ...]\n\
2246Return a list of (suffix, mode, type) tuples describing the files\n\
2247that find_module() looks for.\
2248";
2249
2250static char doc_new_module[] = "\
2251new_module(name) -> module\n\
2252Create a new module. Do not enter it in sys.modules.\n\
2253The module name must include the full package name, if any.\
2254";
2255
Guido van Rossum79f25d91997-04-29 20:08:16 +00002256static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002257 {"find_module", imp_find_module, 1, doc_find_module},
2258 {"get_magic", imp_get_magic, 1, doc_get_magic},
2259 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2260 {"load_module", imp_load_module, 1, doc_load_module},
2261 {"new_module", imp_new_module, 1, doc_new_module},
2262 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002263 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002264 {"init_builtin", imp_init_builtin, 1},
2265 {"init_frozen", imp_init_frozen, 1},
2266 {"is_builtin", imp_is_builtin, 1},
2267 {"is_frozen", imp_is_frozen, 1},
2268 {"load_compiled", imp_load_compiled, 1},
2269 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002270 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002271#ifdef macintosh
2272 {"load_resource", imp_load_resource, 1},
2273#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002274 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002275 {NULL, NULL} /* sentinel */
2276};
2277
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002278int
2279setint(d, name, value)
2280 PyObject *d;
2281 char *name;
2282 int value;
2283{
2284 PyObject *v;
2285 int err;
2286
2287 v = PyInt_FromLong((long)value);
2288 err = PyDict_SetItemString(d, name, v);
2289 Py_XDECREF(v);
2290 return err;
2291}
2292
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002293void
2294initimp()
2295{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002296 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002297
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002298 m = Py_InitModule4("imp", imp_methods, doc_imp,
2299 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002300 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002301
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002302 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2303 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2304 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2305 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2306 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2307 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2308 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2309 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002310
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002311 failure:
2312 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002313}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002314
2315
2316/* API for embedding applications that want to add their own entries to the
2317 table of built-in modules. This should normally be called *before*
2318 Py_Initialize(). When the malloc() or realloc() call fails, -1 is returned
2319 and the existing table is unchanged.
2320
2321 After a similar function by Just van Rossum. */
2322
2323int
2324PyImport_ExtendInittab(newtab)
2325 struct _inittab *newtab;
2326{
2327 static struct _inittab *our_copy = NULL;
2328 struct _inittab *p;
2329 int i, n;
2330
2331 /* Count the number of entries in both tables */
2332 for (n = 0; newtab[n].name != NULL; n++)
2333 ;
2334 if (n == 0)
2335 return 0; /* Nothing to do */
2336 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2337 ;
2338
2339 /* Allocate new memory for the combined table */
2340 if (our_copy == NULL)
2341 p = malloc((i+n+1) * sizeof(struct _inittab));
2342 else
2343 p = realloc(our_copy, (i+n+1) * sizeof(struct _inittab));
2344 if (p == NULL)
2345 return -1;
2346
2347 /* Copy the tables into the new memory */
2348 if (our_copy != PyImport_Inittab)
2349 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2350 PyImport_Inittab = our_copy = p;
2351 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
2352
2353 return 0;
2354}
2355
2356/* Shorthand to add a single entry given a name and a function */
2357
2358int
2359PyImport_AppendInittab(name, initfunc)
2360 char *name;
2361 void (*initfunc)();
2362{
2363 struct _inittab newtab[2];
2364
2365 memset(newtab, '\0', sizeof newtab);
2366
2367 newtab[0].name = name;
2368 newtab[0].initfunc = initfunc;
2369
2370 return PyImport_ExtendInittab(newtab);
2371}