blob: 9dbbd255b6a682dc9419f1b16f6a46cc821e4fc8 [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 Rossum25ce5661997-08-02 03:10:38 +0000428 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000429 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000430
Guido van Rossum79f25d91997-04-29 20:08:16 +0000431 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000432 if (m == NULL)
433 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000434 d = PyModule_GetDict(m);
435 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
436 if (PyDict_SetItemString(d, "__builtins__",
437 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000438 return NULL;
439 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000440 /* Remember the filename as the __file__ attribute */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000441 if (PyDict_SetItemString(d, "__file__",
442 ((PyCodeObject *)co)->co_filename) != 0)
443 PyErr_Clear(); /* Not important enough to report */
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000444 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000445 if (v == NULL)
446 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000447 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000448
Guido van Rossum25ce5661997-08-02 03:10:38 +0000449 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000450 PyErr_Format(PyExc_ImportError,
451 "Loaded module %.200s not found in sys.modules",
452 name);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000453 return NULL;
454 }
455
Guido van Rossum79f25d91997-04-29 20:08:16 +0000456 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000457
458 return m;
459}
460
461
462/* Given a pathname for a Python source file, fill a buffer with the
463 pathname for the corresponding compiled file. Return the pathname
464 for the compiled file, or NULL if there's no space in the buffer.
465 Doesn't set an exception. */
466
467static char *
468make_compiled_pathname(pathname, buf, buflen)
469 char *pathname;
470 char *buf;
471 int buflen;
472{
473 int len;
474
475 len = strlen(pathname);
476 if (len+2 > buflen)
477 return NULL;
478 strcpy(buf, pathname);
Guido van Rossum0824f631997-03-11 18:37:35 +0000479 strcpy(buf+len, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000480
481 return buf;
482}
483
484
485/* Given a pathname for a Python source file, its time of last
486 modification, and a pathname for a compiled file, check whether the
487 compiled file represents the same version of the source. If so,
488 return a FILE pointer for the compiled file, positioned just after
489 the header; if not, return NULL.
490 Doesn't set an exception. */
491
492static FILE *
493check_compiled_module(pathname, mtime, cpathname)
494 char *pathname;
495 long mtime;
496 char *cpathname;
497{
498 FILE *fp;
499 long magic;
500 long pyc_mtime;
501
502 fp = fopen(cpathname, "rb");
503 if (fp == NULL)
504 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000505 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000506 if (magic != MAGIC) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000507 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000508 fprintf(stderr, "# %s has bad magic\n", cpathname);
509 fclose(fp);
510 return NULL;
511 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000512 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000513 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000514 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000515 fprintf(stderr, "# %s has bad mtime\n", cpathname);
516 fclose(fp);
517 return NULL;
518 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000519 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000520 fprintf(stderr, "# %s matches %s\n", cpathname, pathname);
521 return fp;
522}
523
524
525/* Read a code object from a file and check it for validity */
526
Guido van Rossum79f25d91997-04-29 20:08:16 +0000527static PyCodeObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000528read_compiled_module(cpathname, fp)
529 char *cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000530 FILE *fp;
531{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000532 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000533
Guido van Rossum79f25d91997-04-29 20:08:16 +0000534 co = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000535 /* Ugly: rd_object() may return NULL with or without error */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000536 if (co == NULL || !PyCode_Check(co)) {
537 if (!PyErr_Occurred())
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000538 PyErr_Format(PyExc_ImportError,
539 "Non-code object in %.200s", cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000540 Py_XDECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000541 return NULL;
542 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000543 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000544}
545
546
547/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000548 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000549
Guido van Rossum79f25d91997-04-29 20:08:16 +0000550static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000551load_compiled_module(name, cpathname, fp)
552 char *name;
553 char *cpathname;
554 FILE *fp;
555{
556 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000557 PyCodeObject *co;
558 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000559
Guido van Rossum79f25d91997-04-29 20:08:16 +0000560 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000561 if (magic != MAGIC) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000562 PyErr_Format(PyExc_ImportError,
563 "Bad magic number in %.200s", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000564 return NULL;
565 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000566 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000567 co = read_compiled_module(cpathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000568 if (co == NULL)
569 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000570 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000571 fprintf(stderr, "import %s # precompiled from %s\n",
572 name, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000573 m = PyImport_ExecCodeModule(name, (PyObject *)co);
574 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000575
576 return m;
577}
578
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000579/* Parse a source file and return the corresponding code object */
580
Guido van Rossum79f25d91997-04-29 20:08:16 +0000581static PyCodeObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000582parse_source_module(pathname, fp)
583 char *pathname;
584 FILE *fp;
585{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000586 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000587 node *n;
588
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000589 n = PyParser_SimpleParseFile(fp, pathname, Py_file_input);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000590 if (n == NULL)
591 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000592 co = PyNode_Compile(n, pathname);
593 PyNode_Free(n);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000594
595 return co;
596}
597
598
599/* Write a compiled module to a file, placing the time of last
600 modification of its source into the header.
601 Errors are ignored, if a write error occurs an attempt is made to
602 remove the file. */
603
604static void
605write_compiled_module(co, cpathname, mtime)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000606 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000607 char *cpathname;
608 long mtime;
609{
610 FILE *fp;
611
612 fp = fopen(cpathname, "wb");
613 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000614 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000615 fprintf(stderr,
616 "# can't create %s\n", cpathname);
617 return;
618 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000619 PyMarshal_WriteLongToFile(MAGIC, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000620 /* First write a 0 for mtime */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000621 PyMarshal_WriteLongToFile(0L, fp);
622 PyMarshal_WriteObjectToFile((PyObject *)co, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000623 if (ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000624 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000625 fprintf(stderr, "# can't write %s\n", cpathname);
626 /* Don't keep partial file */
627 fclose(fp);
628 (void) unlink(cpathname);
629 return;
630 }
631 /* Now write the true mtime */
632 fseek(fp, 4L, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000633 PyMarshal_WriteLongToFile(mtime, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000634 fflush(fp);
635 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000636 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000637 fprintf(stderr, "# wrote %s\n", cpathname);
638#ifdef macintosh
Guido van Rossumbe1a6e21996-02-21 15:29:20 +0000639 setfiletype(cpathname, 'Pyth', 'PYC ');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000640#endif
641}
642
643
644/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000645 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
646 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000647
Guido van Rossum79f25d91997-04-29 20:08:16 +0000648static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000649load_source_module(name, pathname, fp)
650 char *name;
651 char *pathname;
652 FILE *fp;
653{
654 long mtime;
655 FILE *fpc;
656 char buf[MAXPATHLEN+1];
657 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000658 PyCodeObject *co;
659 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000660
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000661 mtime = PyOS_GetLastModificationTime(pathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000662 cpathname = make_compiled_pathname(pathname, buf, MAXPATHLEN+1);
663 if (cpathname != NULL &&
664 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000665 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000666 fclose(fpc);
667 if (co == NULL)
668 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000669 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000670 fprintf(stderr, "import %s # precompiled from %s\n",
671 name, cpathname);
672 }
673 else {
674 co = parse_source_module(pathname, fp);
675 if (co == NULL)
676 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000677 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000678 fprintf(stderr, "import %s # from %s\n",
679 name, pathname);
680 write_compiled_module(co, cpathname, mtime);
681 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000682 m = PyImport_ExecCodeModule(name, (PyObject *)co);
683 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000684
685 return m;
686}
687
688
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000689/* Forward */
690static PyObject *load_module Py_PROTO((char *, FILE *, char *, int));
691static struct filedescr *find_module Py_PROTO((char *, PyObject *,
692 char *, int, FILE **));
Guido van Rossuma86f77d1997-09-09 18:53:47 +0000693static struct _frozen *find_frozen Py_PROTO((char *name));
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000694
695/* Load a package and return its module object WITH INCREMENTED
696 REFERENCE COUNT */
697
698static PyObject *
699load_package(name, pathname)
700 char *name;
701 char *pathname;
702{
703 PyObject *m, *d, *file, *path;
704 int err;
705 char buf[MAXPATHLEN+1];
706 FILE *fp = NULL;
707 struct filedescr *fdp;
708
709 m = PyImport_AddModule(name);
710 if (m == NULL)
711 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000712 if (Py_VerboseFlag)
713 fprintf(stderr, "import %s # directory %s\n",
714 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000715 d = PyModule_GetDict(m);
716 file = PyString_FromString(pathname);
717 if (file == NULL)
718 return NULL;
719 path = Py_BuildValue("[O]", file);
720 if (path == NULL) {
721 Py_DECREF(file);
722 return NULL;
723 }
724 err = PyDict_SetItemString(d, "__file__", file);
725 if (err == 0)
726 err = PyDict_SetItemString(d, "__path__", path);
727 if (err != 0) {
728 m = NULL;
729 goto cleanup;
730 }
731 buf[0] = '\0';
732 fdp = find_module("__init__", path, buf, sizeof(buf), &fp);
733 if (fdp == NULL) {
734 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
735 PyErr_Clear();
736 }
737 else
738 m = NULL;
739 goto cleanup;
740 }
741 m = load_module(name, fp, buf, fdp->type);
742 if (fp != NULL)
743 fclose(fp);
744 cleanup:
745 Py_XINCREF(m);
746 Py_XDECREF(path);
747 Py_XDECREF(file);
748 return m;
749}
750
751
752/* Helper to test for built-in module */
753
754static int
755is_builtin(name)
756 char *name;
757{
758 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +0000759 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
760 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
761 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000762 return -1;
763 else
764 return 1;
765 }
766 }
767 return 0;
768}
769
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000770
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000771/* Search the path (default sys.path) for a module. Return the
772 corresponding filedescr struct, and (via return arguments) the
773 pathname and an open file. Return NULL if the module is not found. */
774
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000775#ifdef MS_COREDLL
776extern FILE *PyWin_FindRegisteredModule();
777#endif
778
Guido van Rossum197346f1997-10-31 18:38:52 +0000779static int find_init_module Py_PROTO((char *)); /* Forward */
780
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000781static struct filedescr *
782find_module(name, path, buf, buflen, p_fp)
783 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000784 PyObject *path;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000785 /* Output parameters: */
786 char *buf;
787 int buflen;
788 FILE **p_fp;
789{
790 int i, npath, len, namelen;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000791 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000792 FILE *fp = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000793 struct stat statbuf;
794
795 if (path == NULL) {
796 if (is_builtin(name)) {
797 static struct filedescr fd = {"", "", C_BUILTIN};
798 return &fd;
799 }
Guido van Rossuma86f77d1997-09-09 18:53:47 +0000800 if (find_frozen(name) != NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000801 static struct filedescr fd = {"", "", PY_FROZEN};
802 return &fd;
803 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000804
Guido van Rossumac279101996-08-22 23:10:58 +0000805#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000806 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
807 if (fp != NULL) {
808 *p_fp = fp;
809 return fdp;
810 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000811#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000812 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000813
814
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000815 if (path == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000816 path = PySys_GetObject("path");
817 if (path == NULL || !PyList_Check(path)) {
818 PyErr_SetString(PyExc_ImportError,
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000819 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000820 return NULL;
821 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000822 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000823 namelen = strlen(name);
824 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000825 PyObject *v = PyList_GetItem(path, i);
826 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000827 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000828 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000829 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000830 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000831 strcpy(buf, PyString_AsString(v));
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000832 if ((int)strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000833 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000834#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000835#ifdef INTERN_STRINGS
836 /*
837 ** Speedup: each sys.path item is interned, and
838 ** FindResourceModule remembers which items refer to
839 ** folders (so we don't have to bother trying to look
840 ** into them for resources).
841 */
842 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
843 v = PyList_GET_ITEM(path, i);
844#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000845 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000846 static struct filedescr resfiledescr =
847 {"", "", PY_RESOURCE};
Jack Jansen9c96a921995-02-15 22:57:06 +0000848
849 return &resfiledescr;
850 }
851#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000852 if (len > 0 && buf[len-1] != SEP
853#ifdef ALTSEP
854 && buf[len-1] != ALTSEP
855#endif
856 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000857 buf[len++] = SEP;
Guido van Rossum40f470f1996-05-23 22:51:04 +0000858#ifdef IMPORT_8x3_NAMES
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000859 /* see if we are searching in directory dos-8x3 */
860 if (len > 7 && !strncmp(buf + len - 8, "dos-8x3", 7)){
Guido van Rossum40f470f1996-05-23 22:51:04 +0000861 int j;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000862 char ch; /* limit name to 8 lower-case characters */
Guido van Rossum40f470f1996-05-23 22:51:04 +0000863 for (j = 0; (ch = name[j]) && j < 8; j++)
864 if (isupper(ch))
865 buf[len++] = tolower(ch);
866 else
867 buf[len++] = ch;
868 }
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000869 else /* Not in dos-8x3, use the full name */
Guido van Rossum6f489d91996-06-28 20:15:15 +0000870#endif
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000871 {
Guido van Rossum40f470f1996-05-23 22:51:04 +0000872 strcpy(buf+len, name);
873 len += namelen;
874 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000875#ifdef HAVE_STAT
876 if (stat(buf, &statbuf) == 0) {
877 static struct filedescr fd = {"", "", PKG_DIRECTORY};
Guido van Rossum197346f1997-10-31 18:38:52 +0000878 if (S_ISDIR(statbuf.st_mode)) {
879 if (find_init_module(buf))
880 return &fd;
881 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000882 }
883#else
884 /* XXX How are you going to test for directories? */
885#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000886#ifdef macintosh
887 fdp = PyMac_FindModuleExtension(buf, &len, name);
888 if (fdp)
889 fp = fopen(buf, fdp->mode);
890#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000891 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000892 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000893 if (Py_VerboseFlag > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000894 fprintf(stderr, "# trying %s\n", buf);
895 fp = fopen(buf, fdp->mode);
896 if (fp != NULL)
897 break;
898 }
Guido van Rossum741689d1997-08-12 14:53:39 +0000899#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000900 if (fp != NULL)
901 break;
902 }
903 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000904 PyErr_Format(PyExc_ImportError,
905 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000906 return NULL;
907 }
908
909 *p_fp = fp;
910 return fdp;
911}
912
Guido van Rossum197346f1997-10-31 18:38:52 +0000913#ifdef HAVE_STAT
914/* Helper to look for __init__.py or __init__.py[co] in potential package */
915static int
916find_init_module(buf)
917 char *buf;
918{
919 int save_len = strlen(buf);
920 int i = save_len;
921 struct stat statbuf;
922
923 if (save_len + 13 >= MAXPATHLEN)
924 return 0;
925 buf[i++] = SEP;
926 strcpy(buf+i, "__init__.py");
927 if (stat(buf, &statbuf) == 0) {
928 buf[save_len] = '\0';
929 return 1;
930 }
931 i += strlen(buf+i);
932 if (Py_OptimizeFlag)
933 strcpy(buf+i, "o");
934 else
935 strcpy(buf+i, "c");
936 if (stat(buf, &statbuf) == 0) {
937 buf[save_len] = '\0';
938 return 1;
939 }
940 buf[save_len] = '\0';
941 return 0;
942}
943#endif /* HAVE_STAT */
944
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000945
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000946static int init_builtin Py_PROTO((char *)); /* Forward */
947
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000948/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000949 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000950
Guido van Rossum79f25d91997-04-29 20:08:16 +0000951static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000952load_module(name, fp, buf, type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000953 char *name;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000954 FILE *fp;
955 char *buf;
956 int type;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000957{
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000958 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000959 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000960 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000961
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000962 /* First check that there's an open file (if we need one) */
963 switch (type) {
964 case PY_SOURCE:
965 case PY_COMPILED:
966 if (fp == NULL) {
967 PyErr_Format(PyExc_ValueError,
968 "file object required for import (type code %d)",
969 type);
970 return NULL;
971 }
972 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000973
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000974 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000975
976 case PY_SOURCE:
977 m = load_source_module(name, buf, fp);
978 break;
979
980 case PY_COMPILED:
981 m = load_compiled_module(name, buf, fp);
982 break;
983
984 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000985 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000986 break;
987
Jack Jansen9c96a921995-02-15 22:57:06 +0000988#ifdef macintosh
989 case PY_RESOURCE:
990 m = PyMac_LoadResourceModule(name, buf);
991 break;
992#endif
993
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000994 case PKG_DIRECTORY:
995 m = load_package(name, buf);
996 break;
997
998 case C_BUILTIN:
999 case PY_FROZEN:
1000 if (type == C_BUILTIN)
1001 err = init_builtin(name);
1002 else
1003 err = PyImport_ImportFrozenModule(name);
1004 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001005 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001006 if (err == 0) {
1007 PyErr_Format(PyExc_ImportError,
1008 "Purported %s module %.200s not found",
1009 type == C_BUILTIN ?
1010 "builtin" : "frozen",
1011 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001012 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001013 }
1014 modules = PyImport_GetModuleDict();
1015 m = PyDict_GetItemString(modules, name);
1016 if (m == NULL) {
1017 PyErr_Format(
1018 PyExc_ImportError,
1019 "%s module %.200s not properly initialized",
1020 type == C_BUILTIN ?
1021 "builtin" : "frozen",
1022 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001023 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001024 }
1025 Py_INCREF(m);
1026 break;
1027
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001028 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001029 PyErr_Format(PyExc_ImportError,
1030 "Don't know how to import %.200s (type code %d)",
1031 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001032 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001033
1034 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001035
1036 return m;
1037}
1038
1039
1040/* Initialize a built-in module.
1041 Return 1 for succes, 0 if the module is not found, and -1 with
1042 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001043
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001044static int
1045init_builtin(name)
1046 char *name;
1047{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001048 struct _inittab *p;
1049 PyObject *mod;
1050
1051 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
1052 return 1;
1053
Guido van Rossum771c6c81997-10-31 18:37:24 +00001054 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001055 if (strcmp(name, p->name) == 0) {
1056 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001057 PyErr_Format(PyExc_ImportError,
1058 "Cannot re-init internal module %.200s",
1059 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001060 return -1;
1061 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001062 if (Py_VerboseFlag)
Guido van Rossum25ce5661997-08-02 03:10:38 +00001063 fprintf(stderr, "import %s # builtin\n", name);
1064 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001065 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001066 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001067 if (_PyImport_FixupExtension(name, name) == NULL)
1068 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001069 return 1;
1070 }
1071 }
1072 return 0;
1073}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001074
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001075
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001076/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001077
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001078static struct _frozen *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001079find_frozen(name)
1080 char *name;
1081{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001082 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001083
Guido van Rossum79f25d91997-04-29 20:08:16 +00001084 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001085 if (p->name == NULL)
1086 return NULL;
1087 if (strcmp(p->name, name) == 0)
1088 break;
1089 }
1090 return p;
1091}
1092
Guido van Rossum79f25d91997-04-29 20:08:16 +00001093static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001094get_frozen_object(name)
1095 char *name;
1096{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001097 struct _frozen *p = find_frozen(name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001098
1099 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001100 PyErr_Format(PyExc_ImportError,
1101 "No such frozen object named %.200s",
1102 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001103 return NULL;
1104 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001105 return PyMarshal_ReadObjectFromString((char *)p->code, p->size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001106}
1107
1108/* Initialize a frozen module.
1109 Return 1 for succes, 0 if the module is not found, and -1 with
1110 an exception set if the initialization failed.
1111 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001112
1113int
Guido van Rossum79f25d91997-04-29 20:08:16 +00001114PyImport_ImportFrozenModule(name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001115 char *name;
1116{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001117 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001118 PyObject *co;
1119 PyObject *m;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001120
1121 if (p == NULL)
1122 return 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001123 if (Py_VerboseFlag)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001124 fprintf(stderr, "import %s # frozen\n", name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001125 co = PyMarshal_ReadObjectFromString((char *)p->code, p->size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001126 if (co == NULL)
1127 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001128 if (!PyCode_Check(co)) {
1129 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001130 PyErr_Format(PyExc_TypeError,
1131 "frozen object %.200s is not a code object",
1132 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001133 return -1;
1134 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001135 m = PyImport_ExecCodeModule(name, co);
1136 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001137 if (m == NULL)
1138 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001139 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001140 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001141}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001142
1143
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001144/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001145 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001146
Guido van Rossum79f25d91997-04-29 20:08:16 +00001147PyObject *
1148PyImport_ImportModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001149 char *name;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001150{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001151 static PyObject *fromlist = NULL;
1152 if (fromlist == NULL && strchr(name, '.') != NULL) {
1153 fromlist = Py_BuildValue("[s]", "*");
1154 if (fromlist == NULL)
1155 return NULL;
1156 }
1157 return PyImport_ImportModuleEx(name, NULL, NULL, fromlist);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001158}
1159
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001160/* Forward declarations for helper routines */
1161static PyObject *get_parent Py_PROTO((PyObject *globals,
1162 char *buf, int *p_buflen));
1163static PyObject *load_next Py_PROTO((PyObject *mod, PyObject *altmod,
1164 char **p_name, char *buf, int *p_buflen));
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001165static int mark_miss Py_PROTO((char *name));
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001166static int ensure_fromlist Py_PROTO((PyObject *mod, PyObject *fromlist,
Guido van Rossum9905ef91997-09-08 16:07:11 +00001167 char *buf, int buflen, int recursive));
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001168static PyObject * import_submodule Py_PROTO((PyObject *mod,
1169 char *name, char *fullname));
1170
1171/* The Magnum Opus of dotted-name import :-) */
1172
1173/* XXX TO DO:
1174 - Remember misses in package directories so package submodules
1175 that all import the same toplevel module don't keep hitting on the
1176 package directory first
1177*/
1178
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001179PyObject *
1180PyImport_ImportModuleEx(name, globals, locals, fromlist)
1181 char *name;
1182 PyObject *globals;
1183 PyObject *locals;
1184 PyObject *fromlist;
1185{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001186 char buf[MAXPATHLEN+1];
1187 int buflen = 0;
1188 PyObject *parent, *head, *next, *tail;
1189
1190 parent = get_parent(globals, buf, &buflen);
1191 if (parent == NULL)
1192 return NULL;
1193
1194 head = load_next(parent, Py_None, &name, buf, &buflen);
1195 if (head == NULL)
1196 return NULL;
1197
1198 tail = head;
1199 Py_INCREF(tail);
1200 while (name) {
1201 next = load_next(tail, tail, &name, buf, &buflen);
1202 Py_DECREF(tail);
1203 if (next == NULL) {
1204 Py_DECREF(head);
1205 return NULL;
1206 }
1207 tail = next;
1208 }
1209
1210 if (fromlist != NULL) {
1211 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1212 fromlist = NULL;
1213 }
1214
1215 if (fromlist == NULL) {
1216 Py_DECREF(tail);
1217 return head;
1218 }
1219
1220 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001221 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001222 Py_DECREF(tail);
1223 return NULL;
1224 }
1225
1226 return tail;
1227}
1228
1229static PyObject *
1230get_parent(globals, buf, p_buflen)
1231 PyObject *globals;
1232 char *buf;
1233 int *p_buflen;
1234{
1235 static PyObject *namestr = NULL;
1236 static PyObject *pathstr = NULL;
1237 PyObject *modname, *modpath, *modules, *parent;
1238
1239 if (globals == NULL || !PyDict_Check(globals))
1240 return Py_None;
1241
1242 if (namestr == NULL) {
1243 namestr = PyString_InternFromString("__name__");
1244 if (namestr == NULL)
1245 return NULL;
1246 }
1247 if (pathstr == NULL) {
1248 pathstr = PyString_InternFromString("__path__");
1249 if (pathstr == NULL)
1250 return NULL;
1251 }
1252
1253 *buf = '\0';
1254 *p_buflen = 0;
1255 modname = PyDict_GetItem(globals, namestr);
1256 if (modname == NULL || !PyString_Check(modname))
1257 return Py_None;
1258
1259 modpath = PyDict_GetItem(globals, pathstr);
1260 if (modpath != NULL) {
1261 int len = PyString_GET_SIZE(modname);
1262 if (len > MAXPATHLEN) {
1263 PyErr_SetString(PyExc_ValueError,
1264 "Module name too long");
1265 return NULL;
1266 }
1267 strcpy(buf, PyString_AS_STRING(modname));
1268 *p_buflen = len;
1269 }
1270 else {
1271 char *start = PyString_AS_STRING(modname);
1272 char *lastdot = strrchr(start, '.');
1273 int len;
1274 if (lastdot == NULL)
1275 return Py_None;
1276 len = lastdot - start;
1277 if (len >= MAXPATHLEN) {
1278 PyErr_SetString(PyExc_ValueError,
1279 "Module name too long");
1280 return NULL;
1281 }
1282 strncpy(buf, start, len);
1283 buf[len] = '\0';
1284 *p_buflen = len;
1285 }
1286
1287 modules = PyImport_GetModuleDict();
1288 parent = PyDict_GetItemString(modules, buf);
1289 if (parent == NULL)
1290 parent = Py_None;
1291 return parent;
1292 /* We expect, but can't guarantee, if parent != None, that:
1293 - parent.__name__ == buf
1294 - parent.__dict__ is globals
1295 If this is violated... Who cares? */
1296}
1297
1298static PyObject *
1299load_next(mod, altmod, p_name, buf, p_buflen)
1300 PyObject *mod;
1301 PyObject *altmod; /* Either None or same as mod */
1302 char **p_name;
1303 char *buf;
1304 int *p_buflen;
1305{
1306 char *name = *p_name;
1307 char *dot = strchr(name, '.');
1308 int len;
1309 char *p;
1310 PyObject *result;
1311
1312 if (dot == NULL) {
1313 *p_name = NULL;
1314 len = strlen(name);
1315 }
1316 else {
1317 *p_name = dot+1;
1318 len = dot-name;
1319 }
1320
1321 p = buf + *p_buflen;
1322 if (p != buf)
1323 *p++ = '.';
1324 if (p+len-buf >= MAXPATHLEN) {
1325 PyErr_SetString(PyExc_ValueError,
1326 "Module name too long");
1327 return NULL;
1328 }
1329 strncpy(p, name, len);
1330 p[len] = '\0';
1331 *p_buflen = p+len-buf;
1332
1333 result = import_submodule(mod, p, buf);
1334 if (result == Py_None && altmod != mod) {
1335 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001336 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001337 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001338 if (result != NULL && result != Py_None) {
1339 if (mark_miss(buf) != 0) {
1340 Py_DECREF(result);
1341 return NULL;
1342 }
1343 strncpy(buf, name, len);
1344 buf[len] = '\0';
1345 *p_buflen = len;
1346 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001347 }
1348 if (result == NULL)
1349 return NULL;
1350
1351 if (result == Py_None) {
1352 Py_DECREF(result);
1353 PyErr_Format(PyExc_ImportError,
1354 "No module named %.200s", name);
1355 return NULL;
1356 }
1357
1358 return result;
1359}
1360
1361static int
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001362mark_miss(name)
1363 char *name;
1364{
1365 PyObject *modules = PyImport_GetModuleDict();
1366 return PyDict_SetItemString(modules, name, Py_None);
1367}
1368
1369static int
Guido van Rossum9905ef91997-09-08 16:07:11 +00001370ensure_fromlist(mod, fromlist, buf, buflen, recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001371 PyObject *mod;
1372 PyObject *fromlist;
1373 char *buf;
1374 int buflen;
Guido van Rossum9905ef91997-09-08 16:07:11 +00001375 int recursive;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001376{
1377 int i;
1378
1379 if (!PyObject_HasAttrString(mod, "__path__"))
1380 return 1;
1381
1382 for (i = 0; ; i++) {
1383 PyObject *item = PySequence_GetItem(fromlist, i);
1384 int hasit;
1385 if (item == NULL) {
1386 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1387 PyErr_Clear();
1388 return 1;
1389 }
1390 return 0;
1391 }
1392 if (!PyString_Check(item)) {
1393 PyErr_SetString(PyExc_TypeError,
1394 "Item in ``from list'' not a string");
1395 Py_DECREF(item);
1396 return 0;
1397 }
1398 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001399 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001400 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001401 /* See if the package defines __all__ */
1402 if (recursive)
1403 continue; /* Avoid endless recursion */
1404 all = PyObject_GetAttrString(mod, "__all__");
1405 if (all == NULL)
1406 PyErr_Clear();
1407 else {
1408 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1409 return 0;
1410 Py_DECREF(all);
1411 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001412 continue;
1413 }
1414 hasit = PyObject_HasAttr(mod, item);
1415 if (!hasit) {
1416 char *subname = PyString_AS_STRING(item);
1417 PyObject *submod;
1418 char *p;
1419 if (buflen + strlen(subname) >= MAXPATHLEN) {
1420 PyErr_SetString(PyExc_ValueError,
1421 "Module name too long");
1422 Py_DECREF(item);
1423 return 0;
1424 }
1425 p = buf + buflen;
1426 *p++ = '.';
1427 strcpy(p, subname);
1428 submod = import_submodule(mod, subname, buf);
1429 Py_XDECREF(submod);
1430 if (submod == NULL) {
1431 Py_DECREF(item);
1432 return 0;
1433 }
1434 }
1435 Py_DECREF(item);
1436 }
1437
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001438 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001439}
1440
1441static PyObject *
1442import_submodule(mod, subname, fullname)
1443 PyObject *mod; /* May be None */
1444 char *subname;
1445 char *fullname;
1446{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001447 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001448 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001449
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001450 /* Require:
1451 if mod == None: subname == fullname
1452 else: mod.__name__ + "." + subname == fullname
1453 */
1454
1455 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001456 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001457 }
1458 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001459 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001460 char buf[MAXPATHLEN+1];
1461 struct filedescr *fdp;
1462 FILE *fp = NULL;
1463
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001464 path = PyObject_GetAttrString(mod, "__path__");
1465 if (path == NULL)
1466 PyErr_Clear();
1467
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001468 buf[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001469 fdp = find_module(subname, path,
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001470 buf, MAXPATHLEN+1, &fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001471 if (fdp == NULL) {
1472 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1473 return NULL;
1474 PyErr_Clear();
1475 Py_INCREF(Py_None);
1476 return Py_None;
1477 }
1478 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001479 if (fp)
1480 fclose(fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001481 if (m != NULL && mod != Py_None) {
1482 if (PyObject_SetAttrString(mod, subname, m) < 0) {
1483 Py_DECREF(m);
1484 m = NULL;
1485 }
1486 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001487 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001488
1489 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001490}
1491
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001492
1493/* Re-import a module of any kind and return its module object, WITH
1494 INCREMENTED REFERENCE COUNT */
1495
Guido van Rossum79f25d91997-04-29 20:08:16 +00001496PyObject *
1497PyImport_ReloadModule(m)
1498 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001499{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001500 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001501 PyObject *path = NULL;
1502 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001503 char buf[MAXPATHLEN+1];
1504 struct filedescr *fdp;
1505 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001506
Guido van Rossum79f25d91997-04-29 20:08:16 +00001507 if (m == NULL || !PyModule_Check(m)) {
1508 PyErr_SetString(PyExc_TypeError,
1509 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001510 return NULL;
1511 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001512 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001513 if (name == NULL)
1514 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001515 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001516 PyErr_Format(PyExc_ImportError,
1517 "reload(): module %.200s not in sys.modules",
1518 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001519 return NULL;
1520 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001521 subname = strrchr(name, '.');
1522 if (subname == NULL)
1523 subname = name;
1524 else {
1525 PyObject *parentname, *parent;
1526 parentname = PyString_FromStringAndSize(name, (subname-name));
1527 if (parentname == NULL)
1528 return NULL;
1529 parent = PyDict_GetItem(modules, parentname);
1530 if (parent == NULL) {
1531 PyErr_Format(PyExc_ImportError,
1532 "reload(): parent %.200s not in sys.modules",
1533 name);
1534 return NULL;
1535 }
1536 subname++;
1537 path = PyObject_GetAttrString(parent, "__path__");
1538 if (path == NULL)
1539 PyErr_Clear();
1540 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001541 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001542 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1543 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001544 if (fdp == NULL)
1545 return NULL;
1546 m = load_module(name, fp, buf, fdp->type);
1547 if (fp)
1548 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001549 return m;
1550}
1551
1552
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001553/* Higher-level import emulator which emulates the "import" statement
1554 more accurately -- it invokes the __import__() function from the
1555 builtins of the current globals. This means that the import is
1556 done using whatever import hooks are installed in the current
1557 environment, e.g. by "ni" or "rexec". */
1558
1559PyObject *
1560PyImport_Import(module_name)
1561 PyObject *module_name;
1562{
1563 static PyObject *silly_list = NULL;
1564 static PyObject *builtins_str = NULL;
1565 static PyObject *import_str = NULL;
1566 static PyObject *standard_builtins = NULL;
1567 PyObject *globals = NULL;
1568 PyObject *import = NULL;
1569 PyObject *builtins = NULL;
1570 PyObject *r = NULL;
1571
1572 /* Initialize constant string objects */
1573 if (silly_list == NULL) {
1574 import_str = PyString_InternFromString("__import__");
1575 if (import_str == NULL)
1576 return NULL;
1577 builtins_str = PyString_InternFromString("__builtins__");
1578 if (builtins_str == NULL)
1579 return NULL;
1580 silly_list = Py_BuildValue("[s]", "__doc__");
1581 if (silly_list == NULL)
1582 return NULL;
1583 }
1584
1585 /* Get the builtins from current globals */
1586 globals = PyEval_GetGlobals();
1587 if(globals != NULL) {
1588 builtins = PyObject_GetItem(globals, builtins_str);
1589 if (builtins == NULL)
1590 goto err;
1591 }
1592 else {
1593 /* No globals -- use standard builtins, and fake globals */
1594 PyErr_Clear();
1595
1596 if (standard_builtins == NULL) {
1597 standard_builtins =
1598 PyImport_ImportModule("__builtin__");
1599 if (standard_builtins == NULL)
1600 return NULL;
1601 }
1602
1603 builtins = standard_builtins;
1604 Py_INCREF(builtins);
1605 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1606 if (globals == NULL)
1607 goto err;
1608 }
1609
1610 /* Get the __import__ function from the builtins */
1611 if (PyDict_Check(builtins))
1612 import=PyObject_GetItem(builtins, import_str);
1613 else
1614 import=PyObject_GetAttr(builtins, import_str);
1615 if (import == NULL)
1616 goto err;
1617
1618 /* Call the _import__ function with the proper argument list */
1619 r = PyObject_CallFunction(import, "OOOO",
1620 module_name, globals, globals, silly_list);
1621
1622 err:
1623 Py_XDECREF(globals);
1624 Py_XDECREF(builtins);
1625 Py_XDECREF(import);
1626
1627 return r;
1628}
1629
1630
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001631/* Module 'imp' provides Python access to the primitives used for
1632 importing modules.
1633*/
1634
Guido van Rossum79f25d91997-04-29 20:08:16 +00001635static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001636imp_get_magic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001637 PyObject *self;
1638 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001639{
1640 char buf[4];
1641
Guido van Rossum79f25d91997-04-29 20:08:16 +00001642 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001643 return NULL;
Guido van Rossum6bf62da1997-04-11 20:37:35 +00001644 buf[0] = (char) ((MAGIC >> 0) & 0xff);
1645 buf[1] = (char) ((MAGIC >> 8) & 0xff);
1646 buf[2] = (char) ((MAGIC >> 16) & 0xff);
1647 buf[3] = (char) ((MAGIC >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001648
Guido van Rossum79f25d91997-04-29 20:08:16 +00001649 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001650}
1651
Guido van Rossum79f25d91997-04-29 20:08:16 +00001652static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001653imp_get_suffixes(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001654 PyObject *self;
1655 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001656{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001657 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001658 struct filedescr *fdp;
1659
Guido van Rossum79f25d91997-04-29 20:08:16 +00001660 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001661 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001662 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001663 if (list == NULL)
1664 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001665 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
1666 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001667 fdp->suffix, fdp->mode, fdp->type);
1668 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001669 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001670 return NULL;
1671 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001672 if (PyList_Append(list, item) < 0) {
1673 Py_DECREF(list);
1674 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001675 return NULL;
1676 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001677 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001678 }
1679 return list;
1680}
1681
Guido van Rossum79f25d91997-04-29 20:08:16 +00001682static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001683call_find_module(name, path)
1684 char *name;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001685 PyObject *path; /* list or None or NULL */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001686{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001687 extern int fclose Py_PROTO((FILE *));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001688 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001689 struct filedescr *fdp;
1690 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001691 FILE *fp = NULL;
1692
1693 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001694 if (path == Py_None)
1695 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001696 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
1697 if (fdp == NULL)
1698 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001699 if (fp != NULL) {
1700 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
1701 if (fob == NULL) {
1702 fclose(fp);
1703 return NULL;
1704 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001705 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001706 else {
1707 fob = Py_None;
1708 Py_INCREF(fob);
1709 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001710 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001711 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001712 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001713 return ret;
1714}
1715
Guido van Rossum79f25d91997-04-29 20:08:16 +00001716static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001717imp_find_module(self, args)
1718 PyObject *self;
1719 PyObject *args;
1720{
1721 char *name;
1722 PyObject *path = NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001723 if (!PyArg_ParseTuple(args, "s|O", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001724 return NULL;
1725 return call_find_module(name, path);
1726}
1727
1728static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001729imp_init_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001730 PyObject *self;
1731 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001732{
1733 char *name;
1734 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001735 PyObject *m;
1736 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001737 return NULL;
1738 ret = init_builtin(name);
1739 if (ret < 0)
1740 return NULL;
1741 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001742 Py_INCREF(Py_None);
1743 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001744 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001745 m = PyImport_AddModule(name);
1746 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001747 return m;
1748}
1749
Guido van Rossum79f25d91997-04-29 20:08:16 +00001750static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001751imp_init_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001752 PyObject *self;
1753 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001754{
1755 char *name;
1756 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001757 PyObject *m;
1758 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001759 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001760 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001761 if (ret < 0)
1762 return NULL;
1763 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001764 Py_INCREF(Py_None);
1765 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001766 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001767 m = PyImport_AddModule(name);
1768 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001769 return m;
1770}
1771
Guido van Rossum79f25d91997-04-29 20:08:16 +00001772static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001773imp_get_frozen_object(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001774 PyObject *self;
1775 PyObject *args;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001776{
1777 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00001778
Guido van Rossum79f25d91997-04-29 20:08:16 +00001779 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001780 return NULL;
1781 return get_frozen_object(name);
1782}
1783
Guido van Rossum79f25d91997-04-29 20:08:16 +00001784static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001785imp_is_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001786 PyObject *self;
1787 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001788{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001789 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001790 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001791 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001792 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001793}
1794
Guido van Rossum79f25d91997-04-29 20:08:16 +00001795static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001796imp_is_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001797 PyObject *self;
1798 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001799{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001800 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001801 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001802 return NULL;
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001803 return PyInt_FromLong(find_frozen(name) != NULL);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001804}
1805
1806static FILE *
1807get_file(pathname, fob, mode)
1808 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001809 PyObject *fob;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001810 char *mode;
1811{
1812 FILE *fp;
1813 if (fob == NULL) {
1814 fp = fopen(pathname, mode);
1815 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001816 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001817 }
1818 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001819 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001820 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001821 PyErr_SetString(PyExc_ValueError,
1822 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001823 }
1824 return fp;
1825}
1826
Guido van Rossum79f25d91997-04-29 20:08:16 +00001827static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001828imp_load_compiled(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001829 PyObject *self;
1830 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001831{
1832 char *name;
1833 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001834 PyObject *fob = NULL;
1835 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001836 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001837 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00001838 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001839 return NULL;
1840 fp = get_file(pathname, fob, "rb");
1841 if (fp == NULL)
1842 return NULL;
1843 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001844 if (fob == NULL)
1845 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001846 return m;
1847}
1848
Guido van Rossum79f25d91997-04-29 20:08:16 +00001849static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001850imp_load_dynamic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001851 PyObject *self;
1852 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001853{
1854 char *name;
1855 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001856 PyObject *fob = NULL;
1857 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00001858 FILE *fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001859 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
1860 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001861 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001862 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00001863 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001864 if (fp == NULL)
1865 return NULL;
1866 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001867 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00001868 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001869}
1870
Guido van Rossum79f25d91997-04-29 20:08:16 +00001871static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001872imp_load_source(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001873 PyObject *self;
1874 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001875{
1876 char *name;
1877 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001878 PyObject *fob = NULL;
1879 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001880 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001881 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00001882 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001883 return NULL;
1884 fp = get_file(pathname, fob, "r");
1885 if (fp == NULL)
1886 return NULL;
1887 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001888 if (fob == NULL)
1889 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001890 return m;
1891}
1892
Jack Jansen9c96a921995-02-15 22:57:06 +00001893#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00001894static PyObject *
Jack Jansen9c96a921995-02-15 22:57:06 +00001895imp_load_resource(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001896 PyObject *self;
1897 PyObject *args;
Jack Jansen9c96a921995-02-15 22:57:06 +00001898{
1899 char *name;
1900 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001901 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00001902
Guido van Rossum79f25d91997-04-29 20:08:16 +00001903 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00001904 return NULL;
1905 m = PyMac_LoadResourceModule(name, pathname);
1906 return m;
1907}
1908#endif /* macintosh */
1909
Guido van Rossum79f25d91997-04-29 20:08:16 +00001910static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001911imp_load_module(self, args)
1912 PyObject *self;
1913 PyObject *args;
1914{
1915 char *name;
1916 PyObject *fob;
1917 char *pathname;
1918 char *suffix; /* Unused */
1919 char *mode;
1920 int type;
1921 FILE *fp;
1922
1923 if (!PyArg_ParseTuple(args, "sOs(ssi)",
1924 &name, &fob, &pathname,
1925 &suffix, &mode, &type))
1926 return NULL;
1927 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
1928 PyErr_Format(PyExc_ValueError,
1929 "invalid file open mode %.200s", mode);
1930 return NULL;
1931 }
1932 if (fob == Py_None)
1933 fp = NULL;
1934 else {
1935 if (!PyFile_Check(fob)) {
1936 PyErr_SetString(PyExc_ValueError,
1937 "load_module arg#2 should be a file or None");
1938 return NULL;
1939 }
1940 fp = get_file(pathname, fob, mode);
1941 if (fp == NULL)
1942 return NULL;
1943 }
1944 return load_module(name, fp, pathname, type);
1945}
1946
1947static PyObject *
1948imp_load_package(self, args)
1949 PyObject *self;
1950 PyObject *args;
1951{
1952 char *name;
1953 char *pathname;
1954 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
1955 return NULL;
1956 return load_package(name, pathname);
1957}
1958
1959static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001960imp_new_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001961 PyObject *self;
1962 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001963{
1964 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001965 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001966 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001967 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001968}
1969
Guido van Rossum0207e6d1997-09-09 22:04:42 +00001970/* Doc strings */
1971
1972static char doc_imp[] = "\
1973This module provides the components needed to build your own\n\
1974__import__ function. Undocumented functions are obsolete.\n\
1975";
1976
1977static char doc_find_module[] = "\
1978find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
1979Search for a module. If path is omitted or None, search for a\n\
1980built-in, frozen or special module and continue search in sys.path.\n\
1981The module name cannot contain '.'; to search for a submodule of a\n\
1982package, pass the submodule name and the package's __path__.\
1983";
1984
1985static char doc_load_module[] = "\
1986load_module(name, file, filename, (suffix, mode, type)) -> module\n\
1987Load a module, given information returned by find_module().\n\
1988The module name must include the full package name, if any.\
1989";
1990
1991static char doc_get_magic[] = "\
1992get_magic() -> string\n\
1993Return the magic number for .pyc or .pyo files.\
1994";
1995
1996static char doc_get_suffixes[] = "\
1997get_suffixes() -> [(suffix, mode, type), ...]\n\
1998Return a list of (suffix, mode, type) tuples describing the files\n\
1999that find_module() looks for.\
2000";
2001
2002static char doc_new_module[] = "\
2003new_module(name) -> module\n\
2004Create a new module. Do not enter it in sys.modules.\n\
2005The module name must include the full package name, if any.\
2006";
2007
Guido van Rossum79f25d91997-04-29 20:08:16 +00002008static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002009 {"find_module", imp_find_module, 1, doc_find_module},
2010 {"get_magic", imp_get_magic, 1, doc_get_magic},
2011 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2012 {"load_module", imp_load_module, 1, doc_load_module},
2013 {"new_module", imp_new_module, 1, doc_new_module},
2014 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002015 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002016 {"init_builtin", imp_init_builtin, 1},
2017 {"init_frozen", imp_init_frozen, 1},
2018 {"is_builtin", imp_is_builtin, 1},
2019 {"is_frozen", imp_is_frozen, 1},
2020 {"load_compiled", imp_load_compiled, 1},
2021 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002022 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002023#ifdef macintosh
2024 {"load_resource", imp_load_resource, 1},
2025#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002026 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002027 {NULL, NULL} /* sentinel */
2028};
2029
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002030int
2031setint(d, name, value)
2032 PyObject *d;
2033 char *name;
2034 int value;
2035{
2036 PyObject *v;
2037 int err;
2038
2039 v = PyInt_FromLong((long)value);
2040 err = PyDict_SetItemString(d, name, v);
2041 Py_XDECREF(v);
2042 return err;
2043}
2044
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002045void
2046initimp()
2047{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002048 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002049
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002050 m = Py_InitModule4("imp", imp_methods, doc_imp,
2051 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002052 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002053
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002054 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2055 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2056 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2057 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2058 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2059 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2060 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2061 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002062
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002063 failure:
2064 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002065}