blob: 80e2b8f1eed02d4de9710eebc0ca1f81216ba9b0 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/* Module definition and import implementation */
33
Guido van Rossum79f25d91997-04-29 20:08:16 +000034#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000035
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000036#include "node.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000037#include "token.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000038#include "errcode.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +000039#include "marshal.h"
40#include "compile.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000041#include "eval.h"
Guido van Rossumd8bac6d1992-02-26 15:19:13 +000042#include "osdefs.h"
Guido van Rossum1ae940a1995-01-02 19:04:15 +000043#include "importdl.h"
Jack Jansen9c96a921995-02-15 22:57:06 +000044#ifdef macintosh
45#include "macglue.h"
46#endif
Guido van Rossumc405b7b1991-06-04 19:39:42 +000047
Guido van Rossum80bb9651996-12-05 23:27:02 +000048#ifdef HAVE_UNISTD_H
49#include <unistd.h>
50#endif
51
Guido van Rossumaee0bad1997-09-05 07:33:22 +000052/* We expect that stat exists on most systems.
53 It's confirmed on Unix, Mac and Windows.
54 If you don't have it, add #define DONT_HAVE_STAT to your config.h. */
55#ifndef DONT_HAVE_STAT
56#define HAVE_STAT
57
58#include <sys/types.h>
59#include <sys/stat.h>
60
Guido van Rossum595d7ba1997-12-05 21:45:29 +000061#if defined(PYCC_VACPP)
62/* VisualAge C/C++ Failed to Define MountType Field in sys/stat.h */
63#define S_IFMT (S_IFDIR|S_IFCHR|S_IFREG)
64#endif
65
Guido van Rossumaee0bad1997-09-05 07:33:22 +000066#ifndef S_ISDIR
67#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
68#endif
69
70#endif
71
72
Guido van Rossum79f25d91997-04-29 20:08:16 +000073extern long PyOS_GetLastModificationTime(); /* In getmtime.c */
Guido van Rossum21d335e1993-10-15 13:01:11 +000074
Guido van Rossum6c849691994-09-26 15:47:17 +000075/* Magic word to reject .pyc files generated by other Python versions */
Guido van Rossum7faeab31995-07-07 22:50:36 +000076/* Change for each incompatible change */
77/* The value of CR and LF is incorporated so if you ever read or write
78 a .pyc file in text mode the magic number will be wrong; also, the
79 Apple MPW compiler swaps their values, botching string constants */
80/* XXX Perhaps the magic number should be frozen and a version field
81 added to the .pyc file header? */
Guido van Rossumdd5db431997-01-17 21:06:11 +000082/* New way to come up with the magic number: (YEAR-1995), MONTH, DAY */
Guido van Rossum99d18251997-01-24 03:44:53 +000083#define MAGIC (20121 | ((long)'\r'<<16) | ((long)'\n'<<24))
Guido van Rossum3ddee711991-12-16 13:06:34 +000084
Guido van Rossum25ce5661997-08-02 03:10:38 +000085/* See _PyImport_FixupExtension() below */
86static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000087
Guido van Rossum771c6c81997-10-31 18:37:24 +000088/* This table is defined in config.c: */
89extern struct _inittab _PyImport_Inittab[];
90
91struct _inittab *PyImport_Inittab = _PyImport_Inittab;
Guido van Rossum66f1fa81991-04-03 19:03:52 +000092
Guido van Rossum1ae940a1995-01-02 19:04:15 +000093/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000094
95void
Guido van Rossum25ce5661997-08-02 03:10:38 +000096_PyImport_Init()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000097{
Guido van Rossum0824f631997-03-11 18:37:35 +000098 if (Py_OptimizeFlag) {
99 /* Replace ".pyc" with ".pyo" in import_filetab */
100 struct filedescr *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000101 for (p = _PyImport_Filetab; p->suffix != NULL; p++) {
Guido van Rossum0824f631997-03-11 18:37:35 +0000102 if (strcmp(p->suffix, ".pyc") == 0)
103 p->suffix = ".pyo";
104 }
105 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000106}
107
Guido van Rossum25ce5661997-08-02 03:10:38 +0000108void
109_PyImport_Fini()
110{
111 Py_XDECREF(extensions);
112 extensions = NULL;
113}
114
115
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000116/* Locking primitives to prevent parallel imports of the same module
117 in different threads to return with a partially loaded module.
118 These calls are serialized by the global interpreter lock. */
119
120#ifdef WITH_THREAD
121
122#include "thread.h"
123
124static type_lock import_lock = 0;
125static long import_lock_thread = -1;
126static int import_lock_level = 0;
127
128static void
129lock_import()
130{
131 long me = get_thread_ident();
132 if (me == -1)
133 return; /* Too bad */
134 if (import_lock == NULL)
135 import_lock = allocate_lock();
136 if (import_lock_thread == me) {
137 import_lock_level++;
138 return;
139 }
140 if (import_lock_thread != -1 || !acquire_lock(import_lock, 0)) {
141 PyThreadState *tstate = PyEval_SaveThread();
142 acquire_lock(import_lock, 1);
143 PyEval_RestoreThread(tstate);
144 }
145 import_lock_thread = me;
146 import_lock_level = 1;
147}
148
149static void
150unlock_import()
151{
152 long me = get_thread_ident();
153 if (me == -1)
154 return; /* Too bad */
155 if (import_lock_thread != me)
156 Py_FatalError("unlock_import: not holding the import lock");
157 import_lock_level--;
158 if (import_lock_level == 0) {
159 import_lock_thread = -1;
160 release_lock(import_lock);
161 }
162}
163
164#else
165
166#define lock_import()
167#define unlock_import()
168
169#endif
170
Guido van Rossum25ce5661997-08-02 03:10:38 +0000171/* Helper for sys */
172
173PyObject *
174PyImport_GetModuleDict()
175{
176 PyInterpreterState *interp = PyThreadState_Get()->interp;
177 if (interp->modules == NULL)
178 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
179 return interp->modules;
180}
181
Guido van Rossum3f5da241990-12-20 15:06:42 +0000182
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000183/* List of names to clear in sys */
184static char* sys_deletes[] = {
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000185 "path", "argv", "ps1", "ps2", "exitfunc",
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000186 "exc_type", "exc_value", "exc_traceback",
187 "last_type", "last_value", "last_traceback",
188 NULL
189};
190
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000191static char* sys_files[] = {
192 "stdin", "__stdin__",
193 "stdout", "__stdout__",
194 "stderr", "__stderr__",
195 NULL
196};
197
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000198
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000199/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000200
Guido van Rossum3f5da241990-12-20 15:06:42 +0000201void
Guido van Rossum79f25d91997-04-29 20:08:16 +0000202PyImport_Cleanup()
Guido van Rossum3f5da241990-12-20 15:06:42 +0000203{
Guido van Rossum758eec01998-01-19 21:58:26 +0000204 int pos, ndone;
205 char *name;
206 PyObject *key, *value, *dict;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000207 PyInterpreterState *interp = PyThreadState_Get()->interp;
Guido van Rossum758eec01998-01-19 21:58:26 +0000208 PyObject *modules = interp->modules;
209
210 if (modules == NULL)
211 return; /* Already done */
212
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000213 /* Delete some special variables first. These are common
214 places where user values hide and people complain when their
215 destructors fail. Since the modules containing them are
216 deleted *last* of all, they would come too late in the normal
217 destruction order. Sigh. */
218
219 value = PyDict_GetItemString(modules, "__builtin__");
220 if (value != NULL && PyModule_Check(value)) {
221 dict = PyModule_GetDict(value);
222 if (Py_VerboseFlag)
223 fprintf(stderr, "# clear __builtin__._\n");
224 PyDict_SetItemString(dict, "_", Py_None);
225 }
226 value = PyDict_GetItemString(modules, "sys");
227 if (value != NULL && PyModule_Check(value)) {
228 char **p;
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000229 PyObject *v;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000230 dict = PyModule_GetDict(value);
231 for (p = sys_deletes; *p != NULL; p++) {
232 if (Py_VerboseFlag)
233 fprintf(stderr, "# clear sys.%s\n", *p);
234 PyDict_SetItemString(dict, *p, Py_None);
235 }
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000236 for (p = sys_files; *p != NULL; p+=2) {
237 if (Py_VerboseFlag)
238 fprintf(stderr, "# restore sys.%s\n", *p);
239 v = PyDict_GetItemString(dict, *(p+1));
240 if (v == NULL)
241 v = Py_None;
242 PyDict_SetItemString(dict, *p, v);
243 }
244 }
245
246 /* First, delete __main__ */
247 value = PyDict_GetItemString(modules, "__main__");
248 if (value != NULL && PyModule_Check(value)) {
249 if (Py_VerboseFlag)
250 fprintf(stderr, "# cleanup __main__\n");
251 _PyModule_Clear(value);
252 PyDict_SetItemString(modules, "__main__", Py_None);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000253 }
254
Guido van Rossum758eec01998-01-19 21:58:26 +0000255 /* The special treatment of __builtin__ here is because even
256 when it's not referenced as a module, its dictionary is
257 referenced by almost every module's __builtins__. Since
258 deleting a module clears its dictionary (even if there are
259 references left to it), we need to delete the __builtin__
260 module last. Likewise, we don't delete sys until the very
261 end because it is implicitly referenced (e.g. by print).
262
263 Also note that we 'delete' modules by replacing their entry
264 in the modules dict with None, rather than really deleting
265 them; this avoids a rehash of the modules dictionary and
266 also marks them as "non existent" so they won't be
267 re-imported. */
268
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000269 /* Next, repeatedly delete modules with a reference count of
Guido van Rossum758eec01998-01-19 21:58:26 +0000270 one (skipping __builtin__ and sys) and delete them */
271 do {
272 ndone = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000273 pos = 0;
Guido van Rossum758eec01998-01-19 21:58:26 +0000274 while (PyDict_Next(modules, &pos, &key, &value)) {
275 if (value->ob_refcnt != 1)
276 continue;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000277 if (PyModule_Check(value)) {
Guido van Rossum758eec01998-01-19 21:58:26 +0000278 name = PyString_AsString(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000279 if (strcmp(name, "__builtin__") == 0)
280 continue;
281 if (strcmp(name, "sys") == 0)
282 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000283 if (Py_VerboseFlag)
284 fprintf(stderr,
285 "# cleanup[1] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000286 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000287 PyDict_SetItem(modules, key, Py_None);
288 ndone++;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000289 }
290 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000291 } while (ndone > 0);
292
Guido van Rossum758eec01998-01-19 21:58:26 +0000293 /* Next, delete all modules (still skipping __builtin__ and sys) */
294 pos = 0;
295 while (PyDict_Next(modules, &pos, &key, &value)) {
296 if (PyModule_Check(value)) {
297 name = PyString_AsString(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000298 if (strcmp(name, "__builtin__") == 0)
299 continue;
300 if (strcmp(name, "sys") == 0)
301 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000302 if (Py_VerboseFlag)
303 fprintf(stderr, "# cleanup[2] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000304 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000305 PyDict_SetItem(modules, key, Py_None);
306 }
307 }
308
309 /* Next, delete sys and __builtin__ (in that order) */
310 value = PyDict_GetItemString(modules, "sys");
311 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000312 if (Py_VerboseFlag)
313 fprintf(stderr, "# cleanup sys\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000314 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000315 PyDict_SetItemString(modules, "sys", Py_None);
316 }
317 value = PyDict_GetItemString(modules, "__builtin__");
318 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000319 if (Py_VerboseFlag)
320 fprintf(stderr, "# cleanup __builtin__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000321 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000322 PyDict_SetItemString(modules, "__builtin__", Py_None);
323 }
324
325 /* Finally, clear and delete the modules directory */
326 PyDict_Clear(modules);
327 interp->modules = NULL;
328 Py_DECREF(modules);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000329}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000330
331
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000332/* Helper for pythonrun.c -- return magic number */
333
334long
Guido van Rossum79f25d91997-04-29 20:08:16 +0000335PyImport_GetMagicNumber()
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000336{
337 return MAGIC;
338}
339
340
Guido van Rossum25ce5661997-08-02 03:10:38 +0000341/* Magic for extension modules (built-in as well as dynamically
342 loaded). To prevent initializing an extension module more than
343 once, we keep a static dictionary 'extensions' keyed by module name
344 (for built-in modules) or by filename (for dynamically loaded
345 modules), containing these modules. A copy od the module's
346 dictionary is stored by calling _PyImport_FixupExtension()
347 immediately after the module initialization function succeeds. A
348 copy can be retrieved from there by calling
349 _PyImport_FindExtension(). */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000350
Guido van Rossum79f25d91997-04-29 20:08:16 +0000351PyObject *
Guido van Rossum25ce5661997-08-02 03:10:38 +0000352_PyImport_FixupExtension(name, filename)
353 char *name;
354 char *filename;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000355{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000356 PyObject *modules, *mod, *dict, *copy;
357 if (extensions == NULL) {
358 extensions = PyDict_New();
359 if (extensions == NULL)
360 return NULL;
361 }
362 modules = PyImport_GetModuleDict();
363 mod = PyDict_GetItemString(modules, name);
364 if (mod == NULL || !PyModule_Check(mod)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000365 PyErr_Format(PyExc_SystemError,
366 "_PyImport_FixupExtension: module %.200s not loaded", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000367 return NULL;
368 }
369 dict = PyModule_GetDict(mod);
370 if (dict == NULL)
371 return NULL;
372 copy = PyObject_CallMethod(dict, "copy", "");
373 if (copy == NULL)
374 return NULL;
375 PyDict_SetItemString(extensions, filename, copy);
376 Py_DECREF(copy);
377 return copy;
378}
379
380PyObject *
381_PyImport_FindExtension(name, filename)
382 char *name;
383 char *filename;
384{
385 PyObject *dict, *mod, *mdict, *result;
386 if (extensions == NULL)
387 return NULL;
388 dict = PyDict_GetItemString(extensions, filename);
389 if (dict == NULL)
390 return NULL;
391 mod = PyImport_AddModule(name);
392 if (mod == NULL)
393 return NULL;
394 mdict = PyModule_GetDict(mod);
395 if (mdict == NULL)
396 return NULL;
397 result = PyObject_CallMethod(mdict, "update", "O", dict);
398 if (result == NULL)
399 return NULL;
400 Py_DECREF(result);
401 if (Py_VerboseFlag)
402 fprintf(stderr, "import %s # previously loaded (%s)\n",
403 name, filename);
404 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000405}
406
407
408/* Get the module object corresponding to a module name.
409 First check the modules dictionary if there's one there,
410 if not, create a new one and insert in in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000411 Because the former action is most common, THIS DOES NOT RETURN A
412 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000413
Guido van Rossum79f25d91997-04-29 20:08:16 +0000414PyObject *
415PyImport_AddModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000416 char *name;
417{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000418 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000419 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000420
Guido van Rossum25ce5661997-08-02 03:10:38 +0000421 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
Guido van Rossum79f25d91997-04-29 20:08:16 +0000422 PyModule_Check(m))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000423 return m;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000424 m = PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000425 if (m == NULL)
426 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000427 if (PyDict_SetItemString(modules, name, m) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000428 Py_DECREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000429 return NULL;
430 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000431 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000432
433 return m;
434}
435
436
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000437/* Execute a code object in a module and return the module object
438 WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000439
Guido van Rossum79f25d91997-04-29 20:08:16 +0000440PyObject *
441PyImport_ExecCodeModule(name, co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000442 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000443 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000444{
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000445 return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
446}
447
448PyObject *
449PyImport_ExecCodeModuleEx(name, co, pathname)
450 char *name;
451 PyObject *co;
452 char *pathname;
453{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000454 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000455 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000456
Guido van Rossum79f25d91997-04-29 20:08:16 +0000457 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000458 if (m == NULL)
459 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000460 d = PyModule_GetDict(m);
461 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
462 if (PyDict_SetItemString(d, "__builtins__",
463 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000464 return NULL;
465 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000466 /* Remember the filename as the __file__ attribute */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000467 v = NULL;
468 if (pathname != NULL) {
469 v = PyString_FromString(pathname);
470 if (v == NULL)
471 PyErr_Clear();
472 }
473 if (v == NULL) {
474 v = ((PyCodeObject *)co)->co_filename;
475 Py_INCREF(v);
476 }
477 if (PyDict_SetItemString(d, "__file__", v) != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000478 PyErr_Clear(); /* Not important enough to report */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000479 Py_DECREF(v);
480
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000481 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000482 if (v == NULL)
483 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000484 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000485
Guido van Rossum25ce5661997-08-02 03:10:38 +0000486 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000487 PyErr_Format(PyExc_ImportError,
488 "Loaded module %.200s not found in sys.modules",
489 name);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000490 return NULL;
491 }
492
Guido van Rossum79f25d91997-04-29 20:08:16 +0000493 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000494
495 return m;
496}
497
498
499/* Given a pathname for a Python source file, fill a buffer with the
500 pathname for the corresponding compiled file. Return the pathname
501 for the compiled file, or NULL if there's no space in the buffer.
502 Doesn't set an exception. */
503
504static char *
505make_compiled_pathname(pathname, buf, buflen)
506 char *pathname;
507 char *buf;
508 int buflen;
509{
510 int len;
511
512 len = strlen(pathname);
513 if (len+2 > buflen)
514 return NULL;
515 strcpy(buf, pathname);
Guido van Rossum0824f631997-03-11 18:37:35 +0000516 strcpy(buf+len, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000517
518 return buf;
519}
520
521
522/* Given a pathname for a Python source file, its time of last
523 modification, and a pathname for a compiled file, check whether the
524 compiled file represents the same version of the source. If so,
525 return a FILE pointer for the compiled file, positioned just after
526 the header; if not, return NULL.
527 Doesn't set an exception. */
528
529static FILE *
530check_compiled_module(pathname, mtime, cpathname)
531 char *pathname;
532 long mtime;
533 char *cpathname;
534{
535 FILE *fp;
536 long magic;
537 long pyc_mtime;
538
539 fp = fopen(cpathname, "rb");
540 if (fp == NULL)
541 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000542 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000543 if (magic != MAGIC) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000544 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000545 fprintf(stderr, "# %s has bad magic\n", cpathname);
546 fclose(fp);
547 return NULL;
548 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000549 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000550 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000551 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000552 fprintf(stderr, "# %s has bad mtime\n", cpathname);
553 fclose(fp);
554 return NULL;
555 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000556 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000557 fprintf(stderr, "# %s matches %s\n", cpathname, pathname);
558 return fp;
559}
560
561
562/* Read a code object from a file and check it for validity */
563
Guido van Rossum79f25d91997-04-29 20:08:16 +0000564static PyCodeObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000565read_compiled_module(cpathname, fp)
566 char *cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000567 FILE *fp;
568{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000569 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000570
Guido van Rossum79f25d91997-04-29 20:08:16 +0000571 co = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000572 /* Ugly: rd_object() may return NULL with or without error */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000573 if (co == NULL || !PyCode_Check(co)) {
574 if (!PyErr_Occurred())
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000575 PyErr_Format(PyExc_ImportError,
576 "Non-code object in %.200s", cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000577 Py_XDECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000578 return NULL;
579 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000580 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000581}
582
583
584/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000585 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000586
Guido van Rossum79f25d91997-04-29 20:08:16 +0000587static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000588load_compiled_module(name, cpathname, fp)
589 char *name;
590 char *cpathname;
591 FILE *fp;
592{
593 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000594 PyCodeObject *co;
595 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000596
Guido van Rossum79f25d91997-04-29 20:08:16 +0000597 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000598 if (magic != MAGIC) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000599 PyErr_Format(PyExc_ImportError,
600 "Bad magic number in %.200s", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000601 return NULL;
602 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000603 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000604 co = read_compiled_module(cpathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000605 if (co == NULL)
606 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000607 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000608 fprintf(stderr, "import %s # precompiled from %s\n",
609 name, cpathname);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000610 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000611 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000612
613 return m;
614}
615
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000616/* Parse a source file and return the corresponding code object */
617
Guido van Rossum79f25d91997-04-29 20:08:16 +0000618static PyCodeObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000619parse_source_module(pathname, fp)
620 char *pathname;
621 FILE *fp;
622{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000623 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000624 node *n;
625
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000626 n = PyParser_SimpleParseFile(fp, pathname, Py_file_input);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000627 if (n == NULL)
628 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000629 co = PyNode_Compile(n, pathname);
630 PyNode_Free(n);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000631
632 return co;
633}
634
635
636/* Write a compiled module to a file, placing the time of last
637 modification of its source into the header.
638 Errors are ignored, if a write error occurs an attempt is made to
639 remove the file. */
640
641static void
642write_compiled_module(co, cpathname, mtime)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000643 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000644 char *cpathname;
645 long mtime;
646{
647 FILE *fp;
648
649 fp = fopen(cpathname, "wb");
650 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000651 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000652 fprintf(stderr,
653 "# can't create %s\n", cpathname);
654 return;
655 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000656 PyMarshal_WriteLongToFile(MAGIC, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000657 /* First write a 0 for mtime */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000658 PyMarshal_WriteLongToFile(0L, fp);
659 PyMarshal_WriteObjectToFile((PyObject *)co, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000660 if (ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000661 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000662 fprintf(stderr, "# can't write %s\n", cpathname);
663 /* Don't keep partial file */
664 fclose(fp);
665 (void) unlink(cpathname);
666 return;
667 }
668 /* Now write the true mtime */
669 fseek(fp, 4L, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000670 PyMarshal_WriteLongToFile(mtime, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000671 fflush(fp);
672 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000673 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000674 fprintf(stderr, "# wrote %s\n", cpathname);
675#ifdef macintosh
Guido van Rossumbe1a6e21996-02-21 15:29:20 +0000676 setfiletype(cpathname, 'Pyth', 'PYC ');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000677#endif
678}
679
680
681/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000682 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
683 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000684
Guido van Rossum79f25d91997-04-29 20:08:16 +0000685static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000686load_source_module(name, pathname, fp)
687 char *name;
688 char *pathname;
689 FILE *fp;
690{
691 long mtime;
692 FILE *fpc;
693 char buf[MAXPATHLEN+1];
694 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000695 PyCodeObject *co;
696 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000697
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000698 mtime = PyOS_GetLastModificationTime(pathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000699 cpathname = make_compiled_pathname(pathname, buf, MAXPATHLEN+1);
700 if (cpathname != NULL &&
701 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000702 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000703 fclose(fpc);
704 if (co == NULL)
705 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000706 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000707 fprintf(stderr, "import %s # precompiled from %s\n",
708 name, cpathname);
709 }
710 else {
711 co = parse_source_module(pathname, fp);
712 if (co == NULL)
713 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000714 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000715 fprintf(stderr, "import %s # from %s\n",
716 name, pathname);
717 write_compiled_module(co, cpathname, mtime);
718 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000719 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000720 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000721
722 return m;
723}
724
725
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000726/* Forward */
727static PyObject *load_module Py_PROTO((char *, FILE *, char *, int));
728static struct filedescr *find_module Py_PROTO((char *, PyObject *,
729 char *, int, FILE **));
Guido van Rossuma86f77d1997-09-09 18:53:47 +0000730static struct _frozen *find_frozen Py_PROTO((char *name));
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000731
732/* Load a package and return its module object WITH INCREMENTED
733 REFERENCE COUNT */
734
735static PyObject *
736load_package(name, pathname)
737 char *name;
738 char *pathname;
739{
740 PyObject *m, *d, *file, *path;
741 int err;
742 char buf[MAXPATHLEN+1];
743 FILE *fp = NULL;
744 struct filedescr *fdp;
745
746 m = PyImport_AddModule(name);
747 if (m == NULL)
748 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000749 if (Py_VerboseFlag)
750 fprintf(stderr, "import %s # directory %s\n",
751 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000752 d = PyModule_GetDict(m);
753 file = PyString_FromString(pathname);
754 if (file == NULL)
755 return NULL;
756 path = Py_BuildValue("[O]", file);
757 if (path == NULL) {
758 Py_DECREF(file);
759 return NULL;
760 }
761 err = PyDict_SetItemString(d, "__file__", file);
762 if (err == 0)
763 err = PyDict_SetItemString(d, "__path__", path);
764 if (err != 0) {
765 m = NULL;
766 goto cleanup;
767 }
768 buf[0] = '\0';
769 fdp = find_module("__init__", path, buf, sizeof(buf), &fp);
770 if (fdp == NULL) {
771 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
772 PyErr_Clear();
773 }
774 else
775 m = NULL;
776 goto cleanup;
777 }
778 m = load_module(name, fp, buf, fdp->type);
779 if (fp != NULL)
780 fclose(fp);
781 cleanup:
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000782 Py_XDECREF(path);
783 Py_XDECREF(file);
784 return m;
785}
786
787
788/* Helper to test for built-in module */
789
790static int
791is_builtin(name)
792 char *name;
793{
794 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +0000795 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
796 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
797 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000798 return -1;
799 else
800 return 1;
801 }
802 }
803 return 0;
804}
805
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000806
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000807/* Search the path (default sys.path) for a module. Return the
808 corresponding filedescr struct, and (via return arguments) the
809 pathname and an open file. Return NULL if the module is not found. */
810
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000811#ifdef MS_COREDLL
812extern FILE *PyWin_FindRegisteredModule();
813#endif
814
Guido van Rossum0980bd91998-02-13 17:18:36 +0000815#ifdef CHECK_IMPORT_CASE
816static int check_case(char *, int, int, char *);
817#endif
818
Guido van Rossum197346f1997-10-31 18:38:52 +0000819static int find_init_module Py_PROTO((char *)); /* Forward */
820
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000821static struct filedescr *
822find_module(name, path, buf, buflen, p_fp)
823 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000824 PyObject *path;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000825 /* Output parameters: */
826 char *buf;
827 int buflen;
828 FILE **p_fp;
829{
830 int i, npath, len, namelen;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000831 struct _frozen *f;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000832 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000833 FILE *fp = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000834 struct stat statbuf;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000835 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
836 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
837 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000838
839 if (path == NULL) {
840 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000841 strcpy(buf, name);
842 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000843 }
Guido van Rossuma5568d31998-03-05 03:45:08 +0000844 if ((f = find_frozen(name)) != NULL) {
845 strcpy(buf, name);
846 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000847 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000848
Guido van Rossumac279101996-08-22 23:10:58 +0000849#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000850 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
851 if (fp != NULL) {
852 *p_fp = fp;
853 return fdp;
854 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000855#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000856 path = PySys_GetObject("path");
857 }
858 else if (PyString_Check(path)) {
859 /* Submodule of frozen package */
Guido van Rossum39b0f891998-04-10 21:52:06 +0000860 if (PyString_Size(path) + 1 + strlen(name) >= (unsigned int)buflen) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000861 PyErr_SetString(PyExc_ImportError,
862 "full frozen module name too long");
863 return NULL;
864 }
865 strcpy(buf, PyString_AsString(path));
866 strcat(buf, ".");
867 strcat(buf, name);
868 if (find_frozen(buf) != NULL)
869 return &fd_frozen;
870 PyErr_Format(PyExc_ImportError,
871 "frozen module %.200s not found", buf);
872 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000873 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000874
Guido van Rossum79f25d91997-04-29 20:08:16 +0000875 if (path == NULL || !PyList_Check(path)) {
876 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +0000877 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000878 return NULL;
879 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000880 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000881 namelen = strlen(name);
882 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000883 PyObject *v = PyList_GetItem(path, i);
884 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000885 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000886 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000887 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000888 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000889 strcpy(buf, PyString_AsString(v));
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000890 if ((int)strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000891 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000892#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000893#ifdef INTERN_STRINGS
894 /*
895 ** Speedup: each sys.path item is interned, and
896 ** FindResourceModule remembers which items refer to
897 ** folders (so we don't have to bother trying to look
898 ** into them for resources).
899 */
900 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
901 v = PyList_GET_ITEM(path, i);
902#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000903 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000904 static struct filedescr resfiledescr =
905 {"", "", PY_RESOURCE};
Jack Jansen9c96a921995-02-15 22:57:06 +0000906
907 return &resfiledescr;
908 }
Guido van Rossum0f84a341998-08-06 13:36:01 +0000909 if (PyMac_FindCodeResourceModule((PyStringObject *)v, name, buf)) {
910 static struct filedescr resfiledescr =
911 {"", "", PY_CODERESOURCE};
912
913 return &resfiledescr;
914 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000915#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000916 if (len > 0 && buf[len-1] != SEP
917#ifdef ALTSEP
918 && buf[len-1] != ALTSEP
919#endif
920 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000921 buf[len++] = SEP;
Guido van Rossum40f470f1996-05-23 22:51:04 +0000922#ifdef IMPORT_8x3_NAMES
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000923 /* see if we are searching in directory dos-8x3 */
924 if (len > 7 && !strncmp(buf + len - 8, "dos-8x3", 7)){
Guido van Rossum40f470f1996-05-23 22:51:04 +0000925 int j;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000926 char ch; /* limit name to 8 lower-case characters */
Guido van Rossum40f470f1996-05-23 22:51:04 +0000927 for (j = 0; (ch = name[j]) && j < 8; j++)
928 if (isupper(ch))
929 buf[len++] = tolower(ch);
930 else
931 buf[len++] = ch;
932 }
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000933 else /* Not in dos-8x3, use the full name */
Guido van Rossum6f489d91996-06-28 20:15:15 +0000934#endif
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000935 {
Guido van Rossum40f470f1996-05-23 22:51:04 +0000936 strcpy(buf+len, name);
937 len += namelen;
938 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000939#ifdef HAVE_STAT
940 if (stat(buf, &statbuf) == 0) {
Guido van Rossum197346f1997-10-31 18:38:52 +0000941 if (S_ISDIR(statbuf.st_mode)) {
Guido van Rossum0980bd91998-02-13 17:18:36 +0000942 if (find_init_module(buf)) {
943#ifdef CHECK_IMPORT_CASE
944 if (!check_case(buf, len, namelen,
945 name))
946 return NULL;
947#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000948 return &fd_package;
Guido van Rossum0980bd91998-02-13 17:18:36 +0000949 }
Guido van Rossum197346f1997-10-31 18:38:52 +0000950 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000951 }
952#else
953 /* XXX How are you going to test for directories? */
954#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000955#ifdef macintosh
956 fdp = PyMac_FindModuleExtension(buf, &len, name);
957 if (fdp)
958 fp = fopen(buf, fdp->mode);
959#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000960 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000961 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000962 if (Py_VerboseFlag > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000963 fprintf(stderr, "# trying %s\n", buf);
964 fp = fopen(buf, fdp->mode);
965 if (fp != NULL)
966 break;
967 }
Guido van Rossum741689d1997-08-12 14:53:39 +0000968#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000969 if (fp != NULL)
970 break;
971 }
972 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000973 PyErr_Format(PyExc_ImportError,
974 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000975 return NULL;
976 }
Guido van Rossum0980bd91998-02-13 17:18:36 +0000977#ifdef CHECK_IMPORT_CASE
978 if (!check_case(buf, len, namelen, name)) {
979 fclose(fp);
980 return NULL;
981 }
982#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000983
984 *p_fp = fp;
985 return fdp;
986}
987
Guido van Rossum0980bd91998-02-13 17:18:36 +0000988#ifdef CHECK_IMPORT_CASE
989
990#ifdef MS_WIN32
991#include <windows.h>
Guido van Rossum323bf5e1998-06-24 03:54:06 +0000992#include <ctype.h>
993
994static int
995allcaps8x3(s)
996 char *s;
997{
998 /* Return 1 if s is an 8.3 filename in ALLCAPS */
999 char c;
1000 char *dot = strchr(s, '.');
1001 char *end = strchr(s, '\0');
1002 if (dot != NULL) {
1003 if (dot-s > 8)
1004 return 1; /* More than 8 before '.' */
1005 if (end-dot > 4)
1006 return 1; /* More than 3 after '.' */
1007 end = strchr(dot+1, '.');
1008 if (end != NULL)
1009 return 1; /* More than one dot */
1010 }
1011 else if (end-s > 8)
1012 return 1; /* More than 8 and no dot */
1013 while ((c = *s++)) {
1014 if (islower(c))
1015 return 0;
1016 }
1017 return 1;
1018}
1019
Guido van Rossum0980bd91998-02-13 17:18:36 +00001020static int
1021check_case(char *buf, int len, int namelen, char *name)
1022{
1023 WIN32_FIND_DATA data;
1024 HANDLE h;
1025 if (getenv("PYTHONCASEOK") != NULL)
1026 return 1;
1027 h = FindFirstFile(buf, &data);
1028 if (h == INVALID_HANDLE_VALUE) {
1029 PyErr_Format(PyExc_NameError,
1030 "Can't find file for module %.100s\n(filename %.300s)",
1031 name, buf);
1032 return 0;
1033 }
1034 FindClose(h);
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001035 if (allcaps8x3(data.cFileName)) {
1036 /* Skip the test if the filename is ALL.CAPS. This can
1037 happen in certain circumstances beyond our control,
1038 e.g. when software is installed under NT on a FAT
1039 filesystem and then the same FAT filesystem is used
1040 under Windows 95. */
1041 return 1;
1042 }
Guido van Rossum0980bd91998-02-13 17:18:36 +00001043 if (strncmp(data.cFileName, name, namelen) != 0) {
1044 strcpy(buf+len-namelen, data.cFileName);
1045 PyErr_Format(PyExc_NameError,
1046 "Case mismatch for module name %.100s\n(filename %.300s)",
1047 name, buf);
1048 return 0;
1049 }
1050 return 1;
1051}
1052#endif /* MS_WIN32 */
1053
1054#ifdef macintosh
1055#include <TextUtils.h>
1056static int
1057check_case(char *buf, int len, int namelen, char *name)
1058{
1059 FSSpec fss;
1060 OSErr err;
1061 unsigned char mybuf[MAXPATHLEN+1];
1062
1063 strcpy((char *)mybuf, buf);
1064 c2pstr((char *)mybuf);
1065 err = FSMakeFSSpec(0, 0, mybuf, &fss);
1066 if (err) {
1067 PyErr_Format(PyExc_NameError,
1068 "Can't find file for module %.100s\n(filename %.300s)",
1069 name, buf);
1070 return 0;
1071 }
1072 p2cstr(fss.name);
1073 if ( strncmp(name, (char *)fss.name, namelen) != 0 ) {
1074 PyErr_Format(PyExc_NameError,
1075 "Case mismatch for module name %.100s\n(filename %.300s)",
1076 name, fss.name);
1077 return 0;
1078 }
1079 return 1;
1080}
1081#endif /* macintosh */
1082
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001083#ifdef DJGPP
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001084#include <dir.h>
1085
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001086static int
1087check_case(char *buf, int len, int namelen, char *name)
1088{
1089 struct ffblk ffblk;
1090 int done;
1091
1092 if (getenv("PYTHONCASEOK") != NULL)
1093 return 1;
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001094 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001095 if (done) {
1096 PyErr_Format(PyExc_NameError,
1097 "Can't find file for module %.100s\n(filename %.300s)",
1098 name, buf);
1099 return 0;
1100 }
1101
1102 if (strncmp(ffblk.ff_name, name, namelen) != 0) {
1103 strcpy(buf+len-namelen, ffblk.ff_name);
1104 PyErr_Format(PyExc_NameError,
1105 "Case mismatch for module name %.100s\n(filename %.300s)",
1106 name, buf);
1107 return 0;
1108 }
1109 return 1;
1110}
1111#endif
1112
Guido van Rossum8766a771998-04-10 23:44:32 +00001113#endif /* CHECK_IMPORT_CASE */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001114
Guido van Rossum197346f1997-10-31 18:38:52 +00001115#ifdef HAVE_STAT
1116/* Helper to look for __init__.py or __init__.py[co] in potential package */
1117static int
1118find_init_module(buf)
1119 char *buf;
1120{
1121 int save_len = strlen(buf);
1122 int i = save_len;
1123 struct stat statbuf;
1124
1125 if (save_len + 13 >= MAXPATHLEN)
1126 return 0;
1127 buf[i++] = SEP;
1128 strcpy(buf+i, "__init__.py");
1129 if (stat(buf, &statbuf) == 0) {
1130 buf[save_len] = '\0';
1131 return 1;
1132 }
1133 i += strlen(buf+i);
1134 if (Py_OptimizeFlag)
1135 strcpy(buf+i, "o");
1136 else
1137 strcpy(buf+i, "c");
1138 if (stat(buf, &statbuf) == 0) {
1139 buf[save_len] = '\0';
1140 return 1;
1141 }
1142 buf[save_len] = '\0';
1143 return 0;
1144}
1145#endif /* HAVE_STAT */
1146
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001147
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001148static int init_builtin Py_PROTO((char *)); /* Forward */
1149
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001150/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001151 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001152
Guido van Rossum79f25d91997-04-29 20:08:16 +00001153static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001154load_module(name, fp, buf, type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001155 char *name;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001156 FILE *fp;
1157 char *buf;
1158 int type;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001159{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001160 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001161 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001162 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001163
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001164 /* First check that there's an open file (if we need one) */
1165 switch (type) {
1166 case PY_SOURCE:
1167 case PY_COMPILED:
1168 if (fp == NULL) {
1169 PyErr_Format(PyExc_ValueError,
1170 "file object required for import (type code %d)",
1171 type);
1172 return NULL;
1173 }
1174 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001175
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001176 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001177
1178 case PY_SOURCE:
1179 m = load_source_module(name, buf, fp);
1180 break;
1181
1182 case PY_COMPILED:
1183 m = load_compiled_module(name, buf, fp);
1184 break;
1185
1186 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001187 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001188 break;
1189
Jack Jansen9c96a921995-02-15 22:57:06 +00001190#ifdef macintosh
1191 case PY_RESOURCE:
1192 m = PyMac_LoadResourceModule(name, buf);
1193 break;
Guido van Rossum0f84a341998-08-06 13:36:01 +00001194 case PY_CODERESOURCE:
1195 m = PyMac_LoadCodeResourceModule(name, buf);
1196 break;
Jack Jansen9c96a921995-02-15 22:57:06 +00001197#endif
1198
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001199 case PKG_DIRECTORY:
1200 m = load_package(name, buf);
1201 break;
1202
1203 case C_BUILTIN:
1204 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001205 if (buf != NULL && buf[0] != '\0')
1206 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001207 if (type == C_BUILTIN)
1208 err = init_builtin(name);
1209 else
1210 err = PyImport_ImportFrozenModule(name);
1211 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001212 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001213 if (err == 0) {
1214 PyErr_Format(PyExc_ImportError,
1215 "Purported %s module %.200s not found",
1216 type == C_BUILTIN ?
1217 "builtin" : "frozen",
1218 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001219 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001220 }
1221 modules = PyImport_GetModuleDict();
1222 m = PyDict_GetItemString(modules, name);
1223 if (m == NULL) {
1224 PyErr_Format(
1225 PyExc_ImportError,
1226 "%s module %.200s not properly initialized",
1227 type == C_BUILTIN ?
1228 "builtin" : "frozen",
1229 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001230 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001231 }
1232 Py_INCREF(m);
1233 break;
1234
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001235 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001236 PyErr_Format(PyExc_ImportError,
1237 "Don't know how to import %.200s (type code %d)",
1238 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001239 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001240
1241 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001242
1243 return m;
1244}
1245
1246
1247/* Initialize a built-in module.
1248 Return 1 for succes, 0 if the module is not found, and -1 with
1249 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001250
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001251static int
1252init_builtin(name)
1253 char *name;
1254{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001255 struct _inittab *p;
1256 PyObject *mod;
1257
1258 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
1259 return 1;
1260
Guido van Rossum771c6c81997-10-31 18:37:24 +00001261 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001262 if (strcmp(name, p->name) == 0) {
1263 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001264 PyErr_Format(PyExc_ImportError,
1265 "Cannot re-init internal module %.200s",
1266 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001267 return -1;
1268 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001269 if (Py_VerboseFlag)
Guido van Rossum25ce5661997-08-02 03:10:38 +00001270 fprintf(stderr, "import %s # builtin\n", name);
1271 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001272 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001273 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001274 if (_PyImport_FixupExtension(name, name) == NULL)
1275 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001276 return 1;
1277 }
1278 }
1279 return 0;
1280}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001281
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001282
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001283/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001284
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001285static struct _frozen *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001286find_frozen(name)
1287 char *name;
1288{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001289 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001290
Guido van Rossum79f25d91997-04-29 20:08:16 +00001291 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001292 if (p->name == NULL)
1293 return NULL;
1294 if (strcmp(p->name, name) == 0)
1295 break;
1296 }
1297 return p;
1298}
1299
Guido van Rossum79f25d91997-04-29 20:08:16 +00001300static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001301get_frozen_object(name)
1302 char *name;
1303{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001304 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001305 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001306
1307 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001308 PyErr_Format(PyExc_ImportError,
1309 "No such frozen object named %.200s",
1310 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001311 return NULL;
1312 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001313 size = p->size;
1314 if (size < 0)
1315 size = -size;
1316 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001317}
1318
1319/* Initialize a frozen module.
1320 Return 1 for succes, 0 if the module is not found, and -1 with
1321 an exception set if the initialization failed.
1322 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001323
1324int
Guido van Rossum79f25d91997-04-29 20:08:16 +00001325PyImport_ImportFrozenModule(name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001326 char *name;
1327{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001328 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001329 PyObject *co;
1330 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001331 int ispackage;
1332 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001333
1334 if (p == NULL)
1335 return 0;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001336 size = p->size;
1337 ispackage = (size < 0);
1338 if (ispackage)
1339 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001340 if (Py_VerboseFlag)
Guido van Rossuma5568d31998-03-05 03:45:08 +00001341 fprintf(stderr, "import %s # frozen%s\n",
1342 name, ispackage ? " package" : "");
1343 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001344 if (co == NULL)
1345 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001346 if (!PyCode_Check(co)) {
1347 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001348 PyErr_Format(PyExc_TypeError,
1349 "frozen object %.200s is not a code object",
1350 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001351 return -1;
1352 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001353 if (ispackage) {
1354 /* Set __path__ to the package name */
1355 PyObject *d, *s;
1356 int err;
1357 m = PyImport_AddModule(name);
1358 if (m == NULL)
1359 return -1;
1360 d = PyModule_GetDict(m);
1361 s = PyString_InternFromString(name);
1362 if (s == NULL)
1363 return -1;
1364 err = PyDict_SetItemString(d, "__path__", s);
1365 Py_DECREF(s);
1366 if (err != 0)
1367 return err;
1368 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001369 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001370 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001371 if (m == NULL)
1372 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001373 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001374 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001375}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001376
1377
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001378/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001379 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001380
Guido van Rossum79f25d91997-04-29 20:08:16 +00001381PyObject *
1382PyImport_ImportModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001383 char *name;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001384{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001385 static PyObject *fromlist = NULL;
1386 if (fromlist == NULL && strchr(name, '.') != NULL) {
1387 fromlist = Py_BuildValue("[s]", "*");
1388 if (fromlist == NULL)
1389 return NULL;
1390 }
1391 return PyImport_ImportModuleEx(name, NULL, NULL, fromlist);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001392}
1393
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001394/* Forward declarations for helper routines */
1395static PyObject *get_parent Py_PROTO((PyObject *globals,
1396 char *buf, int *p_buflen));
1397static PyObject *load_next Py_PROTO((PyObject *mod, PyObject *altmod,
1398 char **p_name, char *buf, int *p_buflen));
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001399static int mark_miss Py_PROTO((char *name));
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001400static int ensure_fromlist Py_PROTO((PyObject *mod, PyObject *fromlist,
Guido van Rossum9905ef91997-09-08 16:07:11 +00001401 char *buf, int buflen, int recursive));
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001402static PyObject * import_submodule Py_PROTO((PyObject *mod,
1403 char *name, char *fullname));
1404
1405/* The Magnum Opus of dotted-name import :-) */
1406
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001407static PyObject *
1408import_module_ex(name, globals, locals, fromlist)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001409 char *name;
1410 PyObject *globals;
1411 PyObject *locals;
1412 PyObject *fromlist;
1413{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001414 char buf[MAXPATHLEN+1];
1415 int buflen = 0;
1416 PyObject *parent, *head, *next, *tail;
1417
1418 parent = get_parent(globals, buf, &buflen);
1419 if (parent == NULL)
1420 return NULL;
1421
1422 head = load_next(parent, Py_None, &name, buf, &buflen);
1423 if (head == NULL)
1424 return NULL;
1425
1426 tail = head;
1427 Py_INCREF(tail);
1428 while (name) {
1429 next = load_next(tail, tail, &name, buf, &buflen);
1430 Py_DECREF(tail);
1431 if (next == NULL) {
1432 Py_DECREF(head);
1433 return NULL;
1434 }
1435 tail = next;
1436 }
1437
1438 if (fromlist != NULL) {
1439 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1440 fromlist = NULL;
1441 }
1442
1443 if (fromlist == NULL) {
1444 Py_DECREF(tail);
1445 return head;
1446 }
1447
1448 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001449 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001450 Py_DECREF(tail);
1451 return NULL;
1452 }
1453
1454 return tail;
1455}
1456
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001457PyObject *
1458PyImport_ImportModuleEx(name, globals, locals, fromlist)
1459 char *name;
1460 PyObject *globals;
1461 PyObject *locals;
1462 PyObject *fromlist;
1463{
1464 PyObject *result;
1465 lock_import();
Guido van Rossumd65911b1998-03-03 22:33:27 +00001466 result = import_module_ex(name, globals, locals, fromlist);
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001467 unlock_import();
1468 return result;
1469}
1470
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001471static PyObject *
1472get_parent(globals, buf, p_buflen)
1473 PyObject *globals;
1474 char *buf;
1475 int *p_buflen;
1476{
1477 static PyObject *namestr = NULL;
1478 static PyObject *pathstr = NULL;
1479 PyObject *modname, *modpath, *modules, *parent;
1480
1481 if (globals == NULL || !PyDict_Check(globals))
1482 return Py_None;
1483
1484 if (namestr == NULL) {
1485 namestr = PyString_InternFromString("__name__");
1486 if (namestr == NULL)
1487 return NULL;
1488 }
1489 if (pathstr == NULL) {
1490 pathstr = PyString_InternFromString("__path__");
1491 if (pathstr == NULL)
1492 return NULL;
1493 }
1494
1495 *buf = '\0';
1496 *p_buflen = 0;
1497 modname = PyDict_GetItem(globals, namestr);
1498 if (modname == NULL || !PyString_Check(modname))
1499 return Py_None;
1500
1501 modpath = PyDict_GetItem(globals, pathstr);
1502 if (modpath != NULL) {
1503 int len = PyString_GET_SIZE(modname);
1504 if (len > MAXPATHLEN) {
1505 PyErr_SetString(PyExc_ValueError,
1506 "Module name too long");
1507 return NULL;
1508 }
1509 strcpy(buf, PyString_AS_STRING(modname));
1510 *p_buflen = len;
1511 }
1512 else {
1513 char *start = PyString_AS_STRING(modname);
1514 char *lastdot = strrchr(start, '.');
1515 int len;
1516 if (lastdot == NULL)
1517 return Py_None;
1518 len = lastdot - start;
1519 if (len >= MAXPATHLEN) {
1520 PyErr_SetString(PyExc_ValueError,
1521 "Module name too long");
1522 return NULL;
1523 }
1524 strncpy(buf, start, len);
1525 buf[len] = '\0';
1526 *p_buflen = len;
1527 }
1528
1529 modules = PyImport_GetModuleDict();
1530 parent = PyDict_GetItemString(modules, buf);
1531 if (parent == NULL)
1532 parent = Py_None;
1533 return parent;
1534 /* We expect, but can't guarantee, if parent != None, that:
1535 - parent.__name__ == buf
1536 - parent.__dict__ is globals
1537 If this is violated... Who cares? */
1538}
1539
1540static PyObject *
1541load_next(mod, altmod, p_name, buf, p_buflen)
1542 PyObject *mod;
1543 PyObject *altmod; /* Either None or same as mod */
1544 char **p_name;
1545 char *buf;
1546 int *p_buflen;
1547{
1548 char *name = *p_name;
1549 char *dot = strchr(name, '.');
1550 int len;
1551 char *p;
1552 PyObject *result;
1553
1554 if (dot == NULL) {
1555 *p_name = NULL;
1556 len = strlen(name);
1557 }
1558 else {
1559 *p_name = dot+1;
1560 len = dot-name;
1561 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00001562 if (len == 0) {
1563 PyErr_SetString(PyExc_ValueError,
1564 "Empty module name");
1565 return NULL;
1566 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001567
1568 p = buf + *p_buflen;
1569 if (p != buf)
1570 *p++ = '.';
1571 if (p+len-buf >= MAXPATHLEN) {
1572 PyErr_SetString(PyExc_ValueError,
1573 "Module name too long");
1574 return NULL;
1575 }
1576 strncpy(p, name, len);
1577 p[len] = '\0';
1578 *p_buflen = p+len-buf;
1579
1580 result = import_submodule(mod, p, buf);
1581 if (result == Py_None && altmod != mod) {
1582 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001583 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001584 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001585 if (result != NULL && result != Py_None) {
1586 if (mark_miss(buf) != 0) {
1587 Py_DECREF(result);
1588 return NULL;
1589 }
1590 strncpy(buf, name, len);
1591 buf[len] = '\0';
1592 *p_buflen = len;
1593 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001594 }
1595 if (result == NULL)
1596 return NULL;
1597
1598 if (result == Py_None) {
1599 Py_DECREF(result);
1600 PyErr_Format(PyExc_ImportError,
1601 "No module named %.200s", name);
1602 return NULL;
1603 }
1604
1605 return result;
1606}
1607
1608static int
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001609mark_miss(name)
1610 char *name;
1611{
1612 PyObject *modules = PyImport_GetModuleDict();
1613 return PyDict_SetItemString(modules, name, Py_None);
1614}
1615
1616static int
Guido van Rossum9905ef91997-09-08 16:07:11 +00001617ensure_fromlist(mod, fromlist, buf, buflen, recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001618 PyObject *mod;
1619 PyObject *fromlist;
1620 char *buf;
1621 int buflen;
Guido van Rossum9905ef91997-09-08 16:07:11 +00001622 int recursive;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001623{
1624 int i;
1625
1626 if (!PyObject_HasAttrString(mod, "__path__"))
1627 return 1;
1628
1629 for (i = 0; ; i++) {
1630 PyObject *item = PySequence_GetItem(fromlist, i);
1631 int hasit;
1632 if (item == NULL) {
1633 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1634 PyErr_Clear();
1635 return 1;
1636 }
1637 return 0;
1638 }
1639 if (!PyString_Check(item)) {
1640 PyErr_SetString(PyExc_TypeError,
1641 "Item in ``from list'' not a string");
1642 Py_DECREF(item);
1643 return 0;
1644 }
1645 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001646 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001647 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001648 /* See if the package defines __all__ */
1649 if (recursive)
1650 continue; /* Avoid endless recursion */
1651 all = PyObject_GetAttrString(mod, "__all__");
1652 if (all == NULL)
1653 PyErr_Clear();
1654 else {
1655 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1656 return 0;
1657 Py_DECREF(all);
1658 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001659 continue;
1660 }
1661 hasit = PyObject_HasAttr(mod, item);
1662 if (!hasit) {
1663 char *subname = PyString_AS_STRING(item);
1664 PyObject *submod;
1665 char *p;
1666 if (buflen + strlen(subname) >= MAXPATHLEN) {
1667 PyErr_SetString(PyExc_ValueError,
1668 "Module name too long");
1669 Py_DECREF(item);
1670 return 0;
1671 }
1672 p = buf + buflen;
1673 *p++ = '.';
1674 strcpy(p, subname);
1675 submod = import_submodule(mod, subname, buf);
1676 Py_XDECREF(submod);
1677 if (submod == NULL) {
1678 Py_DECREF(item);
1679 return 0;
1680 }
1681 }
1682 Py_DECREF(item);
1683 }
1684
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001685 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001686}
1687
1688static PyObject *
1689import_submodule(mod, subname, fullname)
1690 PyObject *mod; /* May be None */
1691 char *subname;
1692 char *fullname;
1693{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001694 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001695 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001696
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001697 /* Require:
1698 if mod == None: subname == fullname
1699 else: mod.__name__ + "." + subname == fullname
1700 */
1701
1702 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001703 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001704 }
1705 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001706 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001707 char buf[MAXPATHLEN+1];
1708 struct filedescr *fdp;
1709 FILE *fp = NULL;
1710
Guido van Rossum9c0afe51998-05-19 15:09:05 +00001711 if (mod == Py_None)
1712 path = NULL;
1713 else {
1714 path = PyObject_GetAttrString(mod, "__path__");
1715 if (path == NULL) {
1716 PyErr_Clear();
1717 Py_INCREF(Py_None);
1718 return Py_None;
1719 }
1720 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001721
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001722 buf[0] = '\0';
Guido van Rossumb68cd421998-07-01 17:36:26 +00001723 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1724 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001725 if (fdp == NULL) {
1726 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1727 return NULL;
1728 PyErr_Clear();
1729 Py_INCREF(Py_None);
1730 return Py_None;
1731 }
1732 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001733 if (fp)
1734 fclose(fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001735 if (m != NULL && mod != Py_None) {
1736 if (PyObject_SetAttrString(mod, subname, m) < 0) {
1737 Py_DECREF(m);
1738 m = NULL;
1739 }
1740 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001741 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001742
1743 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001744}
1745
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001746
1747/* Re-import a module of any kind and return its module object, WITH
1748 INCREMENTED REFERENCE COUNT */
1749
Guido van Rossum79f25d91997-04-29 20:08:16 +00001750PyObject *
1751PyImport_ReloadModule(m)
1752 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001753{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001754 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001755 PyObject *path = NULL;
1756 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001757 char buf[MAXPATHLEN+1];
1758 struct filedescr *fdp;
1759 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001760
Guido van Rossum79f25d91997-04-29 20:08:16 +00001761 if (m == NULL || !PyModule_Check(m)) {
1762 PyErr_SetString(PyExc_TypeError,
1763 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001764 return NULL;
1765 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001766 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001767 if (name == NULL)
1768 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001769 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001770 PyErr_Format(PyExc_ImportError,
1771 "reload(): module %.200s not in sys.modules",
1772 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001773 return NULL;
1774 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001775 subname = strrchr(name, '.');
1776 if (subname == NULL)
1777 subname = name;
1778 else {
1779 PyObject *parentname, *parent;
1780 parentname = PyString_FromStringAndSize(name, (subname-name));
1781 if (parentname == NULL)
1782 return NULL;
1783 parent = PyDict_GetItem(modules, parentname);
1784 if (parent == NULL) {
1785 PyErr_Format(PyExc_ImportError,
1786 "reload(): parent %.200s not in sys.modules",
1787 name);
1788 return NULL;
1789 }
1790 subname++;
1791 path = PyObject_GetAttrString(parent, "__path__");
1792 if (path == NULL)
1793 PyErr_Clear();
1794 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001795 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001796 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1797 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001798 if (fdp == NULL)
1799 return NULL;
1800 m = load_module(name, fp, buf, fdp->type);
1801 if (fp)
1802 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001803 return m;
1804}
1805
1806
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001807/* Higher-level import emulator which emulates the "import" statement
1808 more accurately -- it invokes the __import__() function from the
1809 builtins of the current globals. This means that the import is
1810 done using whatever import hooks are installed in the current
1811 environment, e.g. by "ni" or "rexec". */
1812
1813PyObject *
1814PyImport_Import(module_name)
1815 PyObject *module_name;
1816{
1817 static PyObject *silly_list = NULL;
1818 static PyObject *builtins_str = NULL;
1819 static PyObject *import_str = NULL;
1820 static PyObject *standard_builtins = NULL;
1821 PyObject *globals = NULL;
1822 PyObject *import = NULL;
1823 PyObject *builtins = NULL;
1824 PyObject *r = NULL;
1825
1826 /* Initialize constant string objects */
1827 if (silly_list == NULL) {
1828 import_str = PyString_InternFromString("__import__");
1829 if (import_str == NULL)
1830 return NULL;
1831 builtins_str = PyString_InternFromString("__builtins__");
1832 if (builtins_str == NULL)
1833 return NULL;
1834 silly_list = Py_BuildValue("[s]", "__doc__");
1835 if (silly_list == NULL)
1836 return NULL;
1837 }
1838
1839 /* Get the builtins from current globals */
1840 globals = PyEval_GetGlobals();
1841 if(globals != NULL) {
1842 builtins = PyObject_GetItem(globals, builtins_str);
1843 if (builtins == NULL)
1844 goto err;
1845 }
1846 else {
1847 /* No globals -- use standard builtins, and fake globals */
1848 PyErr_Clear();
1849
1850 if (standard_builtins == NULL) {
1851 standard_builtins =
1852 PyImport_ImportModule("__builtin__");
1853 if (standard_builtins == NULL)
1854 return NULL;
1855 }
1856
1857 builtins = standard_builtins;
1858 Py_INCREF(builtins);
1859 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1860 if (globals == NULL)
1861 goto err;
1862 }
1863
1864 /* Get the __import__ function from the builtins */
1865 if (PyDict_Check(builtins))
1866 import=PyObject_GetItem(builtins, import_str);
1867 else
1868 import=PyObject_GetAttr(builtins, import_str);
1869 if (import == NULL)
1870 goto err;
1871
1872 /* Call the _import__ function with the proper argument list */
1873 r = PyObject_CallFunction(import, "OOOO",
1874 module_name, globals, globals, silly_list);
1875
1876 err:
1877 Py_XDECREF(globals);
1878 Py_XDECREF(builtins);
1879 Py_XDECREF(import);
1880
1881 return r;
1882}
1883
1884
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001885/* Module 'imp' provides Python access to the primitives used for
1886 importing modules.
1887*/
1888
Guido van Rossum79f25d91997-04-29 20:08:16 +00001889static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001890imp_get_magic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001891 PyObject *self;
1892 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001893{
1894 char buf[4];
1895
Guido van Rossum79f25d91997-04-29 20:08:16 +00001896 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001897 return NULL;
Guido van Rossum6bf62da1997-04-11 20:37:35 +00001898 buf[0] = (char) ((MAGIC >> 0) & 0xff);
1899 buf[1] = (char) ((MAGIC >> 8) & 0xff);
1900 buf[2] = (char) ((MAGIC >> 16) & 0xff);
1901 buf[3] = (char) ((MAGIC >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001902
Guido van Rossum79f25d91997-04-29 20:08:16 +00001903 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001904}
1905
Guido van Rossum79f25d91997-04-29 20:08:16 +00001906static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001907imp_get_suffixes(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001908 PyObject *self;
1909 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001910{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001911 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001912 struct filedescr *fdp;
1913
Guido van Rossum79f25d91997-04-29 20:08:16 +00001914 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001915 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001916 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001917 if (list == NULL)
1918 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001919 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
1920 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001921 fdp->suffix, fdp->mode, fdp->type);
1922 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001923 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001924 return NULL;
1925 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001926 if (PyList_Append(list, item) < 0) {
1927 Py_DECREF(list);
1928 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001929 return NULL;
1930 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001931 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001932 }
1933 return list;
1934}
1935
Guido van Rossum79f25d91997-04-29 20:08:16 +00001936static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001937call_find_module(name, path)
1938 char *name;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001939 PyObject *path; /* list or None or NULL */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001940{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001941 extern int fclose Py_PROTO((FILE *));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001942 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001943 struct filedescr *fdp;
1944 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001945 FILE *fp = NULL;
1946
1947 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001948 if (path == Py_None)
1949 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001950 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
1951 if (fdp == NULL)
1952 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001953 if (fp != NULL) {
1954 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
1955 if (fob == NULL) {
1956 fclose(fp);
1957 return NULL;
1958 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001959 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001960 else {
1961 fob = Py_None;
1962 Py_INCREF(fob);
1963 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001964 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001965 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001966 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001967 return ret;
1968}
1969
Guido van Rossum79f25d91997-04-29 20:08:16 +00001970static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001971imp_find_module(self, args)
1972 PyObject *self;
1973 PyObject *args;
1974{
1975 char *name;
1976 PyObject *path = NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001977 if (!PyArg_ParseTuple(args, "s|O", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001978 return NULL;
1979 return call_find_module(name, path);
1980}
1981
1982static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001983imp_init_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001984 PyObject *self;
1985 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001986{
1987 char *name;
1988 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001989 PyObject *m;
1990 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001991 return NULL;
1992 ret = init_builtin(name);
1993 if (ret < 0)
1994 return NULL;
1995 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001996 Py_INCREF(Py_None);
1997 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001998 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001999 m = PyImport_AddModule(name);
2000 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002001 return m;
2002}
2003
Guido van Rossum79f25d91997-04-29 20:08:16 +00002004static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002005imp_init_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002006 PyObject *self;
2007 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002008{
2009 char *name;
2010 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002011 PyObject *m;
2012 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002013 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002014 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002015 if (ret < 0)
2016 return NULL;
2017 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002018 Py_INCREF(Py_None);
2019 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002020 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002021 m = PyImport_AddModule(name);
2022 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002023 return m;
2024}
2025
Guido van Rossum79f25d91997-04-29 20:08:16 +00002026static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002027imp_get_frozen_object(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002028 PyObject *self;
2029 PyObject *args;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002030{
2031 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002032
Guido van Rossum79f25d91997-04-29 20:08:16 +00002033 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002034 return NULL;
2035 return get_frozen_object(name);
2036}
2037
Guido van Rossum79f25d91997-04-29 20:08:16 +00002038static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002039imp_is_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002040 PyObject *self;
2041 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002042{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002043 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002044 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002045 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002046 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002047}
2048
Guido van Rossum79f25d91997-04-29 20:08:16 +00002049static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002050imp_is_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002051 PyObject *self;
2052 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002053{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002054 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002055 struct _frozen *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002056 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002057 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002058 p = find_frozen(name);
2059 return PyInt_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002060}
2061
2062static FILE *
2063get_file(pathname, fob, mode)
2064 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002065 PyObject *fob;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002066 char *mode;
2067{
2068 FILE *fp;
2069 if (fob == NULL) {
2070 fp = fopen(pathname, mode);
2071 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002072 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002073 }
2074 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002075 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002076 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002077 PyErr_SetString(PyExc_ValueError,
2078 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002079 }
2080 return fp;
2081}
2082
Guido van Rossum79f25d91997-04-29 20:08:16 +00002083static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002084imp_load_compiled(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002085 PyObject *self;
2086 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002087{
2088 char *name;
2089 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002090 PyObject *fob = NULL;
2091 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002092 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002093 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002094 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002095 return NULL;
2096 fp = get_file(pathname, fob, "rb");
2097 if (fp == NULL)
2098 return NULL;
2099 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002100 if (fob == NULL)
2101 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002102 return m;
2103}
2104
Guido van Rossum79f25d91997-04-29 20:08:16 +00002105static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002106imp_load_dynamic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002107 PyObject *self;
2108 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002109{
2110 char *name;
2111 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002112 PyObject *fob = NULL;
2113 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002114 FILE *fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002115 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
2116 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002117 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002118 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002119 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002120 if (fp == NULL)
2121 return NULL;
2122 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002123 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002124 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002125}
2126
Guido van Rossum79f25d91997-04-29 20:08:16 +00002127static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002128imp_load_source(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002129 PyObject *self;
2130 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002131{
2132 char *name;
2133 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002134 PyObject *fob = NULL;
2135 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002136 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002137 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002138 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002139 return NULL;
2140 fp = get_file(pathname, fob, "r");
2141 if (fp == NULL)
2142 return NULL;
2143 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002144 if (fob == NULL)
2145 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002146 return m;
2147}
2148
Jack Jansen9c96a921995-02-15 22:57:06 +00002149#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002150static PyObject *
Jack Jansen9c96a921995-02-15 22:57:06 +00002151imp_load_resource(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002152 PyObject *self;
2153 PyObject *args;
Jack Jansen9c96a921995-02-15 22:57:06 +00002154{
2155 char *name;
2156 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002157 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002158
Guido van Rossum79f25d91997-04-29 20:08:16 +00002159 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002160 return NULL;
2161 m = PyMac_LoadResourceModule(name, pathname);
2162 return m;
2163}
2164#endif /* macintosh */
2165
Guido van Rossum79f25d91997-04-29 20:08:16 +00002166static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002167imp_load_module(self, args)
2168 PyObject *self;
2169 PyObject *args;
2170{
2171 char *name;
2172 PyObject *fob;
2173 char *pathname;
2174 char *suffix; /* Unused */
2175 char *mode;
2176 int type;
2177 FILE *fp;
2178
2179 if (!PyArg_ParseTuple(args, "sOs(ssi)",
2180 &name, &fob, &pathname,
2181 &suffix, &mode, &type))
2182 return NULL;
2183 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
2184 PyErr_Format(PyExc_ValueError,
2185 "invalid file open mode %.200s", mode);
2186 return NULL;
2187 }
2188 if (fob == Py_None)
2189 fp = NULL;
2190 else {
2191 if (!PyFile_Check(fob)) {
2192 PyErr_SetString(PyExc_ValueError,
2193 "load_module arg#2 should be a file or None");
2194 return NULL;
2195 }
2196 fp = get_file(pathname, fob, mode);
2197 if (fp == NULL)
2198 return NULL;
2199 }
2200 return load_module(name, fp, pathname, type);
2201}
2202
2203static PyObject *
2204imp_load_package(self, args)
2205 PyObject *self;
2206 PyObject *args;
2207{
2208 char *name;
2209 char *pathname;
2210 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
2211 return NULL;
2212 return load_package(name, pathname);
2213}
2214
2215static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002216imp_new_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002217 PyObject *self;
2218 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002219{
2220 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002221 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002222 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002223 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002224}
2225
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002226/* Doc strings */
2227
2228static char doc_imp[] = "\
2229This module provides the components needed to build your own\n\
2230__import__ function. Undocumented functions are obsolete.\n\
2231";
2232
2233static char doc_find_module[] = "\
2234find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
2235Search for a module. If path is omitted or None, search for a\n\
2236built-in, frozen or special module and continue search in sys.path.\n\
2237The module name cannot contain '.'; to search for a submodule of a\n\
2238package, pass the submodule name and the package's __path__.\
2239";
2240
2241static char doc_load_module[] = "\
2242load_module(name, file, filename, (suffix, mode, type)) -> module\n\
2243Load a module, given information returned by find_module().\n\
2244The module name must include the full package name, if any.\
2245";
2246
2247static char doc_get_magic[] = "\
2248get_magic() -> string\n\
2249Return the magic number for .pyc or .pyo files.\
2250";
2251
2252static char doc_get_suffixes[] = "\
2253get_suffixes() -> [(suffix, mode, type), ...]\n\
2254Return a list of (suffix, mode, type) tuples describing the files\n\
2255that find_module() looks for.\
2256";
2257
2258static char doc_new_module[] = "\
2259new_module(name) -> module\n\
2260Create a new module. Do not enter it in sys.modules.\n\
2261The module name must include the full package name, if any.\
2262";
2263
Guido van Rossum79f25d91997-04-29 20:08:16 +00002264static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002265 {"find_module", imp_find_module, 1, doc_find_module},
2266 {"get_magic", imp_get_magic, 1, doc_get_magic},
2267 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2268 {"load_module", imp_load_module, 1, doc_load_module},
2269 {"new_module", imp_new_module, 1, doc_new_module},
2270 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002271 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002272 {"init_builtin", imp_init_builtin, 1},
2273 {"init_frozen", imp_init_frozen, 1},
2274 {"is_builtin", imp_is_builtin, 1},
2275 {"is_frozen", imp_is_frozen, 1},
2276 {"load_compiled", imp_load_compiled, 1},
2277 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002278 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002279#ifdef macintosh
2280 {"load_resource", imp_load_resource, 1},
2281#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002282 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002283 {NULL, NULL} /* sentinel */
2284};
2285
Guido van Rossum1a8791e1998-08-04 22:46:29 +00002286static int
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002287setint(d, name, value)
2288 PyObject *d;
2289 char *name;
2290 int value;
2291{
2292 PyObject *v;
2293 int err;
2294
2295 v = PyInt_FromLong((long)value);
2296 err = PyDict_SetItemString(d, name, v);
2297 Py_XDECREF(v);
2298 return err;
2299}
2300
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002301void
2302initimp()
2303{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002304 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002305
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002306 m = Py_InitModule4("imp", imp_methods, doc_imp,
2307 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002308 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002309
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002310 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2311 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2312 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2313 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2314 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2315 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2316 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2317 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00002318 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002319
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002320 failure:
2321 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002322}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002323
2324
2325/* API for embedding applications that want to add their own entries to the
2326 table of built-in modules. This should normally be called *before*
2327 Py_Initialize(). When the malloc() or realloc() call fails, -1 is returned
2328 and the existing table is unchanged.
2329
2330 After a similar function by Just van Rossum. */
2331
2332int
2333PyImport_ExtendInittab(newtab)
2334 struct _inittab *newtab;
2335{
2336 static struct _inittab *our_copy = NULL;
2337 struct _inittab *p;
2338 int i, n;
2339
2340 /* Count the number of entries in both tables */
2341 for (n = 0; newtab[n].name != NULL; n++)
2342 ;
2343 if (n == 0)
2344 return 0; /* Nothing to do */
2345 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2346 ;
2347
2348 /* Allocate new memory for the combined table */
2349 if (our_copy == NULL)
2350 p = malloc((i+n+1) * sizeof(struct _inittab));
2351 else
2352 p = realloc(our_copy, (i+n+1) * sizeof(struct _inittab));
2353 if (p == NULL)
2354 return -1;
2355
2356 /* Copy the tables into the new memory */
2357 if (our_copy != PyImport_Inittab)
2358 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2359 PyImport_Inittab = our_copy = p;
2360 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
2361
2362 return 0;
2363}
2364
2365/* Shorthand to add a single entry given a name and a function */
2366
2367int
2368PyImport_AppendInittab(name, initfunc)
2369 char *name;
2370 void (*initfunc)();
2371{
2372 struct _inittab newtab[2];
2373
2374 memset(newtab, '\0', sizeof newtab);
2375
2376 newtab[0].name = name;
2377 newtab[0].initfunc = initfunc;
2378
2379 return PyImport_ExtendInittab(newtab);
2380}