blob: e10463b28835801f79c4701c944a870a4b39d17b [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
Guido van Rossum2571cc81999-04-07 16:07:23 +000058#ifndef DONT_HAVE_SYS_TYPES_H
Guido van Rossumaee0bad1997-09-05 07:33:22 +000059#include <sys/types.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +000060#endif
61#ifndef DONT_HAVE_SYS_STAT_H
Guido van Rossumaee0bad1997-09-05 07:33:22 +000062#include <sys/stat.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +000063#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +000064
Guido van Rossum595d7ba1997-12-05 21:45:29 +000065#if defined(PYCC_VACPP)
66/* VisualAge C/C++ Failed to Define MountType Field in sys/stat.h */
67#define S_IFMT (S_IFDIR|S_IFCHR|S_IFREG)
68#endif
69
Guido van Rossumaee0bad1997-09-05 07:33:22 +000070#ifndef S_ISDIR
71#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
72#endif
73
74#endif
75
76
Guido van Rossum79f25d91997-04-29 20:08:16 +000077extern long PyOS_GetLastModificationTime(); /* In getmtime.c */
Guido van Rossum21d335e1993-10-15 13:01:11 +000078
Guido van Rossum6c849691994-09-26 15:47:17 +000079/* Magic word to reject .pyc files generated by other Python versions */
Guido van Rossum7faeab31995-07-07 22:50:36 +000080/* Change for each incompatible change */
81/* The value of CR and LF is incorporated so if you ever read or write
82 a .pyc file in text mode the magic number will be wrong; also, the
83 Apple MPW compiler swaps their values, botching string constants */
84/* XXX Perhaps the magic number should be frozen and a version field
85 added to the .pyc file header? */
Guido van Rossumdd5db431997-01-17 21:06:11 +000086/* New way to come up with the magic number: (YEAR-1995), MONTH, DAY */
Guido van Rossum99d18251997-01-24 03:44:53 +000087#define MAGIC (20121 | ((long)'\r'<<16) | ((long)'\n'<<24))
Guido van Rossum3ddee711991-12-16 13:06:34 +000088
Guido van Rossum25ce5661997-08-02 03:10:38 +000089/* See _PyImport_FixupExtension() below */
90static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000091
Guido van Rossum771c6c81997-10-31 18:37:24 +000092/* This table is defined in config.c: */
93extern struct _inittab _PyImport_Inittab[];
94
95struct _inittab *PyImport_Inittab = _PyImport_Inittab;
Guido van Rossum66f1fa81991-04-03 19:03:52 +000096
Guido van Rossumed1170e1999-12-20 21:23:41 +000097/* these tables define the module suffixes that Python recognizes */
98struct filedescr * _PyImport_Filetab = NULL;
99static const struct filedescr _PyImport_StandardFiletab[] = {
100 {".py", "r", PY_SOURCE},
101 {".pyc", "rb", PY_COMPILED},
102 {0, 0}
103};
104
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000105/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000106
107void
Guido van Rossum25ce5661997-08-02 03:10:38 +0000108_PyImport_Init()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000109{
Guido van Rossumed1170e1999-12-20 21:23:41 +0000110 const struct filedescr *scan;
111 struct filedescr *filetab;
112 int countD = 0;
113 int countS = 0;
114
115 /* prepare _PyImport_Filetab: copy entries from
116 _PyImport_DynLoadFiletab and _PyImport_StandardFiletab.
117 */
118 for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan)
119 ++countD;
120 for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan)
121 ++countS;
122 filetab = malloc((countD + countS + 1) * sizeof(struct filedescr));
123 memcpy(filetab, _PyImport_DynLoadFiletab,
124 countD * sizeof(struct filedescr));
125 memcpy(filetab + countD, _PyImport_StandardFiletab,
126 countS * sizeof(struct filedescr));
127 filetab[countD + countS].suffix = NULL;
128
129 _PyImport_Filetab = filetab;
130
Guido van Rossum0824f631997-03-11 18:37:35 +0000131 if (Py_OptimizeFlag) {
Guido van Rossumed1170e1999-12-20 21:23:41 +0000132 /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */
133 for (; filetab->suffix != NULL; filetab++) {
134 if (strcmp(filetab->suffix, ".pyc") == 0)
135 filetab->suffix = ".pyo";
Guido van Rossum0824f631997-03-11 18:37:35 +0000136 }
137 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000138}
139
Guido van Rossum25ce5661997-08-02 03:10:38 +0000140void
141_PyImport_Fini()
142{
143 Py_XDECREF(extensions);
144 extensions = NULL;
145}
146
147
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000148/* Locking primitives to prevent parallel imports of the same module
149 in different threads to return with a partially loaded module.
150 These calls are serialized by the global interpreter lock. */
151
152#ifdef WITH_THREAD
153
Guido van Rossum49b56061998-10-01 20:42:43 +0000154#include "pythread.h"
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000155
Guido van Rossum65d5b571998-12-21 19:32:43 +0000156static PyThread_type_lock import_lock = 0;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000157static long import_lock_thread = -1;
158static int import_lock_level = 0;
159
160static void
161lock_import()
162{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000163 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000164 if (me == -1)
165 return; /* Too bad */
166 if (import_lock == NULL)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000167 import_lock = PyThread_allocate_lock();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000168 if (import_lock_thread == me) {
169 import_lock_level++;
170 return;
171 }
Guido van Rossum65d5b571998-12-21 19:32:43 +0000172 if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0)) {
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000173 PyThreadState *tstate = PyEval_SaveThread();
Guido van Rossum65d5b571998-12-21 19:32:43 +0000174 PyThread_acquire_lock(import_lock, 1);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000175 PyEval_RestoreThread(tstate);
176 }
177 import_lock_thread = me;
178 import_lock_level = 1;
179}
180
181static void
182unlock_import()
183{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000184 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000185 if (me == -1)
186 return; /* Too bad */
187 if (import_lock_thread != me)
188 Py_FatalError("unlock_import: not holding the import lock");
189 import_lock_level--;
190 if (import_lock_level == 0) {
191 import_lock_thread = -1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000192 PyThread_release_lock(import_lock);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000193 }
194}
195
196#else
197
198#define lock_import()
199#define unlock_import()
200
201#endif
202
Guido van Rossum25ce5661997-08-02 03:10:38 +0000203/* Helper for sys */
204
205PyObject *
206PyImport_GetModuleDict()
207{
208 PyInterpreterState *interp = PyThreadState_Get()->interp;
209 if (interp->modules == NULL)
210 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
211 return interp->modules;
212}
213
Guido van Rossum3f5da241990-12-20 15:06:42 +0000214
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000215/* List of names to clear in sys */
216static char* sys_deletes[] = {
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000217 "path", "argv", "ps1", "ps2", "exitfunc",
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000218 "exc_type", "exc_value", "exc_traceback",
219 "last_type", "last_value", "last_traceback",
220 NULL
221};
222
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000223static char* sys_files[] = {
224 "stdin", "__stdin__",
225 "stdout", "__stdout__",
226 "stderr", "__stderr__",
227 NULL
228};
229
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000230
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000231/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000232
Guido van Rossum3f5da241990-12-20 15:06:42 +0000233void
Guido van Rossum79f25d91997-04-29 20:08:16 +0000234PyImport_Cleanup()
Guido van Rossum3f5da241990-12-20 15:06:42 +0000235{
Guido van Rossum758eec01998-01-19 21:58:26 +0000236 int pos, ndone;
237 char *name;
238 PyObject *key, *value, *dict;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000239 PyInterpreterState *interp = PyThreadState_Get()->interp;
Guido van Rossum758eec01998-01-19 21:58:26 +0000240 PyObject *modules = interp->modules;
241
242 if (modules == NULL)
243 return; /* Already done */
244
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000245 /* Delete some special variables first. These are common
246 places where user values hide and people complain when their
247 destructors fail. Since the modules containing them are
248 deleted *last* of all, they would come too late in the normal
249 destruction order. Sigh. */
250
251 value = PyDict_GetItemString(modules, "__builtin__");
252 if (value != NULL && PyModule_Check(value)) {
253 dict = PyModule_GetDict(value);
254 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000255 PySys_WriteStderr("# clear __builtin__._\n");
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000256 PyDict_SetItemString(dict, "_", Py_None);
257 }
258 value = PyDict_GetItemString(modules, "sys");
259 if (value != NULL && PyModule_Check(value)) {
260 char **p;
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000261 PyObject *v;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000262 dict = PyModule_GetDict(value);
263 for (p = sys_deletes; *p != NULL; p++) {
264 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000265 PySys_WriteStderr("# clear sys.%s\n", *p);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000266 PyDict_SetItemString(dict, *p, Py_None);
267 }
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000268 for (p = sys_files; *p != NULL; p+=2) {
269 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000270 PySys_WriteStderr("# restore sys.%s\n", *p);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000271 v = PyDict_GetItemString(dict, *(p+1));
272 if (v == NULL)
273 v = Py_None;
274 PyDict_SetItemString(dict, *p, v);
275 }
276 }
277
278 /* First, delete __main__ */
279 value = PyDict_GetItemString(modules, "__main__");
280 if (value != NULL && PyModule_Check(value)) {
281 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000282 PySys_WriteStderr("# cleanup __main__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000283 _PyModule_Clear(value);
284 PyDict_SetItemString(modules, "__main__", Py_None);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000285 }
286
Guido van Rossum758eec01998-01-19 21:58:26 +0000287 /* The special treatment of __builtin__ here is because even
288 when it's not referenced as a module, its dictionary is
289 referenced by almost every module's __builtins__. Since
290 deleting a module clears its dictionary (even if there are
291 references left to it), we need to delete the __builtin__
292 module last. Likewise, we don't delete sys until the very
293 end because it is implicitly referenced (e.g. by print).
294
295 Also note that we 'delete' modules by replacing their entry
296 in the modules dict with None, rather than really deleting
297 them; this avoids a rehash of the modules dictionary and
298 also marks them as "non existent" so they won't be
299 re-imported. */
300
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000301 /* Next, repeatedly delete modules with a reference count of
Guido van Rossum758eec01998-01-19 21:58:26 +0000302 one (skipping __builtin__ and sys) and delete them */
303 do {
304 ndone = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000305 pos = 0;
Guido van Rossum758eec01998-01-19 21:58:26 +0000306 while (PyDict_Next(modules, &pos, &key, &value)) {
307 if (value->ob_refcnt != 1)
308 continue;
Guido van Rossum566373e1998-10-01 15:24:50 +0000309 if (PyString_Check(key) && PyModule_Check(value)) {
310 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000311 if (strcmp(name, "__builtin__") == 0)
312 continue;
313 if (strcmp(name, "sys") == 0)
314 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000315 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000316 PySys_WriteStderr(
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000317 "# cleanup[1] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000318 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000319 PyDict_SetItem(modules, key, Py_None);
320 ndone++;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000321 }
322 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000323 } while (ndone > 0);
324
Guido van Rossum758eec01998-01-19 21:58:26 +0000325 /* Next, delete all modules (still skipping __builtin__ and sys) */
326 pos = 0;
327 while (PyDict_Next(modules, &pos, &key, &value)) {
Guido van Rossum566373e1998-10-01 15:24:50 +0000328 if (PyString_Check(key) && PyModule_Check(value)) {
329 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000330 if (strcmp(name, "__builtin__") == 0)
331 continue;
332 if (strcmp(name, "sys") == 0)
333 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000334 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000335 PySys_WriteStderr("# cleanup[2] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000336 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000337 PyDict_SetItem(modules, key, Py_None);
338 }
339 }
340
341 /* Next, delete sys and __builtin__ (in that order) */
342 value = PyDict_GetItemString(modules, "sys");
343 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000344 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000345 PySys_WriteStderr("# cleanup sys\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000346 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000347 PyDict_SetItemString(modules, "sys", Py_None);
348 }
349 value = PyDict_GetItemString(modules, "__builtin__");
350 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000351 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000352 PySys_WriteStderr("# cleanup __builtin__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000353 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000354 PyDict_SetItemString(modules, "__builtin__", Py_None);
355 }
356
357 /* Finally, clear and delete the modules directory */
358 PyDict_Clear(modules);
359 interp->modules = NULL;
360 Py_DECREF(modules);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000361}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000362
363
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000364/* Helper for pythonrun.c -- return magic number */
365
366long
Guido van Rossum79f25d91997-04-29 20:08:16 +0000367PyImport_GetMagicNumber()
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000368{
369 return MAGIC;
370}
371
372
Guido van Rossum25ce5661997-08-02 03:10:38 +0000373/* Magic for extension modules (built-in as well as dynamically
374 loaded). To prevent initializing an extension module more than
375 once, we keep a static dictionary 'extensions' keyed by module name
376 (for built-in modules) or by filename (for dynamically loaded
377 modules), containing these modules. A copy od the module's
378 dictionary is stored by calling _PyImport_FixupExtension()
379 immediately after the module initialization function succeeds. A
380 copy can be retrieved from there by calling
381 _PyImport_FindExtension(). */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000382
Guido van Rossum79f25d91997-04-29 20:08:16 +0000383PyObject *
Guido van Rossum25ce5661997-08-02 03:10:38 +0000384_PyImport_FixupExtension(name, filename)
385 char *name;
386 char *filename;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000387{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000388 PyObject *modules, *mod, *dict, *copy;
389 if (extensions == NULL) {
390 extensions = PyDict_New();
391 if (extensions == NULL)
392 return NULL;
393 }
394 modules = PyImport_GetModuleDict();
395 mod = PyDict_GetItemString(modules, name);
396 if (mod == NULL || !PyModule_Check(mod)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000397 PyErr_Format(PyExc_SystemError,
398 "_PyImport_FixupExtension: module %.200s not loaded", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000399 return NULL;
400 }
401 dict = PyModule_GetDict(mod);
402 if (dict == NULL)
403 return NULL;
404 copy = PyObject_CallMethod(dict, "copy", "");
405 if (copy == NULL)
406 return NULL;
407 PyDict_SetItemString(extensions, filename, copy);
408 Py_DECREF(copy);
409 return copy;
410}
411
412PyObject *
413_PyImport_FindExtension(name, filename)
414 char *name;
415 char *filename;
416{
417 PyObject *dict, *mod, *mdict, *result;
418 if (extensions == NULL)
419 return NULL;
420 dict = PyDict_GetItemString(extensions, filename);
421 if (dict == NULL)
422 return NULL;
423 mod = PyImport_AddModule(name);
424 if (mod == NULL)
425 return NULL;
426 mdict = PyModule_GetDict(mod);
427 if (mdict == NULL)
428 return NULL;
429 result = PyObject_CallMethod(mdict, "update", "O", dict);
430 if (result == NULL)
431 return NULL;
432 Py_DECREF(result);
433 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000434 PySys_WriteStderr("import %s # previously loaded (%s)\n",
Guido van Rossum25ce5661997-08-02 03:10:38 +0000435 name, filename);
436 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000437}
438
439
440/* Get the module object corresponding to a module name.
441 First check the modules dictionary if there's one there,
442 if not, create a new one and insert in in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000443 Because the former action is most common, THIS DOES NOT RETURN A
444 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000445
Guido van Rossum79f25d91997-04-29 20:08:16 +0000446PyObject *
447PyImport_AddModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000448 char *name;
449{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000450 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000451 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000452
Guido van Rossum25ce5661997-08-02 03:10:38 +0000453 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
Guido van Rossum79f25d91997-04-29 20:08:16 +0000454 PyModule_Check(m))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000455 return m;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000456 m = PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000457 if (m == NULL)
458 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000459 if (PyDict_SetItemString(modules, name, m) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000460 Py_DECREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000461 return NULL;
462 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000463 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000464
465 return m;
466}
467
468
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000469/* Execute a code object in a module and return the module object
470 WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000471
Guido van Rossum79f25d91997-04-29 20:08:16 +0000472PyObject *
473PyImport_ExecCodeModule(name, co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000474 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000475 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000476{
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000477 return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
478}
479
480PyObject *
481PyImport_ExecCodeModuleEx(name, co, pathname)
482 char *name;
483 PyObject *co;
484 char *pathname;
485{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000486 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000487 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000488
Guido van Rossum79f25d91997-04-29 20:08:16 +0000489 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000490 if (m == NULL)
491 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000492 d = PyModule_GetDict(m);
493 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
494 if (PyDict_SetItemString(d, "__builtins__",
495 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000496 return NULL;
497 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000498 /* Remember the filename as the __file__ attribute */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000499 v = NULL;
500 if (pathname != NULL) {
501 v = PyString_FromString(pathname);
502 if (v == NULL)
503 PyErr_Clear();
504 }
505 if (v == NULL) {
506 v = ((PyCodeObject *)co)->co_filename;
507 Py_INCREF(v);
508 }
509 if (PyDict_SetItemString(d, "__file__", v) != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000510 PyErr_Clear(); /* Not important enough to report */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000511 Py_DECREF(v);
512
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000513 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000514 if (v == NULL)
515 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000516 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000517
Guido van Rossum25ce5661997-08-02 03:10:38 +0000518 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000519 PyErr_Format(PyExc_ImportError,
520 "Loaded module %.200s not found in sys.modules",
521 name);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000522 return NULL;
523 }
524
Guido van Rossum79f25d91997-04-29 20:08:16 +0000525 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000526
527 return m;
528}
529
530
531/* Given a pathname for a Python source file, fill a buffer with the
532 pathname for the corresponding compiled file. Return the pathname
533 for the compiled file, or NULL if there's no space in the buffer.
534 Doesn't set an exception. */
535
536static char *
537make_compiled_pathname(pathname, buf, buflen)
538 char *pathname;
539 char *buf;
540 int buflen;
541{
542 int len;
543
544 len = strlen(pathname);
545 if (len+2 > buflen)
546 return NULL;
547 strcpy(buf, pathname);
Guido van Rossum0824f631997-03-11 18:37:35 +0000548 strcpy(buf+len, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000549
550 return buf;
551}
552
553
554/* Given a pathname for a Python source file, its time of last
555 modification, and a pathname for a compiled file, check whether the
556 compiled file represents the same version of the source. If so,
557 return a FILE pointer for the compiled file, positioned just after
558 the header; if not, return NULL.
559 Doesn't set an exception. */
560
561static FILE *
562check_compiled_module(pathname, mtime, cpathname)
563 char *pathname;
564 long mtime;
565 char *cpathname;
566{
567 FILE *fp;
568 long magic;
569 long pyc_mtime;
570
571 fp = fopen(cpathname, "rb");
572 if (fp == NULL)
573 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000574 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000575 if (magic != MAGIC) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000576 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000577 PySys_WriteStderr("# %s has bad magic\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000578 fclose(fp);
579 return NULL;
580 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000581 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000582 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000583 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000584 PySys_WriteStderr("# %s has bad mtime\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000585 fclose(fp);
586 return NULL;
587 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000588 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000589 PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000590 return fp;
591}
592
593
594/* Read a code object from a file and check it for validity */
595
Guido van Rossum79f25d91997-04-29 20:08:16 +0000596static PyCodeObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000597read_compiled_module(cpathname, fp)
598 char *cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000599 FILE *fp;
600{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000601 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000602
Guido van Rossum79f25d91997-04-29 20:08:16 +0000603 co = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000604 /* Ugly: rd_object() may return NULL with or without error */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000605 if (co == NULL || !PyCode_Check(co)) {
606 if (!PyErr_Occurred())
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000607 PyErr_Format(PyExc_ImportError,
608 "Non-code object in %.200s", cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000609 Py_XDECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000610 return NULL;
611 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000612 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000613}
614
615
616/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000617 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000618
Guido van Rossum79f25d91997-04-29 20:08:16 +0000619static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000620load_compiled_module(name, cpathname, fp)
621 char *name;
622 char *cpathname;
623 FILE *fp;
624{
625 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000626 PyCodeObject *co;
627 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000628
Guido van Rossum79f25d91997-04-29 20:08:16 +0000629 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000630 if (magic != MAGIC) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000631 PyErr_Format(PyExc_ImportError,
632 "Bad magic number in %.200s", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000633 return NULL;
634 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000635 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000636 co = read_compiled_module(cpathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000637 if (co == NULL)
638 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000639 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000640 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000641 name, cpathname);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000642 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000643 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000644
645 return m;
646}
647
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000648/* Parse a source file and return the corresponding code object */
649
Guido van Rossum79f25d91997-04-29 20:08:16 +0000650static PyCodeObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000651parse_source_module(pathname, fp)
652 char *pathname;
653 FILE *fp;
654{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000655 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000656 node *n;
657
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000658 n = PyParser_SimpleParseFile(fp, pathname, Py_file_input);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000659 if (n == NULL)
660 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000661 co = PyNode_Compile(n, pathname);
662 PyNode_Free(n);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000663
664 return co;
665}
666
667
668/* Write a compiled module to a file, placing the time of last
669 modification of its source into the header.
670 Errors are ignored, if a write error occurs an attempt is made to
671 remove the file. */
672
673static void
674write_compiled_module(co, cpathname, mtime)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000675 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000676 char *cpathname;
677 long mtime;
678{
679 FILE *fp;
680
681 fp = fopen(cpathname, "wb");
682 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000683 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000684 PySys_WriteStderr(
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000685 "# can't create %s\n", cpathname);
686 return;
687 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000688 PyMarshal_WriteLongToFile(MAGIC, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000689 /* First write a 0 for mtime */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000690 PyMarshal_WriteLongToFile(0L, fp);
691 PyMarshal_WriteObjectToFile((PyObject *)co, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000692 if (ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000693 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000694 PySys_WriteStderr("# can't write %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000695 /* Don't keep partial file */
696 fclose(fp);
697 (void) unlink(cpathname);
698 return;
699 }
700 /* Now write the true mtime */
701 fseek(fp, 4L, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000702 PyMarshal_WriteLongToFile(mtime, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000703 fflush(fp);
704 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000705 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000706 PySys_WriteStderr("# wrote %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000707#ifdef macintosh
Guido van Rossumbe1a6e21996-02-21 15:29:20 +0000708 setfiletype(cpathname, 'Pyth', 'PYC ');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000709#endif
710}
711
712
713/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000714 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
715 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000716
Guido van Rossum79f25d91997-04-29 20:08:16 +0000717static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000718load_source_module(name, pathname, fp)
719 char *name;
720 char *pathname;
721 FILE *fp;
722{
723 long mtime;
724 FILE *fpc;
725 char buf[MAXPATHLEN+1];
726 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000727 PyCodeObject *co;
728 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000729
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000730 mtime = PyOS_GetLastModificationTime(pathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000731 cpathname = make_compiled_pathname(pathname, buf, MAXPATHLEN+1);
732 if (cpathname != NULL &&
733 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000734 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000735 fclose(fpc);
736 if (co == NULL)
737 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000738 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000739 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000740 name, cpathname);
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000741 pathname = cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000742 }
743 else {
744 co = parse_source_module(pathname, fp);
745 if (co == NULL)
746 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000747 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000748 PySys_WriteStderr("import %s # from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000749 name, pathname);
750 write_compiled_module(co, cpathname, mtime);
751 }
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000752 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000753 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000754
755 return m;
756}
757
758
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000759/* Forward */
760static PyObject *load_module Py_PROTO((char *, FILE *, char *, int));
761static struct filedescr *find_module Py_PROTO((char *, PyObject *,
762 char *, int, FILE **));
Guido van Rossuma86f77d1997-09-09 18:53:47 +0000763static struct _frozen *find_frozen Py_PROTO((char *name));
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000764
765/* Load a package and return its module object WITH INCREMENTED
766 REFERENCE COUNT */
767
768static PyObject *
769load_package(name, pathname)
770 char *name;
771 char *pathname;
772{
773 PyObject *m, *d, *file, *path;
774 int err;
775 char buf[MAXPATHLEN+1];
776 FILE *fp = NULL;
777 struct filedescr *fdp;
778
779 m = PyImport_AddModule(name);
780 if (m == NULL)
781 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000782 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000783 PySys_WriteStderr("import %s # directory %s\n",
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000784 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000785 d = PyModule_GetDict(m);
786 file = PyString_FromString(pathname);
787 if (file == NULL)
788 return NULL;
789 path = Py_BuildValue("[O]", file);
790 if (path == NULL) {
791 Py_DECREF(file);
792 return NULL;
793 }
794 err = PyDict_SetItemString(d, "__file__", file);
795 if (err == 0)
796 err = PyDict_SetItemString(d, "__path__", path);
797 if (err != 0) {
798 m = NULL;
799 goto cleanup;
800 }
801 buf[0] = '\0';
802 fdp = find_module("__init__", path, buf, sizeof(buf), &fp);
803 if (fdp == NULL) {
804 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
805 PyErr_Clear();
806 }
807 else
808 m = NULL;
809 goto cleanup;
810 }
811 m = load_module(name, fp, buf, fdp->type);
812 if (fp != NULL)
813 fclose(fp);
814 cleanup:
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000815 Py_XDECREF(path);
816 Py_XDECREF(file);
817 return m;
818}
819
820
821/* Helper to test for built-in module */
822
823static int
824is_builtin(name)
825 char *name;
826{
827 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +0000828 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
829 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
830 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000831 return -1;
832 else
833 return 1;
834 }
835 }
836 return 0;
837}
838
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000839
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000840/* Search the path (default sys.path) for a module. Return the
841 corresponding filedescr struct, and (via return arguments) the
842 pathname and an open file. Return NULL if the module is not found. */
843
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000844#ifdef MS_COREDLL
845extern FILE *PyWin_FindRegisteredModule();
846#endif
847
Guido van Rossum0980bd91998-02-13 17:18:36 +0000848#ifdef CHECK_IMPORT_CASE
849static int check_case(char *, int, int, char *);
850#endif
851
Guido van Rossum197346f1997-10-31 18:38:52 +0000852static int find_init_module Py_PROTO((char *)); /* Forward */
853
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000854static struct filedescr *
Guido van Rossum0506a431998-08-11 15:07:39 +0000855find_module(realname, path, buf, buflen, p_fp)
856 char *realname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000857 PyObject *path;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000858 /* Output parameters: */
859 char *buf;
860 int buflen;
861 FILE **p_fp;
862{
863 int i, npath, len, namelen;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000864 struct _frozen *f;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000865 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000866 FILE *fp = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000867 struct stat statbuf;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000868 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
869 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
870 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossum0506a431998-08-11 15:07:39 +0000871 char name[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000872
Guido van Rossum0506a431998-08-11 15:07:39 +0000873 strcpy(name, realname);
874
875 if (path != NULL && PyString_Check(path)) {
876 /* Submodule of "frozen" package:
877 Set name to the fullname, path to NULL
878 and continue as "usual" */
879 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
880 PyErr_SetString(PyExc_ImportError,
881 "full frozen module name too long");
882 return NULL;
883 }
884 strcpy(buf, PyString_AsString(path));
885 strcat(buf, ".");
886 strcat(buf, name);
887 strcpy(name, buf);
888 path = NULL;
889 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000890 if (path == NULL) {
891 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000892 strcpy(buf, name);
893 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000894 }
Guido van Rossuma5568d31998-03-05 03:45:08 +0000895 if ((f = find_frozen(name)) != NULL) {
896 strcpy(buf, name);
897 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000898 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000899
Guido van Rossumac279101996-08-22 23:10:58 +0000900#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000901 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
902 if (fp != NULL) {
903 *p_fp = fp;
904 return fdp;
905 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000906#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000907 path = PySys_GetObject("path");
908 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000909 if (path == NULL || !PyList_Check(path)) {
910 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +0000911 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000912 return NULL;
913 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000914 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000915 namelen = strlen(name);
916 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000917 PyObject *v = PyList_GetItem(path, i);
918 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000919 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000920 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000921 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000922 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000923 strcpy(buf, PyString_AsString(v));
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000924 if ((int)strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000925 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000926#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000927#ifdef INTERN_STRINGS
928 /*
929 ** Speedup: each sys.path item is interned, and
930 ** FindResourceModule remembers which items refer to
931 ** folders (so we don't have to bother trying to look
932 ** into them for resources).
933 */
934 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
935 v = PyList_GET_ITEM(path, i);
936#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000937 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000938 static struct filedescr resfiledescr =
939 {"", "", PY_RESOURCE};
Jack Jansen9c96a921995-02-15 22:57:06 +0000940
941 return &resfiledescr;
942 }
Guido van Rossum0f84a341998-08-06 13:36:01 +0000943 if (PyMac_FindCodeResourceModule((PyStringObject *)v, name, buf)) {
944 static struct filedescr resfiledescr =
945 {"", "", PY_CODERESOURCE};
946
947 return &resfiledescr;
948 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000949#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000950 if (len > 0 && buf[len-1] != SEP
951#ifdef ALTSEP
952 && buf[len-1] != ALTSEP
953#endif
954 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000955 buf[len++] = SEP;
Guido van Rossum40f470f1996-05-23 22:51:04 +0000956#ifdef IMPORT_8x3_NAMES
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000957 /* see if we are searching in directory dos-8x3 */
958 if (len > 7 && !strncmp(buf + len - 8, "dos-8x3", 7)){
Guido van Rossum40f470f1996-05-23 22:51:04 +0000959 int j;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000960 char ch; /* limit name to 8 lower-case characters */
Guido van Rossum40f470f1996-05-23 22:51:04 +0000961 for (j = 0; (ch = name[j]) && j < 8; j++)
962 if (isupper(ch))
963 buf[len++] = tolower(ch);
964 else
965 buf[len++] = ch;
966 }
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000967 else /* Not in dos-8x3, use the full name */
Guido van Rossum6f489d91996-06-28 20:15:15 +0000968#endif
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000969 {
Guido van Rossum40f470f1996-05-23 22:51:04 +0000970 strcpy(buf+len, name);
971 len += namelen;
972 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000973#ifdef HAVE_STAT
974 if (stat(buf, &statbuf) == 0) {
Guido van Rossum197346f1997-10-31 18:38:52 +0000975 if (S_ISDIR(statbuf.st_mode)) {
Guido van Rossum0980bd91998-02-13 17:18:36 +0000976 if (find_init_module(buf)) {
977#ifdef CHECK_IMPORT_CASE
978 if (!check_case(buf, len, namelen,
979 name))
980 return NULL;
981#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000982 return &fd_package;
Guido van Rossum0980bd91998-02-13 17:18:36 +0000983 }
Guido van Rossum197346f1997-10-31 18:38:52 +0000984 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000985 }
986#else
987 /* XXX How are you going to test for directories? */
988#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000989#ifdef macintosh
990 fdp = PyMac_FindModuleExtension(buf, &len, name);
991 if (fdp)
992 fp = fopen(buf, fdp->mode);
993#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000994 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000995 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000996 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000997 PySys_WriteStderr("# trying %s\n", buf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000998 fp = fopen(buf, fdp->mode);
999 if (fp != NULL)
1000 break;
1001 }
Guido van Rossum741689d1997-08-12 14:53:39 +00001002#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001003 if (fp != NULL)
1004 break;
1005 }
1006 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001007 PyErr_Format(PyExc_ImportError,
1008 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001009 return NULL;
1010 }
Guido van Rossum0980bd91998-02-13 17:18:36 +00001011#ifdef CHECK_IMPORT_CASE
1012 if (!check_case(buf, len, namelen, name)) {
1013 fclose(fp);
1014 return NULL;
1015 }
1016#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001017
1018 *p_fp = fp;
1019 return fdp;
1020}
1021
Guido van Rossum0980bd91998-02-13 17:18:36 +00001022#ifdef CHECK_IMPORT_CASE
1023
1024#ifdef MS_WIN32
1025#include <windows.h>
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001026#include <ctype.h>
1027
1028static int
1029allcaps8x3(s)
1030 char *s;
1031{
1032 /* Return 1 if s is an 8.3 filename in ALLCAPS */
1033 char c;
1034 char *dot = strchr(s, '.');
1035 char *end = strchr(s, '\0');
1036 if (dot != NULL) {
1037 if (dot-s > 8)
1038 return 1; /* More than 8 before '.' */
1039 if (end-dot > 4)
1040 return 1; /* More than 3 after '.' */
1041 end = strchr(dot+1, '.');
1042 if (end != NULL)
1043 return 1; /* More than one dot */
1044 }
1045 else if (end-s > 8)
1046 return 1; /* More than 8 and no dot */
1047 while ((c = *s++)) {
1048 if (islower(c))
1049 return 0;
1050 }
1051 return 1;
1052}
1053
Guido van Rossum0980bd91998-02-13 17:18:36 +00001054static int
1055check_case(char *buf, int len, int namelen, char *name)
1056{
1057 WIN32_FIND_DATA data;
1058 HANDLE h;
1059 if (getenv("PYTHONCASEOK") != NULL)
1060 return 1;
1061 h = FindFirstFile(buf, &data);
1062 if (h == INVALID_HANDLE_VALUE) {
1063 PyErr_Format(PyExc_NameError,
1064 "Can't find file for module %.100s\n(filename %.300s)",
1065 name, buf);
1066 return 0;
1067 }
1068 FindClose(h);
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001069 if (allcaps8x3(data.cFileName)) {
1070 /* Skip the test if the filename is ALL.CAPS. This can
1071 happen in certain circumstances beyond our control,
1072 e.g. when software is installed under NT on a FAT
1073 filesystem and then the same FAT filesystem is used
1074 under Windows 95. */
1075 return 1;
1076 }
Guido van Rossum0980bd91998-02-13 17:18:36 +00001077 if (strncmp(data.cFileName, name, namelen) != 0) {
1078 strcpy(buf+len-namelen, data.cFileName);
1079 PyErr_Format(PyExc_NameError,
1080 "Case mismatch for module name %.100s\n(filename %.300s)",
1081 name, buf);
1082 return 0;
1083 }
1084 return 1;
1085}
1086#endif /* MS_WIN32 */
1087
1088#ifdef macintosh
1089#include <TextUtils.h>
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001090#ifdef USE_GUSI
1091#include "TFileSpec.h" /* for Path2FSSpec() */
1092#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001093static int
1094check_case(char *buf, int len, int namelen, char *name)
1095{
1096 FSSpec fss;
1097 OSErr err;
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001098#ifndef USE_GUSI
1099 err = FSMakeFSSpec(0, 0, Pstring(buf), &fss);
1100#else
1101 /* GUSI's Path2FSSpec() resolves all possible aliases nicely on
1102 the way, which is fine for all directories, but here we need
1103 the original name of the alias file (say, Dlg.ppc.slb, not
1104 toolboxmodules.ppc.slb). */
1105 char *colon;
1106 err = Path2FSSpec(buf, &fss);
1107 if (err == noErr) {
1108 colon = strrchr(buf, ':'); /* find filename */
1109 if (colon != NULL)
1110 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1111 Pstring(colon+1), &fss);
1112 else
1113 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1114 fss.name, &fss);
1115 }
1116#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001117 if (err) {
1118 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001119 "Can't find file for module %.100s\n(filename %.300s)",
1120 name, buf);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001121 return 0;
1122 }
1123 p2cstr(fss.name);
1124 if ( strncmp(name, (char *)fss.name, namelen) != 0 ) {
1125 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001126 "Case mismatch for module name %.100s\n(filename %.300s)",
1127 name, fss.name);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001128 return 0;
1129 }
1130 return 1;
1131}
1132#endif /* macintosh */
1133
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001134#ifdef DJGPP
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001135#include <dir.h>
1136
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001137static int
1138check_case(char *buf, int len, int namelen, char *name)
1139{
1140 struct ffblk ffblk;
1141 int done;
1142
1143 if (getenv("PYTHONCASEOK") != NULL)
1144 return 1;
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001145 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001146 if (done) {
1147 PyErr_Format(PyExc_NameError,
1148 "Can't find file for module %.100s\n(filename %.300s)",
1149 name, buf);
1150 return 0;
1151 }
1152
1153 if (strncmp(ffblk.ff_name, name, namelen) != 0) {
1154 strcpy(buf+len-namelen, ffblk.ff_name);
1155 PyErr_Format(PyExc_NameError,
1156 "Case mismatch for module name %.100s\n(filename %.300s)",
1157 name, buf);
1158 return 0;
1159 }
1160 return 1;
1161}
1162#endif
1163
Guido van Rossum8766a771998-04-10 23:44:32 +00001164#endif /* CHECK_IMPORT_CASE */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001165
Guido van Rossum197346f1997-10-31 18:38:52 +00001166#ifdef HAVE_STAT
1167/* Helper to look for __init__.py or __init__.py[co] in potential package */
1168static int
1169find_init_module(buf)
1170 char *buf;
1171{
1172 int save_len = strlen(buf);
1173 int i = save_len;
1174 struct stat statbuf;
1175
1176 if (save_len + 13 >= MAXPATHLEN)
1177 return 0;
1178 buf[i++] = SEP;
1179 strcpy(buf+i, "__init__.py");
1180 if (stat(buf, &statbuf) == 0) {
1181 buf[save_len] = '\0';
1182 return 1;
1183 }
1184 i += strlen(buf+i);
1185 if (Py_OptimizeFlag)
1186 strcpy(buf+i, "o");
1187 else
1188 strcpy(buf+i, "c");
1189 if (stat(buf, &statbuf) == 0) {
1190 buf[save_len] = '\0';
1191 return 1;
1192 }
1193 buf[save_len] = '\0';
1194 return 0;
1195}
1196#endif /* HAVE_STAT */
1197
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001198
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001199static int init_builtin Py_PROTO((char *)); /* Forward */
1200
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001201/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001202 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001203
Guido van Rossum79f25d91997-04-29 20:08:16 +00001204static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001205load_module(name, fp, buf, type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001206 char *name;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001207 FILE *fp;
1208 char *buf;
1209 int type;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001210{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001211 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001212 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001213 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001214
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001215 /* First check that there's an open file (if we need one) */
1216 switch (type) {
1217 case PY_SOURCE:
1218 case PY_COMPILED:
1219 if (fp == NULL) {
1220 PyErr_Format(PyExc_ValueError,
1221 "file object required for import (type code %d)",
1222 type);
1223 return NULL;
1224 }
1225 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001226
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001227 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001228
1229 case PY_SOURCE:
1230 m = load_source_module(name, buf, fp);
1231 break;
1232
1233 case PY_COMPILED:
1234 m = load_compiled_module(name, buf, fp);
1235 break;
1236
1237 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001238 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001239 break;
1240
Jack Jansen9c96a921995-02-15 22:57:06 +00001241#ifdef macintosh
1242 case PY_RESOURCE:
1243 m = PyMac_LoadResourceModule(name, buf);
1244 break;
Guido van Rossum0f84a341998-08-06 13:36:01 +00001245 case PY_CODERESOURCE:
1246 m = PyMac_LoadCodeResourceModule(name, buf);
1247 break;
Jack Jansen9c96a921995-02-15 22:57:06 +00001248#endif
1249
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001250 case PKG_DIRECTORY:
1251 m = load_package(name, buf);
1252 break;
1253
1254 case C_BUILTIN:
1255 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001256 if (buf != NULL && buf[0] != '\0')
1257 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001258 if (type == C_BUILTIN)
1259 err = init_builtin(name);
1260 else
1261 err = PyImport_ImportFrozenModule(name);
1262 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001263 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001264 if (err == 0) {
1265 PyErr_Format(PyExc_ImportError,
1266 "Purported %s module %.200s not found",
1267 type == C_BUILTIN ?
1268 "builtin" : "frozen",
1269 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001270 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001271 }
1272 modules = PyImport_GetModuleDict();
1273 m = PyDict_GetItemString(modules, name);
1274 if (m == NULL) {
1275 PyErr_Format(
1276 PyExc_ImportError,
1277 "%s module %.200s not properly initialized",
1278 type == C_BUILTIN ?
1279 "builtin" : "frozen",
1280 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001281 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001282 }
1283 Py_INCREF(m);
1284 break;
1285
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001286 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001287 PyErr_Format(PyExc_ImportError,
1288 "Don't know how to import %.200s (type code %d)",
1289 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001290 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001291
1292 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001293
1294 return m;
1295}
1296
1297
1298/* Initialize a built-in module.
1299 Return 1 for succes, 0 if the module is not found, and -1 with
1300 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001301
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001302static int
1303init_builtin(name)
1304 char *name;
1305{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001306 struct _inittab *p;
1307 PyObject *mod;
1308
1309 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
1310 return 1;
1311
Guido van Rossum771c6c81997-10-31 18:37:24 +00001312 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001313 if (strcmp(name, p->name) == 0) {
1314 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001315 PyErr_Format(PyExc_ImportError,
1316 "Cannot re-init internal module %.200s",
1317 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001318 return -1;
1319 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001320 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001321 PySys_WriteStderr("import %s # builtin\n", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001322 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001323 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001324 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001325 if (_PyImport_FixupExtension(name, name) == NULL)
1326 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001327 return 1;
1328 }
1329 }
1330 return 0;
1331}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001332
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001333
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001334/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001335
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001336static struct _frozen *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001337find_frozen(name)
1338 char *name;
1339{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001340 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001341
Guido van Rossum79f25d91997-04-29 20:08:16 +00001342 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001343 if (p->name == NULL)
1344 return NULL;
1345 if (strcmp(p->name, name) == 0)
1346 break;
1347 }
1348 return p;
1349}
1350
Guido van Rossum79f25d91997-04-29 20:08:16 +00001351static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001352get_frozen_object(name)
1353 char *name;
1354{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001355 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001356 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001357
1358 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001359 PyErr_Format(PyExc_ImportError,
1360 "No such frozen object named %.200s",
1361 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001362 return NULL;
1363 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001364 size = p->size;
1365 if (size < 0)
1366 size = -size;
1367 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001368}
1369
1370/* Initialize a frozen module.
1371 Return 1 for succes, 0 if the module is not found, and -1 with
1372 an exception set if the initialization failed.
1373 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001374
1375int
Guido van Rossum79f25d91997-04-29 20:08:16 +00001376PyImport_ImportFrozenModule(name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001377 char *name;
1378{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001379 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001380 PyObject *co;
1381 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001382 int ispackage;
1383 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001384
1385 if (p == NULL)
1386 return 0;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001387 size = p->size;
1388 ispackage = (size < 0);
1389 if (ispackage)
1390 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001391 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001392 PySys_WriteStderr("import %s # frozen%s\n",
Guido van Rossuma5568d31998-03-05 03:45:08 +00001393 name, ispackage ? " package" : "");
1394 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001395 if (co == NULL)
1396 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001397 if (!PyCode_Check(co)) {
1398 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001399 PyErr_Format(PyExc_TypeError,
1400 "frozen object %.200s is not a code object",
1401 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001402 return -1;
1403 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001404 if (ispackage) {
1405 /* Set __path__ to the package name */
1406 PyObject *d, *s;
1407 int err;
1408 m = PyImport_AddModule(name);
1409 if (m == NULL)
1410 return -1;
1411 d = PyModule_GetDict(m);
1412 s = PyString_InternFromString(name);
1413 if (s == NULL)
1414 return -1;
1415 err = PyDict_SetItemString(d, "__path__", s);
1416 Py_DECREF(s);
1417 if (err != 0)
1418 return err;
1419 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001420 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001421 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001422 if (m == NULL)
1423 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001424 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001425 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001426}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001427
1428
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001429/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001430 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001431
Guido van Rossum79f25d91997-04-29 20:08:16 +00001432PyObject *
1433PyImport_ImportModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001434 char *name;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001435{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001436 static PyObject *fromlist = NULL;
1437 if (fromlist == NULL && strchr(name, '.') != NULL) {
1438 fromlist = Py_BuildValue("[s]", "*");
1439 if (fromlist == NULL)
1440 return NULL;
1441 }
1442 return PyImport_ImportModuleEx(name, NULL, NULL, fromlist);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001443}
1444
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001445/* Forward declarations for helper routines */
1446static PyObject *get_parent Py_PROTO((PyObject *globals,
1447 char *buf, int *p_buflen));
1448static PyObject *load_next Py_PROTO((PyObject *mod, PyObject *altmod,
1449 char **p_name, char *buf, int *p_buflen));
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001450static int mark_miss Py_PROTO((char *name));
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001451static int ensure_fromlist Py_PROTO((PyObject *mod, PyObject *fromlist,
Guido van Rossum9905ef91997-09-08 16:07:11 +00001452 char *buf, int buflen, int recursive));
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001453static PyObject * import_submodule Py_PROTO((PyObject *mod,
1454 char *name, char *fullname));
1455
1456/* The Magnum Opus of dotted-name import :-) */
1457
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001458static PyObject *
1459import_module_ex(name, globals, locals, fromlist)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001460 char *name;
1461 PyObject *globals;
1462 PyObject *locals;
1463 PyObject *fromlist;
1464{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001465 char buf[MAXPATHLEN+1];
1466 int buflen = 0;
1467 PyObject *parent, *head, *next, *tail;
1468
1469 parent = get_parent(globals, buf, &buflen);
1470 if (parent == NULL)
1471 return NULL;
1472
1473 head = load_next(parent, Py_None, &name, buf, &buflen);
1474 if (head == NULL)
1475 return NULL;
1476
1477 tail = head;
1478 Py_INCREF(tail);
1479 while (name) {
1480 next = load_next(tail, tail, &name, buf, &buflen);
1481 Py_DECREF(tail);
1482 if (next == NULL) {
1483 Py_DECREF(head);
1484 return NULL;
1485 }
1486 tail = next;
1487 }
1488
1489 if (fromlist != NULL) {
1490 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1491 fromlist = NULL;
1492 }
1493
1494 if (fromlist == NULL) {
1495 Py_DECREF(tail);
1496 return head;
1497 }
1498
1499 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001500 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001501 Py_DECREF(tail);
1502 return NULL;
1503 }
1504
1505 return tail;
1506}
1507
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001508PyObject *
1509PyImport_ImportModuleEx(name, globals, locals, fromlist)
1510 char *name;
1511 PyObject *globals;
1512 PyObject *locals;
1513 PyObject *fromlist;
1514{
1515 PyObject *result;
1516 lock_import();
Guido van Rossumd65911b1998-03-03 22:33:27 +00001517 result = import_module_ex(name, globals, locals, fromlist);
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001518 unlock_import();
1519 return result;
1520}
1521
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001522static PyObject *
1523get_parent(globals, buf, p_buflen)
1524 PyObject *globals;
1525 char *buf;
1526 int *p_buflen;
1527{
1528 static PyObject *namestr = NULL;
1529 static PyObject *pathstr = NULL;
1530 PyObject *modname, *modpath, *modules, *parent;
1531
1532 if (globals == NULL || !PyDict_Check(globals))
1533 return Py_None;
1534
1535 if (namestr == NULL) {
1536 namestr = PyString_InternFromString("__name__");
1537 if (namestr == NULL)
1538 return NULL;
1539 }
1540 if (pathstr == NULL) {
1541 pathstr = PyString_InternFromString("__path__");
1542 if (pathstr == NULL)
1543 return NULL;
1544 }
1545
1546 *buf = '\0';
1547 *p_buflen = 0;
1548 modname = PyDict_GetItem(globals, namestr);
1549 if (modname == NULL || !PyString_Check(modname))
1550 return Py_None;
1551
1552 modpath = PyDict_GetItem(globals, pathstr);
1553 if (modpath != NULL) {
1554 int len = PyString_GET_SIZE(modname);
1555 if (len > MAXPATHLEN) {
1556 PyErr_SetString(PyExc_ValueError,
1557 "Module name too long");
1558 return NULL;
1559 }
1560 strcpy(buf, PyString_AS_STRING(modname));
1561 *p_buflen = len;
1562 }
1563 else {
1564 char *start = PyString_AS_STRING(modname);
1565 char *lastdot = strrchr(start, '.');
1566 int len;
1567 if (lastdot == NULL)
1568 return Py_None;
1569 len = lastdot - start;
1570 if (len >= MAXPATHLEN) {
1571 PyErr_SetString(PyExc_ValueError,
1572 "Module name too long");
1573 return NULL;
1574 }
1575 strncpy(buf, start, len);
1576 buf[len] = '\0';
1577 *p_buflen = len;
1578 }
1579
1580 modules = PyImport_GetModuleDict();
1581 parent = PyDict_GetItemString(modules, buf);
1582 if (parent == NULL)
1583 parent = Py_None;
1584 return parent;
1585 /* We expect, but can't guarantee, if parent != None, that:
1586 - parent.__name__ == buf
1587 - parent.__dict__ is globals
1588 If this is violated... Who cares? */
1589}
1590
1591static PyObject *
1592load_next(mod, altmod, p_name, buf, p_buflen)
1593 PyObject *mod;
1594 PyObject *altmod; /* Either None or same as mod */
1595 char **p_name;
1596 char *buf;
1597 int *p_buflen;
1598{
1599 char *name = *p_name;
1600 char *dot = strchr(name, '.');
1601 int len;
1602 char *p;
1603 PyObject *result;
1604
1605 if (dot == NULL) {
1606 *p_name = NULL;
1607 len = strlen(name);
1608 }
1609 else {
1610 *p_name = dot+1;
1611 len = dot-name;
1612 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00001613 if (len == 0) {
1614 PyErr_SetString(PyExc_ValueError,
1615 "Empty module name");
1616 return NULL;
1617 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001618
1619 p = buf + *p_buflen;
1620 if (p != buf)
1621 *p++ = '.';
1622 if (p+len-buf >= MAXPATHLEN) {
1623 PyErr_SetString(PyExc_ValueError,
1624 "Module name too long");
1625 return NULL;
1626 }
1627 strncpy(p, name, len);
1628 p[len] = '\0';
1629 *p_buflen = p+len-buf;
1630
1631 result = import_submodule(mod, p, buf);
1632 if (result == Py_None && altmod != mod) {
1633 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001634 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001635 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001636 if (result != NULL && result != Py_None) {
1637 if (mark_miss(buf) != 0) {
1638 Py_DECREF(result);
1639 return NULL;
1640 }
1641 strncpy(buf, name, len);
1642 buf[len] = '\0';
1643 *p_buflen = len;
1644 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001645 }
1646 if (result == NULL)
1647 return NULL;
1648
1649 if (result == Py_None) {
1650 Py_DECREF(result);
1651 PyErr_Format(PyExc_ImportError,
1652 "No module named %.200s", name);
1653 return NULL;
1654 }
1655
1656 return result;
1657}
1658
1659static int
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001660mark_miss(name)
1661 char *name;
1662{
1663 PyObject *modules = PyImport_GetModuleDict();
1664 return PyDict_SetItemString(modules, name, Py_None);
1665}
1666
1667static int
Guido van Rossum9905ef91997-09-08 16:07:11 +00001668ensure_fromlist(mod, fromlist, buf, buflen, recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001669 PyObject *mod;
1670 PyObject *fromlist;
1671 char *buf;
1672 int buflen;
Guido van Rossum9905ef91997-09-08 16:07:11 +00001673 int recursive;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001674{
1675 int i;
1676
1677 if (!PyObject_HasAttrString(mod, "__path__"))
1678 return 1;
1679
1680 for (i = 0; ; i++) {
1681 PyObject *item = PySequence_GetItem(fromlist, i);
1682 int hasit;
1683 if (item == NULL) {
1684 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1685 PyErr_Clear();
1686 return 1;
1687 }
1688 return 0;
1689 }
1690 if (!PyString_Check(item)) {
1691 PyErr_SetString(PyExc_TypeError,
1692 "Item in ``from list'' not a string");
1693 Py_DECREF(item);
1694 return 0;
1695 }
1696 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001697 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001698 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001699 /* See if the package defines __all__ */
1700 if (recursive)
1701 continue; /* Avoid endless recursion */
1702 all = PyObject_GetAttrString(mod, "__all__");
1703 if (all == NULL)
1704 PyErr_Clear();
1705 else {
1706 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1707 return 0;
1708 Py_DECREF(all);
1709 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001710 continue;
1711 }
1712 hasit = PyObject_HasAttr(mod, item);
1713 if (!hasit) {
1714 char *subname = PyString_AS_STRING(item);
1715 PyObject *submod;
1716 char *p;
1717 if (buflen + strlen(subname) >= MAXPATHLEN) {
1718 PyErr_SetString(PyExc_ValueError,
1719 "Module name too long");
1720 Py_DECREF(item);
1721 return 0;
1722 }
1723 p = buf + buflen;
1724 *p++ = '.';
1725 strcpy(p, subname);
1726 submod = import_submodule(mod, subname, buf);
1727 Py_XDECREF(submod);
1728 if (submod == NULL) {
1729 Py_DECREF(item);
1730 return 0;
1731 }
1732 }
1733 Py_DECREF(item);
1734 }
1735
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001736 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001737}
1738
1739static PyObject *
1740import_submodule(mod, subname, fullname)
1741 PyObject *mod; /* May be None */
1742 char *subname;
1743 char *fullname;
1744{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001745 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001746 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001747
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001748 /* Require:
1749 if mod == None: subname == fullname
1750 else: mod.__name__ + "." + subname == fullname
1751 */
1752
1753 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001754 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001755 }
1756 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001757 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001758 char buf[MAXPATHLEN+1];
1759 struct filedescr *fdp;
1760 FILE *fp = NULL;
1761
Guido van Rossum9c0afe51998-05-19 15:09:05 +00001762 if (mod == Py_None)
1763 path = NULL;
1764 else {
1765 path = PyObject_GetAttrString(mod, "__path__");
1766 if (path == NULL) {
1767 PyErr_Clear();
1768 Py_INCREF(Py_None);
1769 return Py_None;
1770 }
1771 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001772
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001773 buf[0] = '\0';
Guido van Rossumb68cd421998-07-01 17:36:26 +00001774 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1775 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001776 if (fdp == NULL) {
1777 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1778 return NULL;
1779 PyErr_Clear();
1780 Py_INCREF(Py_None);
1781 return Py_None;
1782 }
1783 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001784 if (fp)
1785 fclose(fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001786 if (m != NULL && mod != Py_None) {
1787 if (PyObject_SetAttrString(mod, subname, m) < 0) {
1788 Py_DECREF(m);
1789 m = NULL;
1790 }
1791 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001792 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001793
1794 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001795}
1796
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001797
1798/* Re-import a module of any kind and return its module object, WITH
1799 INCREMENTED REFERENCE COUNT */
1800
Guido van Rossum79f25d91997-04-29 20:08:16 +00001801PyObject *
1802PyImport_ReloadModule(m)
1803 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001804{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001805 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001806 PyObject *path = NULL;
1807 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001808 char buf[MAXPATHLEN+1];
1809 struct filedescr *fdp;
1810 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001811
Guido van Rossum79f25d91997-04-29 20:08:16 +00001812 if (m == NULL || !PyModule_Check(m)) {
1813 PyErr_SetString(PyExc_TypeError,
1814 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001815 return NULL;
1816 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001817 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001818 if (name == NULL)
1819 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001820 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001821 PyErr_Format(PyExc_ImportError,
1822 "reload(): module %.200s not in sys.modules",
1823 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001824 return NULL;
1825 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001826 subname = strrchr(name, '.');
1827 if (subname == NULL)
1828 subname = name;
1829 else {
1830 PyObject *parentname, *parent;
1831 parentname = PyString_FromStringAndSize(name, (subname-name));
1832 if (parentname == NULL)
1833 return NULL;
1834 parent = PyDict_GetItem(modules, parentname);
Barry Warsaw38793331999-01-27 17:54:20 +00001835 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00001836 if (parent == NULL) {
1837 PyErr_Format(PyExc_ImportError,
1838 "reload(): parent %.200s not in sys.modules",
1839 name);
1840 return NULL;
1841 }
1842 subname++;
1843 path = PyObject_GetAttrString(parent, "__path__");
1844 if (path == NULL)
1845 PyErr_Clear();
1846 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001847 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001848 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1849 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001850 if (fdp == NULL)
1851 return NULL;
1852 m = load_module(name, fp, buf, fdp->type);
1853 if (fp)
1854 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001855 return m;
1856}
1857
1858
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001859/* Higher-level import emulator which emulates the "import" statement
1860 more accurately -- it invokes the __import__() function from the
1861 builtins of the current globals. This means that the import is
1862 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00001863 environment, e.g. by "rexec".
1864 A dummy list ["__doc__"] is passed as the 4th argument so that
1865 e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
1866 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001867
1868PyObject *
1869PyImport_Import(module_name)
1870 PyObject *module_name;
1871{
1872 static PyObject *silly_list = NULL;
1873 static PyObject *builtins_str = NULL;
1874 static PyObject *import_str = NULL;
1875 static PyObject *standard_builtins = NULL;
1876 PyObject *globals = NULL;
1877 PyObject *import = NULL;
1878 PyObject *builtins = NULL;
1879 PyObject *r = NULL;
1880
1881 /* Initialize constant string objects */
1882 if (silly_list == NULL) {
1883 import_str = PyString_InternFromString("__import__");
1884 if (import_str == NULL)
1885 return NULL;
1886 builtins_str = PyString_InternFromString("__builtins__");
1887 if (builtins_str == NULL)
1888 return NULL;
1889 silly_list = Py_BuildValue("[s]", "__doc__");
1890 if (silly_list == NULL)
1891 return NULL;
1892 }
1893
1894 /* Get the builtins from current globals */
1895 globals = PyEval_GetGlobals();
1896 if(globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00001897 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001898 builtins = PyObject_GetItem(globals, builtins_str);
1899 if (builtins == NULL)
1900 goto err;
1901 }
1902 else {
1903 /* No globals -- use standard builtins, and fake globals */
1904 PyErr_Clear();
1905
1906 if (standard_builtins == NULL) {
1907 standard_builtins =
1908 PyImport_ImportModule("__builtin__");
1909 if (standard_builtins == NULL)
1910 return NULL;
1911 }
1912
1913 builtins = standard_builtins;
1914 Py_INCREF(builtins);
1915 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1916 if (globals == NULL)
1917 goto err;
1918 }
1919
1920 /* Get the __import__ function from the builtins */
1921 if (PyDict_Check(builtins))
1922 import=PyObject_GetItem(builtins, import_str);
1923 else
1924 import=PyObject_GetAttr(builtins, import_str);
1925 if (import == NULL)
1926 goto err;
1927
1928 /* Call the _import__ function with the proper argument list */
1929 r = PyObject_CallFunction(import, "OOOO",
1930 module_name, globals, globals, silly_list);
1931
1932 err:
1933 Py_XDECREF(globals);
1934 Py_XDECREF(builtins);
1935 Py_XDECREF(import);
1936
1937 return r;
1938}
1939
1940
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001941/* Module 'imp' provides Python access to the primitives used for
1942 importing modules.
1943*/
1944
Guido van Rossum79f25d91997-04-29 20:08:16 +00001945static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001946imp_get_magic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001947 PyObject *self;
1948 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001949{
1950 char buf[4];
1951
Guido van Rossum79f25d91997-04-29 20:08:16 +00001952 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001953 return NULL;
Guido van Rossum6bf62da1997-04-11 20:37:35 +00001954 buf[0] = (char) ((MAGIC >> 0) & 0xff);
1955 buf[1] = (char) ((MAGIC >> 8) & 0xff);
1956 buf[2] = (char) ((MAGIC >> 16) & 0xff);
1957 buf[3] = (char) ((MAGIC >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001958
Guido van Rossum79f25d91997-04-29 20:08:16 +00001959 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001960}
1961
Guido van Rossum79f25d91997-04-29 20:08:16 +00001962static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001963imp_get_suffixes(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001964 PyObject *self;
1965 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001966{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001967 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001968 struct filedescr *fdp;
1969
Guido van Rossum79f25d91997-04-29 20:08:16 +00001970 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001971 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001972 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001973 if (list == NULL)
1974 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001975 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
1976 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001977 fdp->suffix, fdp->mode, fdp->type);
1978 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001979 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001980 return NULL;
1981 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001982 if (PyList_Append(list, item) < 0) {
1983 Py_DECREF(list);
1984 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001985 return NULL;
1986 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001987 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001988 }
1989 return list;
1990}
1991
Guido van Rossum79f25d91997-04-29 20:08:16 +00001992static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001993call_find_module(name, path)
1994 char *name;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001995 PyObject *path; /* list or None or NULL */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001996{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001997 extern int fclose Py_PROTO((FILE *));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001998 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001999 struct filedescr *fdp;
2000 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002001 FILE *fp = NULL;
2002
2003 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002004 if (path == Py_None)
2005 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002006 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
2007 if (fdp == NULL)
2008 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002009 if (fp != NULL) {
2010 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
2011 if (fob == NULL) {
2012 fclose(fp);
2013 return NULL;
2014 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002015 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002016 else {
2017 fob = Py_None;
2018 Py_INCREF(fob);
2019 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002020 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002021 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002022 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002023 return ret;
2024}
2025
Guido van Rossum79f25d91997-04-29 20:08:16 +00002026static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002027imp_find_module(self, args)
2028 PyObject *self;
2029 PyObject *args;
2030{
2031 char *name;
2032 PyObject *path = NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002033 if (!PyArg_ParseTuple(args, "s|O", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002034 return NULL;
2035 return call_find_module(name, path);
2036}
2037
2038static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002039imp_init_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002040 PyObject *self;
2041 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002042{
2043 char *name;
2044 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002045 PyObject *m;
2046 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002047 return NULL;
2048 ret = init_builtin(name);
2049 if (ret < 0)
2050 return NULL;
2051 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002052 Py_INCREF(Py_None);
2053 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002054 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002055 m = PyImport_AddModule(name);
2056 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002057 return m;
2058}
2059
Guido van Rossum79f25d91997-04-29 20:08:16 +00002060static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002061imp_init_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002062 PyObject *self;
2063 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002064{
2065 char *name;
2066 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002067 PyObject *m;
2068 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002069 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002070 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002071 if (ret < 0)
2072 return NULL;
2073 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002074 Py_INCREF(Py_None);
2075 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002076 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002077 m = PyImport_AddModule(name);
2078 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002079 return m;
2080}
2081
Guido van Rossum79f25d91997-04-29 20:08:16 +00002082static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002083imp_get_frozen_object(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002084 PyObject *self;
2085 PyObject *args;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002086{
2087 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002088
Guido van Rossum79f25d91997-04-29 20:08:16 +00002089 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002090 return NULL;
2091 return get_frozen_object(name);
2092}
2093
Guido van Rossum79f25d91997-04-29 20:08:16 +00002094static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002095imp_is_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002096 PyObject *self;
2097 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002098{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002099 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002100 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002101 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002102 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002103}
2104
Guido van Rossum79f25d91997-04-29 20:08:16 +00002105static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002106imp_is_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002107 PyObject *self;
2108 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002109{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002110 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002111 struct _frozen *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002112 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002113 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002114 p = find_frozen(name);
2115 return PyInt_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002116}
2117
2118static FILE *
2119get_file(pathname, fob, mode)
2120 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002121 PyObject *fob;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002122 char *mode;
2123{
2124 FILE *fp;
2125 if (fob == NULL) {
2126 fp = fopen(pathname, mode);
2127 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002128 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002129 }
2130 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002131 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002132 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002133 PyErr_SetString(PyExc_ValueError,
2134 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002135 }
2136 return fp;
2137}
2138
Guido van Rossum79f25d91997-04-29 20:08:16 +00002139static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002140imp_load_compiled(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002141 PyObject *self;
2142 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002143{
2144 char *name;
2145 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002146 PyObject *fob = NULL;
2147 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002148 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002149 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002150 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002151 return NULL;
2152 fp = get_file(pathname, fob, "rb");
2153 if (fp == NULL)
2154 return NULL;
2155 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002156 if (fob == NULL)
2157 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002158 return m;
2159}
2160
Guido van Rossum79f25d91997-04-29 20:08:16 +00002161static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002162imp_load_dynamic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002163 PyObject *self;
2164 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002165{
2166 char *name;
2167 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002168 PyObject *fob = NULL;
2169 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002170 FILE *fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002171 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
2172 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002173 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002174 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002175 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002176 if (fp == NULL)
2177 return NULL;
2178 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002179 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002180 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002181}
2182
Guido van Rossum79f25d91997-04-29 20:08:16 +00002183static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002184imp_load_source(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002185 PyObject *self;
2186 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002187{
2188 char *name;
2189 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002190 PyObject *fob = NULL;
2191 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002192 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002193 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002194 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002195 return NULL;
2196 fp = get_file(pathname, fob, "r");
2197 if (fp == NULL)
2198 return NULL;
2199 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002200 if (fob == NULL)
2201 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002202 return m;
2203}
2204
Jack Jansen9c96a921995-02-15 22:57:06 +00002205#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002206static PyObject *
Jack Jansen9c96a921995-02-15 22:57:06 +00002207imp_load_resource(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002208 PyObject *self;
2209 PyObject *args;
Jack Jansen9c96a921995-02-15 22:57:06 +00002210{
2211 char *name;
2212 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002213 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002214
Guido van Rossum79f25d91997-04-29 20:08:16 +00002215 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002216 return NULL;
2217 m = PyMac_LoadResourceModule(name, pathname);
2218 return m;
2219}
2220#endif /* macintosh */
2221
Guido van Rossum79f25d91997-04-29 20:08:16 +00002222static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002223imp_load_module(self, args)
2224 PyObject *self;
2225 PyObject *args;
2226{
2227 char *name;
2228 PyObject *fob;
2229 char *pathname;
2230 char *suffix; /* Unused */
2231 char *mode;
2232 int type;
2233 FILE *fp;
2234
2235 if (!PyArg_ParseTuple(args, "sOs(ssi)",
2236 &name, &fob, &pathname,
2237 &suffix, &mode, &type))
2238 return NULL;
2239 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
2240 PyErr_Format(PyExc_ValueError,
2241 "invalid file open mode %.200s", mode);
2242 return NULL;
2243 }
2244 if (fob == Py_None)
2245 fp = NULL;
2246 else {
2247 if (!PyFile_Check(fob)) {
2248 PyErr_SetString(PyExc_ValueError,
2249 "load_module arg#2 should be a file or None");
2250 return NULL;
2251 }
2252 fp = get_file(pathname, fob, mode);
2253 if (fp == NULL)
2254 return NULL;
2255 }
2256 return load_module(name, fp, pathname, type);
2257}
2258
2259static PyObject *
2260imp_load_package(self, args)
2261 PyObject *self;
2262 PyObject *args;
2263{
2264 char *name;
2265 char *pathname;
2266 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
2267 return NULL;
2268 return load_package(name, pathname);
2269}
2270
2271static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002272imp_new_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002273 PyObject *self;
2274 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002275{
2276 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002277 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002278 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002279 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002280}
2281
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002282/* Doc strings */
2283
2284static char doc_imp[] = "\
2285This module provides the components needed to build your own\n\
2286__import__ function. Undocumented functions are obsolete.\n\
2287";
2288
2289static char doc_find_module[] = "\
2290find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
2291Search for a module. If path is omitted or None, search for a\n\
2292built-in, frozen or special module and continue search in sys.path.\n\
2293The module name cannot contain '.'; to search for a submodule of a\n\
2294package, pass the submodule name and the package's __path__.\
2295";
2296
2297static char doc_load_module[] = "\
2298load_module(name, file, filename, (suffix, mode, type)) -> module\n\
2299Load a module, given information returned by find_module().\n\
2300The module name must include the full package name, if any.\
2301";
2302
2303static char doc_get_magic[] = "\
2304get_magic() -> string\n\
2305Return the magic number for .pyc or .pyo files.\
2306";
2307
2308static char doc_get_suffixes[] = "\
2309get_suffixes() -> [(suffix, mode, type), ...]\n\
2310Return a list of (suffix, mode, type) tuples describing the files\n\
2311that find_module() looks for.\
2312";
2313
2314static char doc_new_module[] = "\
2315new_module(name) -> module\n\
2316Create a new module. Do not enter it in sys.modules.\n\
2317The module name must include the full package name, if any.\
2318";
2319
Guido van Rossum79f25d91997-04-29 20:08:16 +00002320static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002321 {"find_module", imp_find_module, 1, doc_find_module},
2322 {"get_magic", imp_get_magic, 1, doc_get_magic},
2323 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2324 {"load_module", imp_load_module, 1, doc_load_module},
2325 {"new_module", imp_new_module, 1, doc_new_module},
2326 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002327 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002328 {"init_builtin", imp_init_builtin, 1},
2329 {"init_frozen", imp_init_frozen, 1},
2330 {"is_builtin", imp_is_builtin, 1},
2331 {"is_frozen", imp_is_frozen, 1},
2332 {"load_compiled", imp_load_compiled, 1},
2333 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002334 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002335#ifdef macintosh
2336 {"load_resource", imp_load_resource, 1},
2337#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002338 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002339 {NULL, NULL} /* sentinel */
2340};
2341
Guido van Rossum1a8791e1998-08-04 22:46:29 +00002342static int
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002343setint(d, name, value)
2344 PyObject *d;
2345 char *name;
2346 int value;
2347{
2348 PyObject *v;
2349 int err;
2350
2351 v = PyInt_FromLong((long)value);
2352 err = PyDict_SetItemString(d, name, v);
2353 Py_XDECREF(v);
2354 return err;
2355}
2356
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002357void
2358initimp()
2359{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002360 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002361
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002362 m = Py_InitModule4("imp", imp_methods, doc_imp,
2363 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002364 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002365
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002366 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2367 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2368 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2369 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2370 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2371 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2372 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2373 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00002374 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002375
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002376 failure:
2377 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002378}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002379
2380
2381/* API for embedding applications that want to add their own entries to the
2382 table of built-in modules. This should normally be called *before*
2383 Py_Initialize(). When the malloc() or realloc() call fails, -1 is returned
2384 and the existing table is unchanged.
2385
2386 After a similar function by Just van Rossum. */
2387
2388int
2389PyImport_ExtendInittab(newtab)
2390 struct _inittab *newtab;
2391{
2392 static struct _inittab *our_copy = NULL;
2393 struct _inittab *p;
2394 int i, n;
2395
2396 /* Count the number of entries in both tables */
2397 for (n = 0; newtab[n].name != NULL; n++)
2398 ;
2399 if (n == 0)
2400 return 0; /* Nothing to do */
2401 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2402 ;
2403
2404 /* Allocate new memory for the combined table */
2405 if (our_copy == NULL)
2406 p = malloc((i+n+1) * sizeof(struct _inittab));
2407 else
2408 p = realloc(our_copy, (i+n+1) * sizeof(struct _inittab));
2409 if (p == NULL)
2410 return -1;
2411
2412 /* Copy the tables into the new memory */
2413 if (our_copy != PyImport_Inittab)
2414 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2415 PyImport_Inittab = our_copy = p;
2416 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
2417
2418 return 0;
2419}
2420
2421/* Shorthand to add a single entry given a name and a function */
2422
2423int
2424PyImport_AppendInittab(name, initfunc)
2425 char *name;
2426 void (*initfunc)();
2427{
2428 struct _inittab newtab[2];
2429
2430 memset(newtab, '\0', sizeof newtab);
2431
2432 newtab[0].name = name;
2433 newtab[0].initfunc = initfunc;
2434
2435 return PyImport_ExtendInittab(newtab);
2436}