blob: 33d266a36c502e09aeb4526efd6e9d464d749bac [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 *
Guido van Rossum0506a431998-08-11 15:07:39 +0000822find_module(realname, path, buf, buflen, p_fp)
823 char *realname;
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 Rossum0506a431998-08-11 15:07:39 +0000838 char name[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000839
Guido van Rossum0506a431998-08-11 15:07:39 +0000840 strcpy(name, realname);
841
842 if (path != NULL && PyString_Check(path)) {
843 /* Submodule of "frozen" package:
844 Set name to the fullname, path to NULL
845 and continue as "usual" */
846 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
847 PyErr_SetString(PyExc_ImportError,
848 "full frozen module name too long");
849 return NULL;
850 }
851 strcpy(buf, PyString_AsString(path));
852 strcat(buf, ".");
853 strcat(buf, name);
854 strcpy(name, buf);
855 path = NULL;
856 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000857 if (path == NULL) {
858 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000859 strcpy(buf, name);
860 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000861 }
Guido van Rossuma5568d31998-03-05 03:45:08 +0000862 if ((f = find_frozen(name)) != NULL) {
863 strcpy(buf, name);
864 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000865 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000866
Guido van Rossumac279101996-08-22 23:10:58 +0000867#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000868 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
869 if (fp != NULL) {
870 *p_fp = fp;
871 return fdp;
872 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000873#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000874 path = PySys_GetObject("path");
875 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000876 if (path == NULL || !PyList_Check(path)) {
877 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +0000878 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000879 return NULL;
880 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000881 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000882 namelen = strlen(name);
883 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000884 PyObject *v = PyList_GetItem(path, i);
885 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000886 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000887 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000888 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000889 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000890 strcpy(buf, PyString_AsString(v));
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000891 if ((int)strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000892 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000893#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000894#ifdef INTERN_STRINGS
895 /*
896 ** Speedup: each sys.path item is interned, and
897 ** FindResourceModule remembers which items refer to
898 ** folders (so we don't have to bother trying to look
899 ** into them for resources).
900 */
901 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
902 v = PyList_GET_ITEM(path, i);
903#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000904 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000905 static struct filedescr resfiledescr =
906 {"", "", PY_RESOURCE};
Jack Jansen9c96a921995-02-15 22:57:06 +0000907
908 return &resfiledescr;
909 }
Guido van Rossum0f84a341998-08-06 13:36:01 +0000910 if (PyMac_FindCodeResourceModule((PyStringObject *)v, name, buf)) {
911 static struct filedescr resfiledescr =
912 {"", "", PY_CODERESOURCE};
913
914 return &resfiledescr;
915 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000916#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000917 if (len > 0 && buf[len-1] != SEP
918#ifdef ALTSEP
919 && buf[len-1] != ALTSEP
920#endif
921 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000922 buf[len++] = SEP;
Guido van Rossum40f470f1996-05-23 22:51:04 +0000923#ifdef IMPORT_8x3_NAMES
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000924 /* see if we are searching in directory dos-8x3 */
925 if (len > 7 && !strncmp(buf + len - 8, "dos-8x3", 7)){
Guido van Rossum40f470f1996-05-23 22:51:04 +0000926 int j;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000927 char ch; /* limit name to 8 lower-case characters */
Guido van Rossum40f470f1996-05-23 22:51:04 +0000928 for (j = 0; (ch = name[j]) && j < 8; j++)
929 if (isupper(ch))
930 buf[len++] = tolower(ch);
931 else
932 buf[len++] = ch;
933 }
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000934 else /* Not in dos-8x3, use the full name */
Guido van Rossum6f489d91996-06-28 20:15:15 +0000935#endif
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000936 {
Guido van Rossum40f470f1996-05-23 22:51:04 +0000937 strcpy(buf+len, name);
938 len += namelen;
939 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000940#ifdef HAVE_STAT
941 if (stat(buf, &statbuf) == 0) {
Guido van Rossum197346f1997-10-31 18:38:52 +0000942 if (S_ISDIR(statbuf.st_mode)) {
Guido van Rossum0980bd91998-02-13 17:18:36 +0000943 if (find_init_module(buf)) {
944#ifdef CHECK_IMPORT_CASE
945 if (!check_case(buf, len, namelen,
946 name))
947 return NULL;
948#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000949 return &fd_package;
Guido van Rossum0980bd91998-02-13 17:18:36 +0000950 }
Guido van Rossum197346f1997-10-31 18:38:52 +0000951 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000952 }
953#else
954 /* XXX How are you going to test for directories? */
955#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000956#ifdef macintosh
957 fdp = PyMac_FindModuleExtension(buf, &len, name);
958 if (fdp)
959 fp = fopen(buf, fdp->mode);
960#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000961 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000962 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000963 if (Py_VerboseFlag > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000964 fprintf(stderr, "# trying %s\n", buf);
965 fp = fopen(buf, fdp->mode);
966 if (fp != NULL)
967 break;
968 }
Guido van Rossum741689d1997-08-12 14:53:39 +0000969#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000970 if (fp != NULL)
971 break;
972 }
973 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000974 PyErr_Format(PyExc_ImportError,
975 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000976 return NULL;
977 }
Guido van Rossum0980bd91998-02-13 17:18:36 +0000978#ifdef CHECK_IMPORT_CASE
979 if (!check_case(buf, len, namelen, name)) {
980 fclose(fp);
981 return NULL;
982 }
983#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000984
985 *p_fp = fp;
986 return fdp;
987}
988
Guido van Rossum0980bd91998-02-13 17:18:36 +0000989#ifdef CHECK_IMPORT_CASE
990
991#ifdef MS_WIN32
992#include <windows.h>
Guido van Rossum323bf5e1998-06-24 03:54:06 +0000993#include <ctype.h>
994
995static int
996allcaps8x3(s)
997 char *s;
998{
999 /* Return 1 if s is an 8.3 filename in ALLCAPS */
1000 char c;
1001 char *dot = strchr(s, '.');
1002 char *end = strchr(s, '\0');
1003 if (dot != NULL) {
1004 if (dot-s > 8)
1005 return 1; /* More than 8 before '.' */
1006 if (end-dot > 4)
1007 return 1; /* More than 3 after '.' */
1008 end = strchr(dot+1, '.');
1009 if (end != NULL)
1010 return 1; /* More than one dot */
1011 }
1012 else if (end-s > 8)
1013 return 1; /* More than 8 and no dot */
1014 while ((c = *s++)) {
1015 if (islower(c))
1016 return 0;
1017 }
1018 return 1;
1019}
1020
Guido van Rossum0980bd91998-02-13 17:18:36 +00001021static int
1022check_case(char *buf, int len, int namelen, char *name)
1023{
1024 WIN32_FIND_DATA data;
1025 HANDLE h;
1026 if (getenv("PYTHONCASEOK") != NULL)
1027 return 1;
1028 h = FindFirstFile(buf, &data);
1029 if (h == INVALID_HANDLE_VALUE) {
1030 PyErr_Format(PyExc_NameError,
1031 "Can't find file for module %.100s\n(filename %.300s)",
1032 name, buf);
1033 return 0;
1034 }
1035 FindClose(h);
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001036 if (allcaps8x3(data.cFileName)) {
1037 /* Skip the test if the filename is ALL.CAPS. This can
1038 happen in certain circumstances beyond our control,
1039 e.g. when software is installed under NT on a FAT
1040 filesystem and then the same FAT filesystem is used
1041 under Windows 95. */
1042 return 1;
1043 }
Guido van Rossum0980bd91998-02-13 17:18:36 +00001044 if (strncmp(data.cFileName, name, namelen) != 0) {
1045 strcpy(buf+len-namelen, data.cFileName);
1046 PyErr_Format(PyExc_NameError,
1047 "Case mismatch for module name %.100s\n(filename %.300s)",
1048 name, buf);
1049 return 0;
1050 }
1051 return 1;
1052}
1053#endif /* MS_WIN32 */
1054
1055#ifdef macintosh
1056#include <TextUtils.h>
1057static int
1058check_case(char *buf, int len, int namelen, char *name)
1059{
1060 FSSpec fss;
1061 OSErr err;
1062 unsigned char mybuf[MAXPATHLEN+1];
1063
1064 strcpy((char *)mybuf, buf);
1065 c2pstr((char *)mybuf);
1066 err = FSMakeFSSpec(0, 0, mybuf, &fss);
1067 if (err) {
1068 PyErr_Format(PyExc_NameError,
1069 "Can't find file for module %.100s\n(filename %.300s)",
1070 name, buf);
1071 return 0;
1072 }
1073 p2cstr(fss.name);
1074 if ( strncmp(name, (char *)fss.name, namelen) != 0 ) {
1075 PyErr_Format(PyExc_NameError,
1076 "Case mismatch for module name %.100s\n(filename %.300s)",
1077 name, fss.name);
1078 return 0;
1079 }
1080 return 1;
1081}
1082#endif /* macintosh */
1083
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001084#ifdef DJGPP
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001085#include <dir.h>
1086
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001087static int
1088check_case(char *buf, int len, int namelen, char *name)
1089{
1090 struct ffblk ffblk;
1091 int done;
1092
1093 if (getenv("PYTHONCASEOK") != NULL)
1094 return 1;
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001095 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001096 if (done) {
1097 PyErr_Format(PyExc_NameError,
1098 "Can't find file for module %.100s\n(filename %.300s)",
1099 name, buf);
1100 return 0;
1101 }
1102
1103 if (strncmp(ffblk.ff_name, name, namelen) != 0) {
1104 strcpy(buf+len-namelen, ffblk.ff_name);
1105 PyErr_Format(PyExc_NameError,
1106 "Case mismatch for module name %.100s\n(filename %.300s)",
1107 name, buf);
1108 return 0;
1109 }
1110 return 1;
1111}
1112#endif
1113
Guido van Rossum8766a771998-04-10 23:44:32 +00001114#endif /* CHECK_IMPORT_CASE */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001115
Guido van Rossum197346f1997-10-31 18:38:52 +00001116#ifdef HAVE_STAT
1117/* Helper to look for __init__.py or __init__.py[co] in potential package */
1118static int
1119find_init_module(buf)
1120 char *buf;
1121{
1122 int save_len = strlen(buf);
1123 int i = save_len;
1124 struct stat statbuf;
1125
1126 if (save_len + 13 >= MAXPATHLEN)
1127 return 0;
1128 buf[i++] = SEP;
1129 strcpy(buf+i, "__init__.py");
1130 if (stat(buf, &statbuf) == 0) {
1131 buf[save_len] = '\0';
1132 return 1;
1133 }
1134 i += strlen(buf+i);
1135 if (Py_OptimizeFlag)
1136 strcpy(buf+i, "o");
1137 else
1138 strcpy(buf+i, "c");
1139 if (stat(buf, &statbuf) == 0) {
1140 buf[save_len] = '\0';
1141 return 1;
1142 }
1143 buf[save_len] = '\0';
1144 return 0;
1145}
1146#endif /* HAVE_STAT */
1147
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001148
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001149static int init_builtin Py_PROTO((char *)); /* Forward */
1150
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001151/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001152 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001153
Guido van Rossum79f25d91997-04-29 20:08:16 +00001154static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001155load_module(name, fp, buf, type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001156 char *name;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001157 FILE *fp;
1158 char *buf;
1159 int type;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001160{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001161 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001162 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001163 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001164
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001165 /* First check that there's an open file (if we need one) */
1166 switch (type) {
1167 case PY_SOURCE:
1168 case PY_COMPILED:
1169 if (fp == NULL) {
1170 PyErr_Format(PyExc_ValueError,
1171 "file object required for import (type code %d)",
1172 type);
1173 return NULL;
1174 }
1175 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001176
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001177 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001178
1179 case PY_SOURCE:
1180 m = load_source_module(name, buf, fp);
1181 break;
1182
1183 case PY_COMPILED:
1184 m = load_compiled_module(name, buf, fp);
1185 break;
1186
1187 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001188 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001189 break;
1190
Jack Jansen9c96a921995-02-15 22:57:06 +00001191#ifdef macintosh
1192 case PY_RESOURCE:
1193 m = PyMac_LoadResourceModule(name, buf);
1194 break;
Guido van Rossum0f84a341998-08-06 13:36:01 +00001195 case PY_CODERESOURCE:
1196 m = PyMac_LoadCodeResourceModule(name, buf);
1197 break;
Jack Jansen9c96a921995-02-15 22:57:06 +00001198#endif
1199
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001200 case PKG_DIRECTORY:
1201 m = load_package(name, buf);
1202 break;
1203
1204 case C_BUILTIN:
1205 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001206 if (buf != NULL && buf[0] != '\0')
1207 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001208 if (type == C_BUILTIN)
1209 err = init_builtin(name);
1210 else
1211 err = PyImport_ImportFrozenModule(name);
1212 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001213 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001214 if (err == 0) {
1215 PyErr_Format(PyExc_ImportError,
1216 "Purported %s module %.200s not found",
1217 type == C_BUILTIN ?
1218 "builtin" : "frozen",
1219 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001220 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001221 }
1222 modules = PyImport_GetModuleDict();
1223 m = PyDict_GetItemString(modules, name);
1224 if (m == NULL) {
1225 PyErr_Format(
1226 PyExc_ImportError,
1227 "%s module %.200s not properly initialized",
1228 type == C_BUILTIN ?
1229 "builtin" : "frozen",
1230 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001231 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001232 }
1233 Py_INCREF(m);
1234 break;
1235
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001236 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001237 PyErr_Format(PyExc_ImportError,
1238 "Don't know how to import %.200s (type code %d)",
1239 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001240 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001241
1242 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001243
1244 return m;
1245}
1246
1247
1248/* Initialize a built-in module.
1249 Return 1 for succes, 0 if the module is not found, and -1 with
1250 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001251
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001252static int
1253init_builtin(name)
1254 char *name;
1255{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001256 struct _inittab *p;
1257 PyObject *mod;
1258
1259 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
1260 return 1;
1261
Guido van Rossum771c6c81997-10-31 18:37:24 +00001262 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001263 if (strcmp(name, p->name) == 0) {
1264 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001265 PyErr_Format(PyExc_ImportError,
1266 "Cannot re-init internal module %.200s",
1267 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001268 return -1;
1269 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001270 if (Py_VerboseFlag)
Guido van Rossum25ce5661997-08-02 03:10:38 +00001271 fprintf(stderr, "import %s # builtin\n", name);
1272 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001273 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001274 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001275 if (_PyImport_FixupExtension(name, name) == NULL)
1276 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001277 return 1;
1278 }
1279 }
1280 return 0;
1281}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001282
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001283
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001284/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001285
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001286static struct _frozen *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001287find_frozen(name)
1288 char *name;
1289{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001290 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001291
Guido van Rossum79f25d91997-04-29 20:08:16 +00001292 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001293 if (p->name == NULL)
1294 return NULL;
1295 if (strcmp(p->name, name) == 0)
1296 break;
1297 }
1298 return p;
1299}
1300
Guido van Rossum79f25d91997-04-29 20:08:16 +00001301static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001302get_frozen_object(name)
1303 char *name;
1304{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001305 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001306 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001307
1308 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001309 PyErr_Format(PyExc_ImportError,
1310 "No such frozen object named %.200s",
1311 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001312 return NULL;
1313 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001314 size = p->size;
1315 if (size < 0)
1316 size = -size;
1317 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001318}
1319
1320/* Initialize a frozen module.
1321 Return 1 for succes, 0 if the module is not found, and -1 with
1322 an exception set if the initialization failed.
1323 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001324
1325int
Guido van Rossum79f25d91997-04-29 20:08:16 +00001326PyImport_ImportFrozenModule(name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001327 char *name;
1328{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001329 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001330 PyObject *co;
1331 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001332 int ispackage;
1333 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001334
1335 if (p == NULL)
1336 return 0;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001337 size = p->size;
1338 ispackage = (size < 0);
1339 if (ispackage)
1340 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001341 if (Py_VerboseFlag)
Guido van Rossuma5568d31998-03-05 03:45:08 +00001342 fprintf(stderr, "import %s # frozen%s\n",
1343 name, ispackage ? " package" : "");
1344 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001345 if (co == NULL)
1346 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001347 if (!PyCode_Check(co)) {
1348 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001349 PyErr_Format(PyExc_TypeError,
1350 "frozen object %.200s is not a code object",
1351 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001352 return -1;
1353 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001354 if (ispackage) {
1355 /* Set __path__ to the package name */
1356 PyObject *d, *s;
1357 int err;
1358 m = PyImport_AddModule(name);
1359 if (m == NULL)
1360 return -1;
1361 d = PyModule_GetDict(m);
1362 s = PyString_InternFromString(name);
1363 if (s == NULL)
1364 return -1;
1365 err = PyDict_SetItemString(d, "__path__", s);
1366 Py_DECREF(s);
1367 if (err != 0)
1368 return err;
1369 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001370 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001371 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001372 if (m == NULL)
1373 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001374 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001375 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001376}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001377
1378
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001379/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001380 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001381
Guido van Rossum79f25d91997-04-29 20:08:16 +00001382PyObject *
1383PyImport_ImportModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001384 char *name;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001385{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001386 static PyObject *fromlist = NULL;
1387 if (fromlist == NULL && strchr(name, '.') != NULL) {
1388 fromlist = Py_BuildValue("[s]", "*");
1389 if (fromlist == NULL)
1390 return NULL;
1391 }
1392 return PyImport_ImportModuleEx(name, NULL, NULL, fromlist);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001393}
1394
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001395/* Forward declarations for helper routines */
1396static PyObject *get_parent Py_PROTO((PyObject *globals,
1397 char *buf, int *p_buflen));
1398static PyObject *load_next Py_PROTO((PyObject *mod, PyObject *altmod,
1399 char **p_name, char *buf, int *p_buflen));
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001400static int mark_miss Py_PROTO((char *name));
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001401static int ensure_fromlist Py_PROTO((PyObject *mod, PyObject *fromlist,
Guido van Rossum9905ef91997-09-08 16:07:11 +00001402 char *buf, int buflen, int recursive));
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001403static PyObject * import_submodule Py_PROTO((PyObject *mod,
1404 char *name, char *fullname));
1405
1406/* The Magnum Opus of dotted-name import :-) */
1407
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001408static PyObject *
1409import_module_ex(name, globals, locals, fromlist)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001410 char *name;
1411 PyObject *globals;
1412 PyObject *locals;
1413 PyObject *fromlist;
1414{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001415 char buf[MAXPATHLEN+1];
1416 int buflen = 0;
1417 PyObject *parent, *head, *next, *tail;
1418
1419 parent = get_parent(globals, buf, &buflen);
1420 if (parent == NULL)
1421 return NULL;
1422
1423 head = load_next(parent, Py_None, &name, buf, &buflen);
1424 if (head == NULL)
1425 return NULL;
1426
1427 tail = head;
1428 Py_INCREF(tail);
1429 while (name) {
1430 next = load_next(tail, tail, &name, buf, &buflen);
1431 Py_DECREF(tail);
1432 if (next == NULL) {
1433 Py_DECREF(head);
1434 return NULL;
1435 }
1436 tail = next;
1437 }
1438
1439 if (fromlist != NULL) {
1440 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1441 fromlist = NULL;
1442 }
1443
1444 if (fromlist == NULL) {
1445 Py_DECREF(tail);
1446 return head;
1447 }
1448
1449 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001450 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001451 Py_DECREF(tail);
1452 return NULL;
1453 }
1454
1455 return tail;
1456}
1457
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001458PyObject *
1459PyImport_ImportModuleEx(name, globals, locals, fromlist)
1460 char *name;
1461 PyObject *globals;
1462 PyObject *locals;
1463 PyObject *fromlist;
1464{
1465 PyObject *result;
1466 lock_import();
Guido van Rossumd65911b1998-03-03 22:33:27 +00001467 result = import_module_ex(name, globals, locals, fromlist);
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001468 unlock_import();
1469 return result;
1470}
1471
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001472static PyObject *
1473get_parent(globals, buf, p_buflen)
1474 PyObject *globals;
1475 char *buf;
1476 int *p_buflen;
1477{
1478 static PyObject *namestr = NULL;
1479 static PyObject *pathstr = NULL;
1480 PyObject *modname, *modpath, *modules, *parent;
1481
1482 if (globals == NULL || !PyDict_Check(globals))
1483 return Py_None;
1484
1485 if (namestr == NULL) {
1486 namestr = PyString_InternFromString("__name__");
1487 if (namestr == NULL)
1488 return NULL;
1489 }
1490 if (pathstr == NULL) {
1491 pathstr = PyString_InternFromString("__path__");
1492 if (pathstr == NULL)
1493 return NULL;
1494 }
1495
1496 *buf = '\0';
1497 *p_buflen = 0;
1498 modname = PyDict_GetItem(globals, namestr);
1499 if (modname == NULL || !PyString_Check(modname))
1500 return Py_None;
1501
1502 modpath = PyDict_GetItem(globals, pathstr);
1503 if (modpath != NULL) {
1504 int len = PyString_GET_SIZE(modname);
1505 if (len > MAXPATHLEN) {
1506 PyErr_SetString(PyExc_ValueError,
1507 "Module name too long");
1508 return NULL;
1509 }
1510 strcpy(buf, PyString_AS_STRING(modname));
1511 *p_buflen = len;
1512 }
1513 else {
1514 char *start = PyString_AS_STRING(modname);
1515 char *lastdot = strrchr(start, '.');
1516 int len;
1517 if (lastdot == NULL)
1518 return Py_None;
1519 len = lastdot - start;
1520 if (len >= MAXPATHLEN) {
1521 PyErr_SetString(PyExc_ValueError,
1522 "Module name too long");
1523 return NULL;
1524 }
1525 strncpy(buf, start, len);
1526 buf[len] = '\0';
1527 *p_buflen = len;
1528 }
1529
1530 modules = PyImport_GetModuleDict();
1531 parent = PyDict_GetItemString(modules, buf);
1532 if (parent == NULL)
1533 parent = Py_None;
1534 return parent;
1535 /* We expect, but can't guarantee, if parent != None, that:
1536 - parent.__name__ == buf
1537 - parent.__dict__ is globals
1538 If this is violated... Who cares? */
1539}
1540
1541static PyObject *
1542load_next(mod, altmod, p_name, buf, p_buflen)
1543 PyObject *mod;
1544 PyObject *altmod; /* Either None or same as mod */
1545 char **p_name;
1546 char *buf;
1547 int *p_buflen;
1548{
1549 char *name = *p_name;
1550 char *dot = strchr(name, '.');
1551 int len;
1552 char *p;
1553 PyObject *result;
1554
1555 if (dot == NULL) {
1556 *p_name = NULL;
1557 len = strlen(name);
1558 }
1559 else {
1560 *p_name = dot+1;
1561 len = dot-name;
1562 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00001563 if (len == 0) {
1564 PyErr_SetString(PyExc_ValueError,
1565 "Empty module name");
1566 return NULL;
1567 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001568
1569 p = buf + *p_buflen;
1570 if (p != buf)
1571 *p++ = '.';
1572 if (p+len-buf >= MAXPATHLEN) {
1573 PyErr_SetString(PyExc_ValueError,
1574 "Module name too long");
1575 return NULL;
1576 }
1577 strncpy(p, name, len);
1578 p[len] = '\0';
1579 *p_buflen = p+len-buf;
1580
1581 result = import_submodule(mod, p, buf);
1582 if (result == Py_None && altmod != mod) {
1583 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001584 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001585 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001586 if (result != NULL && result != Py_None) {
1587 if (mark_miss(buf) != 0) {
1588 Py_DECREF(result);
1589 return NULL;
1590 }
1591 strncpy(buf, name, len);
1592 buf[len] = '\0';
1593 *p_buflen = len;
1594 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001595 }
1596 if (result == NULL)
1597 return NULL;
1598
1599 if (result == Py_None) {
1600 Py_DECREF(result);
1601 PyErr_Format(PyExc_ImportError,
1602 "No module named %.200s", name);
1603 return NULL;
1604 }
1605
1606 return result;
1607}
1608
1609static int
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001610mark_miss(name)
1611 char *name;
1612{
1613 PyObject *modules = PyImport_GetModuleDict();
1614 return PyDict_SetItemString(modules, name, Py_None);
1615}
1616
1617static int
Guido van Rossum9905ef91997-09-08 16:07:11 +00001618ensure_fromlist(mod, fromlist, buf, buflen, recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001619 PyObject *mod;
1620 PyObject *fromlist;
1621 char *buf;
1622 int buflen;
Guido van Rossum9905ef91997-09-08 16:07:11 +00001623 int recursive;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001624{
1625 int i;
1626
1627 if (!PyObject_HasAttrString(mod, "__path__"))
1628 return 1;
1629
1630 for (i = 0; ; i++) {
1631 PyObject *item = PySequence_GetItem(fromlist, i);
1632 int hasit;
1633 if (item == NULL) {
1634 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1635 PyErr_Clear();
1636 return 1;
1637 }
1638 return 0;
1639 }
1640 if (!PyString_Check(item)) {
1641 PyErr_SetString(PyExc_TypeError,
1642 "Item in ``from list'' not a string");
1643 Py_DECREF(item);
1644 return 0;
1645 }
1646 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001647 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001648 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001649 /* See if the package defines __all__ */
1650 if (recursive)
1651 continue; /* Avoid endless recursion */
1652 all = PyObject_GetAttrString(mod, "__all__");
1653 if (all == NULL)
1654 PyErr_Clear();
1655 else {
1656 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1657 return 0;
1658 Py_DECREF(all);
1659 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001660 continue;
1661 }
1662 hasit = PyObject_HasAttr(mod, item);
1663 if (!hasit) {
1664 char *subname = PyString_AS_STRING(item);
1665 PyObject *submod;
1666 char *p;
1667 if (buflen + strlen(subname) >= MAXPATHLEN) {
1668 PyErr_SetString(PyExc_ValueError,
1669 "Module name too long");
1670 Py_DECREF(item);
1671 return 0;
1672 }
1673 p = buf + buflen;
1674 *p++ = '.';
1675 strcpy(p, subname);
1676 submod = import_submodule(mod, subname, buf);
1677 Py_XDECREF(submod);
1678 if (submod == NULL) {
1679 Py_DECREF(item);
1680 return 0;
1681 }
1682 }
1683 Py_DECREF(item);
1684 }
1685
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001686 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001687}
1688
1689static PyObject *
1690import_submodule(mod, subname, fullname)
1691 PyObject *mod; /* May be None */
1692 char *subname;
1693 char *fullname;
1694{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001695 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001696 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001697
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001698 /* Require:
1699 if mod == None: subname == fullname
1700 else: mod.__name__ + "." + subname == fullname
1701 */
1702
1703 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001704 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001705 }
1706 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001707 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001708 char buf[MAXPATHLEN+1];
1709 struct filedescr *fdp;
1710 FILE *fp = NULL;
1711
Guido van Rossum9c0afe51998-05-19 15:09:05 +00001712 if (mod == Py_None)
1713 path = NULL;
1714 else {
1715 path = PyObject_GetAttrString(mod, "__path__");
1716 if (path == NULL) {
1717 PyErr_Clear();
1718 Py_INCREF(Py_None);
1719 return Py_None;
1720 }
1721 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001722
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001723 buf[0] = '\0';
Guido van Rossumb68cd421998-07-01 17:36:26 +00001724 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1725 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001726 if (fdp == NULL) {
1727 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1728 return NULL;
1729 PyErr_Clear();
1730 Py_INCREF(Py_None);
1731 return Py_None;
1732 }
1733 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001734 if (fp)
1735 fclose(fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001736 if (m != NULL && mod != Py_None) {
1737 if (PyObject_SetAttrString(mod, subname, m) < 0) {
1738 Py_DECREF(m);
1739 m = NULL;
1740 }
1741 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001742 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001743
1744 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001745}
1746
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001747
1748/* Re-import a module of any kind and return its module object, WITH
1749 INCREMENTED REFERENCE COUNT */
1750
Guido van Rossum79f25d91997-04-29 20:08:16 +00001751PyObject *
1752PyImport_ReloadModule(m)
1753 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001754{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001755 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001756 PyObject *path = NULL;
1757 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001758 char buf[MAXPATHLEN+1];
1759 struct filedescr *fdp;
1760 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001761
Guido van Rossum79f25d91997-04-29 20:08:16 +00001762 if (m == NULL || !PyModule_Check(m)) {
1763 PyErr_SetString(PyExc_TypeError,
1764 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001765 return NULL;
1766 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001767 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001768 if (name == NULL)
1769 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001770 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001771 PyErr_Format(PyExc_ImportError,
1772 "reload(): module %.200s not in sys.modules",
1773 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001774 return NULL;
1775 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001776 subname = strrchr(name, '.');
1777 if (subname == NULL)
1778 subname = name;
1779 else {
1780 PyObject *parentname, *parent;
1781 parentname = PyString_FromStringAndSize(name, (subname-name));
1782 if (parentname == NULL)
1783 return NULL;
1784 parent = PyDict_GetItem(modules, parentname);
1785 if (parent == NULL) {
1786 PyErr_Format(PyExc_ImportError,
1787 "reload(): parent %.200s not in sys.modules",
1788 name);
1789 return NULL;
1790 }
1791 subname++;
1792 path = PyObject_GetAttrString(parent, "__path__");
1793 if (path == NULL)
1794 PyErr_Clear();
1795 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001796 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001797 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1798 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001799 if (fdp == NULL)
1800 return NULL;
1801 m = load_module(name, fp, buf, fdp->type);
1802 if (fp)
1803 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001804 return m;
1805}
1806
1807
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001808/* Higher-level import emulator which emulates the "import" statement
1809 more accurately -- it invokes the __import__() function from the
1810 builtins of the current globals. This means that the import is
1811 done using whatever import hooks are installed in the current
1812 environment, e.g. by "ni" or "rexec". */
1813
1814PyObject *
1815PyImport_Import(module_name)
1816 PyObject *module_name;
1817{
1818 static PyObject *silly_list = NULL;
1819 static PyObject *builtins_str = NULL;
1820 static PyObject *import_str = NULL;
1821 static PyObject *standard_builtins = NULL;
1822 PyObject *globals = NULL;
1823 PyObject *import = NULL;
1824 PyObject *builtins = NULL;
1825 PyObject *r = NULL;
1826
1827 /* Initialize constant string objects */
1828 if (silly_list == NULL) {
1829 import_str = PyString_InternFromString("__import__");
1830 if (import_str == NULL)
1831 return NULL;
1832 builtins_str = PyString_InternFromString("__builtins__");
1833 if (builtins_str == NULL)
1834 return NULL;
1835 silly_list = Py_BuildValue("[s]", "__doc__");
1836 if (silly_list == NULL)
1837 return NULL;
1838 }
1839
1840 /* Get the builtins from current globals */
1841 globals = PyEval_GetGlobals();
1842 if(globals != NULL) {
1843 builtins = PyObject_GetItem(globals, builtins_str);
1844 if (builtins == NULL)
1845 goto err;
1846 }
1847 else {
1848 /* No globals -- use standard builtins, and fake globals */
1849 PyErr_Clear();
1850
1851 if (standard_builtins == NULL) {
1852 standard_builtins =
1853 PyImport_ImportModule("__builtin__");
1854 if (standard_builtins == NULL)
1855 return NULL;
1856 }
1857
1858 builtins = standard_builtins;
1859 Py_INCREF(builtins);
1860 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1861 if (globals == NULL)
1862 goto err;
1863 }
1864
1865 /* Get the __import__ function from the builtins */
1866 if (PyDict_Check(builtins))
1867 import=PyObject_GetItem(builtins, import_str);
1868 else
1869 import=PyObject_GetAttr(builtins, import_str);
1870 if (import == NULL)
1871 goto err;
1872
1873 /* Call the _import__ function with the proper argument list */
1874 r = PyObject_CallFunction(import, "OOOO",
1875 module_name, globals, globals, silly_list);
1876
1877 err:
1878 Py_XDECREF(globals);
1879 Py_XDECREF(builtins);
1880 Py_XDECREF(import);
1881
1882 return r;
1883}
1884
1885
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001886/* Module 'imp' provides Python access to the primitives used for
1887 importing modules.
1888*/
1889
Guido van Rossum79f25d91997-04-29 20:08:16 +00001890static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001891imp_get_magic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001892 PyObject *self;
1893 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001894{
1895 char buf[4];
1896
Guido van Rossum79f25d91997-04-29 20:08:16 +00001897 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001898 return NULL;
Guido van Rossum6bf62da1997-04-11 20:37:35 +00001899 buf[0] = (char) ((MAGIC >> 0) & 0xff);
1900 buf[1] = (char) ((MAGIC >> 8) & 0xff);
1901 buf[2] = (char) ((MAGIC >> 16) & 0xff);
1902 buf[3] = (char) ((MAGIC >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001903
Guido van Rossum79f25d91997-04-29 20:08:16 +00001904 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001905}
1906
Guido van Rossum79f25d91997-04-29 20:08:16 +00001907static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001908imp_get_suffixes(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001909 PyObject *self;
1910 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001911{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001912 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001913 struct filedescr *fdp;
1914
Guido van Rossum79f25d91997-04-29 20:08:16 +00001915 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001916 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001917 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001918 if (list == NULL)
1919 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001920 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
1921 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001922 fdp->suffix, fdp->mode, fdp->type);
1923 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001924 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001925 return NULL;
1926 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001927 if (PyList_Append(list, item) < 0) {
1928 Py_DECREF(list);
1929 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001930 return NULL;
1931 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001932 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001933 }
1934 return list;
1935}
1936
Guido van Rossum79f25d91997-04-29 20:08:16 +00001937static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001938call_find_module(name, path)
1939 char *name;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001940 PyObject *path; /* list or None or NULL */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001941{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001942 extern int fclose Py_PROTO((FILE *));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001943 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001944 struct filedescr *fdp;
1945 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001946 FILE *fp = NULL;
1947
1948 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001949 if (path == Py_None)
1950 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001951 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
1952 if (fdp == NULL)
1953 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001954 if (fp != NULL) {
1955 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
1956 if (fob == NULL) {
1957 fclose(fp);
1958 return NULL;
1959 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001960 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001961 else {
1962 fob = Py_None;
1963 Py_INCREF(fob);
1964 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001965 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001966 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001967 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001968 return ret;
1969}
1970
Guido van Rossum79f25d91997-04-29 20:08:16 +00001971static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001972imp_find_module(self, args)
1973 PyObject *self;
1974 PyObject *args;
1975{
1976 char *name;
1977 PyObject *path = NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001978 if (!PyArg_ParseTuple(args, "s|O", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001979 return NULL;
1980 return call_find_module(name, path);
1981}
1982
1983static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001984imp_init_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001985 PyObject *self;
1986 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001987{
1988 char *name;
1989 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001990 PyObject *m;
1991 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001992 return NULL;
1993 ret = init_builtin(name);
1994 if (ret < 0)
1995 return NULL;
1996 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001997 Py_INCREF(Py_None);
1998 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001999 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002000 m = PyImport_AddModule(name);
2001 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002002 return m;
2003}
2004
Guido van Rossum79f25d91997-04-29 20:08:16 +00002005static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002006imp_init_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002007 PyObject *self;
2008 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002009{
2010 char *name;
2011 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002012 PyObject *m;
2013 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002014 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002015 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002016 if (ret < 0)
2017 return NULL;
2018 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002019 Py_INCREF(Py_None);
2020 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002021 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002022 m = PyImport_AddModule(name);
2023 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002024 return m;
2025}
2026
Guido van Rossum79f25d91997-04-29 20:08:16 +00002027static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002028imp_get_frozen_object(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002029 PyObject *self;
2030 PyObject *args;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002031{
2032 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002033
Guido van Rossum79f25d91997-04-29 20:08:16 +00002034 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002035 return NULL;
2036 return get_frozen_object(name);
2037}
2038
Guido van Rossum79f25d91997-04-29 20:08:16 +00002039static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002040imp_is_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002041 PyObject *self;
2042 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002043{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002044 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002045 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002046 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002047 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002048}
2049
Guido van Rossum79f25d91997-04-29 20:08:16 +00002050static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002051imp_is_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002052 PyObject *self;
2053 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002054{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002055 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002056 struct _frozen *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002057 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002058 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002059 p = find_frozen(name);
2060 return PyInt_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002061}
2062
2063static FILE *
2064get_file(pathname, fob, mode)
2065 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002066 PyObject *fob;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002067 char *mode;
2068{
2069 FILE *fp;
2070 if (fob == NULL) {
2071 fp = fopen(pathname, mode);
2072 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002073 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002074 }
2075 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002076 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002077 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002078 PyErr_SetString(PyExc_ValueError,
2079 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002080 }
2081 return fp;
2082}
2083
Guido van Rossum79f25d91997-04-29 20:08:16 +00002084static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002085imp_load_compiled(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002086 PyObject *self;
2087 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002088{
2089 char *name;
2090 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002091 PyObject *fob = NULL;
2092 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002093 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002094 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002095 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002096 return NULL;
2097 fp = get_file(pathname, fob, "rb");
2098 if (fp == NULL)
2099 return NULL;
2100 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002101 if (fob == NULL)
2102 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002103 return m;
2104}
2105
Guido van Rossum79f25d91997-04-29 20:08:16 +00002106static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002107imp_load_dynamic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002108 PyObject *self;
2109 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002110{
2111 char *name;
2112 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002113 PyObject *fob = NULL;
2114 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002115 FILE *fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002116 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
2117 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002118 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002119 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002120 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002121 if (fp == NULL)
2122 return NULL;
2123 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002124 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002125 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002126}
2127
Guido van Rossum79f25d91997-04-29 20:08:16 +00002128static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002129imp_load_source(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002130 PyObject *self;
2131 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002132{
2133 char *name;
2134 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002135 PyObject *fob = NULL;
2136 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002137 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002138 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002139 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002140 return NULL;
2141 fp = get_file(pathname, fob, "r");
2142 if (fp == NULL)
2143 return NULL;
2144 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002145 if (fob == NULL)
2146 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002147 return m;
2148}
2149
Jack Jansen9c96a921995-02-15 22:57:06 +00002150#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002151static PyObject *
Jack Jansen9c96a921995-02-15 22:57:06 +00002152imp_load_resource(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002153 PyObject *self;
2154 PyObject *args;
Jack Jansen9c96a921995-02-15 22:57:06 +00002155{
2156 char *name;
2157 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002158 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002159
Guido van Rossum79f25d91997-04-29 20:08:16 +00002160 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002161 return NULL;
2162 m = PyMac_LoadResourceModule(name, pathname);
2163 return m;
2164}
2165#endif /* macintosh */
2166
Guido van Rossum79f25d91997-04-29 20:08:16 +00002167static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002168imp_load_module(self, args)
2169 PyObject *self;
2170 PyObject *args;
2171{
2172 char *name;
2173 PyObject *fob;
2174 char *pathname;
2175 char *suffix; /* Unused */
2176 char *mode;
2177 int type;
2178 FILE *fp;
2179
2180 if (!PyArg_ParseTuple(args, "sOs(ssi)",
2181 &name, &fob, &pathname,
2182 &suffix, &mode, &type))
2183 return NULL;
2184 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
2185 PyErr_Format(PyExc_ValueError,
2186 "invalid file open mode %.200s", mode);
2187 return NULL;
2188 }
2189 if (fob == Py_None)
2190 fp = NULL;
2191 else {
2192 if (!PyFile_Check(fob)) {
2193 PyErr_SetString(PyExc_ValueError,
2194 "load_module arg#2 should be a file or None");
2195 return NULL;
2196 }
2197 fp = get_file(pathname, fob, mode);
2198 if (fp == NULL)
2199 return NULL;
2200 }
2201 return load_module(name, fp, pathname, type);
2202}
2203
2204static PyObject *
2205imp_load_package(self, args)
2206 PyObject *self;
2207 PyObject *args;
2208{
2209 char *name;
2210 char *pathname;
2211 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
2212 return NULL;
2213 return load_package(name, pathname);
2214}
2215
2216static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002217imp_new_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002218 PyObject *self;
2219 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002220{
2221 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002222 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002223 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002224 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002225}
2226
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002227/* Doc strings */
2228
2229static char doc_imp[] = "\
2230This module provides the components needed to build your own\n\
2231__import__ function. Undocumented functions are obsolete.\n\
2232";
2233
2234static char doc_find_module[] = "\
2235find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
2236Search for a module. If path is omitted or None, search for a\n\
2237built-in, frozen or special module and continue search in sys.path.\n\
2238The module name cannot contain '.'; to search for a submodule of a\n\
2239package, pass the submodule name and the package's __path__.\
2240";
2241
2242static char doc_load_module[] = "\
2243load_module(name, file, filename, (suffix, mode, type)) -> module\n\
2244Load a module, given information returned by find_module().\n\
2245The module name must include the full package name, if any.\
2246";
2247
2248static char doc_get_magic[] = "\
2249get_magic() -> string\n\
2250Return the magic number for .pyc or .pyo files.\
2251";
2252
2253static char doc_get_suffixes[] = "\
2254get_suffixes() -> [(suffix, mode, type), ...]\n\
2255Return a list of (suffix, mode, type) tuples describing the files\n\
2256that find_module() looks for.\
2257";
2258
2259static char doc_new_module[] = "\
2260new_module(name) -> module\n\
2261Create a new module. Do not enter it in sys.modules.\n\
2262The module name must include the full package name, if any.\
2263";
2264
Guido van Rossum79f25d91997-04-29 20:08:16 +00002265static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002266 {"find_module", imp_find_module, 1, doc_find_module},
2267 {"get_magic", imp_get_magic, 1, doc_get_magic},
2268 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2269 {"load_module", imp_load_module, 1, doc_load_module},
2270 {"new_module", imp_new_module, 1, doc_new_module},
2271 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002272 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002273 {"init_builtin", imp_init_builtin, 1},
2274 {"init_frozen", imp_init_frozen, 1},
2275 {"is_builtin", imp_is_builtin, 1},
2276 {"is_frozen", imp_is_frozen, 1},
2277 {"load_compiled", imp_load_compiled, 1},
2278 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002279 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002280#ifdef macintosh
2281 {"load_resource", imp_load_resource, 1},
2282#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002283 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002284 {NULL, NULL} /* sentinel */
2285};
2286
Guido van Rossum1a8791e1998-08-04 22:46:29 +00002287static int
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002288setint(d, name, value)
2289 PyObject *d;
2290 char *name;
2291 int value;
2292{
2293 PyObject *v;
2294 int err;
2295
2296 v = PyInt_FromLong((long)value);
2297 err = PyDict_SetItemString(d, name, v);
2298 Py_XDECREF(v);
2299 return err;
2300}
2301
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002302void
2303initimp()
2304{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002305 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002306
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002307 m = Py_InitModule4("imp", imp_methods, doc_imp,
2308 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002309 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002310
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002311 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2312 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2313 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2314 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2315 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2316 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2317 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2318 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00002319 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002320
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002321 failure:
2322 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002323}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002324
2325
2326/* API for embedding applications that want to add their own entries to the
2327 table of built-in modules. This should normally be called *before*
2328 Py_Initialize(). When the malloc() or realloc() call fails, -1 is returned
2329 and the existing table is unchanged.
2330
2331 After a similar function by Just van Rossum. */
2332
2333int
2334PyImport_ExtendInittab(newtab)
2335 struct _inittab *newtab;
2336{
2337 static struct _inittab *our_copy = NULL;
2338 struct _inittab *p;
2339 int i, n;
2340
2341 /* Count the number of entries in both tables */
2342 for (n = 0; newtab[n].name != NULL; n++)
2343 ;
2344 if (n == 0)
2345 return 0; /* Nothing to do */
2346 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2347 ;
2348
2349 /* Allocate new memory for the combined table */
2350 if (our_copy == NULL)
2351 p = malloc((i+n+1) * sizeof(struct _inittab));
2352 else
2353 p = realloc(our_copy, (i+n+1) * sizeof(struct _inittab));
2354 if (p == NULL)
2355 return -1;
2356
2357 /* Copy the tables into the new memory */
2358 if (our_copy != PyImport_Inittab)
2359 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2360 PyImport_Inittab = our_copy = p;
2361 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
2362
2363 return 0;
2364}
2365
2366/* Shorthand to add a single entry given a name and a function */
2367
2368int
2369PyImport_AppendInittab(name, initfunc)
2370 char *name;
2371 void (*initfunc)();
2372{
2373 struct _inittab newtab[2];
2374
2375 memset(newtab, '\0', sizeof newtab);
2376
2377 newtab[0].name = name;
2378 newtab[0].initfunc = initfunc;
2379
2380 return PyImport_ExtendInittab(newtab);
2381}