blob: fd92698d44a03eef0c7d172c3798b110c2ee5032 [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
116/* Helper for sys */
117
118PyObject *
119PyImport_GetModuleDict()
120{
121 PyInterpreterState *interp = PyThreadState_Get()->interp;
122 if (interp->modules == NULL)
123 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
124 return interp->modules;
125}
126
Guido van Rossum3f5da241990-12-20 15:06:42 +0000127
Guido van Rossum085d2691997-08-05 02:20:51 +0000128/* Helper for PyImport_Cleanup */
129
130static void
131clear_carefully(d)
132 PyObject *d;
133{
134 /* To make the execution order of destructors for global
135 objects a bit more predictable, we first zap all objects
136 whose name starts with a single underscore, before we clear
137 the entire dictionary. We zap them by replacing them with
138 None, rather than deleting them from the dictionary, to
139 avoid rehashing the dictionary (to some extent). */
140
141 int pos;
142 PyObject *key, *value;
143
Guido van Rossum758eec01998-01-19 21:58:26 +0000144 Py_INCREF(d); /* Prevent it from being deleted recursively */
145
146 /* First, clear only names starting with a single underscore */
Guido van Rossum085d2691997-08-05 02:20:51 +0000147 pos = 0;
148 while (PyDict_Next(d, &pos, &key, &value)) {
149 if (value != Py_None && PyString_Check(key)) {
150 char *s = PyString_AsString(key);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000151 if (s[0] == '_' && s[1] != '_') {
152 if (Py_VerboseFlag > 1)
153 fprintf(stderr, "# clear[1] %s\n", s);
Guido van Rossum085d2691997-08-05 02:20:51 +0000154 PyDict_SetItem(d, key, Py_None);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000155 }
Guido van Rossum085d2691997-08-05 02:20:51 +0000156 }
157 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000158
159 /* Next, clear all names except those starting with two underscores */
160 pos = 0;
161 while (PyDict_Next(d, &pos, &key, &value)) {
162 if (value != Py_None && PyString_Check(key)) {
163 char *s = PyString_AsString(key);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000164 if (s[0] != '_' || s[1] != '_') {
165 if (Py_VerboseFlag > 1)
166 fprintf(stderr, "# clear[2] %s\n", s);
Guido van Rossum758eec01998-01-19 21:58:26 +0000167 PyDict_SetItem(d, key, Py_None);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000168 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000169 }
170 }
171
172 PyDict_Clear(d); /* Finally, clear all names */
173
174 Py_DECREF(d); /* Match INCREF at top */
Guido van Rossum085d2691997-08-05 02:20:51 +0000175}
176
Guido van Rossum758eec01998-01-19 21:58:26 +0000177
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000178/* List of names to clear in sys */
179static char* sys_deletes[] = {
180 "exc_type", "exc_value", "exc_traceback",
181 "last_type", "last_value", "last_traceback",
182 NULL
183};
184
185
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000186/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000187
Guido van Rossum3f5da241990-12-20 15:06:42 +0000188void
Guido van Rossum79f25d91997-04-29 20:08:16 +0000189PyImport_Cleanup()
Guido van Rossum3f5da241990-12-20 15:06:42 +0000190{
Guido van Rossum758eec01998-01-19 21:58:26 +0000191 int pos, ndone;
192 char *name;
193 PyObject *key, *value, *dict;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000194 PyInterpreterState *interp = PyThreadState_Get()->interp;
Guido van Rossum758eec01998-01-19 21:58:26 +0000195 PyObject *modules = interp->modules;
196
197 if (modules == NULL)
198 return; /* Already done */
199
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000200 /* Delete some special variables first. These are common
201 places where user values hide and people complain when their
202 destructors fail. Since the modules containing them are
203 deleted *last* of all, they would come too late in the normal
204 destruction order. Sigh. */
205
206 value = PyDict_GetItemString(modules, "__builtin__");
207 if (value != NULL && PyModule_Check(value)) {
208 dict = PyModule_GetDict(value);
209 if (Py_VerboseFlag)
210 fprintf(stderr, "# clear __builtin__._\n");
211 PyDict_SetItemString(dict, "_", Py_None);
212 }
213 value = PyDict_GetItemString(modules, "sys");
214 if (value != NULL && PyModule_Check(value)) {
215 char **p;
216 dict = PyModule_GetDict(value);
217 for (p = sys_deletes; *p != NULL; p++) {
218 if (Py_VerboseFlag)
219 fprintf(stderr, "# clear sys.%s\n", *p);
220 PyDict_SetItemString(dict, *p, Py_None);
221 }
222 }
223
Guido van Rossum758eec01998-01-19 21:58:26 +0000224 /* The special treatment of __builtin__ here is because even
225 when it's not referenced as a module, its dictionary is
226 referenced by almost every module's __builtins__. Since
227 deleting a module clears its dictionary (even if there are
228 references left to it), we need to delete the __builtin__
229 module last. Likewise, we don't delete sys until the very
230 end because it is implicitly referenced (e.g. by print).
231
232 Also note that we 'delete' modules by replacing their entry
233 in the modules dict with None, rather than really deleting
234 them; this avoids a rehash of the modules dictionary and
235 also marks them as "non existent" so they won't be
236 re-imported. */
237
238 /* First, repeatedly delete modules with a reference count of
239 one (skipping __builtin__ and sys) and delete them */
240 do {
241 ndone = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000242 pos = 0;
Guido van Rossum758eec01998-01-19 21:58:26 +0000243 while (PyDict_Next(modules, &pos, &key, &value)) {
244 if (value->ob_refcnt != 1)
245 continue;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000246 if (PyModule_Check(value)) {
Guido van Rossum758eec01998-01-19 21:58:26 +0000247 name = PyString_AsString(key);
248 dict = PyModule_GetDict(value);
249 if (strcmp(name, "__builtin__") == 0)
250 continue;
251 if (strcmp(name, "sys") == 0)
252 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000253 if (Py_VerboseFlag)
254 fprintf(stderr,
255 "# cleanup[1] %s\n", name);
Guido van Rossum758eec01998-01-19 21:58:26 +0000256 clear_carefully(dict);
257 PyDict_SetItem(modules, key, Py_None);
258 ndone++;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000259 }
260 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000261 } while (ndone > 0);
262
263 /* Next, delete __main__ if it's still there */
264 value = PyDict_GetItemString(modules, "__main__");
265 if (value != NULL && PyModule_Check(value)) {
266 dict = PyModule_GetDict(value);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000267 if (Py_VerboseFlag)
268 fprintf(stderr, "# cleanup __main__\n");
Guido van Rossum758eec01998-01-19 21:58:26 +0000269 clear_carefully(dict);
270 PyDict_SetItemString(modules, "__main__", Py_None);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000271 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000272
273 /* Next, delete all modules (still skipping __builtin__ and sys) */
274 pos = 0;
275 while (PyDict_Next(modules, &pos, &key, &value)) {
276 if (PyModule_Check(value)) {
277 name = PyString_AsString(key);
278 dict = PyModule_GetDict(value);
279 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, "# cleanup[2] %s\n", name);
Guido van Rossum758eec01998-01-19 21:58:26 +0000285 clear_carefully(dict);
286 PyDict_SetItem(modules, key, Py_None);
287 }
288 }
289
290 /* Next, delete sys and __builtin__ (in that order) */
291 value = PyDict_GetItemString(modules, "sys");
292 if (value != NULL && PyModule_Check(value)) {
293 dict = PyModule_GetDict(value);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000294 if (Py_VerboseFlag)
295 fprintf(stderr, "# cleanup sys\n");
Guido van Rossum758eec01998-01-19 21:58:26 +0000296 clear_carefully(dict);
297 PyDict_SetItemString(modules, "sys", Py_None);
298 }
299 value = PyDict_GetItemString(modules, "__builtin__");
300 if (value != NULL && PyModule_Check(value)) {
301 dict = PyModule_GetDict(value);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000302 if (Py_VerboseFlag)
303 fprintf(stderr, "# cleanup __builtin__\n");
304 clear_carefully(dict); /* XXX Is this necessary? */
Guido van Rossum758eec01998-01-19 21:58:26 +0000305 PyDict_SetItemString(modules, "__builtin__", Py_None);
306 }
307
308 /* Finally, clear and delete the modules directory */
309 PyDict_Clear(modules);
310 interp->modules = NULL;
311 Py_DECREF(modules);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000312}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000313
314
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000315/* Helper for pythonrun.c -- return magic number */
316
317long
Guido van Rossum79f25d91997-04-29 20:08:16 +0000318PyImport_GetMagicNumber()
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000319{
320 return MAGIC;
321}
322
323
Guido van Rossum25ce5661997-08-02 03:10:38 +0000324/* Magic for extension modules (built-in as well as dynamically
325 loaded). To prevent initializing an extension module more than
326 once, we keep a static dictionary 'extensions' keyed by module name
327 (for built-in modules) or by filename (for dynamically loaded
328 modules), containing these modules. A copy od the module's
329 dictionary is stored by calling _PyImport_FixupExtension()
330 immediately after the module initialization function succeeds. A
331 copy can be retrieved from there by calling
332 _PyImport_FindExtension(). */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000333
Guido van Rossum79f25d91997-04-29 20:08:16 +0000334PyObject *
Guido van Rossum25ce5661997-08-02 03:10:38 +0000335_PyImport_FixupExtension(name, filename)
336 char *name;
337 char *filename;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000338{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000339 PyObject *modules, *mod, *dict, *copy;
340 if (extensions == NULL) {
341 extensions = PyDict_New();
342 if (extensions == NULL)
343 return NULL;
344 }
345 modules = PyImport_GetModuleDict();
346 mod = PyDict_GetItemString(modules, name);
347 if (mod == NULL || !PyModule_Check(mod)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000348 PyErr_Format(PyExc_SystemError,
349 "_PyImport_FixupExtension: module %.200s not loaded", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000350 return NULL;
351 }
352 dict = PyModule_GetDict(mod);
353 if (dict == NULL)
354 return NULL;
355 copy = PyObject_CallMethod(dict, "copy", "");
356 if (copy == NULL)
357 return NULL;
358 PyDict_SetItemString(extensions, filename, copy);
359 Py_DECREF(copy);
360 return copy;
361}
362
363PyObject *
364_PyImport_FindExtension(name, filename)
365 char *name;
366 char *filename;
367{
368 PyObject *dict, *mod, *mdict, *result;
369 if (extensions == NULL)
370 return NULL;
371 dict = PyDict_GetItemString(extensions, filename);
372 if (dict == NULL)
373 return NULL;
374 mod = PyImport_AddModule(name);
375 if (mod == NULL)
376 return NULL;
377 mdict = PyModule_GetDict(mod);
378 if (mdict == NULL)
379 return NULL;
380 result = PyObject_CallMethod(mdict, "update", "O", dict);
381 if (result == NULL)
382 return NULL;
383 Py_DECREF(result);
384 if (Py_VerboseFlag)
385 fprintf(stderr, "import %s # previously loaded (%s)\n",
386 name, filename);
387 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000388}
389
390
391/* Get the module object corresponding to a module name.
392 First check the modules dictionary if there's one there,
393 if not, create a new one and insert in in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000394 Because the former action is most common, THIS DOES NOT RETURN A
395 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000396
Guido van Rossum79f25d91997-04-29 20:08:16 +0000397PyObject *
398PyImport_AddModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000399 char *name;
400{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000401 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000402 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000403
Guido van Rossum25ce5661997-08-02 03:10:38 +0000404 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
Guido van Rossum79f25d91997-04-29 20:08:16 +0000405 PyModule_Check(m))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000406 return m;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000407 m = PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000408 if (m == NULL)
409 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000410 if (PyDict_SetItemString(modules, name, m) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000411 Py_DECREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000412 return NULL;
413 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000414 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000415
416 return m;
417}
418
419
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000420/* Execute a code object in a module and return the module object
421 WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000422
Guido van Rossum79f25d91997-04-29 20:08:16 +0000423PyObject *
424PyImport_ExecCodeModule(name, co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000425 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000426 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000427{
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000428 return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
429}
430
431PyObject *
432PyImport_ExecCodeModuleEx(name, co, pathname)
433 char *name;
434 PyObject *co;
435 char *pathname;
436{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000437 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000438 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000439
Guido van Rossum79f25d91997-04-29 20:08:16 +0000440 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000441 if (m == NULL)
442 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000443 d = PyModule_GetDict(m);
444 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
445 if (PyDict_SetItemString(d, "__builtins__",
446 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000447 return NULL;
448 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000449 /* Remember the filename as the __file__ attribute */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000450 v = NULL;
451 if (pathname != NULL) {
452 v = PyString_FromString(pathname);
453 if (v == NULL)
454 PyErr_Clear();
455 }
456 if (v == NULL) {
457 v = ((PyCodeObject *)co)->co_filename;
458 Py_INCREF(v);
459 }
460 if (PyDict_SetItemString(d, "__file__", v) != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000461 PyErr_Clear(); /* Not important enough to report */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000462 Py_DECREF(v);
463
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000464 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000465 if (v == NULL)
466 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000467 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000468
Guido van Rossum25ce5661997-08-02 03:10:38 +0000469 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000470 PyErr_Format(PyExc_ImportError,
471 "Loaded module %.200s not found in sys.modules",
472 name);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000473 return NULL;
474 }
475
Guido van Rossum79f25d91997-04-29 20:08:16 +0000476 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000477
478 return m;
479}
480
481
482/* Given a pathname for a Python source file, fill a buffer with the
483 pathname for the corresponding compiled file. Return the pathname
484 for the compiled file, or NULL if there's no space in the buffer.
485 Doesn't set an exception. */
486
487static char *
488make_compiled_pathname(pathname, buf, buflen)
489 char *pathname;
490 char *buf;
491 int buflen;
492{
493 int len;
494
495 len = strlen(pathname);
496 if (len+2 > buflen)
497 return NULL;
498 strcpy(buf, pathname);
Guido van Rossum0824f631997-03-11 18:37:35 +0000499 strcpy(buf+len, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000500
501 return buf;
502}
503
504
505/* Given a pathname for a Python source file, its time of last
506 modification, and a pathname for a compiled file, check whether the
507 compiled file represents the same version of the source. If so,
508 return a FILE pointer for the compiled file, positioned just after
509 the header; if not, return NULL.
510 Doesn't set an exception. */
511
512static FILE *
513check_compiled_module(pathname, mtime, cpathname)
514 char *pathname;
515 long mtime;
516 char *cpathname;
517{
518 FILE *fp;
519 long magic;
520 long pyc_mtime;
521
522 fp = fopen(cpathname, "rb");
523 if (fp == NULL)
524 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000525 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000526 if (magic != MAGIC) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000527 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000528 fprintf(stderr, "# %s has bad magic\n", cpathname);
529 fclose(fp);
530 return NULL;
531 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000532 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000533 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000534 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000535 fprintf(stderr, "# %s has bad mtime\n", cpathname);
536 fclose(fp);
537 return NULL;
538 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000539 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000540 fprintf(stderr, "# %s matches %s\n", cpathname, pathname);
541 return fp;
542}
543
544
545/* Read a code object from a file and check it for validity */
546
Guido van Rossum79f25d91997-04-29 20:08:16 +0000547static PyCodeObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000548read_compiled_module(cpathname, fp)
549 char *cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000550 FILE *fp;
551{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000552 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000553
Guido van Rossum79f25d91997-04-29 20:08:16 +0000554 co = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000555 /* Ugly: rd_object() may return NULL with or without error */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000556 if (co == NULL || !PyCode_Check(co)) {
557 if (!PyErr_Occurred())
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000558 PyErr_Format(PyExc_ImportError,
559 "Non-code object in %.200s", cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000560 Py_XDECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000561 return NULL;
562 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000563 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000564}
565
566
567/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000568 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000569
Guido van Rossum79f25d91997-04-29 20:08:16 +0000570static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000571load_compiled_module(name, cpathname, fp)
572 char *name;
573 char *cpathname;
574 FILE *fp;
575{
576 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000577 PyCodeObject *co;
578 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000579
Guido van Rossum79f25d91997-04-29 20:08:16 +0000580 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000581 if (magic != MAGIC) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000582 PyErr_Format(PyExc_ImportError,
583 "Bad magic number in %.200s", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000584 return NULL;
585 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000586 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000587 co = read_compiled_module(cpathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000588 if (co == NULL)
589 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000590 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000591 fprintf(stderr, "import %s # precompiled from %s\n",
592 name, cpathname);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000593 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000594 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000595
596 return m;
597}
598
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000599/* Parse a source file and return the corresponding code object */
600
Guido van Rossum79f25d91997-04-29 20:08:16 +0000601static PyCodeObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000602parse_source_module(pathname, fp)
603 char *pathname;
604 FILE *fp;
605{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000606 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000607 node *n;
608
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000609 n = PyParser_SimpleParseFile(fp, pathname, Py_file_input);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000610 if (n == NULL)
611 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000612 co = PyNode_Compile(n, pathname);
613 PyNode_Free(n);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000614
615 return co;
616}
617
618
619/* Write a compiled module to a file, placing the time of last
620 modification of its source into the header.
621 Errors are ignored, if a write error occurs an attempt is made to
622 remove the file. */
623
624static void
625write_compiled_module(co, cpathname, mtime)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000626 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000627 char *cpathname;
628 long mtime;
629{
630 FILE *fp;
631
632 fp = fopen(cpathname, "wb");
633 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000634 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000635 fprintf(stderr,
636 "# can't create %s\n", cpathname);
637 return;
638 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000639 PyMarshal_WriteLongToFile(MAGIC, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000640 /* First write a 0 for mtime */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000641 PyMarshal_WriteLongToFile(0L, fp);
642 PyMarshal_WriteObjectToFile((PyObject *)co, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000643 if (ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000644 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000645 fprintf(stderr, "# can't write %s\n", cpathname);
646 /* Don't keep partial file */
647 fclose(fp);
648 (void) unlink(cpathname);
649 return;
650 }
651 /* Now write the true mtime */
652 fseek(fp, 4L, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000653 PyMarshal_WriteLongToFile(mtime, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000654 fflush(fp);
655 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000656 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000657 fprintf(stderr, "# wrote %s\n", cpathname);
658#ifdef macintosh
Guido van Rossumbe1a6e21996-02-21 15:29:20 +0000659 setfiletype(cpathname, 'Pyth', 'PYC ');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000660#endif
661}
662
663
664/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000665 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
666 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000667
Guido van Rossum79f25d91997-04-29 20:08:16 +0000668static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000669load_source_module(name, pathname, fp)
670 char *name;
671 char *pathname;
672 FILE *fp;
673{
674 long mtime;
675 FILE *fpc;
676 char buf[MAXPATHLEN+1];
677 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000678 PyCodeObject *co;
679 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000680
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000681 mtime = PyOS_GetLastModificationTime(pathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000682 cpathname = make_compiled_pathname(pathname, buf, MAXPATHLEN+1);
683 if (cpathname != NULL &&
684 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000685 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000686 fclose(fpc);
687 if (co == NULL)
688 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000689 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000690 fprintf(stderr, "import %s # precompiled from %s\n",
691 name, cpathname);
692 }
693 else {
694 co = parse_source_module(pathname, fp);
695 if (co == NULL)
696 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000697 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000698 fprintf(stderr, "import %s # from %s\n",
699 name, pathname);
700 write_compiled_module(co, cpathname, mtime);
701 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000702 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000703 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000704
705 return m;
706}
707
708
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000709/* Forward */
710static PyObject *load_module Py_PROTO((char *, FILE *, char *, int));
711static struct filedescr *find_module Py_PROTO((char *, PyObject *,
712 char *, int, FILE **));
Guido van Rossuma86f77d1997-09-09 18:53:47 +0000713static struct _frozen *find_frozen Py_PROTO((char *name));
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000714
715/* Load a package and return its module object WITH INCREMENTED
716 REFERENCE COUNT */
717
718static PyObject *
719load_package(name, pathname)
720 char *name;
721 char *pathname;
722{
723 PyObject *m, *d, *file, *path;
724 int err;
725 char buf[MAXPATHLEN+1];
726 FILE *fp = NULL;
727 struct filedescr *fdp;
728
729 m = PyImport_AddModule(name);
730 if (m == NULL)
731 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000732 if (Py_VerboseFlag)
733 fprintf(stderr, "import %s # directory %s\n",
734 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000735 d = PyModule_GetDict(m);
736 file = PyString_FromString(pathname);
737 if (file == NULL)
738 return NULL;
739 path = Py_BuildValue("[O]", file);
740 if (path == NULL) {
741 Py_DECREF(file);
742 return NULL;
743 }
744 err = PyDict_SetItemString(d, "__file__", file);
745 if (err == 0)
746 err = PyDict_SetItemString(d, "__path__", path);
747 if (err != 0) {
748 m = NULL;
749 goto cleanup;
750 }
751 buf[0] = '\0';
752 fdp = find_module("__init__", path, buf, sizeof(buf), &fp);
753 if (fdp == NULL) {
754 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
755 PyErr_Clear();
756 }
757 else
758 m = NULL;
759 goto cleanup;
760 }
761 m = load_module(name, fp, buf, fdp->type);
762 if (fp != NULL)
763 fclose(fp);
764 cleanup:
765 Py_XINCREF(m);
766 Py_XDECREF(path);
767 Py_XDECREF(file);
768 return m;
769}
770
771
772/* Helper to test for built-in module */
773
774static int
775is_builtin(name)
776 char *name;
777{
778 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +0000779 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
780 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
781 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000782 return -1;
783 else
784 return 1;
785 }
786 }
787 return 0;
788}
789
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000790
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000791/* Search the path (default sys.path) for a module. Return the
792 corresponding filedescr struct, and (via return arguments) the
793 pathname and an open file. Return NULL if the module is not found. */
794
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000795#ifdef MS_COREDLL
796extern FILE *PyWin_FindRegisteredModule();
797#endif
798
Guido van Rossum0980bd91998-02-13 17:18:36 +0000799#ifdef CHECK_IMPORT_CASE
800static int check_case(char *, int, int, char *);
801#endif
802
Guido van Rossum197346f1997-10-31 18:38:52 +0000803static int find_init_module Py_PROTO((char *)); /* Forward */
804
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000805static struct filedescr *
806find_module(name, path, buf, buflen, p_fp)
807 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000808 PyObject *path;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000809 /* Output parameters: */
810 char *buf;
811 int buflen;
812 FILE **p_fp;
813{
814 int i, npath, len, namelen;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000815 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000816 FILE *fp = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000817 struct stat statbuf;
818
819 if (path == NULL) {
820 if (is_builtin(name)) {
821 static struct filedescr fd = {"", "", C_BUILTIN};
822 return &fd;
823 }
Guido van Rossuma86f77d1997-09-09 18:53:47 +0000824 if (find_frozen(name) != NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000825 static struct filedescr fd = {"", "", PY_FROZEN};
826 return &fd;
827 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000828
Guido van Rossumac279101996-08-22 23:10:58 +0000829#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000830 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
831 if (fp != NULL) {
832 *p_fp = fp;
833 return fdp;
834 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000835#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000836 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000837
838
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000839 if (path == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000840 path = PySys_GetObject("path");
841 if (path == NULL || !PyList_Check(path)) {
842 PyErr_SetString(PyExc_ImportError,
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000843 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000844 return NULL;
845 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000846 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000847 namelen = strlen(name);
848 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000849 PyObject *v = PyList_GetItem(path, i);
850 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000851 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000852 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000853 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000854 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000855 strcpy(buf, PyString_AsString(v));
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000856 if ((int)strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000857 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000858#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000859#ifdef INTERN_STRINGS
860 /*
861 ** Speedup: each sys.path item is interned, and
862 ** FindResourceModule remembers which items refer to
863 ** folders (so we don't have to bother trying to look
864 ** into them for resources).
865 */
866 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
867 v = PyList_GET_ITEM(path, i);
868#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000869 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000870 static struct filedescr resfiledescr =
871 {"", "", PY_RESOURCE};
Jack Jansen9c96a921995-02-15 22:57:06 +0000872
873 return &resfiledescr;
874 }
875#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000876 if (len > 0 && buf[len-1] != SEP
877#ifdef ALTSEP
878 && buf[len-1] != ALTSEP
879#endif
880 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000881 buf[len++] = SEP;
Guido van Rossum40f470f1996-05-23 22:51:04 +0000882#ifdef IMPORT_8x3_NAMES
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000883 /* see if we are searching in directory dos-8x3 */
884 if (len > 7 && !strncmp(buf + len - 8, "dos-8x3", 7)){
Guido van Rossum40f470f1996-05-23 22:51:04 +0000885 int j;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000886 char ch; /* limit name to 8 lower-case characters */
Guido van Rossum40f470f1996-05-23 22:51:04 +0000887 for (j = 0; (ch = name[j]) && j < 8; j++)
888 if (isupper(ch))
889 buf[len++] = tolower(ch);
890 else
891 buf[len++] = ch;
892 }
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000893 else /* Not in dos-8x3, use the full name */
Guido van Rossum6f489d91996-06-28 20:15:15 +0000894#endif
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000895 {
Guido van Rossum40f470f1996-05-23 22:51:04 +0000896 strcpy(buf+len, name);
897 len += namelen;
898 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000899#ifdef HAVE_STAT
900 if (stat(buf, &statbuf) == 0) {
901 static struct filedescr fd = {"", "", PKG_DIRECTORY};
Guido van Rossum197346f1997-10-31 18:38:52 +0000902 if (S_ISDIR(statbuf.st_mode)) {
Guido van Rossum0980bd91998-02-13 17:18:36 +0000903 if (find_init_module(buf)) {
904#ifdef CHECK_IMPORT_CASE
905 if (!check_case(buf, len, namelen,
906 name))
907 return NULL;
908#endif
Guido van Rossum197346f1997-10-31 18:38:52 +0000909 return &fd;
Guido van Rossum0980bd91998-02-13 17:18:36 +0000910 }
Guido van Rossum197346f1997-10-31 18:38:52 +0000911 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000912 }
913#else
914 /* XXX How are you going to test for directories? */
915#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000916#ifdef macintosh
917 fdp = PyMac_FindModuleExtension(buf, &len, name);
918 if (fdp)
919 fp = fopen(buf, fdp->mode);
920#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000921 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000922 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000923 if (Py_VerboseFlag > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000924 fprintf(stderr, "# trying %s\n", buf);
925 fp = fopen(buf, fdp->mode);
926 if (fp != NULL)
927 break;
928 }
Guido van Rossum741689d1997-08-12 14:53:39 +0000929#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000930 if (fp != NULL)
931 break;
932 }
933 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000934 PyErr_Format(PyExc_ImportError,
935 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000936 return NULL;
937 }
Guido van Rossum0980bd91998-02-13 17:18:36 +0000938#ifdef CHECK_IMPORT_CASE
939 if (!check_case(buf, len, namelen, name)) {
940 fclose(fp);
941 return NULL;
942 }
943#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000944
945 *p_fp = fp;
946 return fdp;
947}
948
Guido van Rossum0980bd91998-02-13 17:18:36 +0000949#ifdef CHECK_IMPORT_CASE
950
951#ifdef MS_WIN32
952#include <windows.h>
953static int
954check_case(char *buf, int len, int namelen, char *name)
955{
956 WIN32_FIND_DATA data;
957 HANDLE h;
958 if (getenv("PYTHONCASEOK") != NULL)
959 return 1;
960 h = FindFirstFile(buf, &data);
961 if (h == INVALID_HANDLE_VALUE) {
962 PyErr_Format(PyExc_NameError,
963 "Can't find file for module %.100s\n(filename %.300s)",
964 name, buf);
965 return 0;
966 }
967 FindClose(h);
968 if (strncmp(data.cFileName, name, namelen) != 0) {
969 strcpy(buf+len-namelen, data.cFileName);
970 PyErr_Format(PyExc_NameError,
971 "Case mismatch for module name %.100s\n(filename %.300s)",
972 name, buf);
973 return 0;
974 }
975 return 1;
976}
977#endif /* MS_WIN32 */
978
979#ifdef macintosh
980#include <TextUtils.h>
981static int
982check_case(char *buf, int len, int namelen, char *name)
983{
984 FSSpec fss;
985 OSErr err;
986 unsigned char mybuf[MAXPATHLEN+1];
987
988 strcpy((char *)mybuf, buf);
989 c2pstr((char *)mybuf);
990 err = FSMakeFSSpec(0, 0, mybuf, &fss);
991 if (err) {
992 PyErr_Format(PyExc_NameError,
993 "Can't find file for module %.100s\n(filename %.300s)",
994 name, buf);
995 return 0;
996 }
997 p2cstr(fss.name);
998 if ( strncmp(name, (char *)fss.name, namelen) != 0 ) {
999 PyErr_Format(PyExc_NameError,
1000 "Case mismatch for module name %.100s\n(filename %.300s)",
1001 name, fss.name);
1002 return 0;
1003 }
1004 return 1;
1005}
1006#endif /* macintosh */
1007
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001008#ifdef DJGPP
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001009#include <dir.h>
1010
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001011static int
1012check_case(char *buf, int len, int namelen, char *name)
1013{
1014 struct ffblk ffblk;
1015 int done;
1016
1017 if (getenv("PYTHONCASEOK") != NULL)
1018 return 1;
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001019 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001020 if (done) {
1021 PyErr_Format(PyExc_NameError,
1022 "Can't find file for module %.100s\n(filename %.300s)",
1023 name, buf);
1024 return 0;
1025 }
1026
1027 if (strncmp(ffblk.ff_name, name, namelen) != 0) {
1028 strcpy(buf+len-namelen, ffblk.ff_name);
1029 PyErr_Format(PyExc_NameError,
1030 "Case mismatch for module name %.100s\n(filename %.300s)",
1031 name, buf);
1032 return 0;
1033 }
1034 return 1;
1035}
1036#endif
1037
Guido van Rossum0980bd91998-02-13 17:18:36 +00001038#endif CHECK_IMPORT_CASE
1039
Guido van Rossum197346f1997-10-31 18:38:52 +00001040#ifdef HAVE_STAT
1041/* Helper to look for __init__.py or __init__.py[co] in potential package */
1042static int
1043find_init_module(buf)
1044 char *buf;
1045{
1046 int save_len = strlen(buf);
1047 int i = save_len;
1048 struct stat statbuf;
1049
1050 if (save_len + 13 >= MAXPATHLEN)
1051 return 0;
1052 buf[i++] = SEP;
1053 strcpy(buf+i, "__init__.py");
1054 if (stat(buf, &statbuf) == 0) {
1055 buf[save_len] = '\0';
1056 return 1;
1057 }
1058 i += strlen(buf+i);
1059 if (Py_OptimizeFlag)
1060 strcpy(buf+i, "o");
1061 else
1062 strcpy(buf+i, "c");
1063 if (stat(buf, &statbuf) == 0) {
1064 buf[save_len] = '\0';
1065 return 1;
1066 }
1067 buf[save_len] = '\0';
1068 return 0;
1069}
1070#endif /* HAVE_STAT */
1071
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001072
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001073static int init_builtin Py_PROTO((char *)); /* Forward */
1074
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001075/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001076 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001077
Guido van Rossum79f25d91997-04-29 20:08:16 +00001078static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001079load_module(name, fp, buf, type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001080 char *name;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001081 FILE *fp;
1082 char *buf;
1083 int type;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001084{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001085 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001086 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001087 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001088
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001089 /* First check that there's an open file (if we need one) */
1090 switch (type) {
1091 case PY_SOURCE:
1092 case PY_COMPILED:
1093 if (fp == NULL) {
1094 PyErr_Format(PyExc_ValueError,
1095 "file object required for import (type code %d)",
1096 type);
1097 return NULL;
1098 }
1099 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001100
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001101 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001102
1103 case PY_SOURCE:
1104 m = load_source_module(name, buf, fp);
1105 break;
1106
1107 case PY_COMPILED:
1108 m = load_compiled_module(name, buf, fp);
1109 break;
1110
1111 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001112 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001113 break;
1114
Jack Jansen9c96a921995-02-15 22:57:06 +00001115#ifdef macintosh
1116 case PY_RESOURCE:
1117 m = PyMac_LoadResourceModule(name, buf);
1118 break;
1119#endif
1120
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001121 case PKG_DIRECTORY:
1122 m = load_package(name, buf);
1123 break;
1124
1125 case C_BUILTIN:
1126 case PY_FROZEN:
1127 if (type == C_BUILTIN)
1128 err = init_builtin(name);
1129 else
1130 err = PyImport_ImportFrozenModule(name);
1131 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001132 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001133 if (err == 0) {
1134 PyErr_Format(PyExc_ImportError,
1135 "Purported %s module %.200s not found",
1136 type == C_BUILTIN ?
1137 "builtin" : "frozen",
1138 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001139 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001140 }
1141 modules = PyImport_GetModuleDict();
1142 m = PyDict_GetItemString(modules, name);
1143 if (m == NULL) {
1144 PyErr_Format(
1145 PyExc_ImportError,
1146 "%s module %.200s not properly initialized",
1147 type == C_BUILTIN ?
1148 "builtin" : "frozen",
1149 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001150 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001151 }
1152 Py_INCREF(m);
1153 break;
1154
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001155 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001156 PyErr_Format(PyExc_ImportError,
1157 "Don't know how to import %.200s (type code %d)",
1158 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001159 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001160
1161 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001162
1163 return m;
1164}
1165
1166
1167/* Initialize a built-in module.
1168 Return 1 for succes, 0 if the module is not found, and -1 with
1169 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001170
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001171static int
1172init_builtin(name)
1173 char *name;
1174{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001175 struct _inittab *p;
1176 PyObject *mod;
1177
1178 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
1179 return 1;
1180
Guido van Rossum771c6c81997-10-31 18:37:24 +00001181 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001182 if (strcmp(name, p->name) == 0) {
1183 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001184 PyErr_Format(PyExc_ImportError,
1185 "Cannot re-init internal module %.200s",
1186 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001187 return -1;
1188 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001189 if (Py_VerboseFlag)
Guido van Rossum25ce5661997-08-02 03:10:38 +00001190 fprintf(stderr, "import %s # builtin\n", name);
1191 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001192 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001193 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001194 if (_PyImport_FixupExtension(name, name) == NULL)
1195 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001196 return 1;
1197 }
1198 }
1199 return 0;
1200}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001201
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001202
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001203/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001204
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001205static struct _frozen *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001206find_frozen(name)
1207 char *name;
1208{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001209 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001210
Guido van Rossum79f25d91997-04-29 20:08:16 +00001211 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001212 if (p->name == NULL)
1213 return NULL;
1214 if (strcmp(p->name, name) == 0)
1215 break;
1216 }
1217 return p;
1218}
1219
Guido van Rossum79f25d91997-04-29 20:08:16 +00001220static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001221get_frozen_object(name)
1222 char *name;
1223{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001224 struct _frozen *p = find_frozen(name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001225
1226 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001227 PyErr_Format(PyExc_ImportError,
1228 "No such frozen object named %.200s",
1229 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001230 return NULL;
1231 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001232 return PyMarshal_ReadObjectFromString((char *)p->code, p->size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001233}
1234
1235/* Initialize a frozen module.
1236 Return 1 for succes, 0 if the module is not found, and -1 with
1237 an exception set if the initialization failed.
1238 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001239
1240int
Guido van Rossum79f25d91997-04-29 20:08:16 +00001241PyImport_ImportFrozenModule(name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001242 char *name;
1243{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001244 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001245 PyObject *co;
1246 PyObject *m;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001247
1248 if (p == NULL)
1249 return 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001250 if (Py_VerboseFlag)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001251 fprintf(stderr, "import %s # frozen\n", name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001252 co = PyMarshal_ReadObjectFromString((char *)p->code, p->size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001253 if (co == NULL)
1254 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001255 if (!PyCode_Check(co)) {
1256 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001257 PyErr_Format(PyExc_TypeError,
1258 "frozen object %.200s is not a code object",
1259 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001260 return -1;
1261 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001262 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001263 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001264 if (m == NULL)
1265 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001266 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001267 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001268}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001269
1270
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001271/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001272 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001273
Guido van Rossum79f25d91997-04-29 20:08:16 +00001274PyObject *
1275PyImport_ImportModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001276 char *name;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001277{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001278 static PyObject *fromlist = NULL;
1279 if (fromlist == NULL && strchr(name, '.') != NULL) {
1280 fromlist = Py_BuildValue("[s]", "*");
1281 if (fromlist == NULL)
1282 return NULL;
1283 }
1284 return PyImport_ImportModuleEx(name, NULL, NULL, fromlist);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001285}
1286
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001287/* Forward declarations for helper routines */
1288static PyObject *get_parent Py_PROTO((PyObject *globals,
1289 char *buf, int *p_buflen));
1290static PyObject *load_next Py_PROTO((PyObject *mod, PyObject *altmod,
1291 char **p_name, char *buf, int *p_buflen));
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001292static int mark_miss Py_PROTO((char *name));
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001293static int ensure_fromlist Py_PROTO((PyObject *mod, PyObject *fromlist,
Guido van Rossum9905ef91997-09-08 16:07:11 +00001294 char *buf, int buflen, int recursive));
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001295static PyObject * import_submodule Py_PROTO((PyObject *mod,
1296 char *name, char *fullname));
1297
1298/* The Magnum Opus of dotted-name import :-) */
1299
1300/* XXX TO DO:
1301 - Remember misses in package directories so package submodules
1302 that all import the same toplevel module don't keep hitting on the
1303 package directory first
1304*/
1305
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001306PyObject *
1307PyImport_ImportModuleEx(name, globals, locals, fromlist)
1308 char *name;
1309 PyObject *globals;
1310 PyObject *locals;
1311 PyObject *fromlist;
1312{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001313 char buf[MAXPATHLEN+1];
1314 int buflen = 0;
1315 PyObject *parent, *head, *next, *tail;
1316
1317 parent = get_parent(globals, buf, &buflen);
1318 if (parent == NULL)
1319 return NULL;
1320
1321 head = load_next(parent, Py_None, &name, buf, &buflen);
1322 if (head == NULL)
1323 return NULL;
1324
1325 tail = head;
1326 Py_INCREF(tail);
1327 while (name) {
1328 next = load_next(tail, tail, &name, buf, &buflen);
1329 Py_DECREF(tail);
1330 if (next == NULL) {
1331 Py_DECREF(head);
1332 return NULL;
1333 }
1334 tail = next;
1335 }
1336
1337 if (fromlist != NULL) {
1338 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1339 fromlist = NULL;
1340 }
1341
1342 if (fromlist == NULL) {
1343 Py_DECREF(tail);
1344 return head;
1345 }
1346
1347 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001348 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001349 Py_DECREF(tail);
1350 return NULL;
1351 }
1352
1353 return tail;
1354}
1355
1356static PyObject *
1357get_parent(globals, buf, p_buflen)
1358 PyObject *globals;
1359 char *buf;
1360 int *p_buflen;
1361{
1362 static PyObject *namestr = NULL;
1363 static PyObject *pathstr = NULL;
1364 PyObject *modname, *modpath, *modules, *parent;
1365
1366 if (globals == NULL || !PyDict_Check(globals))
1367 return Py_None;
1368
1369 if (namestr == NULL) {
1370 namestr = PyString_InternFromString("__name__");
1371 if (namestr == NULL)
1372 return NULL;
1373 }
1374 if (pathstr == NULL) {
1375 pathstr = PyString_InternFromString("__path__");
1376 if (pathstr == NULL)
1377 return NULL;
1378 }
1379
1380 *buf = '\0';
1381 *p_buflen = 0;
1382 modname = PyDict_GetItem(globals, namestr);
1383 if (modname == NULL || !PyString_Check(modname))
1384 return Py_None;
1385
1386 modpath = PyDict_GetItem(globals, pathstr);
1387 if (modpath != NULL) {
1388 int len = PyString_GET_SIZE(modname);
1389 if (len > MAXPATHLEN) {
1390 PyErr_SetString(PyExc_ValueError,
1391 "Module name too long");
1392 return NULL;
1393 }
1394 strcpy(buf, PyString_AS_STRING(modname));
1395 *p_buflen = len;
1396 }
1397 else {
1398 char *start = PyString_AS_STRING(modname);
1399 char *lastdot = strrchr(start, '.');
1400 int len;
1401 if (lastdot == NULL)
1402 return Py_None;
1403 len = lastdot - start;
1404 if (len >= MAXPATHLEN) {
1405 PyErr_SetString(PyExc_ValueError,
1406 "Module name too long");
1407 return NULL;
1408 }
1409 strncpy(buf, start, len);
1410 buf[len] = '\0';
1411 *p_buflen = len;
1412 }
1413
1414 modules = PyImport_GetModuleDict();
1415 parent = PyDict_GetItemString(modules, buf);
1416 if (parent == NULL)
1417 parent = Py_None;
1418 return parent;
1419 /* We expect, but can't guarantee, if parent != None, that:
1420 - parent.__name__ == buf
1421 - parent.__dict__ is globals
1422 If this is violated... Who cares? */
1423}
1424
1425static PyObject *
1426load_next(mod, altmod, p_name, buf, p_buflen)
1427 PyObject *mod;
1428 PyObject *altmod; /* Either None or same as mod */
1429 char **p_name;
1430 char *buf;
1431 int *p_buflen;
1432{
1433 char *name = *p_name;
1434 char *dot = strchr(name, '.');
1435 int len;
1436 char *p;
1437 PyObject *result;
1438
1439 if (dot == NULL) {
1440 *p_name = NULL;
1441 len = strlen(name);
1442 }
1443 else {
1444 *p_name = dot+1;
1445 len = dot-name;
1446 }
1447
1448 p = buf + *p_buflen;
1449 if (p != buf)
1450 *p++ = '.';
1451 if (p+len-buf >= MAXPATHLEN) {
1452 PyErr_SetString(PyExc_ValueError,
1453 "Module name too long");
1454 return NULL;
1455 }
1456 strncpy(p, name, len);
1457 p[len] = '\0';
1458 *p_buflen = p+len-buf;
1459
1460 result = import_submodule(mod, p, buf);
1461 if (result == Py_None && altmod != mod) {
1462 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001463 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001464 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001465 if (result != NULL && result != Py_None) {
1466 if (mark_miss(buf) != 0) {
1467 Py_DECREF(result);
1468 return NULL;
1469 }
1470 strncpy(buf, name, len);
1471 buf[len] = '\0';
1472 *p_buflen = len;
1473 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001474 }
1475 if (result == NULL)
1476 return NULL;
1477
1478 if (result == Py_None) {
1479 Py_DECREF(result);
1480 PyErr_Format(PyExc_ImportError,
1481 "No module named %.200s", name);
1482 return NULL;
1483 }
1484
1485 return result;
1486}
1487
1488static int
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001489mark_miss(name)
1490 char *name;
1491{
1492 PyObject *modules = PyImport_GetModuleDict();
1493 return PyDict_SetItemString(modules, name, Py_None);
1494}
1495
1496static int
Guido van Rossum9905ef91997-09-08 16:07:11 +00001497ensure_fromlist(mod, fromlist, buf, buflen, recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001498 PyObject *mod;
1499 PyObject *fromlist;
1500 char *buf;
1501 int buflen;
Guido van Rossum9905ef91997-09-08 16:07:11 +00001502 int recursive;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001503{
1504 int i;
1505
1506 if (!PyObject_HasAttrString(mod, "__path__"))
1507 return 1;
1508
1509 for (i = 0; ; i++) {
1510 PyObject *item = PySequence_GetItem(fromlist, i);
1511 int hasit;
1512 if (item == NULL) {
1513 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1514 PyErr_Clear();
1515 return 1;
1516 }
1517 return 0;
1518 }
1519 if (!PyString_Check(item)) {
1520 PyErr_SetString(PyExc_TypeError,
1521 "Item in ``from list'' not a string");
1522 Py_DECREF(item);
1523 return 0;
1524 }
1525 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001526 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001527 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001528 /* See if the package defines __all__ */
1529 if (recursive)
1530 continue; /* Avoid endless recursion */
1531 all = PyObject_GetAttrString(mod, "__all__");
1532 if (all == NULL)
1533 PyErr_Clear();
1534 else {
1535 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1536 return 0;
1537 Py_DECREF(all);
1538 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001539 continue;
1540 }
1541 hasit = PyObject_HasAttr(mod, item);
1542 if (!hasit) {
1543 char *subname = PyString_AS_STRING(item);
1544 PyObject *submod;
1545 char *p;
1546 if (buflen + strlen(subname) >= MAXPATHLEN) {
1547 PyErr_SetString(PyExc_ValueError,
1548 "Module name too long");
1549 Py_DECREF(item);
1550 return 0;
1551 }
1552 p = buf + buflen;
1553 *p++ = '.';
1554 strcpy(p, subname);
1555 submod = import_submodule(mod, subname, buf);
1556 Py_XDECREF(submod);
1557 if (submod == NULL) {
1558 Py_DECREF(item);
1559 return 0;
1560 }
1561 }
1562 Py_DECREF(item);
1563 }
1564
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001565 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001566}
1567
1568static PyObject *
1569import_submodule(mod, subname, fullname)
1570 PyObject *mod; /* May be None */
1571 char *subname;
1572 char *fullname;
1573{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001574 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001575 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001576
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001577 /* Require:
1578 if mod == None: subname == fullname
1579 else: mod.__name__ + "." + subname == fullname
1580 */
1581
1582 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001583 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001584 }
1585 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001586 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001587 char buf[MAXPATHLEN+1];
1588 struct filedescr *fdp;
1589 FILE *fp = NULL;
1590
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001591 path = PyObject_GetAttrString(mod, "__path__");
1592 if (path == NULL)
1593 PyErr_Clear();
1594
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001595 buf[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001596 fdp = find_module(subname, path,
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001597 buf, MAXPATHLEN+1, &fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001598 if (fdp == NULL) {
1599 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1600 return NULL;
1601 PyErr_Clear();
1602 Py_INCREF(Py_None);
1603 return Py_None;
1604 }
1605 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001606 if (fp)
1607 fclose(fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001608 if (m != NULL && mod != Py_None) {
1609 if (PyObject_SetAttrString(mod, subname, m) < 0) {
1610 Py_DECREF(m);
1611 m = NULL;
1612 }
1613 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001614 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001615
1616 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001617}
1618
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001619
1620/* Re-import a module of any kind and return its module object, WITH
1621 INCREMENTED REFERENCE COUNT */
1622
Guido van Rossum79f25d91997-04-29 20:08:16 +00001623PyObject *
1624PyImport_ReloadModule(m)
1625 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001626{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001627 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001628 PyObject *path = NULL;
1629 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001630 char buf[MAXPATHLEN+1];
1631 struct filedescr *fdp;
1632 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001633
Guido van Rossum79f25d91997-04-29 20:08:16 +00001634 if (m == NULL || !PyModule_Check(m)) {
1635 PyErr_SetString(PyExc_TypeError,
1636 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001637 return NULL;
1638 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001639 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001640 if (name == NULL)
1641 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001642 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001643 PyErr_Format(PyExc_ImportError,
1644 "reload(): module %.200s not in sys.modules",
1645 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001646 return NULL;
1647 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001648 subname = strrchr(name, '.');
1649 if (subname == NULL)
1650 subname = name;
1651 else {
1652 PyObject *parentname, *parent;
1653 parentname = PyString_FromStringAndSize(name, (subname-name));
1654 if (parentname == NULL)
1655 return NULL;
1656 parent = PyDict_GetItem(modules, parentname);
1657 if (parent == NULL) {
1658 PyErr_Format(PyExc_ImportError,
1659 "reload(): parent %.200s not in sys.modules",
1660 name);
1661 return NULL;
1662 }
1663 subname++;
1664 path = PyObject_GetAttrString(parent, "__path__");
1665 if (path == NULL)
1666 PyErr_Clear();
1667 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001668 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001669 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1670 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001671 if (fdp == NULL)
1672 return NULL;
1673 m = load_module(name, fp, buf, fdp->type);
1674 if (fp)
1675 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001676 return m;
1677}
1678
1679
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001680/* Higher-level import emulator which emulates the "import" statement
1681 more accurately -- it invokes the __import__() function from the
1682 builtins of the current globals. This means that the import is
1683 done using whatever import hooks are installed in the current
1684 environment, e.g. by "ni" or "rexec". */
1685
1686PyObject *
1687PyImport_Import(module_name)
1688 PyObject *module_name;
1689{
1690 static PyObject *silly_list = NULL;
1691 static PyObject *builtins_str = NULL;
1692 static PyObject *import_str = NULL;
1693 static PyObject *standard_builtins = NULL;
1694 PyObject *globals = NULL;
1695 PyObject *import = NULL;
1696 PyObject *builtins = NULL;
1697 PyObject *r = NULL;
1698
1699 /* Initialize constant string objects */
1700 if (silly_list == NULL) {
1701 import_str = PyString_InternFromString("__import__");
1702 if (import_str == NULL)
1703 return NULL;
1704 builtins_str = PyString_InternFromString("__builtins__");
1705 if (builtins_str == NULL)
1706 return NULL;
1707 silly_list = Py_BuildValue("[s]", "__doc__");
1708 if (silly_list == NULL)
1709 return NULL;
1710 }
1711
1712 /* Get the builtins from current globals */
1713 globals = PyEval_GetGlobals();
1714 if(globals != NULL) {
1715 builtins = PyObject_GetItem(globals, builtins_str);
1716 if (builtins == NULL)
1717 goto err;
1718 }
1719 else {
1720 /* No globals -- use standard builtins, and fake globals */
1721 PyErr_Clear();
1722
1723 if (standard_builtins == NULL) {
1724 standard_builtins =
1725 PyImport_ImportModule("__builtin__");
1726 if (standard_builtins == NULL)
1727 return NULL;
1728 }
1729
1730 builtins = standard_builtins;
1731 Py_INCREF(builtins);
1732 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1733 if (globals == NULL)
1734 goto err;
1735 }
1736
1737 /* Get the __import__ function from the builtins */
1738 if (PyDict_Check(builtins))
1739 import=PyObject_GetItem(builtins, import_str);
1740 else
1741 import=PyObject_GetAttr(builtins, import_str);
1742 if (import == NULL)
1743 goto err;
1744
1745 /* Call the _import__ function with the proper argument list */
1746 r = PyObject_CallFunction(import, "OOOO",
1747 module_name, globals, globals, silly_list);
1748
1749 err:
1750 Py_XDECREF(globals);
1751 Py_XDECREF(builtins);
1752 Py_XDECREF(import);
1753
1754 return r;
1755}
1756
1757
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001758/* Module 'imp' provides Python access to the primitives used for
1759 importing modules.
1760*/
1761
Guido van Rossum79f25d91997-04-29 20:08:16 +00001762static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001763imp_get_magic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001764 PyObject *self;
1765 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001766{
1767 char buf[4];
1768
Guido van Rossum79f25d91997-04-29 20:08:16 +00001769 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001770 return NULL;
Guido van Rossum6bf62da1997-04-11 20:37:35 +00001771 buf[0] = (char) ((MAGIC >> 0) & 0xff);
1772 buf[1] = (char) ((MAGIC >> 8) & 0xff);
1773 buf[2] = (char) ((MAGIC >> 16) & 0xff);
1774 buf[3] = (char) ((MAGIC >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001775
Guido van Rossum79f25d91997-04-29 20:08:16 +00001776 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001777}
1778
Guido van Rossum79f25d91997-04-29 20:08:16 +00001779static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001780imp_get_suffixes(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001781 PyObject *self;
1782 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001783{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001784 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001785 struct filedescr *fdp;
1786
Guido van Rossum79f25d91997-04-29 20:08:16 +00001787 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001788 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001789 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001790 if (list == NULL)
1791 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001792 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
1793 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001794 fdp->suffix, fdp->mode, fdp->type);
1795 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001796 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001797 return NULL;
1798 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001799 if (PyList_Append(list, item) < 0) {
1800 Py_DECREF(list);
1801 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001802 return NULL;
1803 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001804 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001805 }
1806 return list;
1807}
1808
Guido van Rossum79f25d91997-04-29 20:08:16 +00001809static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001810call_find_module(name, path)
1811 char *name;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001812 PyObject *path; /* list or None or NULL */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001813{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001814 extern int fclose Py_PROTO((FILE *));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001815 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001816 struct filedescr *fdp;
1817 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001818 FILE *fp = NULL;
1819
1820 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001821 if (path == Py_None)
1822 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001823 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
1824 if (fdp == NULL)
1825 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001826 if (fp != NULL) {
1827 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
1828 if (fob == NULL) {
1829 fclose(fp);
1830 return NULL;
1831 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001832 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001833 else {
1834 fob = Py_None;
1835 Py_INCREF(fob);
1836 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001837 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001838 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001839 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001840 return ret;
1841}
1842
Guido van Rossum79f25d91997-04-29 20:08:16 +00001843static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001844imp_find_module(self, args)
1845 PyObject *self;
1846 PyObject *args;
1847{
1848 char *name;
1849 PyObject *path = NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001850 if (!PyArg_ParseTuple(args, "s|O", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001851 return NULL;
1852 return call_find_module(name, path);
1853}
1854
1855static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001856imp_init_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001857 PyObject *self;
1858 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001859{
1860 char *name;
1861 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001862 PyObject *m;
1863 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001864 return NULL;
1865 ret = init_builtin(name);
1866 if (ret < 0)
1867 return NULL;
1868 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001869 Py_INCREF(Py_None);
1870 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001871 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001872 m = PyImport_AddModule(name);
1873 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001874 return m;
1875}
1876
Guido van Rossum79f25d91997-04-29 20:08:16 +00001877static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001878imp_init_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001879 PyObject *self;
1880 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001881{
1882 char *name;
1883 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001884 PyObject *m;
1885 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001886 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001887 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001888 if (ret < 0)
1889 return NULL;
1890 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001891 Py_INCREF(Py_None);
1892 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001893 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001894 m = PyImport_AddModule(name);
1895 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001896 return m;
1897}
1898
Guido van Rossum79f25d91997-04-29 20:08:16 +00001899static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001900imp_get_frozen_object(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001901 PyObject *self;
1902 PyObject *args;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001903{
1904 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00001905
Guido van Rossum79f25d91997-04-29 20:08:16 +00001906 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001907 return NULL;
1908 return get_frozen_object(name);
1909}
1910
Guido van Rossum79f25d91997-04-29 20:08:16 +00001911static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001912imp_is_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001913 PyObject *self;
1914 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001915{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001916 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001917 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001918 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001919 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001920}
1921
Guido van Rossum79f25d91997-04-29 20:08:16 +00001922static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001923imp_is_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001924 PyObject *self;
1925 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001926{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001927 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001928 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001929 return NULL;
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001930 return PyInt_FromLong(find_frozen(name) != NULL);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001931}
1932
1933static FILE *
1934get_file(pathname, fob, mode)
1935 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001936 PyObject *fob;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001937 char *mode;
1938{
1939 FILE *fp;
1940 if (fob == NULL) {
1941 fp = fopen(pathname, mode);
1942 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001943 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001944 }
1945 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001946 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001947 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001948 PyErr_SetString(PyExc_ValueError,
1949 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001950 }
1951 return fp;
1952}
1953
Guido van Rossum79f25d91997-04-29 20:08:16 +00001954static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001955imp_load_compiled(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001956 PyObject *self;
1957 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001958{
1959 char *name;
1960 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001961 PyObject *fob = NULL;
1962 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001963 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001964 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00001965 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001966 return NULL;
1967 fp = get_file(pathname, fob, "rb");
1968 if (fp == NULL)
1969 return NULL;
1970 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001971 if (fob == NULL)
1972 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001973 return m;
1974}
1975
Guido van Rossum79f25d91997-04-29 20:08:16 +00001976static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001977imp_load_dynamic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001978 PyObject *self;
1979 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001980{
1981 char *name;
1982 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001983 PyObject *fob = NULL;
1984 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00001985 FILE *fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001986 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
1987 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001988 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001989 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00001990 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001991 if (fp == NULL)
1992 return NULL;
1993 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001994 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00001995 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001996}
1997
Guido van Rossum79f25d91997-04-29 20:08:16 +00001998static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001999imp_load_source(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002000 PyObject *self;
2001 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002002{
2003 char *name;
2004 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002005 PyObject *fob = NULL;
2006 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002007 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002008 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002009 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002010 return NULL;
2011 fp = get_file(pathname, fob, "r");
2012 if (fp == NULL)
2013 return NULL;
2014 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002015 if (fob == NULL)
2016 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002017 return m;
2018}
2019
Jack Jansen9c96a921995-02-15 22:57:06 +00002020#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002021static PyObject *
Jack Jansen9c96a921995-02-15 22:57:06 +00002022imp_load_resource(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002023 PyObject *self;
2024 PyObject *args;
Jack Jansen9c96a921995-02-15 22:57:06 +00002025{
2026 char *name;
2027 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002028 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002029
Guido van Rossum79f25d91997-04-29 20:08:16 +00002030 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002031 return NULL;
2032 m = PyMac_LoadResourceModule(name, pathname);
2033 return m;
2034}
2035#endif /* macintosh */
2036
Guido van Rossum79f25d91997-04-29 20:08:16 +00002037static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002038imp_load_module(self, args)
2039 PyObject *self;
2040 PyObject *args;
2041{
2042 char *name;
2043 PyObject *fob;
2044 char *pathname;
2045 char *suffix; /* Unused */
2046 char *mode;
2047 int type;
2048 FILE *fp;
2049
2050 if (!PyArg_ParseTuple(args, "sOs(ssi)",
2051 &name, &fob, &pathname,
2052 &suffix, &mode, &type))
2053 return NULL;
2054 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
2055 PyErr_Format(PyExc_ValueError,
2056 "invalid file open mode %.200s", mode);
2057 return NULL;
2058 }
2059 if (fob == Py_None)
2060 fp = NULL;
2061 else {
2062 if (!PyFile_Check(fob)) {
2063 PyErr_SetString(PyExc_ValueError,
2064 "load_module arg#2 should be a file or None");
2065 return NULL;
2066 }
2067 fp = get_file(pathname, fob, mode);
2068 if (fp == NULL)
2069 return NULL;
2070 }
2071 return load_module(name, fp, pathname, type);
2072}
2073
2074static PyObject *
2075imp_load_package(self, args)
2076 PyObject *self;
2077 PyObject *args;
2078{
2079 char *name;
2080 char *pathname;
2081 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
2082 return NULL;
2083 return load_package(name, pathname);
2084}
2085
2086static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002087imp_new_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002088 PyObject *self;
2089 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002090{
2091 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002092 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002093 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002094 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002095}
2096
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002097/* Doc strings */
2098
2099static char doc_imp[] = "\
2100This module provides the components needed to build your own\n\
2101__import__ function. Undocumented functions are obsolete.\n\
2102";
2103
2104static char doc_find_module[] = "\
2105find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
2106Search for a module. If path is omitted or None, search for a\n\
2107built-in, frozen or special module and continue search in sys.path.\n\
2108The module name cannot contain '.'; to search for a submodule of a\n\
2109package, pass the submodule name and the package's __path__.\
2110";
2111
2112static char doc_load_module[] = "\
2113load_module(name, file, filename, (suffix, mode, type)) -> module\n\
2114Load a module, given information returned by find_module().\n\
2115The module name must include the full package name, if any.\
2116";
2117
2118static char doc_get_magic[] = "\
2119get_magic() -> string\n\
2120Return the magic number for .pyc or .pyo files.\
2121";
2122
2123static char doc_get_suffixes[] = "\
2124get_suffixes() -> [(suffix, mode, type), ...]\n\
2125Return a list of (suffix, mode, type) tuples describing the files\n\
2126that find_module() looks for.\
2127";
2128
2129static char doc_new_module[] = "\
2130new_module(name) -> module\n\
2131Create a new module. Do not enter it in sys.modules.\n\
2132The module name must include the full package name, if any.\
2133";
2134
Guido van Rossum79f25d91997-04-29 20:08:16 +00002135static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002136 {"find_module", imp_find_module, 1, doc_find_module},
2137 {"get_magic", imp_get_magic, 1, doc_get_magic},
2138 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2139 {"load_module", imp_load_module, 1, doc_load_module},
2140 {"new_module", imp_new_module, 1, doc_new_module},
2141 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002142 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002143 {"init_builtin", imp_init_builtin, 1},
2144 {"init_frozen", imp_init_frozen, 1},
2145 {"is_builtin", imp_is_builtin, 1},
2146 {"is_frozen", imp_is_frozen, 1},
2147 {"load_compiled", imp_load_compiled, 1},
2148 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002149 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002150#ifdef macintosh
2151 {"load_resource", imp_load_resource, 1},
2152#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002153 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002154 {NULL, NULL} /* sentinel */
2155};
2156
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002157int
2158setint(d, name, value)
2159 PyObject *d;
2160 char *name;
2161 int value;
2162{
2163 PyObject *v;
2164 int err;
2165
2166 v = PyInt_FromLong((long)value);
2167 err = PyDict_SetItemString(d, name, v);
2168 Py_XDECREF(v);
2169 return err;
2170}
2171
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002172void
2173initimp()
2174{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002175 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002176
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002177 m = Py_InitModule4("imp", imp_methods, doc_imp,
2178 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002179 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002180
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002181 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2182 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2183 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2184 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2185 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2186 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2187 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2188 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002189
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002190 failure:
2191 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002192}