blob: 7917633f2c02191b92459523ed0d22f6353f417d [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
1009static int
1010check_case(char *buf, int len, int namelen, char *name)
1011{
1012 struct ffblk ffblk;
1013 int done;
1014
1015 if (getenv("PYTHONCASEOK") != NULL)
1016 return 1;
1017 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN);
1018 if (done) {
1019 PyErr_Format(PyExc_NameError,
1020 "Can't find file for module %.100s\n(filename %.300s)",
1021 name, buf);
1022 return 0;
1023 }
1024
1025 if (strncmp(ffblk.ff_name, name, namelen) != 0) {
1026 strcpy(buf+len-namelen, ffblk.ff_name);
1027 PyErr_Format(PyExc_NameError,
1028 "Case mismatch for module name %.100s\n(filename %.300s)",
1029 name, buf);
1030 return 0;
1031 }
1032 return 1;
1033}
1034#endif
1035
Guido van Rossum0980bd91998-02-13 17:18:36 +00001036#endif CHECK_IMPORT_CASE
1037
Guido van Rossum197346f1997-10-31 18:38:52 +00001038#ifdef HAVE_STAT
1039/* Helper to look for __init__.py or __init__.py[co] in potential package */
1040static int
1041find_init_module(buf)
1042 char *buf;
1043{
1044 int save_len = strlen(buf);
1045 int i = save_len;
1046 struct stat statbuf;
1047
1048 if (save_len + 13 >= MAXPATHLEN)
1049 return 0;
1050 buf[i++] = SEP;
1051 strcpy(buf+i, "__init__.py");
1052 if (stat(buf, &statbuf) == 0) {
1053 buf[save_len] = '\0';
1054 return 1;
1055 }
1056 i += strlen(buf+i);
1057 if (Py_OptimizeFlag)
1058 strcpy(buf+i, "o");
1059 else
1060 strcpy(buf+i, "c");
1061 if (stat(buf, &statbuf) == 0) {
1062 buf[save_len] = '\0';
1063 return 1;
1064 }
1065 buf[save_len] = '\0';
1066 return 0;
1067}
1068#endif /* HAVE_STAT */
1069
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001070
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001071static int init_builtin Py_PROTO((char *)); /* Forward */
1072
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001073/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001074 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001075
Guido van Rossum79f25d91997-04-29 20:08:16 +00001076static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001077load_module(name, fp, buf, type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001078 char *name;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001079 FILE *fp;
1080 char *buf;
1081 int type;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001082{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001083 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001084 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001085 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001086
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001087 /* First check that there's an open file (if we need one) */
1088 switch (type) {
1089 case PY_SOURCE:
1090 case PY_COMPILED:
1091 if (fp == NULL) {
1092 PyErr_Format(PyExc_ValueError,
1093 "file object required for import (type code %d)",
1094 type);
1095 return NULL;
1096 }
1097 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001098
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001099 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001100
1101 case PY_SOURCE:
1102 m = load_source_module(name, buf, fp);
1103 break;
1104
1105 case PY_COMPILED:
1106 m = load_compiled_module(name, buf, fp);
1107 break;
1108
1109 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001110 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001111 break;
1112
Jack Jansen9c96a921995-02-15 22:57:06 +00001113#ifdef macintosh
1114 case PY_RESOURCE:
1115 m = PyMac_LoadResourceModule(name, buf);
1116 break;
1117#endif
1118
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001119 case PKG_DIRECTORY:
1120 m = load_package(name, buf);
1121 break;
1122
1123 case C_BUILTIN:
1124 case PY_FROZEN:
1125 if (type == C_BUILTIN)
1126 err = init_builtin(name);
1127 else
1128 err = PyImport_ImportFrozenModule(name);
1129 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001130 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001131 if (err == 0) {
1132 PyErr_Format(PyExc_ImportError,
1133 "Purported %s module %.200s not found",
1134 type == C_BUILTIN ?
1135 "builtin" : "frozen",
1136 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001137 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001138 }
1139 modules = PyImport_GetModuleDict();
1140 m = PyDict_GetItemString(modules, name);
1141 if (m == NULL) {
1142 PyErr_Format(
1143 PyExc_ImportError,
1144 "%s module %.200s not properly initialized",
1145 type == C_BUILTIN ?
1146 "builtin" : "frozen",
1147 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001148 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001149 }
1150 Py_INCREF(m);
1151 break;
1152
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001153 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001154 PyErr_Format(PyExc_ImportError,
1155 "Don't know how to import %.200s (type code %d)",
1156 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001157 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001158
1159 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001160
1161 return m;
1162}
1163
1164
1165/* Initialize a built-in module.
1166 Return 1 for succes, 0 if the module is not found, and -1 with
1167 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001168
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001169static int
1170init_builtin(name)
1171 char *name;
1172{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001173 struct _inittab *p;
1174 PyObject *mod;
1175
1176 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
1177 return 1;
1178
Guido van Rossum771c6c81997-10-31 18:37:24 +00001179 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001180 if (strcmp(name, p->name) == 0) {
1181 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001182 PyErr_Format(PyExc_ImportError,
1183 "Cannot re-init internal module %.200s",
1184 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001185 return -1;
1186 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001187 if (Py_VerboseFlag)
Guido van Rossum25ce5661997-08-02 03:10:38 +00001188 fprintf(stderr, "import %s # builtin\n", name);
1189 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001190 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001191 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001192 if (_PyImport_FixupExtension(name, name) == NULL)
1193 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001194 return 1;
1195 }
1196 }
1197 return 0;
1198}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001199
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001200
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001201/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001202
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001203static struct _frozen *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001204find_frozen(name)
1205 char *name;
1206{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001207 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001208
Guido van Rossum79f25d91997-04-29 20:08:16 +00001209 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001210 if (p->name == NULL)
1211 return NULL;
1212 if (strcmp(p->name, name) == 0)
1213 break;
1214 }
1215 return p;
1216}
1217
Guido van Rossum79f25d91997-04-29 20:08:16 +00001218static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001219get_frozen_object(name)
1220 char *name;
1221{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001222 struct _frozen *p = find_frozen(name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001223
1224 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001225 PyErr_Format(PyExc_ImportError,
1226 "No such frozen object named %.200s",
1227 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001228 return NULL;
1229 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001230 return PyMarshal_ReadObjectFromString((char *)p->code, p->size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001231}
1232
1233/* Initialize a frozen module.
1234 Return 1 for succes, 0 if the module is not found, and -1 with
1235 an exception set if the initialization failed.
1236 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001237
1238int
Guido van Rossum79f25d91997-04-29 20:08:16 +00001239PyImport_ImportFrozenModule(name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001240 char *name;
1241{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001242 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001243 PyObject *co;
1244 PyObject *m;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001245
1246 if (p == NULL)
1247 return 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001248 if (Py_VerboseFlag)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001249 fprintf(stderr, "import %s # frozen\n", name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001250 co = PyMarshal_ReadObjectFromString((char *)p->code, p->size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001251 if (co == NULL)
1252 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001253 if (!PyCode_Check(co)) {
1254 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001255 PyErr_Format(PyExc_TypeError,
1256 "frozen object %.200s is not a code object",
1257 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001258 return -1;
1259 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001260 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001261 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001262 if (m == NULL)
1263 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001264 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001265 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001266}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001267
1268
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001269/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001270 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001271
Guido van Rossum79f25d91997-04-29 20:08:16 +00001272PyObject *
1273PyImport_ImportModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001274 char *name;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001275{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001276 static PyObject *fromlist = NULL;
1277 if (fromlist == NULL && strchr(name, '.') != NULL) {
1278 fromlist = Py_BuildValue("[s]", "*");
1279 if (fromlist == NULL)
1280 return NULL;
1281 }
1282 return PyImport_ImportModuleEx(name, NULL, NULL, fromlist);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001283}
1284
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001285/* Forward declarations for helper routines */
1286static PyObject *get_parent Py_PROTO((PyObject *globals,
1287 char *buf, int *p_buflen));
1288static PyObject *load_next Py_PROTO((PyObject *mod, PyObject *altmod,
1289 char **p_name, char *buf, int *p_buflen));
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001290static int mark_miss Py_PROTO((char *name));
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001291static int ensure_fromlist Py_PROTO((PyObject *mod, PyObject *fromlist,
Guido van Rossum9905ef91997-09-08 16:07:11 +00001292 char *buf, int buflen, int recursive));
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001293static PyObject * import_submodule Py_PROTO((PyObject *mod,
1294 char *name, char *fullname));
1295
1296/* The Magnum Opus of dotted-name import :-) */
1297
1298/* XXX TO DO:
1299 - Remember misses in package directories so package submodules
1300 that all import the same toplevel module don't keep hitting on the
1301 package directory first
1302*/
1303
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001304PyObject *
1305PyImport_ImportModuleEx(name, globals, locals, fromlist)
1306 char *name;
1307 PyObject *globals;
1308 PyObject *locals;
1309 PyObject *fromlist;
1310{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001311 char buf[MAXPATHLEN+1];
1312 int buflen = 0;
1313 PyObject *parent, *head, *next, *tail;
1314
1315 parent = get_parent(globals, buf, &buflen);
1316 if (parent == NULL)
1317 return NULL;
1318
1319 head = load_next(parent, Py_None, &name, buf, &buflen);
1320 if (head == NULL)
1321 return NULL;
1322
1323 tail = head;
1324 Py_INCREF(tail);
1325 while (name) {
1326 next = load_next(tail, tail, &name, buf, &buflen);
1327 Py_DECREF(tail);
1328 if (next == NULL) {
1329 Py_DECREF(head);
1330 return NULL;
1331 }
1332 tail = next;
1333 }
1334
1335 if (fromlist != NULL) {
1336 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1337 fromlist = NULL;
1338 }
1339
1340 if (fromlist == NULL) {
1341 Py_DECREF(tail);
1342 return head;
1343 }
1344
1345 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001346 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001347 Py_DECREF(tail);
1348 return NULL;
1349 }
1350
1351 return tail;
1352}
1353
1354static PyObject *
1355get_parent(globals, buf, p_buflen)
1356 PyObject *globals;
1357 char *buf;
1358 int *p_buflen;
1359{
1360 static PyObject *namestr = NULL;
1361 static PyObject *pathstr = NULL;
1362 PyObject *modname, *modpath, *modules, *parent;
1363
1364 if (globals == NULL || !PyDict_Check(globals))
1365 return Py_None;
1366
1367 if (namestr == NULL) {
1368 namestr = PyString_InternFromString("__name__");
1369 if (namestr == NULL)
1370 return NULL;
1371 }
1372 if (pathstr == NULL) {
1373 pathstr = PyString_InternFromString("__path__");
1374 if (pathstr == NULL)
1375 return NULL;
1376 }
1377
1378 *buf = '\0';
1379 *p_buflen = 0;
1380 modname = PyDict_GetItem(globals, namestr);
1381 if (modname == NULL || !PyString_Check(modname))
1382 return Py_None;
1383
1384 modpath = PyDict_GetItem(globals, pathstr);
1385 if (modpath != NULL) {
1386 int len = PyString_GET_SIZE(modname);
1387 if (len > MAXPATHLEN) {
1388 PyErr_SetString(PyExc_ValueError,
1389 "Module name too long");
1390 return NULL;
1391 }
1392 strcpy(buf, PyString_AS_STRING(modname));
1393 *p_buflen = len;
1394 }
1395 else {
1396 char *start = PyString_AS_STRING(modname);
1397 char *lastdot = strrchr(start, '.');
1398 int len;
1399 if (lastdot == NULL)
1400 return Py_None;
1401 len = lastdot - start;
1402 if (len >= MAXPATHLEN) {
1403 PyErr_SetString(PyExc_ValueError,
1404 "Module name too long");
1405 return NULL;
1406 }
1407 strncpy(buf, start, len);
1408 buf[len] = '\0';
1409 *p_buflen = len;
1410 }
1411
1412 modules = PyImport_GetModuleDict();
1413 parent = PyDict_GetItemString(modules, buf);
1414 if (parent == NULL)
1415 parent = Py_None;
1416 return parent;
1417 /* We expect, but can't guarantee, if parent != None, that:
1418 - parent.__name__ == buf
1419 - parent.__dict__ is globals
1420 If this is violated... Who cares? */
1421}
1422
1423static PyObject *
1424load_next(mod, altmod, p_name, buf, p_buflen)
1425 PyObject *mod;
1426 PyObject *altmod; /* Either None or same as mod */
1427 char **p_name;
1428 char *buf;
1429 int *p_buflen;
1430{
1431 char *name = *p_name;
1432 char *dot = strchr(name, '.');
1433 int len;
1434 char *p;
1435 PyObject *result;
1436
1437 if (dot == NULL) {
1438 *p_name = NULL;
1439 len = strlen(name);
1440 }
1441 else {
1442 *p_name = dot+1;
1443 len = dot-name;
1444 }
1445
1446 p = buf + *p_buflen;
1447 if (p != buf)
1448 *p++ = '.';
1449 if (p+len-buf >= MAXPATHLEN) {
1450 PyErr_SetString(PyExc_ValueError,
1451 "Module name too long");
1452 return NULL;
1453 }
1454 strncpy(p, name, len);
1455 p[len] = '\0';
1456 *p_buflen = p+len-buf;
1457
1458 result = import_submodule(mod, p, buf);
1459 if (result == Py_None && altmod != mod) {
1460 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001461 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001462 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001463 if (result != NULL && result != Py_None) {
1464 if (mark_miss(buf) != 0) {
1465 Py_DECREF(result);
1466 return NULL;
1467 }
1468 strncpy(buf, name, len);
1469 buf[len] = '\0';
1470 *p_buflen = len;
1471 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001472 }
1473 if (result == NULL)
1474 return NULL;
1475
1476 if (result == Py_None) {
1477 Py_DECREF(result);
1478 PyErr_Format(PyExc_ImportError,
1479 "No module named %.200s", name);
1480 return NULL;
1481 }
1482
1483 return result;
1484}
1485
1486static int
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001487mark_miss(name)
1488 char *name;
1489{
1490 PyObject *modules = PyImport_GetModuleDict();
1491 return PyDict_SetItemString(modules, name, Py_None);
1492}
1493
1494static int
Guido van Rossum9905ef91997-09-08 16:07:11 +00001495ensure_fromlist(mod, fromlist, buf, buflen, recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001496 PyObject *mod;
1497 PyObject *fromlist;
1498 char *buf;
1499 int buflen;
Guido van Rossum9905ef91997-09-08 16:07:11 +00001500 int recursive;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001501{
1502 int i;
1503
1504 if (!PyObject_HasAttrString(mod, "__path__"))
1505 return 1;
1506
1507 for (i = 0; ; i++) {
1508 PyObject *item = PySequence_GetItem(fromlist, i);
1509 int hasit;
1510 if (item == NULL) {
1511 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1512 PyErr_Clear();
1513 return 1;
1514 }
1515 return 0;
1516 }
1517 if (!PyString_Check(item)) {
1518 PyErr_SetString(PyExc_TypeError,
1519 "Item in ``from list'' not a string");
1520 Py_DECREF(item);
1521 return 0;
1522 }
1523 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001524 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001525 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001526 /* See if the package defines __all__ */
1527 if (recursive)
1528 continue; /* Avoid endless recursion */
1529 all = PyObject_GetAttrString(mod, "__all__");
1530 if (all == NULL)
1531 PyErr_Clear();
1532 else {
1533 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1534 return 0;
1535 Py_DECREF(all);
1536 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001537 continue;
1538 }
1539 hasit = PyObject_HasAttr(mod, item);
1540 if (!hasit) {
1541 char *subname = PyString_AS_STRING(item);
1542 PyObject *submod;
1543 char *p;
1544 if (buflen + strlen(subname) >= MAXPATHLEN) {
1545 PyErr_SetString(PyExc_ValueError,
1546 "Module name too long");
1547 Py_DECREF(item);
1548 return 0;
1549 }
1550 p = buf + buflen;
1551 *p++ = '.';
1552 strcpy(p, subname);
1553 submod = import_submodule(mod, subname, buf);
1554 Py_XDECREF(submod);
1555 if (submod == NULL) {
1556 Py_DECREF(item);
1557 return 0;
1558 }
1559 }
1560 Py_DECREF(item);
1561 }
1562
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001563 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001564}
1565
1566static PyObject *
1567import_submodule(mod, subname, fullname)
1568 PyObject *mod; /* May be None */
1569 char *subname;
1570 char *fullname;
1571{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001572 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001573 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001574
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001575 /* Require:
1576 if mod == None: subname == fullname
1577 else: mod.__name__ + "." + subname == fullname
1578 */
1579
1580 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001581 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001582 }
1583 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001584 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001585 char buf[MAXPATHLEN+1];
1586 struct filedescr *fdp;
1587 FILE *fp = NULL;
1588
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001589 path = PyObject_GetAttrString(mod, "__path__");
1590 if (path == NULL)
1591 PyErr_Clear();
1592
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001593 buf[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001594 fdp = find_module(subname, path,
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001595 buf, MAXPATHLEN+1, &fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001596 if (fdp == NULL) {
1597 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1598 return NULL;
1599 PyErr_Clear();
1600 Py_INCREF(Py_None);
1601 return Py_None;
1602 }
1603 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001604 if (fp)
1605 fclose(fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001606 if (m != NULL && mod != Py_None) {
1607 if (PyObject_SetAttrString(mod, subname, m) < 0) {
1608 Py_DECREF(m);
1609 m = NULL;
1610 }
1611 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001612 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001613
1614 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001615}
1616
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001617
1618/* Re-import a module of any kind and return its module object, WITH
1619 INCREMENTED REFERENCE COUNT */
1620
Guido van Rossum79f25d91997-04-29 20:08:16 +00001621PyObject *
1622PyImport_ReloadModule(m)
1623 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001624{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001625 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001626 PyObject *path = NULL;
1627 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001628 char buf[MAXPATHLEN+1];
1629 struct filedescr *fdp;
1630 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001631
Guido van Rossum79f25d91997-04-29 20:08:16 +00001632 if (m == NULL || !PyModule_Check(m)) {
1633 PyErr_SetString(PyExc_TypeError,
1634 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001635 return NULL;
1636 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001637 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001638 if (name == NULL)
1639 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001640 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001641 PyErr_Format(PyExc_ImportError,
1642 "reload(): module %.200s not in sys.modules",
1643 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001644 return NULL;
1645 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001646 subname = strrchr(name, '.');
1647 if (subname == NULL)
1648 subname = name;
1649 else {
1650 PyObject *parentname, *parent;
1651 parentname = PyString_FromStringAndSize(name, (subname-name));
1652 if (parentname == NULL)
1653 return NULL;
1654 parent = PyDict_GetItem(modules, parentname);
1655 if (parent == NULL) {
1656 PyErr_Format(PyExc_ImportError,
1657 "reload(): parent %.200s not in sys.modules",
1658 name);
1659 return NULL;
1660 }
1661 subname++;
1662 path = PyObject_GetAttrString(parent, "__path__");
1663 if (path == NULL)
1664 PyErr_Clear();
1665 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001666 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001667 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1668 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001669 if (fdp == NULL)
1670 return NULL;
1671 m = load_module(name, fp, buf, fdp->type);
1672 if (fp)
1673 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001674 return m;
1675}
1676
1677
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001678/* Higher-level import emulator which emulates the "import" statement
1679 more accurately -- it invokes the __import__() function from the
1680 builtins of the current globals. This means that the import is
1681 done using whatever import hooks are installed in the current
1682 environment, e.g. by "ni" or "rexec". */
1683
1684PyObject *
1685PyImport_Import(module_name)
1686 PyObject *module_name;
1687{
1688 static PyObject *silly_list = NULL;
1689 static PyObject *builtins_str = NULL;
1690 static PyObject *import_str = NULL;
1691 static PyObject *standard_builtins = NULL;
1692 PyObject *globals = NULL;
1693 PyObject *import = NULL;
1694 PyObject *builtins = NULL;
1695 PyObject *r = NULL;
1696
1697 /* Initialize constant string objects */
1698 if (silly_list == NULL) {
1699 import_str = PyString_InternFromString("__import__");
1700 if (import_str == NULL)
1701 return NULL;
1702 builtins_str = PyString_InternFromString("__builtins__");
1703 if (builtins_str == NULL)
1704 return NULL;
1705 silly_list = Py_BuildValue("[s]", "__doc__");
1706 if (silly_list == NULL)
1707 return NULL;
1708 }
1709
1710 /* Get the builtins from current globals */
1711 globals = PyEval_GetGlobals();
1712 if(globals != NULL) {
1713 builtins = PyObject_GetItem(globals, builtins_str);
1714 if (builtins == NULL)
1715 goto err;
1716 }
1717 else {
1718 /* No globals -- use standard builtins, and fake globals */
1719 PyErr_Clear();
1720
1721 if (standard_builtins == NULL) {
1722 standard_builtins =
1723 PyImport_ImportModule("__builtin__");
1724 if (standard_builtins == NULL)
1725 return NULL;
1726 }
1727
1728 builtins = standard_builtins;
1729 Py_INCREF(builtins);
1730 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1731 if (globals == NULL)
1732 goto err;
1733 }
1734
1735 /* Get the __import__ function from the builtins */
1736 if (PyDict_Check(builtins))
1737 import=PyObject_GetItem(builtins, import_str);
1738 else
1739 import=PyObject_GetAttr(builtins, import_str);
1740 if (import == NULL)
1741 goto err;
1742
1743 /* Call the _import__ function with the proper argument list */
1744 r = PyObject_CallFunction(import, "OOOO",
1745 module_name, globals, globals, silly_list);
1746
1747 err:
1748 Py_XDECREF(globals);
1749 Py_XDECREF(builtins);
1750 Py_XDECREF(import);
1751
1752 return r;
1753}
1754
1755
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001756/* Module 'imp' provides Python access to the primitives used for
1757 importing modules.
1758*/
1759
Guido van Rossum79f25d91997-04-29 20:08:16 +00001760static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001761imp_get_magic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001762 PyObject *self;
1763 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001764{
1765 char buf[4];
1766
Guido van Rossum79f25d91997-04-29 20:08:16 +00001767 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001768 return NULL;
Guido van Rossum6bf62da1997-04-11 20:37:35 +00001769 buf[0] = (char) ((MAGIC >> 0) & 0xff);
1770 buf[1] = (char) ((MAGIC >> 8) & 0xff);
1771 buf[2] = (char) ((MAGIC >> 16) & 0xff);
1772 buf[3] = (char) ((MAGIC >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001773
Guido van Rossum79f25d91997-04-29 20:08:16 +00001774 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001775}
1776
Guido van Rossum79f25d91997-04-29 20:08:16 +00001777static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001778imp_get_suffixes(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001779 PyObject *self;
1780 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001781{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001782 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001783 struct filedescr *fdp;
1784
Guido van Rossum79f25d91997-04-29 20:08:16 +00001785 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001786 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001787 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001788 if (list == NULL)
1789 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001790 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
1791 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001792 fdp->suffix, fdp->mode, fdp->type);
1793 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001794 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001795 return NULL;
1796 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001797 if (PyList_Append(list, item) < 0) {
1798 Py_DECREF(list);
1799 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001800 return NULL;
1801 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001802 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001803 }
1804 return list;
1805}
1806
Guido van Rossum79f25d91997-04-29 20:08:16 +00001807static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001808call_find_module(name, path)
1809 char *name;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001810 PyObject *path; /* list or None or NULL */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001811{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001812 extern int fclose Py_PROTO((FILE *));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001813 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001814 struct filedescr *fdp;
1815 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001816 FILE *fp = NULL;
1817
1818 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001819 if (path == Py_None)
1820 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001821 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
1822 if (fdp == NULL)
1823 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001824 if (fp != NULL) {
1825 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
1826 if (fob == NULL) {
1827 fclose(fp);
1828 return NULL;
1829 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001830 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001831 else {
1832 fob = Py_None;
1833 Py_INCREF(fob);
1834 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001835 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001836 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001837 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001838 return ret;
1839}
1840
Guido van Rossum79f25d91997-04-29 20:08:16 +00001841static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001842imp_find_module(self, args)
1843 PyObject *self;
1844 PyObject *args;
1845{
1846 char *name;
1847 PyObject *path = NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001848 if (!PyArg_ParseTuple(args, "s|O", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001849 return NULL;
1850 return call_find_module(name, path);
1851}
1852
1853static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001854imp_init_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001855 PyObject *self;
1856 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001857{
1858 char *name;
1859 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001860 PyObject *m;
1861 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001862 return NULL;
1863 ret = init_builtin(name);
1864 if (ret < 0)
1865 return NULL;
1866 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001867 Py_INCREF(Py_None);
1868 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001869 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001870 m = PyImport_AddModule(name);
1871 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001872 return m;
1873}
1874
Guido van Rossum79f25d91997-04-29 20:08:16 +00001875static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001876imp_init_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001877 PyObject *self;
1878 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001879{
1880 char *name;
1881 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001882 PyObject *m;
1883 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001884 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001885 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001886 if (ret < 0)
1887 return NULL;
1888 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001889 Py_INCREF(Py_None);
1890 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001891 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001892 m = PyImport_AddModule(name);
1893 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001894 return m;
1895}
1896
Guido van Rossum79f25d91997-04-29 20:08:16 +00001897static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001898imp_get_frozen_object(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001899 PyObject *self;
1900 PyObject *args;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001901{
1902 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00001903
Guido van Rossum79f25d91997-04-29 20:08:16 +00001904 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001905 return NULL;
1906 return get_frozen_object(name);
1907}
1908
Guido van Rossum79f25d91997-04-29 20:08:16 +00001909static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001910imp_is_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001911 PyObject *self;
1912 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001913{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001914 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001915 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001916 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001917 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001918}
1919
Guido van Rossum79f25d91997-04-29 20:08:16 +00001920static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001921imp_is_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001922 PyObject *self;
1923 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001924{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001925 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001926 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001927 return NULL;
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001928 return PyInt_FromLong(find_frozen(name) != NULL);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001929}
1930
1931static FILE *
1932get_file(pathname, fob, mode)
1933 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001934 PyObject *fob;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001935 char *mode;
1936{
1937 FILE *fp;
1938 if (fob == NULL) {
1939 fp = fopen(pathname, mode);
1940 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001941 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001942 }
1943 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001944 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001945 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001946 PyErr_SetString(PyExc_ValueError,
1947 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001948 }
1949 return fp;
1950}
1951
Guido van Rossum79f25d91997-04-29 20:08:16 +00001952static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001953imp_load_compiled(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001954 PyObject *self;
1955 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001956{
1957 char *name;
1958 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001959 PyObject *fob = NULL;
1960 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001961 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001962 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00001963 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001964 return NULL;
1965 fp = get_file(pathname, fob, "rb");
1966 if (fp == NULL)
1967 return NULL;
1968 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001969 if (fob == NULL)
1970 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001971 return m;
1972}
1973
Guido van Rossum79f25d91997-04-29 20:08:16 +00001974static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001975imp_load_dynamic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001976 PyObject *self;
1977 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001978{
1979 char *name;
1980 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001981 PyObject *fob = NULL;
1982 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00001983 FILE *fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001984 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
1985 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001986 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001987 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00001988 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001989 if (fp == NULL)
1990 return NULL;
1991 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001992 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00001993 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001994}
1995
Guido van Rossum79f25d91997-04-29 20:08:16 +00001996static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001997imp_load_source(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001998 PyObject *self;
1999 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002000{
2001 char *name;
2002 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002003 PyObject *fob = NULL;
2004 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002005 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002006 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002007 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002008 return NULL;
2009 fp = get_file(pathname, fob, "r");
2010 if (fp == NULL)
2011 return NULL;
2012 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002013 if (fob == NULL)
2014 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002015 return m;
2016}
2017
Jack Jansen9c96a921995-02-15 22:57:06 +00002018#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002019static PyObject *
Jack Jansen9c96a921995-02-15 22:57:06 +00002020imp_load_resource(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002021 PyObject *self;
2022 PyObject *args;
Jack Jansen9c96a921995-02-15 22:57:06 +00002023{
2024 char *name;
2025 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002026 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002027
Guido van Rossum79f25d91997-04-29 20:08:16 +00002028 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002029 return NULL;
2030 m = PyMac_LoadResourceModule(name, pathname);
2031 return m;
2032}
2033#endif /* macintosh */
2034
Guido van Rossum79f25d91997-04-29 20:08:16 +00002035static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002036imp_load_module(self, args)
2037 PyObject *self;
2038 PyObject *args;
2039{
2040 char *name;
2041 PyObject *fob;
2042 char *pathname;
2043 char *suffix; /* Unused */
2044 char *mode;
2045 int type;
2046 FILE *fp;
2047
2048 if (!PyArg_ParseTuple(args, "sOs(ssi)",
2049 &name, &fob, &pathname,
2050 &suffix, &mode, &type))
2051 return NULL;
2052 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
2053 PyErr_Format(PyExc_ValueError,
2054 "invalid file open mode %.200s", mode);
2055 return NULL;
2056 }
2057 if (fob == Py_None)
2058 fp = NULL;
2059 else {
2060 if (!PyFile_Check(fob)) {
2061 PyErr_SetString(PyExc_ValueError,
2062 "load_module arg#2 should be a file or None");
2063 return NULL;
2064 }
2065 fp = get_file(pathname, fob, mode);
2066 if (fp == NULL)
2067 return NULL;
2068 }
2069 return load_module(name, fp, pathname, type);
2070}
2071
2072static PyObject *
2073imp_load_package(self, args)
2074 PyObject *self;
2075 PyObject *args;
2076{
2077 char *name;
2078 char *pathname;
2079 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
2080 return NULL;
2081 return load_package(name, pathname);
2082}
2083
2084static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002085imp_new_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002086 PyObject *self;
2087 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002088{
2089 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002090 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002091 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002092 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002093}
2094
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002095/* Doc strings */
2096
2097static char doc_imp[] = "\
2098This module provides the components needed to build your own\n\
2099__import__ function. Undocumented functions are obsolete.\n\
2100";
2101
2102static char doc_find_module[] = "\
2103find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
2104Search for a module. If path is omitted or None, search for a\n\
2105built-in, frozen or special module and continue search in sys.path.\n\
2106The module name cannot contain '.'; to search for a submodule of a\n\
2107package, pass the submodule name and the package's __path__.\
2108";
2109
2110static char doc_load_module[] = "\
2111load_module(name, file, filename, (suffix, mode, type)) -> module\n\
2112Load a module, given information returned by find_module().\n\
2113The module name must include the full package name, if any.\
2114";
2115
2116static char doc_get_magic[] = "\
2117get_magic() -> string\n\
2118Return the magic number for .pyc or .pyo files.\
2119";
2120
2121static char doc_get_suffixes[] = "\
2122get_suffixes() -> [(suffix, mode, type), ...]\n\
2123Return a list of (suffix, mode, type) tuples describing the files\n\
2124that find_module() looks for.\
2125";
2126
2127static char doc_new_module[] = "\
2128new_module(name) -> module\n\
2129Create a new module. Do not enter it in sys.modules.\n\
2130The module name must include the full package name, if any.\
2131";
2132
Guido van Rossum79f25d91997-04-29 20:08:16 +00002133static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002134 {"find_module", imp_find_module, 1, doc_find_module},
2135 {"get_magic", imp_get_magic, 1, doc_get_magic},
2136 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2137 {"load_module", imp_load_module, 1, doc_load_module},
2138 {"new_module", imp_new_module, 1, doc_new_module},
2139 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002140 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002141 {"init_builtin", imp_init_builtin, 1},
2142 {"init_frozen", imp_init_frozen, 1},
2143 {"is_builtin", imp_is_builtin, 1},
2144 {"is_frozen", imp_is_frozen, 1},
2145 {"load_compiled", imp_load_compiled, 1},
2146 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002147 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002148#ifdef macintosh
2149 {"load_resource", imp_load_resource, 1},
2150#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002151 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002152 {NULL, NULL} /* sentinel */
2153};
2154
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002155int
2156setint(d, name, value)
2157 PyObject *d;
2158 char *name;
2159 int value;
2160{
2161 PyObject *v;
2162 int err;
2163
2164 v = PyInt_FromLong((long)value);
2165 err = PyDict_SetItemString(d, name, v);
2166 Py_XDECREF(v);
2167 return err;
2168}
2169
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002170void
2171initimp()
2172{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002173 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002174
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002175 m = Py_InitModule4("imp", imp_methods, doc_imp,
2176 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002177 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002178
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002179 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2180 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2181 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2182 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2183 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2184 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2185 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2186 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002187
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002188 failure:
2189 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002190}