blob: 7099d1b92b4a195d111c304342a3355c413342fb [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);
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000709 pathname = cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000710 }
711 else {
712 co = parse_source_module(pathname, fp);
713 if (co == NULL)
714 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000715 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000716 fprintf(stderr, "import %s # from %s\n",
717 name, pathname);
718 write_compiled_module(co, cpathname, mtime);
719 }
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000720 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000721 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000722
723 return m;
724}
725
726
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000727/* Forward */
728static PyObject *load_module Py_PROTO((char *, FILE *, char *, int));
729static struct filedescr *find_module Py_PROTO((char *, PyObject *,
730 char *, int, FILE **));
Guido van Rossuma86f77d1997-09-09 18:53:47 +0000731static struct _frozen *find_frozen Py_PROTO((char *name));
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000732
733/* Load a package and return its module object WITH INCREMENTED
734 REFERENCE COUNT */
735
736static PyObject *
737load_package(name, pathname)
738 char *name;
739 char *pathname;
740{
741 PyObject *m, *d, *file, *path;
742 int err;
743 char buf[MAXPATHLEN+1];
744 FILE *fp = NULL;
745 struct filedescr *fdp;
746
747 m = PyImport_AddModule(name);
748 if (m == NULL)
749 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000750 if (Py_VerboseFlag)
751 fprintf(stderr, "import %s # directory %s\n",
752 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000753 d = PyModule_GetDict(m);
754 file = PyString_FromString(pathname);
755 if (file == NULL)
756 return NULL;
757 path = Py_BuildValue("[O]", file);
758 if (path == NULL) {
759 Py_DECREF(file);
760 return NULL;
761 }
762 err = PyDict_SetItemString(d, "__file__", file);
763 if (err == 0)
764 err = PyDict_SetItemString(d, "__path__", path);
765 if (err != 0) {
766 m = NULL;
767 goto cleanup;
768 }
769 buf[0] = '\0';
770 fdp = find_module("__init__", path, buf, sizeof(buf), &fp);
771 if (fdp == NULL) {
772 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
773 PyErr_Clear();
774 }
775 else
776 m = NULL;
777 goto cleanup;
778 }
779 m = load_module(name, fp, buf, fdp->type);
780 if (fp != NULL)
781 fclose(fp);
782 cleanup:
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000783 Py_XDECREF(path);
784 Py_XDECREF(file);
785 return m;
786}
787
788
789/* Helper to test for built-in module */
790
791static int
792is_builtin(name)
793 char *name;
794{
795 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +0000796 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
797 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
798 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000799 return -1;
800 else
801 return 1;
802 }
803 }
804 return 0;
805}
806
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000807
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000808/* Search the path (default sys.path) for a module. Return the
809 corresponding filedescr struct, and (via return arguments) the
810 pathname and an open file. Return NULL if the module is not found. */
811
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000812#ifdef MS_COREDLL
813extern FILE *PyWin_FindRegisteredModule();
814#endif
815
Guido van Rossum0980bd91998-02-13 17:18:36 +0000816#ifdef CHECK_IMPORT_CASE
817static int check_case(char *, int, int, char *);
818#endif
819
Guido van Rossum197346f1997-10-31 18:38:52 +0000820static int find_init_module Py_PROTO((char *)); /* Forward */
821
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000822static struct filedescr *
Guido van Rossum0506a431998-08-11 15:07:39 +0000823find_module(realname, path, buf, buflen, p_fp)
824 char *realname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000825 PyObject *path;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000826 /* Output parameters: */
827 char *buf;
828 int buflen;
829 FILE **p_fp;
830{
831 int i, npath, len, namelen;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000832 struct _frozen *f;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000833 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000834 FILE *fp = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000835 struct stat statbuf;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000836 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
837 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
838 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossum0506a431998-08-11 15:07:39 +0000839 char name[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000840
Guido van Rossum0506a431998-08-11 15:07:39 +0000841 strcpy(name, realname);
842
843 if (path != NULL && PyString_Check(path)) {
844 /* Submodule of "frozen" package:
845 Set name to the fullname, path to NULL
846 and continue as "usual" */
847 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
848 PyErr_SetString(PyExc_ImportError,
849 "full frozen module name too long");
850 return NULL;
851 }
852 strcpy(buf, PyString_AsString(path));
853 strcat(buf, ".");
854 strcat(buf, name);
855 strcpy(name, buf);
856 path = NULL;
857 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000858 if (path == NULL) {
859 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000860 strcpy(buf, name);
861 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000862 }
Guido van Rossuma5568d31998-03-05 03:45:08 +0000863 if ((f = find_frozen(name)) != NULL) {
864 strcpy(buf, name);
865 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000866 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000867
Guido van Rossumac279101996-08-22 23:10:58 +0000868#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000869 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
870 if (fp != NULL) {
871 *p_fp = fp;
872 return fdp;
873 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000874#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000875 path = PySys_GetObject("path");
876 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000877 if (path == NULL || !PyList_Check(path)) {
878 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +0000879 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000880 return NULL;
881 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000882 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000883 namelen = strlen(name);
884 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000885 PyObject *v = PyList_GetItem(path, i);
886 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000887 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000888 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000889 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000890 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000891 strcpy(buf, PyString_AsString(v));
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000892 if ((int)strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000893 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000894#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000895#ifdef INTERN_STRINGS
896 /*
897 ** Speedup: each sys.path item is interned, and
898 ** FindResourceModule remembers which items refer to
899 ** folders (so we don't have to bother trying to look
900 ** into them for resources).
901 */
902 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
903 v = PyList_GET_ITEM(path, i);
904#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000905 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000906 static struct filedescr resfiledescr =
907 {"", "", PY_RESOURCE};
Jack Jansen9c96a921995-02-15 22:57:06 +0000908
909 return &resfiledescr;
910 }
Guido van Rossum0f84a341998-08-06 13:36:01 +0000911 if (PyMac_FindCodeResourceModule((PyStringObject *)v, name, buf)) {
912 static struct filedescr resfiledescr =
913 {"", "", PY_CODERESOURCE};
914
915 return &resfiledescr;
916 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000917#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000918 if (len > 0 && buf[len-1] != SEP
919#ifdef ALTSEP
920 && buf[len-1] != ALTSEP
921#endif
922 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000923 buf[len++] = SEP;
Guido van Rossum40f470f1996-05-23 22:51:04 +0000924#ifdef IMPORT_8x3_NAMES
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000925 /* see if we are searching in directory dos-8x3 */
926 if (len > 7 && !strncmp(buf + len - 8, "dos-8x3", 7)){
Guido van Rossum40f470f1996-05-23 22:51:04 +0000927 int j;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000928 char ch; /* limit name to 8 lower-case characters */
Guido van Rossum40f470f1996-05-23 22:51:04 +0000929 for (j = 0; (ch = name[j]) && j < 8; j++)
930 if (isupper(ch))
931 buf[len++] = tolower(ch);
932 else
933 buf[len++] = ch;
934 }
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000935 else /* Not in dos-8x3, use the full name */
Guido van Rossum6f489d91996-06-28 20:15:15 +0000936#endif
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000937 {
Guido van Rossum40f470f1996-05-23 22:51:04 +0000938 strcpy(buf+len, name);
939 len += namelen;
940 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000941#ifdef HAVE_STAT
942 if (stat(buf, &statbuf) == 0) {
Guido van Rossum197346f1997-10-31 18:38:52 +0000943 if (S_ISDIR(statbuf.st_mode)) {
Guido van Rossum0980bd91998-02-13 17:18:36 +0000944 if (find_init_module(buf)) {
945#ifdef CHECK_IMPORT_CASE
946 if (!check_case(buf, len, namelen,
947 name))
948 return NULL;
949#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000950 return &fd_package;
Guido van Rossum0980bd91998-02-13 17:18:36 +0000951 }
Guido van Rossum197346f1997-10-31 18:38:52 +0000952 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000953 }
954#else
955 /* XXX How are you going to test for directories? */
956#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000957#ifdef macintosh
958 fdp = PyMac_FindModuleExtension(buf, &len, name);
959 if (fdp)
960 fp = fopen(buf, fdp->mode);
961#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000962 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000963 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000964 if (Py_VerboseFlag > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000965 fprintf(stderr, "# trying %s\n", buf);
966 fp = fopen(buf, fdp->mode);
967 if (fp != NULL)
968 break;
969 }
Guido van Rossum741689d1997-08-12 14:53:39 +0000970#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000971 if (fp != NULL)
972 break;
973 }
974 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000975 PyErr_Format(PyExc_ImportError,
976 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000977 return NULL;
978 }
Guido van Rossum0980bd91998-02-13 17:18:36 +0000979#ifdef CHECK_IMPORT_CASE
980 if (!check_case(buf, len, namelen, name)) {
981 fclose(fp);
982 return NULL;
983 }
984#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000985
986 *p_fp = fp;
987 return fdp;
988}
989
Guido van Rossum0980bd91998-02-13 17:18:36 +0000990#ifdef CHECK_IMPORT_CASE
991
992#ifdef MS_WIN32
993#include <windows.h>
Guido van Rossum323bf5e1998-06-24 03:54:06 +0000994#include <ctype.h>
995
996static int
997allcaps8x3(s)
998 char *s;
999{
1000 /* Return 1 if s is an 8.3 filename in ALLCAPS */
1001 char c;
1002 char *dot = strchr(s, '.');
1003 char *end = strchr(s, '\0');
1004 if (dot != NULL) {
1005 if (dot-s > 8)
1006 return 1; /* More than 8 before '.' */
1007 if (end-dot > 4)
1008 return 1; /* More than 3 after '.' */
1009 end = strchr(dot+1, '.');
1010 if (end != NULL)
1011 return 1; /* More than one dot */
1012 }
1013 else if (end-s > 8)
1014 return 1; /* More than 8 and no dot */
1015 while ((c = *s++)) {
1016 if (islower(c))
1017 return 0;
1018 }
1019 return 1;
1020}
1021
Guido van Rossum0980bd91998-02-13 17:18:36 +00001022static int
1023check_case(char *buf, int len, int namelen, char *name)
1024{
1025 WIN32_FIND_DATA data;
1026 HANDLE h;
1027 if (getenv("PYTHONCASEOK") != NULL)
1028 return 1;
1029 h = FindFirstFile(buf, &data);
1030 if (h == INVALID_HANDLE_VALUE) {
1031 PyErr_Format(PyExc_NameError,
1032 "Can't find file for module %.100s\n(filename %.300s)",
1033 name, buf);
1034 return 0;
1035 }
1036 FindClose(h);
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001037 if (allcaps8x3(data.cFileName)) {
1038 /* Skip the test if the filename is ALL.CAPS. This can
1039 happen in certain circumstances beyond our control,
1040 e.g. when software is installed under NT on a FAT
1041 filesystem and then the same FAT filesystem is used
1042 under Windows 95. */
1043 return 1;
1044 }
Guido van Rossum0980bd91998-02-13 17:18:36 +00001045 if (strncmp(data.cFileName, name, namelen) != 0) {
1046 strcpy(buf+len-namelen, data.cFileName);
1047 PyErr_Format(PyExc_NameError,
1048 "Case mismatch for module name %.100s\n(filename %.300s)",
1049 name, buf);
1050 return 0;
1051 }
1052 return 1;
1053}
1054#endif /* MS_WIN32 */
1055
1056#ifdef macintosh
1057#include <TextUtils.h>
1058static int
1059check_case(char *buf, int len, int namelen, char *name)
1060{
1061 FSSpec fss;
1062 OSErr err;
1063 unsigned char mybuf[MAXPATHLEN+1];
1064
1065 strcpy((char *)mybuf, buf);
1066 c2pstr((char *)mybuf);
1067 err = FSMakeFSSpec(0, 0, mybuf, &fss);
1068 if (err) {
1069 PyErr_Format(PyExc_NameError,
1070 "Can't find file for module %.100s\n(filename %.300s)",
1071 name, buf);
1072 return 0;
1073 }
1074 p2cstr(fss.name);
1075 if ( strncmp(name, (char *)fss.name, namelen) != 0 ) {
1076 PyErr_Format(PyExc_NameError,
1077 "Case mismatch for module name %.100s\n(filename %.300s)",
1078 name, fss.name);
1079 return 0;
1080 }
1081 return 1;
1082}
1083#endif /* macintosh */
1084
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001085#ifdef DJGPP
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001086#include <dir.h>
1087
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001088static int
1089check_case(char *buf, int len, int namelen, char *name)
1090{
1091 struct ffblk ffblk;
1092 int done;
1093
1094 if (getenv("PYTHONCASEOK") != NULL)
1095 return 1;
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001096 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001097 if (done) {
1098 PyErr_Format(PyExc_NameError,
1099 "Can't find file for module %.100s\n(filename %.300s)",
1100 name, buf);
1101 return 0;
1102 }
1103
1104 if (strncmp(ffblk.ff_name, name, namelen) != 0) {
1105 strcpy(buf+len-namelen, ffblk.ff_name);
1106 PyErr_Format(PyExc_NameError,
1107 "Case mismatch for module name %.100s\n(filename %.300s)",
1108 name, buf);
1109 return 0;
1110 }
1111 return 1;
1112}
1113#endif
1114
Guido van Rossum8766a771998-04-10 23:44:32 +00001115#endif /* CHECK_IMPORT_CASE */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001116
Guido van Rossum197346f1997-10-31 18:38:52 +00001117#ifdef HAVE_STAT
1118/* Helper to look for __init__.py or __init__.py[co] in potential package */
1119static int
1120find_init_module(buf)
1121 char *buf;
1122{
1123 int save_len = strlen(buf);
1124 int i = save_len;
1125 struct stat statbuf;
1126
1127 if (save_len + 13 >= MAXPATHLEN)
1128 return 0;
1129 buf[i++] = SEP;
1130 strcpy(buf+i, "__init__.py");
1131 if (stat(buf, &statbuf) == 0) {
1132 buf[save_len] = '\0';
1133 return 1;
1134 }
1135 i += strlen(buf+i);
1136 if (Py_OptimizeFlag)
1137 strcpy(buf+i, "o");
1138 else
1139 strcpy(buf+i, "c");
1140 if (stat(buf, &statbuf) == 0) {
1141 buf[save_len] = '\0';
1142 return 1;
1143 }
1144 buf[save_len] = '\0';
1145 return 0;
1146}
1147#endif /* HAVE_STAT */
1148
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001149
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001150static int init_builtin Py_PROTO((char *)); /* Forward */
1151
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001152/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001153 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001154
Guido van Rossum79f25d91997-04-29 20:08:16 +00001155static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001156load_module(name, fp, buf, type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001157 char *name;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001158 FILE *fp;
1159 char *buf;
1160 int type;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001161{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001162 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001163 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001164 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001165
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001166 /* First check that there's an open file (if we need one) */
1167 switch (type) {
1168 case PY_SOURCE:
1169 case PY_COMPILED:
1170 if (fp == NULL) {
1171 PyErr_Format(PyExc_ValueError,
1172 "file object required for import (type code %d)",
1173 type);
1174 return NULL;
1175 }
1176 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001177
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001178 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001179
1180 case PY_SOURCE:
1181 m = load_source_module(name, buf, fp);
1182 break;
1183
1184 case PY_COMPILED:
1185 m = load_compiled_module(name, buf, fp);
1186 break;
1187
1188 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001189 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001190 break;
1191
Jack Jansen9c96a921995-02-15 22:57:06 +00001192#ifdef macintosh
1193 case PY_RESOURCE:
1194 m = PyMac_LoadResourceModule(name, buf);
1195 break;
Guido van Rossum0f84a341998-08-06 13:36:01 +00001196 case PY_CODERESOURCE:
1197 m = PyMac_LoadCodeResourceModule(name, buf);
1198 break;
Jack Jansen9c96a921995-02-15 22:57:06 +00001199#endif
1200
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001201 case PKG_DIRECTORY:
1202 m = load_package(name, buf);
1203 break;
1204
1205 case C_BUILTIN:
1206 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001207 if (buf != NULL && buf[0] != '\0')
1208 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001209 if (type == C_BUILTIN)
1210 err = init_builtin(name);
1211 else
1212 err = PyImport_ImportFrozenModule(name);
1213 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001214 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001215 if (err == 0) {
1216 PyErr_Format(PyExc_ImportError,
1217 "Purported %s module %.200s not found",
1218 type == C_BUILTIN ?
1219 "builtin" : "frozen",
1220 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001221 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001222 }
1223 modules = PyImport_GetModuleDict();
1224 m = PyDict_GetItemString(modules, name);
1225 if (m == NULL) {
1226 PyErr_Format(
1227 PyExc_ImportError,
1228 "%s module %.200s not properly initialized",
1229 type == C_BUILTIN ?
1230 "builtin" : "frozen",
1231 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001232 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001233 }
1234 Py_INCREF(m);
1235 break;
1236
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001237 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001238 PyErr_Format(PyExc_ImportError,
1239 "Don't know how to import %.200s (type code %d)",
1240 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001241 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001242
1243 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001244
1245 return m;
1246}
1247
1248
1249/* Initialize a built-in module.
1250 Return 1 for succes, 0 if the module is not found, and -1 with
1251 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001252
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001253static int
1254init_builtin(name)
1255 char *name;
1256{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001257 struct _inittab *p;
1258 PyObject *mod;
1259
1260 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
1261 return 1;
1262
Guido van Rossum771c6c81997-10-31 18:37:24 +00001263 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001264 if (strcmp(name, p->name) == 0) {
1265 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001266 PyErr_Format(PyExc_ImportError,
1267 "Cannot re-init internal module %.200s",
1268 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001269 return -1;
1270 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001271 if (Py_VerboseFlag)
Guido van Rossum25ce5661997-08-02 03:10:38 +00001272 fprintf(stderr, "import %s # builtin\n", name);
1273 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001274 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001275 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001276 if (_PyImport_FixupExtension(name, name) == NULL)
1277 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001278 return 1;
1279 }
1280 }
1281 return 0;
1282}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001283
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001284
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001285/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001286
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001287static struct _frozen *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001288find_frozen(name)
1289 char *name;
1290{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001291 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001292
Guido van Rossum79f25d91997-04-29 20:08:16 +00001293 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001294 if (p->name == NULL)
1295 return NULL;
1296 if (strcmp(p->name, name) == 0)
1297 break;
1298 }
1299 return p;
1300}
1301
Guido van Rossum79f25d91997-04-29 20:08:16 +00001302static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001303get_frozen_object(name)
1304 char *name;
1305{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001306 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001307 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001308
1309 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001310 PyErr_Format(PyExc_ImportError,
1311 "No such frozen object named %.200s",
1312 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001313 return NULL;
1314 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001315 size = p->size;
1316 if (size < 0)
1317 size = -size;
1318 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001319}
1320
1321/* Initialize a frozen module.
1322 Return 1 for succes, 0 if the module is not found, and -1 with
1323 an exception set if the initialization failed.
1324 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001325
1326int
Guido van Rossum79f25d91997-04-29 20:08:16 +00001327PyImport_ImportFrozenModule(name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001328 char *name;
1329{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001330 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001331 PyObject *co;
1332 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001333 int ispackage;
1334 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001335
1336 if (p == NULL)
1337 return 0;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001338 size = p->size;
1339 ispackage = (size < 0);
1340 if (ispackage)
1341 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001342 if (Py_VerboseFlag)
Guido van Rossuma5568d31998-03-05 03:45:08 +00001343 fprintf(stderr, "import %s # frozen%s\n",
1344 name, ispackage ? " package" : "");
1345 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001346 if (co == NULL)
1347 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001348 if (!PyCode_Check(co)) {
1349 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001350 PyErr_Format(PyExc_TypeError,
1351 "frozen object %.200s is not a code object",
1352 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001353 return -1;
1354 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001355 if (ispackage) {
1356 /* Set __path__ to the package name */
1357 PyObject *d, *s;
1358 int err;
1359 m = PyImport_AddModule(name);
1360 if (m == NULL)
1361 return -1;
1362 d = PyModule_GetDict(m);
1363 s = PyString_InternFromString(name);
1364 if (s == NULL)
1365 return -1;
1366 err = PyDict_SetItemString(d, "__path__", s);
1367 Py_DECREF(s);
1368 if (err != 0)
1369 return err;
1370 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001371 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001372 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001373 if (m == NULL)
1374 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001375 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001376 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001377}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001378
1379
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001380/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001381 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001382
Guido van Rossum79f25d91997-04-29 20:08:16 +00001383PyObject *
1384PyImport_ImportModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001385 char *name;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001386{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001387 static PyObject *fromlist = NULL;
1388 if (fromlist == NULL && strchr(name, '.') != NULL) {
1389 fromlist = Py_BuildValue("[s]", "*");
1390 if (fromlist == NULL)
1391 return NULL;
1392 }
1393 return PyImport_ImportModuleEx(name, NULL, NULL, fromlist);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001394}
1395
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001396/* Forward declarations for helper routines */
1397static PyObject *get_parent Py_PROTO((PyObject *globals,
1398 char *buf, int *p_buflen));
1399static PyObject *load_next Py_PROTO((PyObject *mod, PyObject *altmod,
1400 char **p_name, char *buf, int *p_buflen));
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001401static int mark_miss Py_PROTO((char *name));
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001402static int ensure_fromlist Py_PROTO((PyObject *mod, PyObject *fromlist,
Guido van Rossum9905ef91997-09-08 16:07:11 +00001403 char *buf, int buflen, int recursive));
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001404static PyObject * import_submodule Py_PROTO((PyObject *mod,
1405 char *name, char *fullname));
1406
1407/* The Magnum Opus of dotted-name import :-) */
1408
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001409static PyObject *
1410import_module_ex(name, globals, locals, fromlist)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001411 char *name;
1412 PyObject *globals;
1413 PyObject *locals;
1414 PyObject *fromlist;
1415{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001416 char buf[MAXPATHLEN+1];
1417 int buflen = 0;
1418 PyObject *parent, *head, *next, *tail;
1419
1420 parent = get_parent(globals, buf, &buflen);
1421 if (parent == NULL)
1422 return NULL;
1423
1424 head = load_next(parent, Py_None, &name, buf, &buflen);
1425 if (head == NULL)
1426 return NULL;
1427
1428 tail = head;
1429 Py_INCREF(tail);
1430 while (name) {
1431 next = load_next(tail, tail, &name, buf, &buflen);
1432 Py_DECREF(tail);
1433 if (next == NULL) {
1434 Py_DECREF(head);
1435 return NULL;
1436 }
1437 tail = next;
1438 }
1439
1440 if (fromlist != NULL) {
1441 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1442 fromlist = NULL;
1443 }
1444
1445 if (fromlist == NULL) {
1446 Py_DECREF(tail);
1447 return head;
1448 }
1449
1450 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001451 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001452 Py_DECREF(tail);
1453 return NULL;
1454 }
1455
1456 return tail;
1457}
1458
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001459PyObject *
1460PyImport_ImportModuleEx(name, globals, locals, fromlist)
1461 char *name;
1462 PyObject *globals;
1463 PyObject *locals;
1464 PyObject *fromlist;
1465{
1466 PyObject *result;
1467 lock_import();
Guido van Rossumd65911b1998-03-03 22:33:27 +00001468 result = import_module_ex(name, globals, locals, fromlist);
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001469 unlock_import();
1470 return result;
1471}
1472
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001473static PyObject *
1474get_parent(globals, buf, p_buflen)
1475 PyObject *globals;
1476 char *buf;
1477 int *p_buflen;
1478{
1479 static PyObject *namestr = NULL;
1480 static PyObject *pathstr = NULL;
1481 PyObject *modname, *modpath, *modules, *parent;
1482
1483 if (globals == NULL || !PyDict_Check(globals))
1484 return Py_None;
1485
1486 if (namestr == NULL) {
1487 namestr = PyString_InternFromString("__name__");
1488 if (namestr == NULL)
1489 return NULL;
1490 }
1491 if (pathstr == NULL) {
1492 pathstr = PyString_InternFromString("__path__");
1493 if (pathstr == NULL)
1494 return NULL;
1495 }
1496
1497 *buf = '\0';
1498 *p_buflen = 0;
1499 modname = PyDict_GetItem(globals, namestr);
1500 if (modname == NULL || !PyString_Check(modname))
1501 return Py_None;
1502
1503 modpath = PyDict_GetItem(globals, pathstr);
1504 if (modpath != NULL) {
1505 int len = PyString_GET_SIZE(modname);
1506 if (len > MAXPATHLEN) {
1507 PyErr_SetString(PyExc_ValueError,
1508 "Module name too long");
1509 return NULL;
1510 }
1511 strcpy(buf, PyString_AS_STRING(modname));
1512 *p_buflen = len;
1513 }
1514 else {
1515 char *start = PyString_AS_STRING(modname);
1516 char *lastdot = strrchr(start, '.');
1517 int len;
1518 if (lastdot == NULL)
1519 return Py_None;
1520 len = lastdot - start;
1521 if (len >= MAXPATHLEN) {
1522 PyErr_SetString(PyExc_ValueError,
1523 "Module name too long");
1524 return NULL;
1525 }
1526 strncpy(buf, start, len);
1527 buf[len] = '\0';
1528 *p_buflen = len;
1529 }
1530
1531 modules = PyImport_GetModuleDict();
1532 parent = PyDict_GetItemString(modules, buf);
1533 if (parent == NULL)
1534 parent = Py_None;
1535 return parent;
1536 /* We expect, but can't guarantee, if parent != None, that:
1537 - parent.__name__ == buf
1538 - parent.__dict__ is globals
1539 If this is violated... Who cares? */
1540}
1541
1542static PyObject *
1543load_next(mod, altmod, p_name, buf, p_buflen)
1544 PyObject *mod;
1545 PyObject *altmod; /* Either None or same as mod */
1546 char **p_name;
1547 char *buf;
1548 int *p_buflen;
1549{
1550 char *name = *p_name;
1551 char *dot = strchr(name, '.');
1552 int len;
1553 char *p;
1554 PyObject *result;
1555
1556 if (dot == NULL) {
1557 *p_name = NULL;
1558 len = strlen(name);
1559 }
1560 else {
1561 *p_name = dot+1;
1562 len = dot-name;
1563 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00001564 if (len == 0) {
1565 PyErr_SetString(PyExc_ValueError,
1566 "Empty module name");
1567 return NULL;
1568 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001569
1570 p = buf + *p_buflen;
1571 if (p != buf)
1572 *p++ = '.';
1573 if (p+len-buf >= MAXPATHLEN) {
1574 PyErr_SetString(PyExc_ValueError,
1575 "Module name too long");
1576 return NULL;
1577 }
1578 strncpy(p, name, len);
1579 p[len] = '\0';
1580 *p_buflen = p+len-buf;
1581
1582 result = import_submodule(mod, p, buf);
1583 if (result == Py_None && altmod != mod) {
1584 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001585 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001586 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001587 if (result != NULL && result != Py_None) {
1588 if (mark_miss(buf) != 0) {
1589 Py_DECREF(result);
1590 return NULL;
1591 }
1592 strncpy(buf, name, len);
1593 buf[len] = '\0';
1594 *p_buflen = len;
1595 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001596 }
1597 if (result == NULL)
1598 return NULL;
1599
1600 if (result == Py_None) {
1601 Py_DECREF(result);
1602 PyErr_Format(PyExc_ImportError,
1603 "No module named %.200s", name);
1604 return NULL;
1605 }
1606
1607 return result;
1608}
1609
1610static int
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001611mark_miss(name)
1612 char *name;
1613{
1614 PyObject *modules = PyImport_GetModuleDict();
1615 return PyDict_SetItemString(modules, name, Py_None);
1616}
1617
1618static int
Guido van Rossum9905ef91997-09-08 16:07:11 +00001619ensure_fromlist(mod, fromlist, buf, buflen, recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001620 PyObject *mod;
1621 PyObject *fromlist;
1622 char *buf;
1623 int buflen;
Guido van Rossum9905ef91997-09-08 16:07:11 +00001624 int recursive;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001625{
1626 int i;
1627
1628 if (!PyObject_HasAttrString(mod, "__path__"))
1629 return 1;
1630
1631 for (i = 0; ; i++) {
1632 PyObject *item = PySequence_GetItem(fromlist, i);
1633 int hasit;
1634 if (item == NULL) {
1635 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1636 PyErr_Clear();
1637 return 1;
1638 }
1639 return 0;
1640 }
1641 if (!PyString_Check(item)) {
1642 PyErr_SetString(PyExc_TypeError,
1643 "Item in ``from list'' not a string");
1644 Py_DECREF(item);
1645 return 0;
1646 }
1647 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001648 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001649 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001650 /* See if the package defines __all__ */
1651 if (recursive)
1652 continue; /* Avoid endless recursion */
1653 all = PyObject_GetAttrString(mod, "__all__");
1654 if (all == NULL)
1655 PyErr_Clear();
1656 else {
1657 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1658 return 0;
1659 Py_DECREF(all);
1660 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001661 continue;
1662 }
1663 hasit = PyObject_HasAttr(mod, item);
1664 if (!hasit) {
1665 char *subname = PyString_AS_STRING(item);
1666 PyObject *submod;
1667 char *p;
1668 if (buflen + strlen(subname) >= MAXPATHLEN) {
1669 PyErr_SetString(PyExc_ValueError,
1670 "Module name too long");
1671 Py_DECREF(item);
1672 return 0;
1673 }
1674 p = buf + buflen;
1675 *p++ = '.';
1676 strcpy(p, subname);
1677 submod = import_submodule(mod, subname, buf);
1678 Py_XDECREF(submod);
1679 if (submod == NULL) {
1680 Py_DECREF(item);
1681 return 0;
1682 }
1683 }
1684 Py_DECREF(item);
1685 }
1686
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001687 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001688}
1689
1690static PyObject *
1691import_submodule(mod, subname, fullname)
1692 PyObject *mod; /* May be None */
1693 char *subname;
1694 char *fullname;
1695{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001696 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001697 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001698
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001699 /* Require:
1700 if mod == None: subname == fullname
1701 else: mod.__name__ + "." + subname == fullname
1702 */
1703
1704 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001705 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001706 }
1707 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001708 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001709 char buf[MAXPATHLEN+1];
1710 struct filedescr *fdp;
1711 FILE *fp = NULL;
1712
Guido van Rossum9c0afe51998-05-19 15:09:05 +00001713 if (mod == Py_None)
1714 path = NULL;
1715 else {
1716 path = PyObject_GetAttrString(mod, "__path__");
1717 if (path == NULL) {
1718 PyErr_Clear();
1719 Py_INCREF(Py_None);
1720 return Py_None;
1721 }
1722 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001723
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001724 buf[0] = '\0';
Guido van Rossumb68cd421998-07-01 17:36:26 +00001725 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1726 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001727 if (fdp == NULL) {
1728 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1729 return NULL;
1730 PyErr_Clear();
1731 Py_INCREF(Py_None);
1732 return Py_None;
1733 }
1734 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001735 if (fp)
1736 fclose(fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001737 if (m != NULL && mod != Py_None) {
1738 if (PyObject_SetAttrString(mod, subname, m) < 0) {
1739 Py_DECREF(m);
1740 m = NULL;
1741 }
1742 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001743 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001744
1745 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001746}
1747
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001748
1749/* Re-import a module of any kind and return its module object, WITH
1750 INCREMENTED REFERENCE COUNT */
1751
Guido van Rossum79f25d91997-04-29 20:08:16 +00001752PyObject *
1753PyImport_ReloadModule(m)
1754 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001755{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001756 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001757 PyObject *path = NULL;
1758 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001759 char buf[MAXPATHLEN+1];
1760 struct filedescr *fdp;
1761 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001762
Guido van Rossum79f25d91997-04-29 20:08:16 +00001763 if (m == NULL || !PyModule_Check(m)) {
1764 PyErr_SetString(PyExc_TypeError,
1765 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001766 return NULL;
1767 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001768 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001769 if (name == NULL)
1770 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001771 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001772 PyErr_Format(PyExc_ImportError,
1773 "reload(): module %.200s not in sys.modules",
1774 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001775 return NULL;
1776 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001777 subname = strrchr(name, '.');
1778 if (subname == NULL)
1779 subname = name;
1780 else {
1781 PyObject *parentname, *parent;
1782 parentname = PyString_FromStringAndSize(name, (subname-name));
1783 if (parentname == NULL)
1784 return NULL;
1785 parent = PyDict_GetItem(modules, parentname);
1786 if (parent == NULL) {
1787 PyErr_Format(PyExc_ImportError,
1788 "reload(): parent %.200s not in sys.modules",
1789 name);
1790 return NULL;
1791 }
1792 subname++;
1793 path = PyObject_GetAttrString(parent, "__path__");
1794 if (path == NULL)
1795 PyErr_Clear();
1796 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001797 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001798 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1799 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001800 if (fdp == NULL)
1801 return NULL;
1802 m = load_module(name, fp, buf, fdp->type);
1803 if (fp)
1804 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001805 return m;
1806}
1807
1808
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001809/* Higher-level import emulator which emulates the "import" statement
1810 more accurately -- it invokes the __import__() function from the
1811 builtins of the current globals. This means that the import is
1812 done using whatever import hooks are installed in the current
1813 environment, e.g. by "ni" or "rexec". */
1814
1815PyObject *
1816PyImport_Import(module_name)
1817 PyObject *module_name;
1818{
1819 static PyObject *silly_list = NULL;
1820 static PyObject *builtins_str = NULL;
1821 static PyObject *import_str = NULL;
1822 static PyObject *standard_builtins = NULL;
1823 PyObject *globals = NULL;
1824 PyObject *import = NULL;
1825 PyObject *builtins = NULL;
1826 PyObject *r = NULL;
1827
1828 /* Initialize constant string objects */
1829 if (silly_list == NULL) {
1830 import_str = PyString_InternFromString("__import__");
1831 if (import_str == NULL)
1832 return NULL;
1833 builtins_str = PyString_InternFromString("__builtins__");
1834 if (builtins_str == NULL)
1835 return NULL;
1836 silly_list = Py_BuildValue("[s]", "__doc__");
1837 if (silly_list == NULL)
1838 return NULL;
1839 }
1840
1841 /* Get the builtins from current globals */
1842 globals = PyEval_GetGlobals();
1843 if(globals != NULL) {
1844 builtins = PyObject_GetItem(globals, builtins_str);
1845 if (builtins == NULL)
1846 goto err;
1847 }
1848 else {
1849 /* No globals -- use standard builtins, and fake globals */
1850 PyErr_Clear();
1851
1852 if (standard_builtins == NULL) {
1853 standard_builtins =
1854 PyImport_ImportModule("__builtin__");
1855 if (standard_builtins == NULL)
1856 return NULL;
1857 }
1858
1859 builtins = standard_builtins;
1860 Py_INCREF(builtins);
1861 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1862 if (globals == NULL)
1863 goto err;
1864 }
1865
1866 /* Get the __import__ function from the builtins */
1867 if (PyDict_Check(builtins))
1868 import=PyObject_GetItem(builtins, import_str);
1869 else
1870 import=PyObject_GetAttr(builtins, import_str);
1871 if (import == NULL)
1872 goto err;
1873
1874 /* Call the _import__ function with the proper argument list */
1875 r = PyObject_CallFunction(import, "OOOO",
1876 module_name, globals, globals, silly_list);
1877
1878 err:
1879 Py_XDECREF(globals);
1880 Py_XDECREF(builtins);
1881 Py_XDECREF(import);
1882
1883 return r;
1884}
1885
1886
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001887/* Module 'imp' provides Python access to the primitives used for
1888 importing modules.
1889*/
1890
Guido van Rossum79f25d91997-04-29 20:08:16 +00001891static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001892imp_get_magic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001893 PyObject *self;
1894 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001895{
1896 char buf[4];
1897
Guido van Rossum79f25d91997-04-29 20:08:16 +00001898 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001899 return NULL;
Guido van Rossum6bf62da1997-04-11 20:37:35 +00001900 buf[0] = (char) ((MAGIC >> 0) & 0xff);
1901 buf[1] = (char) ((MAGIC >> 8) & 0xff);
1902 buf[2] = (char) ((MAGIC >> 16) & 0xff);
1903 buf[3] = (char) ((MAGIC >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001904
Guido van Rossum79f25d91997-04-29 20:08:16 +00001905 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001906}
1907
Guido van Rossum79f25d91997-04-29 20:08:16 +00001908static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001909imp_get_suffixes(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001910 PyObject *self;
1911 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001912{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001913 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001914 struct filedescr *fdp;
1915
Guido van Rossum79f25d91997-04-29 20:08:16 +00001916 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001917 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001918 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001919 if (list == NULL)
1920 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001921 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
1922 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001923 fdp->suffix, fdp->mode, fdp->type);
1924 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001925 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001926 return NULL;
1927 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001928 if (PyList_Append(list, item) < 0) {
1929 Py_DECREF(list);
1930 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001931 return NULL;
1932 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001933 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001934 }
1935 return list;
1936}
1937
Guido van Rossum79f25d91997-04-29 20:08:16 +00001938static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001939call_find_module(name, path)
1940 char *name;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001941 PyObject *path; /* list or None or NULL */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001942{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001943 extern int fclose Py_PROTO((FILE *));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001944 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001945 struct filedescr *fdp;
1946 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001947 FILE *fp = NULL;
1948
1949 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001950 if (path == Py_None)
1951 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001952 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
1953 if (fdp == NULL)
1954 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001955 if (fp != NULL) {
1956 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
1957 if (fob == NULL) {
1958 fclose(fp);
1959 return NULL;
1960 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001961 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001962 else {
1963 fob = Py_None;
1964 Py_INCREF(fob);
1965 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001966 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001967 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001968 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001969 return ret;
1970}
1971
Guido van Rossum79f25d91997-04-29 20:08:16 +00001972static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001973imp_find_module(self, args)
1974 PyObject *self;
1975 PyObject *args;
1976{
1977 char *name;
1978 PyObject *path = NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001979 if (!PyArg_ParseTuple(args, "s|O", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001980 return NULL;
1981 return call_find_module(name, path);
1982}
1983
1984static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001985imp_init_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001986 PyObject *self;
1987 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001988{
1989 char *name;
1990 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001991 PyObject *m;
1992 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001993 return NULL;
1994 ret = init_builtin(name);
1995 if (ret < 0)
1996 return NULL;
1997 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001998 Py_INCREF(Py_None);
1999 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002000 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002001 m = PyImport_AddModule(name);
2002 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002003 return m;
2004}
2005
Guido van Rossum79f25d91997-04-29 20:08:16 +00002006static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002007imp_init_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002008 PyObject *self;
2009 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002010{
2011 char *name;
2012 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002013 PyObject *m;
2014 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002015 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002016 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002017 if (ret < 0)
2018 return NULL;
2019 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002020 Py_INCREF(Py_None);
2021 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002022 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002023 m = PyImport_AddModule(name);
2024 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002025 return m;
2026}
2027
Guido van Rossum79f25d91997-04-29 20:08:16 +00002028static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002029imp_get_frozen_object(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002030 PyObject *self;
2031 PyObject *args;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002032{
2033 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002034
Guido van Rossum79f25d91997-04-29 20:08:16 +00002035 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002036 return NULL;
2037 return get_frozen_object(name);
2038}
2039
Guido van Rossum79f25d91997-04-29 20:08:16 +00002040static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002041imp_is_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002042 PyObject *self;
2043 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002044{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002045 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002046 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002047 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002048 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002049}
2050
Guido van Rossum79f25d91997-04-29 20:08:16 +00002051static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002052imp_is_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002053 PyObject *self;
2054 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002055{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002056 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002057 struct _frozen *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002058 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002059 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002060 p = find_frozen(name);
2061 return PyInt_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002062}
2063
2064static FILE *
2065get_file(pathname, fob, mode)
2066 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002067 PyObject *fob;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002068 char *mode;
2069{
2070 FILE *fp;
2071 if (fob == NULL) {
2072 fp = fopen(pathname, mode);
2073 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002074 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002075 }
2076 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002077 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002078 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002079 PyErr_SetString(PyExc_ValueError,
2080 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002081 }
2082 return fp;
2083}
2084
Guido van Rossum79f25d91997-04-29 20:08:16 +00002085static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002086imp_load_compiled(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002087 PyObject *self;
2088 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002089{
2090 char *name;
2091 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002092 PyObject *fob = NULL;
2093 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002094 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002095 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002096 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002097 return NULL;
2098 fp = get_file(pathname, fob, "rb");
2099 if (fp == NULL)
2100 return NULL;
2101 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002102 if (fob == NULL)
2103 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002104 return m;
2105}
2106
Guido van Rossum79f25d91997-04-29 20:08:16 +00002107static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002108imp_load_dynamic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002109 PyObject *self;
2110 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002111{
2112 char *name;
2113 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002114 PyObject *fob = NULL;
2115 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002116 FILE *fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002117 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
2118 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002119 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002120 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002121 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002122 if (fp == NULL)
2123 return NULL;
2124 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002125 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002126 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002127}
2128
Guido van Rossum79f25d91997-04-29 20:08:16 +00002129static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002130imp_load_source(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002131 PyObject *self;
2132 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002133{
2134 char *name;
2135 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002136 PyObject *fob = NULL;
2137 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002138 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002139 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002140 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002141 return NULL;
2142 fp = get_file(pathname, fob, "r");
2143 if (fp == NULL)
2144 return NULL;
2145 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002146 if (fob == NULL)
2147 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002148 return m;
2149}
2150
Jack Jansen9c96a921995-02-15 22:57:06 +00002151#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002152static PyObject *
Jack Jansen9c96a921995-02-15 22:57:06 +00002153imp_load_resource(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002154 PyObject *self;
2155 PyObject *args;
Jack Jansen9c96a921995-02-15 22:57:06 +00002156{
2157 char *name;
2158 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002159 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002160
Guido van Rossum79f25d91997-04-29 20:08:16 +00002161 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002162 return NULL;
2163 m = PyMac_LoadResourceModule(name, pathname);
2164 return m;
2165}
2166#endif /* macintosh */
2167
Guido van Rossum79f25d91997-04-29 20:08:16 +00002168static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002169imp_load_module(self, args)
2170 PyObject *self;
2171 PyObject *args;
2172{
2173 char *name;
2174 PyObject *fob;
2175 char *pathname;
2176 char *suffix; /* Unused */
2177 char *mode;
2178 int type;
2179 FILE *fp;
2180
2181 if (!PyArg_ParseTuple(args, "sOs(ssi)",
2182 &name, &fob, &pathname,
2183 &suffix, &mode, &type))
2184 return NULL;
2185 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
2186 PyErr_Format(PyExc_ValueError,
2187 "invalid file open mode %.200s", mode);
2188 return NULL;
2189 }
2190 if (fob == Py_None)
2191 fp = NULL;
2192 else {
2193 if (!PyFile_Check(fob)) {
2194 PyErr_SetString(PyExc_ValueError,
2195 "load_module arg#2 should be a file or None");
2196 return NULL;
2197 }
2198 fp = get_file(pathname, fob, mode);
2199 if (fp == NULL)
2200 return NULL;
2201 }
2202 return load_module(name, fp, pathname, type);
2203}
2204
2205static PyObject *
2206imp_load_package(self, args)
2207 PyObject *self;
2208 PyObject *args;
2209{
2210 char *name;
2211 char *pathname;
2212 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
2213 return NULL;
2214 return load_package(name, pathname);
2215}
2216
2217static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002218imp_new_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002219 PyObject *self;
2220 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002221{
2222 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002223 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002224 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002225 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002226}
2227
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002228/* Doc strings */
2229
2230static char doc_imp[] = "\
2231This module provides the components needed to build your own\n\
2232__import__ function. Undocumented functions are obsolete.\n\
2233";
2234
2235static char doc_find_module[] = "\
2236find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
2237Search for a module. If path is omitted or None, search for a\n\
2238built-in, frozen or special module and continue search in sys.path.\n\
2239The module name cannot contain '.'; to search for a submodule of a\n\
2240package, pass the submodule name and the package's __path__.\
2241";
2242
2243static char doc_load_module[] = "\
2244load_module(name, file, filename, (suffix, mode, type)) -> module\n\
2245Load a module, given information returned by find_module().\n\
2246The module name must include the full package name, if any.\
2247";
2248
2249static char doc_get_magic[] = "\
2250get_magic() -> string\n\
2251Return the magic number for .pyc or .pyo files.\
2252";
2253
2254static char doc_get_suffixes[] = "\
2255get_suffixes() -> [(suffix, mode, type), ...]\n\
2256Return a list of (suffix, mode, type) tuples describing the files\n\
2257that find_module() looks for.\
2258";
2259
2260static char doc_new_module[] = "\
2261new_module(name) -> module\n\
2262Create a new module. Do not enter it in sys.modules.\n\
2263The module name must include the full package name, if any.\
2264";
2265
Guido van Rossum79f25d91997-04-29 20:08:16 +00002266static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002267 {"find_module", imp_find_module, 1, doc_find_module},
2268 {"get_magic", imp_get_magic, 1, doc_get_magic},
2269 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2270 {"load_module", imp_load_module, 1, doc_load_module},
2271 {"new_module", imp_new_module, 1, doc_new_module},
2272 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002273 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002274 {"init_builtin", imp_init_builtin, 1},
2275 {"init_frozen", imp_init_frozen, 1},
2276 {"is_builtin", imp_is_builtin, 1},
2277 {"is_frozen", imp_is_frozen, 1},
2278 {"load_compiled", imp_load_compiled, 1},
2279 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002280 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002281#ifdef macintosh
2282 {"load_resource", imp_load_resource, 1},
2283#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002284 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002285 {NULL, NULL} /* sentinel */
2286};
2287
Guido van Rossum1a8791e1998-08-04 22:46:29 +00002288static int
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002289setint(d, name, value)
2290 PyObject *d;
2291 char *name;
2292 int value;
2293{
2294 PyObject *v;
2295 int err;
2296
2297 v = PyInt_FromLong((long)value);
2298 err = PyDict_SetItemString(d, name, v);
2299 Py_XDECREF(v);
2300 return err;
2301}
2302
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002303void
2304initimp()
2305{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002306 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002307
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002308 m = Py_InitModule4("imp", imp_methods, doc_imp,
2309 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002310 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002311
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002312 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2313 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2314 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2315 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2316 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2317 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2318 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2319 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00002320 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002321
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002322 failure:
2323 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002324}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002325
2326
2327/* API for embedding applications that want to add their own entries to the
2328 table of built-in modules. This should normally be called *before*
2329 Py_Initialize(). When the malloc() or realloc() call fails, -1 is returned
2330 and the existing table is unchanged.
2331
2332 After a similar function by Just van Rossum. */
2333
2334int
2335PyImport_ExtendInittab(newtab)
2336 struct _inittab *newtab;
2337{
2338 static struct _inittab *our_copy = NULL;
2339 struct _inittab *p;
2340 int i, n;
2341
2342 /* Count the number of entries in both tables */
2343 for (n = 0; newtab[n].name != NULL; n++)
2344 ;
2345 if (n == 0)
2346 return 0; /* Nothing to do */
2347 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2348 ;
2349
2350 /* Allocate new memory for the combined table */
2351 if (our_copy == NULL)
2352 p = malloc((i+n+1) * sizeof(struct _inittab));
2353 else
2354 p = realloc(our_copy, (i+n+1) * sizeof(struct _inittab));
2355 if (p == NULL)
2356 return -1;
2357
2358 /* Copy the tables into the new memory */
2359 if (our_copy != PyImport_Inittab)
2360 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2361 PyImport_Inittab = our_copy = p;
2362 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
2363
2364 return 0;
2365}
2366
2367/* Shorthand to add a single entry given a name and a function */
2368
2369int
2370PyImport_AppendInittab(name, initfunc)
2371 char *name;
2372 void (*initfunc)();
2373{
2374 struct _inittab newtab[2];
2375
2376 memset(newtab, '\0', sizeof newtab);
2377
2378 newtab[0].name = name;
2379 newtab[0].initfunc = initfunc;
2380
2381 return PyImport_ExtendInittab(newtab);
2382}