blob: edc960c1f91f5b004b99aa61af2709067cc54077 [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 Rossum80bb9651996-12-05 23:27:02 +0000832 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000833 FILE *fp = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000834 struct stat statbuf;
835
836 if (path == NULL) {
837 if (is_builtin(name)) {
838 static struct filedescr fd = {"", "", C_BUILTIN};
839 return &fd;
840 }
Guido van Rossuma86f77d1997-09-09 18:53:47 +0000841 if (find_frozen(name) != NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000842 static struct filedescr fd = {"", "", PY_FROZEN};
843 return &fd;
844 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000845
Guido van Rossumac279101996-08-22 23:10:58 +0000846#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000847 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
848 if (fp != NULL) {
849 *p_fp = fp;
850 return fdp;
851 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000852#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000853 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000854
855
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000856 if (path == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000857 path = PySys_GetObject("path");
858 if (path == NULL || !PyList_Check(path)) {
859 PyErr_SetString(PyExc_ImportError,
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000860 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000861 return NULL;
862 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000863 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000864 namelen = strlen(name);
865 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000866 PyObject *v = PyList_GetItem(path, i);
867 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000868 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000869 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000870 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000871 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000872 strcpy(buf, PyString_AsString(v));
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000873 if ((int)strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000874 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000875#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000876#ifdef INTERN_STRINGS
877 /*
878 ** Speedup: each sys.path item is interned, and
879 ** FindResourceModule remembers which items refer to
880 ** folders (so we don't have to bother trying to look
881 ** into them for resources).
882 */
883 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
884 v = PyList_GET_ITEM(path, i);
885#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000886 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000887 static struct filedescr resfiledescr =
888 {"", "", PY_RESOURCE};
Jack Jansen9c96a921995-02-15 22:57:06 +0000889
890 return &resfiledescr;
891 }
892#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000893 if (len > 0 && buf[len-1] != SEP
894#ifdef ALTSEP
895 && buf[len-1] != ALTSEP
896#endif
897 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000898 buf[len++] = SEP;
Guido van Rossum40f470f1996-05-23 22:51:04 +0000899#ifdef IMPORT_8x3_NAMES
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000900 /* see if we are searching in directory dos-8x3 */
901 if (len > 7 && !strncmp(buf + len - 8, "dos-8x3", 7)){
Guido van Rossum40f470f1996-05-23 22:51:04 +0000902 int j;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000903 char ch; /* limit name to 8 lower-case characters */
Guido van Rossum40f470f1996-05-23 22:51:04 +0000904 for (j = 0; (ch = name[j]) && j < 8; j++)
905 if (isupper(ch))
906 buf[len++] = tolower(ch);
907 else
908 buf[len++] = ch;
909 }
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000910 else /* Not in dos-8x3, use the full name */
Guido van Rossum6f489d91996-06-28 20:15:15 +0000911#endif
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000912 {
Guido van Rossum40f470f1996-05-23 22:51:04 +0000913 strcpy(buf+len, name);
914 len += namelen;
915 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000916#ifdef HAVE_STAT
917 if (stat(buf, &statbuf) == 0) {
918 static struct filedescr fd = {"", "", PKG_DIRECTORY};
Guido van Rossum197346f1997-10-31 18:38:52 +0000919 if (S_ISDIR(statbuf.st_mode)) {
Guido van Rossum0980bd91998-02-13 17:18:36 +0000920 if (find_init_module(buf)) {
921#ifdef CHECK_IMPORT_CASE
922 if (!check_case(buf, len, namelen,
923 name))
924 return NULL;
925#endif
Guido van Rossum197346f1997-10-31 18:38:52 +0000926 return &fd;
Guido van Rossum0980bd91998-02-13 17:18:36 +0000927 }
Guido van Rossum197346f1997-10-31 18:38:52 +0000928 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000929 }
930#else
931 /* XXX How are you going to test for directories? */
932#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000933#ifdef macintosh
934 fdp = PyMac_FindModuleExtension(buf, &len, name);
935 if (fdp)
936 fp = fopen(buf, fdp->mode);
937#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000938 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000939 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000940 if (Py_VerboseFlag > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000941 fprintf(stderr, "# trying %s\n", buf);
942 fp = fopen(buf, fdp->mode);
943 if (fp != NULL)
944 break;
945 }
Guido van Rossum741689d1997-08-12 14:53:39 +0000946#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000947 if (fp != NULL)
948 break;
949 }
950 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000951 PyErr_Format(PyExc_ImportError,
952 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000953 return NULL;
954 }
Guido van Rossum0980bd91998-02-13 17:18:36 +0000955#ifdef CHECK_IMPORT_CASE
956 if (!check_case(buf, len, namelen, name)) {
957 fclose(fp);
958 return NULL;
959 }
960#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000961
962 *p_fp = fp;
963 return fdp;
964}
965
Guido van Rossum0980bd91998-02-13 17:18:36 +0000966#ifdef CHECK_IMPORT_CASE
967
968#ifdef MS_WIN32
969#include <windows.h>
970static int
971check_case(char *buf, int len, int namelen, char *name)
972{
973 WIN32_FIND_DATA data;
974 HANDLE h;
975 if (getenv("PYTHONCASEOK") != NULL)
976 return 1;
977 h = FindFirstFile(buf, &data);
978 if (h == INVALID_HANDLE_VALUE) {
979 PyErr_Format(PyExc_NameError,
980 "Can't find file for module %.100s\n(filename %.300s)",
981 name, buf);
982 return 0;
983 }
984 FindClose(h);
985 if (strncmp(data.cFileName, name, namelen) != 0) {
986 strcpy(buf+len-namelen, data.cFileName);
987 PyErr_Format(PyExc_NameError,
988 "Case mismatch for module name %.100s\n(filename %.300s)",
989 name, buf);
990 return 0;
991 }
992 return 1;
993}
994#endif /* MS_WIN32 */
995
996#ifdef macintosh
997#include <TextUtils.h>
998static int
999check_case(char *buf, int len, int namelen, char *name)
1000{
1001 FSSpec fss;
1002 OSErr err;
1003 unsigned char mybuf[MAXPATHLEN+1];
1004
1005 strcpy((char *)mybuf, buf);
1006 c2pstr((char *)mybuf);
1007 err = FSMakeFSSpec(0, 0, mybuf, &fss);
1008 if (err) {
1009 PyErr_Format(PyExc_NameError,
1010 "Can't find file for module %.100s\n(filename %.300s)",
1011 name, buf);
1012 return 0;
1013 }
1014 p2cstr(fss.name);
1015 if ( strncmp(name, (char *)fss.name, namelen) != 0 ) {
1016 PyErr_Format(PyExc_NameError,
1017 "Case mismatch for module name %.100s\n(filename %.300s)",
1018 name, fss.name);
1019 return 0;
1020 }
1021 return 1;
1022}
1023#endif /* macintosh */
1024
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001025#ifdef DJGPP
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001026#include <dir.h>
1027
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001028static int
1029check_case(char *buf, int len, int namelen, char *name)
1030{
1031 struct ffblk ffblk;
1032 int done;
1033
1034 if (getenv("PYTHONCASEOK") != NULL)
1035 return 1;
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001036 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001037 if (done) {
1038 PyErr_Format(PyExc_NameError,
1039 "Can't find file for module %.100s\n(filename %.300s)",
1040 name, buf);
1041 return 0;
1042 }
1043
1044 if (strncmp(ffblk.ff_name, name, namelen) != 0) {
1045 strcpy(buf+len-namelen, ffblk.ff_name);
1046 PyErr_Format(PyExc_NameError,
1047 "Case mismatch for module name %.100s\n(filename %.300s)",
1048 name, buf);
1049 return 0;
1050 }
1051 return 1;
1052}
1053#endif
1054
Guido van Rossum0980bd91998-02-13 17:18:36 +00001055#endif CHECK_IMPORT_CASE
1056
Guido van Rossum197346f1997-10-31 18:38:52 +00001057#ifdef HAVE_STAT
1058/* Helper to look for __init__.py or __init__.py[co] in potential package */
1059static int
1060find_init_module(buf)
1061 char *buf;
1062{
1063 int save_len = strlen(buf);
1064 int i = save_len;
1065 struct stat statbuf;
1066
1067 if (save_len + 13 >= MAXPATHLEN)
1068 return 0;
1069 buf[i++] = SEP;
1070 strcpy(buf+i, "__init__.py");
1071 if (stat(buf, &statbuf) == 0) {
1072 buf[save_len] = '\0';
1073 return 1;
1074 }
1075 i += strlen(buf+i);
1076 if (Py_OptimizeFlag)
1077 strcpy(buf+i, "o");
1078 else
1079 strcpy(buf+i, "c");
1080 if (stat(buf, &statbuf) == 0) {
1081 buf[save_len] = '\0';
1082 return 1;
1083 }
1084 buf[save_len] = '\0';
1085 return 0;
1086}
1087#endif /* HAVE_STAT */
1088
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001089
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001090static int init_builtin Py_PROTO((char *)); /* Forward */
1091
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001092/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001093 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001094
Guido van Rossum79f25d91997-04-29 20:08:16 +00001095static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001096load_module(name, fp, buf, type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001097 char *name;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001098 FILE *fp;
1099 char *buf;
1100 int type;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001101{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001102 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001103 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001104 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001105
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001106 /* First check that there's an open file (if we need one) */
1107 switch (type) {
1108 case PY_SOURCE:
1109 case PY_COMPILED:
1110 if (fp == NULL) {
1111 PyErr_Format(PyExc_ValueError,
1112 "file object required for import (type code %d)",
1113 type);
1114 return NULL;
1115 }
1116 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001117
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001118 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001119
1120 case PY_SOURCE:
1121 m = load_source_module(name, buf, fp);
1122 break;
1123
1124 case PY_COMPILED:
1125 m = load_compiled_module(name, buf, fp);
1126 break;
1127
1128 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001129 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001130 break;
1131
Jack Jansen9c96a921995-02-15 22:57:06 +00001132#ifdef macintosh
1133 case PY_RESOURCE:
1134 m = PyMac_LoadResourceModule(name, buf);
1135 break;
1136#endif
1137
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001138 case PKG_DIRECTORY:
1139 m = load_package(name, buf);
1140 break;
1141
1142 case C_BUILTIN:
1143 case PY_FROZEN:
1144 if (type == C_BUILTIN)
1145 err = init_builtin(name);
1146 else
1147 err = PyImport_ImportFrozenModule(name);
1148 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001149 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001150 if (err == 0) {
1151 PyErr_Format(PyExc_ImportError,
1152 "Purported %s module %.200s not found",
1153 type == C_BUILTIN ?
1154 "builtin" : "frozen",
1155 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001156 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001157 }
1158 modules = PyImport_GetModuleDict();
1159 m = PyDict_GetItemString(modules, name);
1160 if (m == NULL) {
1161 PyErr_Format(
1162 PyExc_ImportError,
1163 "%s module %.200s not properly initialized",
1164 type == C_BUILTIN ?
1165 "builtin" : "frozen",
1166 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001167 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001168 }
1169 Py_INCREF(m);
1170 break;
1171
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001172 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001173 PyErr_Format(PyExc_ImportError,
1174 "Don't know how to import %.200s (type code %d)",
1175 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001176 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001177
1178 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001179
1180 return m;
1181}
1182
1183
1184/* Initialize a built-in module.
1185 Return 1 for succes, 0 if the module is not found, and -1 with
1186 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001187
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001188static int
1189init_builtin(name)
1190 char *name;
1191{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001192 struct _inittab *p;
1193 PyObject *mod;
1194
1195 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
1196 return 1;
1197
Guido van Rossum771c6c81997-10-31 18:37:24 +00001198 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001199 if (strcmp(name, p->name) == 0) {
1200 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001201 PyErr_Format(PyExc_ImportError,
1202 "Cannot re-init internal module %.200s",
1203 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001204 return -1;
1205 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001206 if (Py_VerboseFlag)
Guido van Rossum25ce5661997-08-02 03:10:38 +00001207 fprintf(stderr, "import %s # builtin\n", name);
1208 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001209 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001210 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001211 if (_PyImport_FixupExtension(name, name) == NULL)
1212 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001213 return 1;
1214 }
1215 }
1216 return 0;
1217}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001218
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001219
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001220/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001221
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001222static struct _frozen *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001223find_frozen(name)
1224 char *name;
1225{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001226 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001227
Guido van Rossum79f25d91997-04-29 20:08:16 +00001228 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001229 if (p->name == NULL)
1230 return NULL;
1231 if (strcmp(p->name, name) == 0)
1232 break;
1233 }
1234 return p;
1235}
1236
Guido van Rossum79f25d91997-04-29 20:08:16 +00001237static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001238get_frozen_object(name)
1239 char *name;
1240{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001241 struct _frozen *p = find_frozen(name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001242
1243 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001244 PyErr_Format(PyExc_ImportError,
1245 "No such frozen object named %.200s",
1246 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001247 return NULL;
1248 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001249 return PyMarshal_ReadObjectFromString((char *)p->code, p->size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001250}
1251
1252/* Initialize a frozen module.
1253 Return 1 for succes, 0 if the module is not found, and -1 with
1254 an exception set if the initialization failed.
1255 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001256
1257int
Guido van Rossum79f25d91997-04-29 20:08:16 +00001258PyImport_ImportFrozenModule(name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001259 char *name;
1260{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001261 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001262 PyObject *co;
1263 PyObject *m;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001264
1265 if (p == NULL)
1266 return 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001267 if (Py_VerboseFlag)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001268 fprintf(stderr, "import %s # frozen\n", name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001269 co = PyMarshal_ReadObjectFromString((char *)p->code, p->size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001270 if (co == NULL)
1271 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001272 if (!PyCode_Check(co)) {
1273 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001274 PyErr_Format(PyExc_TypeError,
1275 "frozen object %.200s is not a code object",
1276 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001277 return -1;
1278 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001279 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001280 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001281 if (m == NULL)
1282 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001283 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001284 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001285}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001286
1287
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001288/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001289 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001290
Guido van Rossum79f25d91997-04-29 20:08:16 +00001291PyObject *
1292PyImport_ImportModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001293 char *name;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001294{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001295 static PyObject *fromlist = NULL;
1296 if (fromlist == NULL && strchr(name, '.') != NULL) {
1297 fromlist = Py_BuildValue("[s]", "*");
1298 if (fromlist == NULL)
1299 return NULL;
1300 }
1301 return PyImport_ImportModuleEx(name, NULL, NULL, fromlist);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001302}
1303
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001304/* Forward declarations for helper routines */
1305static PyObject *get_parent Py_PROTO((PyObject *globals,
1306 char *buf, int *p_buflen));
1307static PyObject *load_next Py_PROTO((PyObject *mod, PyObject *altmod,
1308 char **p_name, char *buf, int *p_buflen));
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001309static int mark_miss Py_PROTO((char *name));
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001310static int ensure_fromlist Py_PROTO((PyObject *mod, PyObject *fromlist,
Guido van Rossum9905ef91997-09-08 16:07:11 +00001311 char *buf, int buflen, int recursive));
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001312static PyObject * import_submodule Py_PROTO((PyObject *mod,
1313 char *name, char *fullname));
1314
1315/* The Magnum Opus of dotted-name import :-) */
1316
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001317static PyObject *
1318import_module_ex(name, globals, locals, fromlist)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001319 char *name;
1320 PyObject *globals;
1321 PyObject *locals;
1322 PyObject *fromlist;
1323{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001324 char buf[MAXPATHLEN+1];
1325 int buflen = 0;
1326 PyObject *parent, *head, *next, *tail;
1327
1328 parent = get_parent(globals, buf, &buflen);
1329 if (parent == NULL)
1330 return NULL;
1331
1332 head = load_next(parent, Py_None, &name, buf, &buflen);
1333 if (head == NULL)
1334 return NULL;
1335
1336 tail = head;
1337 Py_INCREF(tail);
1338 while (name) {
1339 next = load_next(tail, tail, &name, buf, &buflen);
1340 Py_DECREF(tail);
1341 if (next == NULL) {
1342 Py_DECREF(head);
1343 return NULL;
1344 }
1345 tail = next;
1346 }
1347
1348 if (fromlist != NULL) {
1349 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1350 fromlist = NULL;
1351 }
1352
1353 if (fromlist == NULL) {
1354 Py_DECREF(tail);
1355 return head;
1356 }
1357
1358 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001359 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001360 Py_DECREF(tail);
1361 return NULL;
1362 }
1363
1364 return tail;
1365}
1366
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001367PyObject *
1368PyImport_ImportModuleEx(name, globals, locals, fromlist)
1369 char *name;
1370 PyObject *globals;
1371 PyObject *locals;
1372 PyObject *fromlist;
1373{
1374 PyObject *result;
1375 lock_import();
Guido van Rossumd65911b1998-03-03 22:33:27 +00001376 result = import_module_ex(name, globals, locals, fromlist);
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001377 unlock_import();
1378 return result;
1379}
1380
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001381static PyObject *
1382get_parent(globals, buf, p_buflen)
1383 PyObject *globals;
1384 char *buf;
1385 int *p_buflen;
1386{
1387 static PyObject *namestr = NULL;
1388 static PyObject *pathstr = NULL;
1389 PyObject *modname, *modpath, *modules, *parent;
1390
1391 if (globals == NULL || !PyDict_Check(globals))
1392 return Py_None;
1393
1394 if (namestr == NULL) {
1395 namestr = PyString_InternFromString("__name__");
1396 if (namestr == NULL)
1397 return NULL;
1398 }
1399 if (pathstr == NULL) {
1400 pathstr = PyString_InternFromString("__path__");
1401 if (pathstr == NULL)
1402 return NULL;
1403 }
1404
1405 *buf = '\0';
1406 *p_buflen = 0;
1407 modname = PyDict_GetItem(globals, namestr);
1408 if (modname == NULL || !PyString_Check(modname))
1409 return Py_None;
1410
1411 modpath = PyDict_GetItem(globals, pathstr);
1412 if (modpath != NULL) {
1413 int len = PyString_GET_SIZE(modname);
1414 if (len > MAXPATHLEN) {
1415 PyErr_SetString(PyExc_ValueError,
1416 "Module name too long");
1417 return NULL;
1418 }
1419 strcpy(buf, PyString_AS_STRING(modname));
1420 *p_buflen = len;
1421 }
1422 else {
1423 char *start = PyString_AS_STRING(modname);
1424 char *lastdot = strrchr(start, '.');
1425 int len;
1426 if (lastdot == NULL)
1427 return Py_None;
1428 len = lastdot - start;
1429 if (len >= MAXPATHLEN) {
1430 PyErr_SetString(PyExc_ValueError,
1431 "Module name too long");
1432 return NULL;
1433 }
1434 strncpy(buf, start, len);
1435 buf[len] = '\0';
1436 *p_buflen = len;
1437 }
1438
1439 modules = PyImport_GetModuleDict();
1440 parent = PyDict_GetItemString(modules, buf);
1441 if (parent == NULL)
1442 parent = Py_None;
1443 return parent;
1444 /* We expect, but can't guarantee, if parent != None, that:
1445 - parent.__name__ == buf
1446 - parent.__dict__ is globals
1447 If this is violated... Who cares? */
1448}
1449
1450static PyObject *
1451load_next(mod, altmod, p_name, buf, p_buflen)
1452 PyObject *mod;
1453 PyObject *altmod; /* Either None or same as mod */
1454 char **p_name;
1455 char *buf;
1456 int *p_buflen;
1457{
1458 char *name = *p_name;
1459 char *dot = strchr(name, '.');
1460 int len;
1461 char *p;
1462 PyObject *result;
1463
1464 if (dot == NULL) {
1465 *p_name = NULL;
1466 len = strlen(name);
1467 }
1468 else {
1469 *p_name = dot+1;
1470 len = dot-name;
1471 }
1472
1473 p = buf + *p_buflen;
1474 if (p != buf)
1475 *p++ = '.';
1476 if (p+len-buf >= MAXPATHLEN) {
1477 PyErr_SetString(PyExc_ValueError,
1478 "Module name too long");
1479 return NULL;
1480 }
1481 strncpy(p, name, len);
1482 p[len] = '\0';
1483 *p_buflen = p+len-buf;
1484
1485 result = import_submodule(mod, p, buf);
1486 if (result == Py_None && altmod != mod) {
1487 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001488 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001489 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001490 if (result != NULL && result != Py_None) {
1491 if (mark_miss(buf) != 0) {
1492 Py_DECREF(result);
1493 return NULL;
1494 }
1495 strncpy(buf, name, len);
1496 buf[len] = '\0';
1497 *p_buflen = len;
1498 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001499 }
1500 if (result == NULL)
1501 return NULL;
1502
1503 if (result == Py_None) {
1504 Py_DECREF(result);
1505 PyErr_Format(PyExc_ImportError,
1506 "No module named %.200s", name);
1507 return NULL;
1508 }
1509
1510 return result;
1511}
1512
1513static int
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001514mark_miss(name)
1515 char *name;
1516{
1517 PyObject *modules = PyImport_GetModuleDict();
1518 return PyDict_SetItemString(modules, name, Py_None);
1519}
1520
1521static int
Guido van Rossum9905ef91997-09-08 16:07:11 +00001522ensure_fromlist(mod, fromlist, buf, buflen, recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001523 PyObject *mod;
1524 PyObject *fromlist;
1525 char *buf;
1526 int buflen;
Guido van Rossum9905ef91997-09-08 16:07:11 +00001527 int recursive;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001528{
1529 int i;
1530
1531 if (!PyObject_HasAttrString(mod, "__path__"))
1532 return 1;
1533
1534 for (i = 0; ; i++) {
1535 PyObject *item = PySequence_GetItem(fromlist, i);
1536 int hasit;
1537 if (item == NULL) {
1538 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1539 PyErr_Clear();
1540 return 1;
1541 }
1542 return 0;
1543 }
1544 if (!PyString_Check(item)) {
1545 PyErr_SetString(PyExc_TypeError,
1546 "Item in ``from list'' not a string");
1547 Py_DECREF(item);
1548 return 0;
1549 }
1550 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001551 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001552 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001553 /* See if the package defines __all__ */
1554 if (recursive)
1555 continue; /* Avoid endless recursion */
1556 all = PyObject_GetAttrString(mod, "__all__");
1557 if (all == NULL)
1558 PyErr_Clear();
1559 else {
1560 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1561 return 0;
1562 Py_DECREF(all);
1563 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001564 continue;
1565 }
1566 hasit = PyObject_HasAttr(mod, item);
1567 if (!hasit) {
1568 char *subname = PyString_AS_STRING(item);
1569 PyObject *submod;
1570 char *p;
1571 if (buflen + strlen(subname) >= MAXPATHLEN) {
1572 PyErr_SetString(PyExc_ValueError,
1573 "Module name too long");
1574 Py_DECREF(item);
1575 return 0;
1576 }
1577 p = buf + buflen;
1578 *p++ = '.';
1579 strcpy(p, subname);
1580 submod = import_submodule(mod, subname, buf);
1581 Py_XDECREF(submod);
1582 if (submod == NULL) {
1583 Py_DECREF(item);
1584 return 0;
1585 }
1586 }
1587 Py_DECREF(item);
1588 }
1589
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001590 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001591}
1592
1593static PyObject *
1594import_submodule(mod, subname, fullname)
1595 PyObject *mod; /* May be None */
1596 char *subname;
1597 char *fullname;
1598{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001599 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001600 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001601
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001602 /* Require:
1603 if mod == None: subname == fullname
1604 else: mod.__name__ + "." + subname == fullname
1605 */
1606
1607 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001608 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001609 }
1610 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001611 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001612 char buf[MAXPATHLEN+1];
1613 struct filedescr *fdp;
1614 FILE *fp = NULL;
1615
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001616 path = PyObject_GetAttrString(mod, "__path__");
1617 if (path == NULL)
1618 PyErr_Clear();
1619
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001620 buf[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001621 fdp = find_module(subname, path,
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001622 buf, MAXPATHLEN+1, &fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001623 if (fdp == NULL) {
1624 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1625 return NULL;
1626 PyErr_Clear();
1627 Py_INCREF(Py_None);
1628 return Py_None;
1629 }
1630 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001631 if (fp)
1632 fclose(fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001633 if (m != NULL && mod != Py_None) {
1634 if (PyObject_SetAttrString(mod, subname, m) < 0) {
1635 Py_DECREF(m);
1636 m = NULL;
1637 }
1638 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001639 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001640
1641 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001642}
1643
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001644
1645/* Re-import a module of any kind and return its module object, WITH
1646 INCREMENTED REFERENCE COUNT */
1647
Guido van Rossum79f25d91997-04-29 20:08:16 +00001648PyObject *
1649PyImport_ReloadModule(m)
1650 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001651{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001652 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001653 PyObject *path = NULL;
1654 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001655 char buf[MAXPATHLEN+1];
1656 struct filedescr *fdp;
1657 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001658
Guido van Rossum79f25d91997-04-29 20:08:16 +00001659 if (m == NULL || !PyModule_Check(m)) {
1660 PyErr_SetString(PyExc_TypeError,
1661 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001662 return NULL;
1663 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001664 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001665 if (name == NULL)
1666 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001667 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001668 PyErr_Format(PyExc_ImportError,
1669 "reload(): module %.200s not in sys.modules",
1670 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001671 return NULL;
1672 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001673 subname = strrchr(name, '.');
1674 if (subname == NULL)
1675 subname = name;
1676 else {
1677 PyObject *parentname, *parent;
1678 parentname = PyString_FromStringAndSize(name, (subname-name));
1679 if (parentname == NULL)
1680 return NULL;
1681 parent = PyDict_GetItem(modules, parentname);
1682 if (parent == NULL) {
1683 PyErr_Format(PyExc_ImportError,
1684 "reload(): parent %.200s not in sys.modules",
1685 name);
1686 return NULL;
1687 }
1688 subname++;
1689 path = PyObject_GetAttrString(parent, "__path__");
1690 if (path == NULL)
1691 PyErr_Clear();
1692 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001693 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001694 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1695 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001696 if (fdp == NULL)
1697 return NULL;
1698 m = load_module(name, fp, buf, fdp->type);
1699 if (fp)
1700 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001701 return m;
1702}
1703
1704
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001705/* Higher-level import emulator which emulates the "import" statement
1706 more accurately -- it invokes the __import__() function from the
1707 builtins of the current globals. This means that the import is
1708 done using whatever import hooks are installed in the current
1709 environment, e.g. by "ni" or "rexec". */
1710
1711PyObject *
1712PyImport_Import(module_name)
1713 PyObject *module_name;
1714{
1715 static PyObject *silly_list = NULL;
1716 static PyObject *builtins_str = NULL;
1717 static PyObject *import_str = NULL;
1718 static PyObject *standard_builtins = NULL;
1719 PyObject *globals = NULL;
1720 PyObject *import = NULL;
1721 PyObject *builtins = NULL;
1722 PyObject *r = NULL;
1723
1724 /* Initialize constant string objects */
1725 if (silly_list == NULL) {
1726 import_str = PyString_InternFromString("__import__");
1727 if (import_str == NULL)
1728 return NULL;
1729 builtins_str = PyString_InternFromString("__builtins__");
1730 if (builtins_str == NULL)
1731 return NULL;
1732 silly_list = Py_BuildValue("[s]", "__doc__");
1733 if (silly_list == NULL)
1734 return NULL;
1735 }
1736
1737 /* Get the builtins from current globals */
1738 globals = PyEval_GetGlobals();
1739 if(globals != NULL) {
1740 builtins = PyObject_GetItem(globals, builtins_str);
1741 if (builtins == NULL)
1742 goto err;
1743 }
1744 else {
1745 /* No globals -- use standard builtins, and fake globals */
1746 PyErr_Clear();
1747
1748 if (standard_builtins == NULL) {
1749 standard_builtins =
1750 PyImport_ImportModule("__builtin__");
1751 if (standard_builtins == NULL)
1752 return NULL;
1753 }
1754
1755 builtins = standard_builtins;
1756 Py_INCREF(builtins);
1757 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1758 if (globals == NULL)
1759 goto err;
1760 }
1761
1762 /* Get the __import__ function from the builtins */
1763 if (PyDict_Check(builtins))
1764 import=PyObject_GetItem(builtins, import_str);
1765 else
1766 import=PyObject_GetAttr(builtins, import_str);
1767 if (import == NULL)
1768 goto err;
1769
1770 /* Call the _import__ function with the proper argument list */
1771 r = PyObject_CallFunction(import, "OOOO",
1772 module_name, globals, globals, silly_list);
1773
1774 err:
1775 Py_XDECREF(globals);
1776 Py_XDECREF(builtins);
1777 Py_XDECREF(import);
1778
1779 return r;
1780}
1781
1782
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001783/* Module 'imp' provides Python access to the primitives used for
1784 importing modules.
1785*/
1786
Guido van Rossum79f25d91997-04-29 20:08:16 +00001787static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001788imp_get_magic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001789 PyObject *self;
1790 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001791{
1792 char buf[4];
1793
Guido van Rossum79f25d91997-04-29 20:08:16 +00001794 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001795 return NULL;
Guido van Rossum6bf62da1997-04-11 20:37:35 +00001796 buf[0] = (char) ((MAGIC >> 0) & 0xff);
1797 buf[1] = (char) ((MAGIC >> 8) & 0xff);
1798 buf[2] = (char) ((MAGIC >> 16) & 0xff);
1799 buf[3] = (char) ((MAGIC >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001800
Guido van Rossum79f25d91997-04-29 20:08:16 +00001801 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001802}
1803
Guido van Rossum79f25d91997-04-29 20:08:16 +00001804static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001805imp_get_suffixes(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001806 PyObject *self;
1807 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001808{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001809 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001810 struct filedescr *fdp;
1811
Guido van Rossum79f25d91997-04-29 20:08:16 +00001812 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001813 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001814 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001815 if (list == NULL)
1816 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001817 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
1818 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001819 fdp->suffix, fdp->mode, fdp->type);
1820 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001821 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001822 return NULL;
1823 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001824 if (PyList_Append(list, item) < 0) {
1825 Py_DECREF(list);
1826 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001827 return NULL;
1828 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001829 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001830 }
1831 return list;
1832}
1833
Guido van Rossum79f25d91997-04-29 20:08:16 +00001834static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001835call_find_module(name, path)
1836 char *name;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001837 PyObject *path; /* list or None or NULL */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001838{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001839 extern int fclose Py_PROTO((FILE *));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001840 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001841 struct filedescr *fdp;
1842 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001843 FILE *fp = NULL;
1844
1845 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001846 if (path == Py_None)
1847 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001848 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
1849 if (fdp == NULL)
1850 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001851 if (fp != NULL) {
1852 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
1853 if (fob == NULL) {
1854 fclose(fp);
1855 return NULL;
1856 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001857 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001858 else {
1859 fob = Py_None;
1860 Py_INCREF(fob);
1861 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001862 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001863 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001864 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001865 return ret;
1866}
1867
Guido van Rossum79f25d91997-04-29 20:08:16 +00001868static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001869imp_find_module(self, args)
1870 PyObject *self;
1871 PyObject *args;
1872{
1873 char *name;
1874 PyObject *path = NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001875 if (!PyArg_ParseTuple(args, "s|O", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001876 return NULL;
1877 return call_find_module(name, path);
1878}
1879
1880static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001881imp_init_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001882 PyObject *self;
1883 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001884{
1885 char *name;
1886 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001887 PyObject *m;
1888 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001889 return NULL;
1890 ret = init_builtin(name);
1891 if (ret < 0)
1892 return NULL;
1893 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001894 Py_INCREF(Py_None);
1895 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001896 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001897 m = PyImport_AddModule(name);
1898 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001899 return m;
1900}
1901
Guido van Rossum79f25d91997-04-29 20:08:16 +00001902static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001903imp_init_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001904 PyObject *self;
1905 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001906{
1907 char *name;
1908 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001909 PyObject *m;
1910 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001911 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001912 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001913 if (ret < 0)
1914 return NULL;
1915 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001916 Py_INCREF(Py_None);
1917 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001918 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001919 m = PyImport_AddModule(name);
1920 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001921 return m;
1922}
1923
Guido van Rossum79f25d91997-04-29 20:08:16 +00001924static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001925imp_get_frozen_object(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001926 PyObject *self;
1927 PyObject *args;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001928{
1929 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00001930
Guido van Rossum79f25d91997-04-29 20:08:16 +00001931 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001932 return NULL;
1933 return get_frozen_object(name);
1934}
1935
Guido van Rossum79f25d91997-04-29 20:08:16 +00001936static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001937imp_is_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001938 PyObject *self;
1939 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001940{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001941 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001942 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001943 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001944 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001945}
1946
Guido van Rossum79f25d91997-04-29 20:08:16 +00001947static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001948imp_is_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001949 PyObject *self;
1950 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001951{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001952 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001953 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001954 return NULL;
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001955 return PyInt_FromLong(find_frozen(name) != NULL);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001956}
1957
1958static FILE *
1959get_file(pathname, fob, mode)
1960 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001961 PyObject *fob;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001962 char *mode;
1963{
1964 FILE *fp;
1965 if (fob == NULL) {
1966 fp = fopen(pathname, mode);
1967 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001968 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001969 }
1970 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001971 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001972 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001973 PyErr_SetString(PyExc_ValueError,
1974 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001975 }
1976 return fp;
1977}
1978
Guido van Rossum79f25d91997-04-29 20:08:16 +00001979static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001980imp_load_compiled(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001981 PyObject *self;
1982 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001983{
1984 char *name;
1985 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001986 PyObject *fob = NULL;
1987 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001988 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001989 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00001990 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001991 return NULL;
1992 fp = get_file(pathname, fob, "rb");
1993 if (fp == NULL)
1994 return NULL;
1995 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001996 if (fob == NULL)
1997 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001998 return m;
1999}
2000
Guido van Rossum79f25d91997-04-29 20:08:16 +00002001static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002002imp_load_dynamic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002003 PyObject *self;
2004 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002005{
2006 char *name;
2007 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002008 PyObject *fob = NULL;
2009 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002010 FILE *fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002011 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
2012 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002013 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002014 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002015 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002016 if (fp == NULL)
2017 return NULL;
2018 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002019 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002020 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002021}
2022
Guido van Rossum79f25d91997-04-29 20:08:16 +00002023static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002024imp_load_source(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002025 PyObject *self;
2026 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002027{
2028 char *name;
2029 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002030 PyObject *fob = NULL;
2031 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002032 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002033 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002034 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002035 return NULL;
2036 fp = get_file(pathname, fob, "r");
2037 if (fp == NULL)
2038 return NULL;
2039 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002040 if (fob == NULL)
2041 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002042 return m;
2043}
2044
Jack Jansen9c96a921995-02-15 22:57:06 +00002045#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002046static PyObject *
Jack Jansen9c96a921995-02-15 22:57:06 +00002047imp_load_resource(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002048 PyObject *self;
2049 PyObject *args;
Jack Jansen9c96a921995-02-15 22:57:06 +00002050{
2051 char *name;
2052 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002053 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002054
Guido van Rossum79f25d91997-04-29 20:08:16 +00002055 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002056 return NULL;
2057 m = PyMac_LoadResourceModule(name, pathname);
2058 return m;
2059}
2060#endif /* macintosh */
2061
Guido van Rossum79f25d91997-04-29 20:08:16 +00002062static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002063imp_load_module(self, args)
2064 PyObject *self;
2065 PyObject *args;
2066{
2067 char *name;
2068 PyObject *fob;
2069 char *pathname;
2070 char *suffix; /* Unused */
2071 char *mode;
2072 int type;
2073 FILE *fp;
2074
2075 if (!PyArg_ParseTuple(args, "sOs(ssi)",
2076 &name, &fob, &pathname,
2077 &suffix, &mode, &type))
2078 return NULL;
2079 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
2080 PyErr_Format(PyExc_ValueError,
2081 "invalid file open mode %.200s", mode);
2082 return NULL;
2083 }
2084 if (fob == Py_None)
2085 fp = NULL;
2086 else {
2087 if (!PyFile_Check(fob)) {
2088 PyErr_SetString(PyExc_ValueError,
2089 "load_module arg#2 should be a file or None");
2090 return NULL;
2091 }
2092 fp = get_file(pathname, fob, mode);
2093 if (fp == NULL)
2094 return NULL;
2095 }
2096 return load_module(name, fp, pathname, type);
2097}
2098
2099static PyObject *
2100imp_load_package(self, args)
2101 PyObject *self;
2102 PyObject *args;
2103{
2104 char *name;
2105 char *pathname;
2106 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
2107 return NULL;
2108 return load_package(name, pathname);
2109}
2110
2111static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002112imp_new_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002113 PyObject *self;
2114 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002115{
2116 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002117 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002118 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002119 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002120}
2121
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002122/* Doc strings */
2123
2124static char doc_imp[] = "\
2125This module provides the components needed to build your own\n\
2126__import__ function. Undocumented functions are obsolete.\n\
2127";
2128
2129static char doc_find_module[] = "\
2130find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
2131Search for a module. If path is omitted or None, search for a\n\
2132built-in, frozen or special module and continue search in sys.path.\n\
2133The module name cannot contain '.'; to search for a submodule of a\n\
2134package, pass the submodule name and the package's __path__.\
2135";
2136
2137static char doc_load_module[] = "\
2138load_module(name, file, filename, (suffix, mode, type)) -> module\n\
2139Load a module, given information returned by find_module().\n\
2140The module name must include the full package name, if any.\
2141";
2142
2143static char doc_get_magic[] = "\
2144get_magic() -> string\n\
2145Return the magic number for .pyc or .pyo files.\
2146";
2147
2148static char doc_get_suffixes[] = "\
2149get_suffixes() -> [(suffix, mode, type), ...]\n\
2150Return a list of (suffix, mode, type) tuples describing the files\n\
2151that find_module() looks for.\
2152";
2153
2154static char doc_new_module[] = "\
2155new_module(name) -> module\n\
2156Create a new module. Do not enter it in sys.modules.\n\
2157The module name must include the full package name, if any.\
2158";
2159
Guido van Rossum79f25d91997-04-29 20:08:16 +00002160static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002161 {"find_module", imp_find_module, 1, doc_find_module},
2162 {"get_magic", imp_get_magic, 1, doc_get_magic},
2163 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2164 {"load_module", imp_load_module, 1, doc_load_module},
2165 {"new_module", imp_new_module, 1, doc_new_module},
2166 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002167 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002168 {"init_builtin", imp_init_builtin, 1},
2169 {"init_frozen", imp_init_frozen, 1},
2170 {"is_builtin", imp_is_builtin, 1},
2171 {"is_frozen", imp_is_frozen, 1},
2172 {"load_compiled", imp_load_compiled, 1},
2173 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002174 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002175#ifdef macintosh
2176 {"load_resource", imp_load_resource, 1},
2177#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002178 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002179 {NULL, NULL} /* sentinel */
2180};
2181
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002182int
2183setint(d, name, value)
2184 PyObject *d;
2185 char *name;
2186 int value;
2187{
2188 PyObject *v;
2189 int err;
2190
2191 v = PyInt_FromLong((long)value);
2192 err = PyDict_SetItemString(d, name, v);
2193 Py_XDECREF(v);
2194 return err;
2195}
2196
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002197void
2198initimp()
2199{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002200 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002201
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002202 m = Py_InitModule4("imp", imp_methods, doc_imp,
2203 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002204 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002205
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002206 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2207 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2208 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2209 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2210 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2211 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2212 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2213 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002214
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002215 failure:
2216 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002217}