blob: a23b71b43d3a2b872339d389733bba9adacea21d [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 Rossum1cb6cd02000-04-28 19:03:54 +000087#define MAGIC (50428 | ((long)'\r'<<16) | ((long)'\n'<<24))
Guido van Rossum3ddee711991-12-16 13:06:34 +000088
Guido van Rossum96774c12000-05-01 20:19:08 +000089/* Magic word as global; note that _PyImport_Init() can change the
Jeremy Hylton9262b8a2000-06-30 04:59:17 +000090 value of this global to accommodate for alterations of how the
Guido van Rossum96774c12000-05-01 20:19:08 +000091 compiler works which are enabled by command line switches. */
92static long pyc_magic = MAGIC;
93
Guido van Rossum25ce5661997-08-02 03:10:38 +000094/* See _PyImport_FixupExtension() below */
95static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000096
Guido van Rossum771c6c81997-10-31 18:37:24 +000097/* This table is defined in config.c: */
98extern struct _inittab _PyImport_Inittab[];
99
100struct _inittab *PyImport_Inittab = _PyImport_Inittab;
Guido van Rossum66f1fa81991-04-03 19:03:52 +0000101
Guido van Rossumed1170e1999-12-20 21:23:41 +0000102/* these tables define the module suffixes that Python recognizes */
103struct filedescr * _PyImport_Filetab = NULL;
104static const struct filedescr _PyImport_StandardFiletab[] = {
105 {".py", "r", PY_SOURCE},
106 {".pyc", "rb", PY_COMPILED},
107 {0, 0}
108};
109
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000110/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000111
112void
Guido van Rossum25ce5661997-08-02 03:10:38 +0000113_PyImport_Init()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000114{
Guido van Rossumed1170e1999-12-20 21:23:41 +0000115 const struct filedescr *scan;
116 struct filedescr *filetab;
117 int countD = 0;
118 int countS = 0;
119
120 /* prepare _PyImport_Filetab: copy entries from
121 _PyImport_DynLoadFiletab and _PyImport_StandardFiletab.
122 */
123 for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan)
124 ++countD;
125 for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan)
126 ++countS;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000127 filetab = PyMem_NEW(struct filedescr, countD + countS + 1);
Guido van Rossumed1170e1999-12-20 21:23:41 +0000128 memcpy(filetab, _PyImport_DynLoadFiletab,
129 countD * sizeof(struct filedescr));
130 memcpy(filetab + countD, _PyImport_StandardFiletab,
131 countS * sizeof(struct filedescr));
132 filetab[countD + countS].suffix = NULL;
133
134 _PyImport_Filetab = filetab;
135
Guido van Rossum0824f631997-03-11 18:37:35 +0000136 if (Py_OptimizeFlag) {
Guido van Rossumed1170e1999-12-20 21:23:41 +0000137 /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */
138 for (; filetab->suffix != NULL; filetab++) {
139 if (strcmp(filetab->suffix, ".pyc") == 0)
140 filetab->suffix = ".pyo";
Guido van Rossum0824f631997-03-11 18:37:35 +0000141 }
142 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000143
144 if (Py_UnicodeFlag) {
145 /* Fix the pyc_magic so that byte compiled code created
146 using the all-Unicode method doesn't interfere with
147 code created in normal operation mode. */
148 pyc_magic = MAGIC + 1;
149 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000150}
151
Guido van Rossum25ce5661997-08-02 03:10:38 +0000152void
153_PyImport_Fini()
154{
155 Py_XDECREF(extensions);
156 extensions = NULL;
157}
158
159
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000160/* Locking primitives to prevent parallel imports of the same module
161 in different threads to return with a partially loaded module.
162 These calls are serialized by the global interpreter lock. */
163
164#ifdef WITH_THREAD
165
Guido van Rossum49b56061998-10-01 20:42:43 +0000166#include "pythread.h"
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000167
Guido van Rossum65d5b571998-12-21 19:32:43 +0000168static PyThread_type_lock import_lock = 0;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000169static long import_lock_thread = -1;
170static int import_lock_level = 0;
171
172static void
173lock_import()
174{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000175 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000176 if (me == -1)
177 return; /* Too bad */
178 if (import_lock == NULL)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000179 import_lock = PyThread_allocate_lock();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000180 if (import_lock_thread == me) {
181 import_lock_level++;
182 return;
183 }
Guido van Rossum65d5b571998-12-21 19:32:43 +0000184 if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0)) {
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000185 PyThreadState *tstate = PyEval_SaveThread();
Guido van Rossum65d5b571998-12-21 19:32:43 +0000186 PyThread_acquire_lock(import_lock, 1);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000187 PyEval_RestoreThread(tstate);
188 }
189 import_lock_thread = me;
190 import_lock_level = 1;
191}
192
193static void
194unlock_import()
195{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000196 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000197 if (me == -1)
198 return; /* Too bad */
199 if (import_lock_thread != me)
200 Py_FatalError("unlock_import: not holding the import lock");
201 import_lock_level--;
202 if (import_lock_level == 0) {
203 import_lock_thread = -1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000204 PyThread_release_lock(import_lock);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000205 }
206}
207
208#else
209
210#define lock_import()
211#define unlock_import()
212
213#endif
214
Guido van Rossum25ce5661997-08-02 03:10:38 +0000215/* Helper for sys */
216
217PyObject *
218PyImport_GetModuleDict()
219{
220 PyInterpreterState *interp = PyThreadState_Get()->interp;
221 if (interp->modules == NULL)
222 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
223 return interp->modules;
224}
225
Guido van Rossum3f5da241990-12-20 15:06:42 +0000226
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000227/* List of names to clear in sys */
228static char* sys_deletes[] = {
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000229 "path", "argv", "ps1", "ps2", "exitfunc",
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000230 "exc_type", "exc_value", "exc_traceback",
231 "last_type", "last_value", "last_traceback",
232 NULL
233};
234
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000235static char* sys_files[] = {
236 "stdin", "__stdin__",
237 "stdout", "__stdout__",
238 "stderr", "__stderr__",
239 NULL
240};
241
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000242
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000243/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000244
Guido van Rossum3f5da241990-12-20 15:06:42 +0000245void
Guido van Rossum79f25d91997-04-29 20:08:16 +0000246PyImport_Cleanup()
Guido van Rossum3f5da241990-12-20 15:06:42 +0000247{
Guido van Rossum758eec01998-01-19 21:58:26 +0000248 int pos, ndone;
249 char *name;
250 PyObject *key, *value, *dict;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000251 PyInterpreterState *interp = PyThreadState_Get()->interp;
Guido van Rossum758eec01998-01-19 21:58:26 +0000252 PyObject *modules = interp->modules;
253
254 if (modules == NULL)
255 return; /* Already done */
256
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000257 /* Delete some special variables first. These are common
258 places where user values hide and people complain when their
259 destructors fail. Since the modules containing them are
260 deleted *last* of all, they would come too late in the normal
261 destruction order. Sigh. */
262
263 value = PyDict_GetItemString(modules, "__builtin__");
264 if (value != NULL && PyModule_Check(value)) {
265 dict = PyModule_GetDict(value);
266 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000267 PySys_WriteStderr("# clear __builtin__._\n");
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000268 PyDict_SetItemString(dict, "_", Py_None);
269 }
270 value = PyDict_GetItemString(modules, "sys");
271 if (value != NULL && PyModule_Check(value)) {
272 char **p;
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000273 PyObject *v;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000274 dict = PyModule_GetDict(value);
275 for (p = sys_deletes; *p != NULL; p++) {
276 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000277 PySys_WriteStderr("# clear sys.%s\n", *p);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000278 PyDict_SetItemString(dict, *p, Py_None);
279 }
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000280 for (p = sys_files; *p != NULL; p+=2) {
281 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000282 PySys_WriteStderr("# restore sys.%s\n", *p);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000283 v = PyDict_GetItemString(dict, *(p+1));
284 if (v == NULL)
285 v = Py_None;
286 PyDict_SetItemString(dict, *p, v);
287 }
288 }
289
290 /* First, delete __main__ */
291 value = PyDict_GetItemString(modules, "__main__");
292 if (value != NULL && PyModule_Check(value)) {
293 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000294 PySys_WriteStderr("# cleanup __main__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000295 _PyModule_Clear(value);
296 PyDict_SetItemString(modules, "__main__", Py_None);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000297 }
298
Guido van Rossum758eec01998-01-19 21:58:26 +0000299 /* The special treatment of __builtin__ here is because even
300 when it's not referenced as a module, its dictionary is
301 referenced by almost every module's __builtins__. Since
302 deleting a module clears its dictionary (even if there are
303 references left to it), we need to delete the __builtin__
304 module last. Likewise, we don't delete sys until the very
305 end because it is implicitly referenced (e.g. by print).
306
307 Also note that we 'delete' modules by replacing their entry
308 in the modules dict with None, rather than really deleting
309 them; this avoids a rehash of the modules dictionary and
310 also marks them as "non existent" so they won't be
311 re-imported. */
312
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000313 /* Next, repeatedly delete modules with a reference count of
Guido van Rossum758eec01998-01-19 21:58:26 +0000314 one (skipping __builtin__ and sys) and delete them */
315 do {
316 ndone = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000317 pos = 0;
Guido van Rossum758eec01998-01-19 21:58:26 +0000318 while (PyDict_Next(modules, &pos, &key, &value)) {
319 if (value->ob_refcnt != 1)
320 continue;
Guido van Rossum566373e1998-10-01 15:24:50 +0000321 if (PyString_Check(key) && PyModule_Check(value)) {
322 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000323 if (strcmp(name, "__builtin__") == 0)
324 continue;
325 if (strcmp(name, "sys") == 0)
326 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000327 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000328 PySys_WriteStderr(
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000329 "# cleanup[1] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000330 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000331 PyDict_SetItem(modules, key, Py_None);
332 ndone++;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000333 }
334 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000335 } while (ndone > 0);
336
Guido van Rossum758eec01998-01-19 21:58:26 +0000337 /* Next, delete all modules (still skipping __builtin__ and sys) */
338 pos = 0;
339 while (PyDict_Next(modules, &pos, &key, &value)) {
Guido van Rossum566373e1998-10-01 15:24:50 +0000340 if (PyString_Check(key) && PyModule_Check(value)) {
341 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000342 if (strcmp(name, "__builtin__") == 0)
343 continue;
344 if (strcmp(name, "sys") == 0)
345 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000346 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000347 PySys_WriteStderr("# cleanup[2] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000348 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000349 PyDict_SetItem(modules, key, Py_None);
350 }
351 }
352
353 /* Next, delete sys and __builtin__ (in that order) */
354 value = PyDict_GetItemString(modules, "sys");
355 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000356 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000357 PySys_WriteStderr("# cleanup sys\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000358 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000359 PyDict_SetItemString(modules, "sys", Py_None);
360 }
361 value = PyDict_GetItemString(modules, "__builtin__");
362 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000363 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000364 PySys_WriteStderr("# cleanup __builtin__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000365 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000366 PyDict_SetItemString(modules, "__builtin__", Py_None);
367 }
368
369 /* Finally, clear and delete the modules directory */
370 PyDict_Clear(modules);
371 interp->modules = NULL;
372 Py_DECREF(modules);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000373}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000374
375
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000376/* Helper for pythonrun.c -- return magic number */
377
378long
Guido van Rossum79f25d91997-04-29 20:08:16 +0000379PyImport_GetMagicNumber()
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000380{
Guido van Rossum96774c12000-05-01 20:19:08 +0000381 return pyc_magic;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000382}
383
384
Guido van Rossum25ce5661997-08-02 03:10:38 +0000385/* Magic for extension modules (built-in as well as dynamically
386 loaded). To prevent initializing an extension module more than
387 once, we keep a static dictionary 'extensions' keyed by module name
388 (for built-in modules) or by filename (for dynamically loaded
389 modules), containing these modules. A copy od the module's
390 dictionary is stored by calling _PyImport_FixupExtension()
391 immediately after the module initialization function succeeds. A
392 copy can be retrieved from there by calling
393 _PyImport_FindExtension(). */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000394
Guido van Rossum79f25d91997-04-29 20:08:16 +0000395PyObject *
Guido van Rossum25ce5661997-08-02 03:10:38 +0000396_PyImport_FixupExtension(name, filename)
397 char *name;
398 char *filename;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000399{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000400 PyObject *modules, *mod, *dict, *copy;
401 if (extensions == NULL) {
402 extensions = PyDict_New();
403 if (extensions == NULL)
404 return NULL;
405 }
406 modules = PyImport_GetModuleDict();
407 mod = PyDict_GetItemString(modules, name);
408 if (mod == NULL || !PyModule_Check(mod)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000409 PyErr_Format(PyExc_SystemError,
410 "_PyImport_FixupExtension: module %.200s not loaded", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000411 return NULL;
412 }
413 dict = PyModule_GetDict(mod);
414 if (dict == NULL)
415 return NULL;
416 copy = PyObject_CallMethod(dict, "copy", "");
417 if (copy == NULL)
418 return NULL;
419 PyDict_SetItemString(extensions, filename, copy);
420 Py_DECREF(copy);
421 return copy;
422}
423
424PyObject *
425_PyImport_FindExtension(name, filename)
426 char *name;
427 char *filename;
428{
429 PyObject *dict, *mod, *mdict, *result;
430 if (extensions == NULL)
431 return NULL;
432 dict = PyDict_GetItemString(extensions, filename);
433 if (dict == NULL)
434 return NULL;
435 mod = PyImport_AddModule(name);
436 if (mod == NULL)
437 return NULL;
438 mdict = PyModule_GetDict(mod);
439 if (mdict == NULL)
440 return NULL;
441 result = PyObject_CallMethod(mdict, "update", "O", dict);
442 if (result == NULL)
443 return NULL;
444 Py_DECREF(result);
445 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000446 PySys_WriteStderr("import %s # previously loaded (%s)\n",
Guido van Rossum25ce5661997-08-02 03:10:38 +0000447 name, filename);
448 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000449}
450
451
452/* Get the module object corresponding to a module name.
453 First check the modules dictionary if there's one there,
454 if not, create a new one and insert in in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000455 Because the former action is most common, THIS DOES NOT RETURN A
456 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000457
Guido van Rossum79f25d91997-04-29 20:08:16 +0000458PyObject *
459PyImport_AddModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000460 char *name;
461{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000462 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000463 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000464
Guido van Rossum25ce5661997-08-02 03:10:38 +0000465 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
Guido van Rossum79f25d91997-04-29 20:08:16 +0000466 PyModule_Check(m))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000467 return m;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000468 m = PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000469 if (m == NULL)
470 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000471 if (PyDict_SetItemString(modules, name, m) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000472 Py_DECREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000473 return NULL;
474 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000475 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000476
477 return m;
478}
479
480
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000481/* Execute a code object in a module and return the module object
482 WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000483
Guido van Rossum79f25d91997-04-29 20:08:16 +0000484PyObject *
485PyImport_ExecCodeModule(name, co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000486 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000487 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000488{
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000489 return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
490}
491
492PyObject *
493PyImport_ExecCodeModuleEx(name, co, pathname)
494 char *name;
495 PyObject *co;
496 char *pathname;
497{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000498 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000499 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000500
Guido van Rossum79f25d91997-04-29 20:08:16 +0000501 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000502 if (m == NULL)
503 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000504 d = PyModule_GetDict(m);
505 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
506 if (PyDict_SetItemString(d, "__builtins__",
507 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000508 return NULL;
509 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000510 /* Remember the filename as the __file__ attribute */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000511 v = NULL;
512 if (pathname != NULL) {
513 v = PyString_FromString(pathname);
514 if (v == NULL)
515 PyErr_Clear();
516 }
517 if (v == NULL) {
518 v = ((PyCodeObject *)co)->co_filename;
519 Py_INCREF(v);
520 }
521 if (PyDict_SetItemString(d, "__file__", v) != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000522 PyErr_Clear(); /* Not important enough to report */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000523 Py_DECREF(v);
524
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000525 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000526 if (v == NULL)
527 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000528 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000529
Guido van Rossum25ce5661997-08-02 03:10:38 +0000530 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000531 PyErr_Format(PyExc_ImportError,
532 "Loaded module %.200s not found in sys.modules",
533 name);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000534 return NULL;
535 }
536
Guido van Rossum79f25d91997-04-29 20:08:16 +0000537 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000538
539 return m;
540}
541
542
543/* Given a pathname for a Python source file, fill a buffer with the
544 pathname for the corresponding compiled file. Return the pathname
545 for the compiled file, or NULL if there's no space in the buffer.
546 Doesn't set an exception. */
547
548static char *
549make_compiled_pathname(pathname, buf, buflen)
550 char *pathname;
551 char *buf;
552 int buflen;
553{
554 int len;
555
556 len = strlen(pathname);
557 if (len+2 > buflen)
558 return NULL;
559 strcpy(buf, pathname);
Guido van Rossum0824f631997-03-11 18:37:35 +0000560 strcpy(buf+len, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000561
562 return buf;
563}
564
565
566/* Given a pathname for a Python source file, its time of last
567 modification, and a pathname for a compiled file, check whether the
568 compiled file represents the same version of the source. If so,
569 return a FILE pointer for the compiled file, positioned just after
570 the header; if not, return NULL.
571 Doesn't set an exception. */
572
573static FILE *
574check_compiled_module(pathname, mtime, cpathname)
575 char *pathname;
576 long mtime;
577 char *cpathname;
578{
579 FILE *fp;
580 long magic;
581 long pyc_mtime;
582
583 fp = fopen(cpathname, "rb");
584 if (fp == NULL)
585 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000586 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000587 if (magic != pyc_magic) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000588 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000589 PySys_WriteStderr("# %s has bad magic\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000590 fclose(fp);
591 return NULL;
592 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000593 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000594 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000595 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000596 PySys_WriteStderr("# %s has bad mtime\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000597 fclose(fp);
598 return NULL;
599 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000600 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000601 PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000602 return fp;
603}
604
605
606/* Read a code object from a file and check it for validity */
607
Guido van Rossum79f25d91997-04-29 20:08:16 +0000608static PyCodeObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000609read_compiled_module(cpathname, fp)
610 char *cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000611 FILE *fp;
612{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000613 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000614
Guido van Rossum79f25d91997-04-29 20:08:16 +0000615 co = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000616 /* Ugly: rd_object() may return NULL with or without error */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000617 if (co == NULL || !PyCode_Check(co)) {
618 if (!PyErr_Occurred())
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000619 PyErr_Format(PyExc_ImportError,
620 "Non-code object in %.200s", cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000621 Py_XDECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000622 return NULL;
623 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000624 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000625}
626
627
628/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000629 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000630
Guido van Rossum79f25d91997-04-29 20:08:16 +0000631static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000632load_compiled_module(name, cpathname, fp)
633 char *name;
634 char *cpathname;
635 FILE *fp;
636{
637 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000638 PyCodeObject *co;
639 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000640
Guido van Rossum79f25d91997-04-29 20:08:16 +0000641 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000642 if (magic != pyc_magic) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000643 PyErr_Format(PyExc_ImportError,
644 "Bad magic number in %.200s", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000645 return NULL;
646 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000647 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000648 co = read_compiled_module(cpathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000649 if (co == NULL)
650 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000651 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000652 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000653 name, cpathname);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000654 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000655 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000656
657 return m;
658}
659
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000660/* Parse a source file and return the corresponding code object */
661
Guido van Rossum79f25d91997-04-29 20:08:16 +0000662static PyCodeObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000663parse_source_module(pathname, fp)
664 char *pathname;
665 FILE *fp;
666{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000667 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000668 node *n;
669
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000670 n = PyParser_SimpleParseFile(fp, pathname, Py_file_input);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000671 if (n == NULL)
672 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000673 co = PyNode_Compile(n, pathname);
674 PyNode_Free(n);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000675
676 return co;
677}
678
679
680/* Write a compiled module to a file, placing the time of last
681 modification of its source into the header.
682 Errors are ignored, if a write error occurs an attempt is made to
683 remove the file. */
684
685static void
686write_compiled_module(co, cpathname, mtime)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000687 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000688 char *cpathname;
689 long mtime;
690{
691 FILE *fp;
692
693 fp = fopen(cpathname, "wb");
694 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000695 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000696 PySys_WriteStderr(
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000697 "# can't create %s\n", cpathname);
698 return;
699 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000700 PyMarshal_WriteLongToFile(pyc_magic, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000701 /* First write a 0 for mtime */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000702 PyMarshal_WriteLongToFile(0L, fp);
703 PyMarshal_WriteObjectToFile((PyObject *)co, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000704 if (ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000705 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000706 PySys_WriteStderr("# can't write %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000707 /* Don't keep partial file */
708 fclose(fp);
709 (void) unlink(cpathname);
710 return;
711 }
712 /* Now write the true mtime */
713 fseek(fp, 4L, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000714 PyMarshal_WriteLongToFile(mtime, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000715 fflush(fp);
716 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000717 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000718 PySys_WriteStderr("# wrote %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000719#ifdef macintosh
Guido van Rossumbe1a6e21996-02-21 15:29:20 +0000720 setfiletype(cpathname, 'Pyth', 'PYC ');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000721#endif
722}
723
724
725/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000726 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
727 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000728
Guido van Rossum79f25d91997-04-29 20:08:16 +0000729static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000730load_source_module(name, pathname, fp)
731 char *name;
732 char *pathname;
733 FILE *fp;
734{
735 long mtime;
736 FILE *fpc;
737 char buf[MAXPATHLEN+1];
738 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000739 PyCodeObject *co;
740 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000741
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000742 mtime = PyOS_GetLastModificationTime(pathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000743 cpathname = make_compiled_pathname(pathname, buf, MAXPATHLEN+1);
744 if (cpathname != NULL &&
745 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000746 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000747 fclose(fpc);
748 if (co == NULL)
749 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000750 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000751 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000752 name, cpathname);
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000753 pathname = cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000754 }
755 else {
756 co = parse_source_module(pathname, fp);
757 if (co == NULL)
758 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000759 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000760 PySys_WriteStderr("import %s # from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000761 name, pathname);
762 write_compiled_module(co, cpathname, mtime);
763 }
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000764 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000765 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000766
767 return m;
768}
769
770
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000771/* Forward */
772static PyObject *load_module Py_PROTO((char *, FILE *, char *, int));
773static struct filedescr *find_module Py_PROTO((char *, PyObject *,
774 char *, int, FILE **));
Guido van Rossuma86f77d1997-09-09 18:53:47 +0000775static struct _frozen *find_frozen Py_PROTO((char *name));
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000776
777/* Load a package and return its module object WITH INCREMENTED
778 REFERENCE COUNT */
779
780static PyObject *
781load_package(name, pathname)
782 char *name;
783 char *pathname;
784{
785 PyObject *m, *d, *file, *path;
786 int err;
787 char buf[MAXPATHLEN+1];
788 FILE *fp = NULL;
789 struct filedescr *fdp;
790
791 m = PyImport_AddModule(name);
792 if (m == NULL)
793 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000794 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000795 PySys_WriteStderr("import %s # directory %s\n",
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000796 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000797 d = PyModule_GetDict(m);
798 file = PyString_FromString(pathname);
799 if (file == NULL)
800 return NULL;
801 path = Py_BuildValue("[O]", file);
802 if (path == NULL) {
803 Py_DECREF(file);
804 return NULL;
805 }
806 err = PyDict_SetItemString(d, "__file__", file);
807 if (err == 0)
808 err = PyDict_SetItemString(d, "__path__", path);
809 if (err != 0) {
810 m = NULL;
811 goto cleanup;
812 }
813 buf[0] = '\0';
814 fdp = find_module("__init__", path, buf, sizeof(buf), &fp);
815 if (fdp == NULL) {
816 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
817 PyErr_Clear();
818 }
819 else
820 m = NULL;
821 goto cleanup;
822 }
823 m = load_module(name, fp, buf, fdp->type);
824 if (fp != NULL)
825 fclose(fp);
826 cleanup:
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000827 Py_XDECREF(path);
828 Py_XDECREF(file);
829 return m;
830}
831
832
833/* Helper to test for built-in module */
834
835static int
836is_builtin(name)
837 char *name;
838{
839 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +0000840 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
841 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
842 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000843 return -1;
844 else
845 return 1;
846 }
847 }
848 return 0;
849}
850
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000851
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000852/* Search the path (default sys.path) for a module. Return the
853 corresponding filedescr struct, and (via return arguments) the
854 pathname and an open file. Return NULL if the module is not found. */
855
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000856#ifdef MS_COREDLL
857extern FILE *PyWin_FindRegisteredModule();
858#endif
859
Guido van Rossum0980bd91998-02-13 17:18:36 +0000860#ifdef CHECK_IMPORT_CASE
861static int check_case(char *, int, int, char *);
862#endif
863
Guido van Rossum197346f1997-10-31 18:38:52 +0000864static int find_init_module Py_PROTO((char *)); /* Forward */
865
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000866static struct filedescr *
Guido van Rossum0506a431998-08-11 15:07:39 +0000867find_module(realname, path, buf, buflen, p_fp)
868 char *realname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000869 PyObject *path;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000870 /* Output parameters: */
871 char *buf;
872 int buflen;
873 FILE **p_fp;
874{
875 int i, npath, len, namelen;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000876 struct _frozen *f;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000877 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000878 FILE *fp = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000879 struct stat statbuf;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000880 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
881 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
882 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossum0506a431998-08-11 15:07:39 +0000883 char name[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000884
Guido van Rossum0506a431998-08-11 15:07:39 +0000885 strcpy(name, realname);
886
887 if (path != NULL && PyString_Check(path)) {
888 /* Submodule of "frozen" package:
889 Set name to the fullname, path to NULL
890 and continue as "usual" */
891 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
892 PyErr_SetString(PyExc_ImportError,
893 "full frozen module name too long");
894 return NULL;
895 }
896 strcpy(buf, PyString_AsString(path));
897 strcat(buf, ".");
898 strcat(buf, name);
899 strcpy(name, buf);
900 path = NULL;
901 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000902 if (path == NULL) {
903 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000904 strcpy(buf, name);
905 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000906 }
Guido van Rossuma5568d31998-03-05 03:45:08 +0000907 if ((f = find_frozen(name)) != NULL) {
908 strcpy(buf, name);
909 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000910 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000911
Guido van Rossumac279101996-08-22 23:10:58 +0000912#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000913 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
914 if (fp != NULL) {
915 *p_fp = fp;
916 return fdp;
917 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000918#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000919 path = PySys_GetObject("path");
920 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000921 if (path == NULL || !PyList_Check(path)) {
922 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +0000923 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000924 return NULL;
925 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000926 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000927 namelen = strlen(name);
928 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000929 PyObject *v = PyList_GetItem(path, i);
930 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000931 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000932 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000933 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000934 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000935 strcpy(buf, PyString_AsString(v));
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000936 if ((int)strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000937 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000938#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000939#ifdef INTERN_STRINGS
940 /*
941 ** Speedup: each sys.path item is interned, and
942 ** FindResourceModule remembers which items refer to
943 ** folders (so we don't have to bother trying to look
944 ** into them for resources).
945 */
946 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
947 v = PyList_GET_ITEM(path, i);
948#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000949 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000950 static struct filedescr resfiledescr =
951 {"", "", PY_RESOURCE};
Jack Jansen9c96a921995-02-15 22:57:06 +0000952
953 return &resfiledescr;
954 }
Guido van Rossum0f84a341998-08-06 13:36:01 +0000955 if (PyMac_FindCodeResourceModule((PyStringObject *)v, name, buf)) {
956 static struct filedescr resfiledescr =
957 {"", "", PY_CODERESOURCE};
958
959 return &resfiledescr;
960 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000961#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000962 if (len > 0 && buf[len-1] != SEP
963#ifdef ALTSEP
964 && buf[len-1] != ALTSEP
965#endif
966 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000967 buf[len++] = SEP;
Guido van Rossum40f470f1996-05-23 22:51:04 +0000968#ifdef IMPORT_8x3_NAMES
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000969 /* see if we are searching in directory dos-8x3 */
970 if (len > 7 && !strncmp(buf + len - 8, "dos-8x3", 7)){
Guido van Rossum40f470f1996-05-23 22:51:04 +0000971 int j;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000972 char ch; /* limit name to 8 lower-case characters */
Guido van Rossum40f470f1996-05-23 22:51:04 +0000973 for (j = 0; (ch = name[j]) && j < 8; j++)
974 if (isupper(ch))
975 buf[len++] = tolower(ch);
976 else
977 buf[len++] = ch;
978 }
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000979 else /* Not in dos-8x3, use the full name */
Guido van Rossum6f489d91996-06-28 20:15:15 +0000980#endif
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000981 {
Guido van Rossum40f470f1996-05-23 22:51:04 +0000982 strcpy(buf+len, name);
983 len += namelen;
984 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000985#ifdef HAVE_STAT
986 if (stat(buf, &statbuf) == 0) {
Guido van Rossum197346f1997-10-31 18:38:52 +0000987 if (S_ISDIR(statbuf.st_mode)) {
Guido van Rossum0980bd91998-02-13 17:18:36 +0000988 if (find_init_module(buf)) {
989#ifdef CHECK_IMPORT_CASE
990 if (!check_case(buf, len, namelen,
991 name))
992 return NULL;
993#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000994 return &fd_package;
Guido van Rossum0980bd91998-02-13 17:18:36 +0000995 }
Guido van Rossum197346f1997-10-31 18:38:52 +0000996 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000997 }
998#else
999 /* XXX How are you going to test for directories? */
1000#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +00001001#ifdef macintosh
1002 fdp = PyMac_FindModuleExtension(buf, &len, name);
1003 if (fdp)
1004 fp = fopen(buf, fdp->mode);
1005#else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001006 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001007 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001008 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001009 PySys_WriteStderr("# trying %s\n", buf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001010 fp = fopen(buf, fdp->mode);
1011 if (fp != NULL)
1012 break;
1013 }
Guido van Rossum741689d1997-08-12 14:53:39 +00001014#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001015 if (fp != NULL)
1016 break;
1017 }
1018 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001019 PyErr_Format(PyExc_ImportError,
1020 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001021 return NULL;
1022 }
Guido van Rossum0980bd91998-02-13 17:18:36 +00001023#ifdef CHECK_IMPORT_CASE
1024 if (!check_case(buf, len, namelen, name)) {
1025 fclose(fp);
1026 return NULL;
1027 }
1028#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001029
1030 *p_fp = fp;
1031 return fdp;
1032}
1033
Guido van Rossum0980bd91998-02-13 17:18:36 +00001034#ifdef CHECK_IMPORT_CASE
1035
1036#ifdef MS_WIN32
1037#include <windows.h>
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001038#include <ctype.h>
1039
1040static int
1041allcaps8x3(s)
1042 char *s;
1043{
1044 /* Return 1 if s is an 8.3 filename in ALLCAPS */
1045 char c;
1046 char *dot = strchr(s, '.');
1047 char *end = strchr(s, '\0');
1048 if (dot != NULL) {
1049 if (dot-s > 8)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001050 return 0; /* More than 8 before '.' */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001051 if (end-dot > 4)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001052 return 0; /* More than 3 after '.' */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001053 end = strchr(dot+1, '.');
1054 if (end != NULL)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001055 return 0; /* More than one dot */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001056 }
1057 else if (end-s > 8)
Guido van Rossum22b65a82000-05-01 17:36:58 +00001058 return 0; /* More than 8 and no dot */
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001059 while ((c = *s++)) {
1060 if (islower(c))
1061 return 0;
1062 }
1063 return 1;
1064}
1065
Guido van Rossum0980bd91998-02-13 17:18:36 +00001066static int
1067check_case(char *buf, int len, int namelen, char *name)
1068{
1069 WIN32_FIND_DATA data;
1070 HANDLE h;
1071 if (getenv("PYTHONCASEOK") != NULL)
1072 return 1;
1073 h = FindFirstFile(buf, &data);
1074 if (h == INVALID_HANDLE_VALUE) {
1075 PyErr_Format(PyExc_NameError,
1076 "Can't find file for module %.100s\n(filename %.300s)",
1077 name, buf);
1078 return 0;
1079 }
1080 FindClose(h);
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001081 if (allcaps8x3(data.cFileName)) {
1082 /* Skip the test if the filename is ALL.CAPS. This can
1083 happen in certain circumstances beyond our control,
1084 e.g. when software is installed under NT on a FAT
1085 filesystem and then the same FAT filesystem is used
1086 under Windows 95. */
1087 return 1;
1088 }
Guido van Rossum0980bd91998-02-13 17:18:36 +00001089 if (strncmp(data.cFileName, name, namelen) != 0) {
1090 strcpy(buf+len-namelen, data.cFileName);
1091 PyErr_Format(PyExc_NameError,
1092 "Case mismatch for module name %.100s\n(filename %.300s)",
1093 name, buf);
1094 return 0;
1095 }
1096 return 1;
1097}
1098#endif /* MS_WIN32 */
1099
1100#ifdef macintosh
1101#include <TextUtils.h>
Guido van Rossumb33aa1a2000-04-24 15:08:18 +00001102#ifdef USE_GUSI1
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001103#include "TFileSpec.h" /* for Path2FSSpec() */
1104#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001105static int
1106check_case(char *buf, int len, int namelen, char *name)
1107{
1108 FSSpec fss;
1109 OSErr err;
Guido van Rossumb33aa1a2000-04-24 15:08:18 +00001110#ifndef USE_GUSI1
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001111 err = FSMakeFSSpec(0, 0, Pstring(buf), &fss);
1112#else
1113 /* GUSI's Path2FSSpec() resolves all possible aliases nicely on
1114 the way, which is fine for all directories, but here we need
1115 the original name of the alias file (say, Dlg.ppc.slb, not
1116 toolboxmodules.ppc.slb). */
1117 char *colon;
1118 err = Path2FSSpec(buf, &fss);
1119 if (err == noErr) {
1120 colon = strrchr(buf, ':'); /* find filename */
1121 if (colon != NULL)
1122 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1123 Pstring(colon+1), &fss);
1124 else
1125 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1126 fss.name, &fss);
1127 }
1128#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001129 if (err) {
1130 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001131 "Can't find file for module %.100s\n(filename %.300s)",
1132 name, buf);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001133 return 0;
1134 }
1135 p2cstr(fss.name);
1136 if ( strncmp(name, (char *)fss.name, namelen) != 0 ) {
1137 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001138 "Case mismatch for module name %.100s\n(filename %.300s)",
1139 name, fss.name);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001140 return 0;
1141 }
1142 return 1;
1143}
1144#endif /* macintosh */
1145
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001146#ifdef DJGPP
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001147#include <dir.h>
1148
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001149static int
1150check_case(char *buf, int len, int namelen, char *name)
1151{
1152 struct ffblk ffblk;
1153 int done;
1154
1155 if (getenv("PYTHONCASEOK") != NULL)
1156 return 1;
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001157 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001158 if (done) {
1159 PyErr_Format(PyExc_NameError,
1160 "Can't find file for module %.100s\n(filename %.300s)",
1161 name, buf);
1162 return 0;
1163 }
1164
1165 if (strncmp(ffblk.ff_name, name, namelen) != 0) {
1166 strcpy(buf+len-namelen, ffblk.ff_name);
1167 PyErr_Format(PyExc_NameError,
1168 "Case mismatch for module name %.100s\n(filename %.300s)",
1169 name, buf);
1170 return 0;
1171 }
1172 return 1;
1173}
1174#endif
1175
Guido van Rossum8766a771998-04-10 23:44:32 +00001176#endif /* CHECK_IMPORT_CASE */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001177
Guido van Rossum197346f1997-10-31 18:38:52 +00001178#ifdef HAVE_STAT
1179/* Helper to look for __init__.py or __init__.py[co] in potential package */
1180static int
1181find_init_module(buf)
1182 char *buf;
1183{
1184 int save_len = strlen(buf);
1185 int i = save_len;
1186 struct stat statbuf;
1187
1188 if (save_len + 13 >= MAXPATHLEN)
1189 return 0;
1190 buf[i++] = SEP;
1191 strcpy(buf+i, "__init__.py");
1192 if (stat(buf, &statbuf) == 0) {
1193 buf[save_len] = '\0';
1194 return 1;
1195 }
1196 i += strlen(buf+i);
1197 if (Py_OptimizeFlag)
1198 strcpy(buf+i, "o");
1199 else
1200 strcpy(buf+i, "c");
1201 if (stat(buf, &statbuf) == 0) {
1202 buf[save_len] = '\0';
1203 return 1;
1204 }
1205 buf[save_len] = '\0';
1206 return 0;
1207}
1208#endif /* HAVE_STAT */
1209
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001210
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001211static int init_builtin Py_PROTO((char *)); /* Forward */
1212
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001213/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001214 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001215
Guido van Rossum79f25d91997-04-29 20:08:16 +00001216static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001217load_module(name, fp, buf, type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001218 char *name;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001219 FILE *fp;
1220 char *buf;
1221 int type;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001222{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001223 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001224 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001225 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001226
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001227 /* First check that there's an open file (if we need one) */
1228 switch (type) {
1229 case PY_SOURCE:
1230 case PY_COMPILED:
1231 if (fp == NULL) {
1232 PyErr_Format(PyExc_ValueError,
1233 "file object required for import (type code %d)",
1234 type);
1235 return NULL;
1236 }
1237 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001238
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001239 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001240
1241 case PY_SOURCE:
1242 m = load_source_module(name, buf, fp);
1243 break;
1244
1245 case PY_COMPILED:
1246 m = load_compiled_module(name, buf, fp);
1247 break;
1248
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001249#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001250 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001251 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001252 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001253#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001254
Jack Jansen9c96a921995-02-15 22:57:06 +00001255#ifdef macintosh
1256 case PY_RESOURCE:
1257 m = PyMac_LoadResourceModule(name, buf);
1258 break;
Guido van Rossum0f84a341998-08-06 13:36:01 +00001259 case PY_CODERESOURCE:
1260 m = PyMac_LoadCodeResourceModule(name, buf);
1261 break;
Jack Jansen9c96a921995-02-15 22:57:06 +00001262#endif
1263
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001264 case PKG_DIRECTORY:
1265 m = load_package(name, buf);
1266 break;
1267
1268 case C_BUILTIN:
1269 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001270 if (buf != NULL && buf[0] != '\0')
1271 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001272 if (type == C_BUILTIN)
1273 err = init_builtin(name);
1274 else
1275 err = PyImport_ImportFrozenModule(name);
1276 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001277 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001278 if (err == 0) {
1279 PyErr_Format(PyExc_ImportError,
1280 "Purported %s module %.200s not found",
1281 type == C_BUILTIN ?
1282 "builtin" : "frozen",
1283 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001284 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001285 }
1286 modules = PyImport_GetModuleDict();
1287 m = PyDict_GetItemString(modules, name);
1288 if (m == NULL) {
1289 PyErr_Format(
1290 PyExc_ImportError,
1291 "%s module %.200s not properly initialized",
1292 type == C_BUILTIN ?
1293 "builtin" : "frozen",
1294 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001295 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001296 }
1297 Py_INCREF(m);
1298 break;
1299
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001300 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001301 PyErr_Format(PyExc_ImportError,
1302 "Don't know how to import %.200s (type code %d)",
1303 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001304 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001305
1306 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001307
1308 return m;
1309}
1310
1311
1312/* Initialize a built-in module.
1313 Return 1 for succes, 0 if the module is not found, and -1 with
1314 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001315
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001316static int
1317init_builtin(name)
1318 char *name;
1319{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001320 struct _inittab *p;
1321 PyObject *mod;
1322
1323 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
1324 return 1;
1325
Guido van Rossum771c6c81997-10-31 18:37:24 +00001326 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001327 if (strcmp(name, p->name) == 0) {
1328 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001329 PyErr_Format(PyExc_ImportError,
1330 "Cannot re-init internal module %.200s",
1331 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001332 return -1;
1333 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001334 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001335 PySys_WriteStderr("import %s # builtin\n", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001336 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001337 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001338 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001339 if (_PyImport_FixupExtension(name, name) == NULL)
1340 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001341 return 1;
1342 }
1343 }
1344 return 0;
1345}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001346
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001347
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001348/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001349
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001350static struct _frozen *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001351find_frozen(name)
1352 char *name;
1353{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001354 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001355
Guido van Rossum79f25d91997-04-29 20:08:16 +00001356 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001357 if (p->name == NULL)
1358 return NULL;
1359 if (strcmp(p->name, name) == 0)
1360 break;
1361 }
1362 return p;
1363}
1364
Guido van Rossum79f25d91997-04-29 20:08:16 +00001365static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001366get_frozen_object(name)
1367 char *name;
1368{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001369 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001370 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001371
1372 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001373 PyErr_Format(PyExc_ImportError,
1374 "No such frozen object named %.200s",
1375 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001376 return NULL;
1377 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001378 size = p->size;
1379 if (size < 0)
1380 size = -size;
1381 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001382}
1383
1384/* Initialize a frozen module.
1385 Return 1 for succes, 0 if the module is not found, and -1 with
1386 an exception set if the initialization failed.
1387 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001388
1389int
Guido van Rossum79f25d91997-04-29 20:08:16 +00001390PyImport_ImportFrozenModule(name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001391 char *name;
1392{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001393 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001394 PyObject *co;
1395 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001396 int ispackage;
1397 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001398
1399 if (p == NULL)
1400 return 0;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001401 size = p->size;
1402 ispackage = (size < 0);
1403 if (ispackage)
1404 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001405 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001406 PySys_WriteStderr("import %s # frozen%s\n",
Guido van Rossuma5568d31998-03-05 03:45:08 +00001407 name, ispackage ? " package" : "");
1408 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001409 if (co == NULL)
1410 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001411 if (!PyCode_Check(co)) {
1412 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001413 PyErr_Format(PyExc_TypeError,
1414 "frozen object %.200s is not a code object",
1415 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001416 return -1;
1417 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001418 if (ispackage) {
1419 /* Set __path__ to the package name */
1420 PyObject *d, *s;
1421 int err;
1422 m = PyImport_AddModule(name);
1423 if (m == NULL)
1424 return -1;
1425 d = PyModule_GetDict(m);
1426 s = PyString_InternFromString(name);
1427 if (s == NULL)
1428 return -1;
1429 err = PyDict_SetItemString(d, "__path__", s);
1430 Py_DECREF(s);
1431 if (err != 0)
1432 return err;
1433 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001434 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001435 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001436 if (m == NULL)
1437 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001438 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001439 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001440}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001441
1442
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001443/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001444 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001445
Guido van Rossum79f25d91997-04-29 20:08:16 +00001446PyObject *
1447PyImport_ImportModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001448 char *name;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001449{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001450 static PyObject *fromlist = NULL;
1451 if (fromlist == NULL && strchr(name, '.') != NULL) {
1452 fromlist = Py_BuildValue("[s]", "*");
1453 if (fromlist == NULL)
1454 return NULL;
1455 }
1456 return PyImport_ImportModuleEx(name, NULL, NULL, fromlist);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001457}
1458
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001459/* Forward declarations for helper routines */
1460static PyObject *get_parent Py_PROTO((PyObject *globals,
1461 char *buf, int *p_buflen));
1462static PyObject *load_next Py_PROTO((PyObject *mod, PyObject *altmod,
1463 char **p_name, char *buf, int *p_buflen));
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001464static int mark_miss Py_PROTO((char *name));
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001465static int ensure_fromlist Py_PROTO((PyObject *mod, PyObject *fromlist,
Guido van Rossum9905ef91997-09-08 16:07:11 +00001466 char *buf, int buflen, int recursive));
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001467static PyObject * import_submodule Py_PROTO((PyObject *mod,
1468 char *name, char *fullname));
1469
1470/* The Magnum Opus of dotted-name import :-) */
1471
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001472static PyObject *
1473import_module_ex(name, globals, locals, fromlist)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001474 char *name;
1475 PyObject *globals;
1476 PyObject *locals;
1477 PyObject *fromlist;
1478{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001479 char buf[MAXPATHLEN+1];
1480 int buflen = 0;
1481 PyObject *parent, *head, *next, *tail;
1482
1483 parent = get_parent(globals, buf, &buflen);
1484 if (parent == NULL)
1485 return NULL;
1486
1487 head = load_next(parent, Py_None, &name, buf, &buflen);
1488 if (head == NULL)
1489 return NULL;
1490
1491 tail = head;
1492 Py_INCREF(tail);
1493 while (name) {
1494 next = load_next(tail, tail, &name, buf, &buflen);
1495 Py_DECREF(tail);
1496 if (next == NULL) {
1497 Py_DECREF(head);
1498 return NULL;
1499 }
1500 tail = next;
1501 }
1502
1503 if (fromlist != NULL) {
1504 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1505 fromlist = NULL;
1506 }
1507
1508 if (fromlist == NULL) {
1509 Py_DECREF(tail);
1510 return head;
1511 }
1512
1513 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001514 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001515 Py_DECREF(tail);
1516 return NULL;
1517 }
1518
1519 return tail;
1520}
1521
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001522PyObject *
1523PyImport_ImportModuleEx(name, globals, locals, fromlist)
1524 char *name;
1525 PyObject *globals;
1526 PyObject *locals;
1527 PyObject *fromlist;
1528{
1529 PyObject *result;
1530 lock_import();
Guido van Rossumd65911b1998-03-03 22:33:27 +00001531 result = import_module_ex(name, globals, locals, fromlist);
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001532 unlock_import();
1533 return result;
1534}
1535
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001536static PyObject *
1537get_parent(globals, buf, p_buflen)
1538 PyObject *globals;
1539 char *buf;
1540 int *p_buflen;
1541{
1542 static PyObject *namestr = NULL;
1543 static PyObject *pathstr = NULL;
1544 PyObject *modname, *modpath, *modules, *parent;
1545
1546 if (globals == NULL || !PyDict_Check(globals))
1547 return Py_None;
1548
1549 if (namestr == NULL) {
1550 namestr = PyString_InternFromString("__name__");
1551 if (namestr == NULL)
1552 return NULL;
1553 }
1554 if (pathstr == NULL) {
1555 pathstr = PyString_InternFromString("__path__");
1556 if (pathstr == NULL)
1557 return NULL;
1558 }
1559
1560 *buf = '\0';
1561 *p_buflen = 0;
1562 modname = PyDict_GetItem(globals, namestr);
1563 if (modname == NULL || !PyString_Check(modname))
1564 return Py_None;
1565
1566 modpath = PyDict_GetItem(globals, pathstr);
1567 if (modpath != NULL) {
1568 int len = PyString_GET_SIZE(modname);
1569 if (len > MAXPATHLEN) {
1570 PyErr_SetString(PyExc_ValueError,
1571 "Module name too long");
1572 return NULL;
1573 }
1574 strcpy(buf, PyString_AS_STRING(modname));
1575 *p_buflen = len;
1576 }
1577 else {
1578 char *start = PyString_AS_STRING(modname);
1579 char *lastdot = strrchr(start, '.');
1580 int len;
1581 if (lastdot == NULL)
1582 return Py_None;
1583 len = lastdot - start;
1584 if (len >= MAXPATHLEN) {
1585 PyErr_SetString(PyExc_ValueError,
1586 "Module name too long");
1587 return NULL;
1588 }
1589 strncpy(buf, start, len);
1590 buf[len] = '\0';
1591 *p_buflen = len;
1592 }
1593
1594 modules = PyImport_GetModuleDict();
1595 parent = PyDict_GetItemString(modules, buf);
1596 if (parent == NULL)
1597 parent = Py_None;
1598 return parent;
1599 /* We expect, but can't guarantee, if parent != None, that:
1600 - parent.__name__ == buf
1601 - parent.__dict__ is globals
1602 If this is violated... Who cares? */
1603}
1604
1605static PyObject *
1606load_next(mod, altmod, p_name, buf, p_buflen)
1607 PyObject *mod;
1608 PyObject *altmod; /* Either None or same as mod */
1609 char **p_name;
1610 char *buf;
1611 int *p_buflen;
1612{
1613 char *name = *p_name;
1614 char *dot = strchr(name, '.');
1615 int len;
1616 char *p;
1617 PyObject *result;
1618
1619 if (dot == NULL) {
1620 *p_name = NULL;
1621 len = strlen(name);
1622 }
1623 else {
1624 *p_name = dot+1;
1625 len = dot-name;
1626 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00001627 if (len == 0) {
1628 PyErr_SetString(PyExc_ValueError,
1629 "Empty module name");
1630 return NULL;
1631 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001632
1633 p = buf + *p_buflen;
1634 if (p != buf)
1635 *p++ = '.';
1636 if (p+len-buf >= MAXPATHLEN) {
1637 PyErr_SetString(PyExc_ValueError,
1638 "Module name too long");
1639 return NULL;
1640 }
1641 strncpy(p, name, len);
1642 p[len] = '\0';
1643 *p_buflen = p+len-buf;
1644
1645 result = import_submodule(mod, p, buf);
1646 if (result == Py_None && altmod != mod) {
1647 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001648 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001649 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001650 if (result != NULL && result != Py_None) {
1651 if (mark_miss(buf) != 0) {
1652 Py_DECREF(result);
1653 return NULL;
1654 }
1655 strncpy(buf, name, len);
1656 buf[len] = '\0';
1657 *p_buflen = len;
1658 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001659 }
1660 if (result == NULL)
1661 return NULL;
1662
1663 if (result == Py_None) {
1664 Py_DECREF(result);
1665 PyErr_Format(PyExc_ImportError,
1666 "No module named %.200s", name);
1667 return NULL;
1668 }
1669
1670 return result;
1671}
1672
1673static int
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001674mark_miss(name)
1675 char *name;
1676{
1677 PyObject *modules = PyImport_GetModuleDict();
1678 return PyDict_SetItemString(modules, name, Py_None);
1679}
1680
1681static int
Guido van Rossum9905ef91997-09-08 16:07:11 +00001682ensure_fromlist(mod, fromlist, buf, buflen, recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001683 PyObject *mod;
1684 PyObject *fromlist;
1685 char *buf;
1686 int buflen;
Guido van Rossum9905ef91997-09-08 16:07:11 +00001687 int recursive;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001688{
1689 int i;
1690
1691 if (!PyObject_HasAttrString(mod, "__path__"))
1692 return 1;
1693
1694 for (i = 0; ; i++) {
1695 PyObject *item = PySequence_GetItem(fromlist, i);
1696 int hasit;
1697 if (item == NULL) {
1698 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1699 PyErr_Clear();
1700 return 1;
1701 }
1702 return 0;
1703 }
1704 if (!PyString_Check(item)) {
1705 PyErr_SetString(PyExc_TypeError,
1706 "Item in ``from list'' not a string");
1707 Py_DECREF(item);
1708 return 0;
1709 }
1710 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001711 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001712 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001713 /* See if the package defines __all__ */
1714 if (recursive)
1715 continue; /* Avoid endless recursion */
1716 all = PyObject_GetAttrString(mod, "__all__");
1717 if (all == NULL)
1718 PyErr_Clear();
1719 else {
1720 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1721 return 0;
1722 Py_DECREF(all);
1723 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001724 continue;
1725 }
1726 hasit = PyObject_HasAttr(mod, item);
1727 if (!hasit) {
1728 char *subname = PyString_AS_STRING(item);
1729 PyObject *submod;
1730 char *p;
1731 if (buflen + strlen(subname) >= MAXPATHLEN) {
1732 PyErr_SetString(PyExc_ValueError,
1733 "Module name too long");
1734 Py_DECREF(item);
1735 return 0;
1736 }
1737 p = buf + buflen;
1738 *p++ = '.';
1739 strcpy(p, subname);
1740 submod = import_submodule(mod, subname, buf);
1741 Py_XDECREF(submod);
1742 if (submod == NULL) {
1743 Py_DECREF(item);
1744 return 0;
1745 }
1746 }
1747 Py_DECREF(item);
1748 }
1749
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001750 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001751}
1752
1753static PyObject *
1754import_submodule(mod, subname, fullname)
1755 PyObject *mod; /* May be None */
1756 char *subname;
1757 char *fullname;
1758{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001759 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001760 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001761
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001762 /* Require:
1763 if mod == None: subname == fullname
1764 else: mod.__name__ + "." + subname == fullname
1765 */
1766
1767 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001768 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001769 }
1770 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001771 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001772 char buf[MAXPATHLEN+1];
1773 struct filedescr *fdp;
1774 FILE *fp = NULL;
1775
Guido van Rossum9c0afe51998-05-19 15:09:05 +00001776 if (mod == Py_None)
1777 path = NULL;
1778 else {
1779 path = PyObject_GetAttrString(mod, "__path__");
1780 if (path == NULL) {
1781 PyErr_Clear();
1782 Py_INCREF(Py_None);
1783 return Py_None;
1784 }
1785 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001786
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001787 buf[0] = '\0';
Guido van Rossumb68cd421998-07-01 17:36:26 +00001788 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1789 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001790 if (fdp == NULL) {
1791 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1792 return NULL;
1793 PyErr_Clear();
1794 Py_INCREF(Py_None);
1795 return Py_None;
1796 }
1797 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001798 if (fp)
1799 fclose(fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001800 if (m != NULL && mod != Py_None) {
1801 if (PyObject_SetAttrString(mod, subname, m) < 0) {
1802 Py_DECREF(m);
1803 m = NULL;
1804 }
1805 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001806 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001807
1808 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001809}
1810
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001811
1812/* Re-import a module of any kind and return its module object, WITH
1813 INCREMENTED REFERENCE COUNT */
1814
Guido van Rossum79f25d91997-04-29 20:08:16 +00001815PyObject *
1816PyImport_ReloadModule(m)
1817 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001818{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001819 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001820 PyObject *path = NULL;
1821 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001822 char buf[MAXPATHLEN+1];
1823 struct filedescr *fdp;
1824 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001825
Guido van Rossum79f25d91997-04-29 20:08:16 +00001826 if (m == NULL || !PyModule_Check(m)) {
1827 PyErr_SetString(PyExc_TypeError,
1828 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001829 return NULL;
1830 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001831 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001832 if (name == NULL)
1833 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001834 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001835 PyErr_Format(PyExc_ImportError,
1836 "reload(): module %.200s not in sys.modules",
1837 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001838 return NULL;
1839 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001840 subname = strrchr(name, '.');
1841 if (subname == NULL)
1842 subname = name;
1843 else {
1844 PyObject *parentname, *parent;
1845 parentname = PyString_FromStringAndSize(name, (subname-name));
1846 if (parentname == NULL)
1847 return NULL;
1848 parent = PyDict_GetItem(modules, parentname);
Barry Warsaw38793331999-01-27 17:54:20 +00001849 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00001850 if (parent == NULL) {
1851 PyErr_Format(PyExc_ImportError,
1852 "reload(): parent %.200s not in sys.modules",
1853 name);
1854 return NULL;
1855 }
1856 subname++;
1857 path = PyObject_GetAttrString(parent, "__path__");
1858 if (path == NULL)
1859 PyErr_Clear();
1860 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001861 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001862 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1863 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001864 if (fdp == NULL)
1865 return NULL;
1866 m = load_module(name, fp, buf, fdp->type);
1867 if (fp)
1868 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001869 return m;
1870}
1871
1872
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001873/* Higher-level import emulator which emulates the "import" statement
1874 more accurately -- it invokes the __import__() function from the
1875 builtins of the current globals. This means that the import is
1876 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00001877 environment, e.g. by "rexec".
1878 A dummy list ["__doc__"] is passed as the 4th argument so that
1879 e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
1880 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001881
1882PyObject *
1883PyImport_Import(module_name)
1884 PyObject *module_name;
1885{
1886 static PyObject *silly_list = NULL;
1887 static PyObject *builtins_str = NULL;
1888 static PyObject *import_str = NULL;
1889 static PyObject *standard_builtins = NULL;
1890 PyObject *globals = NULL;
1891 PyObject *import = NULL;
1892 PyObject *builtins = NULL;
1893 PyObject *r = NULL;
1894
1895 /* Initialize constant string objects */
1896 if (silly_list == NULL) {
1897 import_str = PyString_InternFromString("__import__");
1898 if (import_str == NULL)
1899 return NULL;
1900 builtins_str = PyString_InternFromString("__builtins__");
1901 if (builtins_str == NULL)
1902 return NULL;
1903 silly_list = Py_BuildValue("[s]", "__doc__");
1904 if (silly_list == NULL)
1905 return NULL;
1906 }
1907
1908 /* Get the builtins from current globals */
1909 globals = PyEval_GetGlobals();
1910 if(globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00001911 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001912 builtins = PyObject_GetItem(globals, builtins_str);
1913 if (builtins == NULL)
1914 goto err;
1915 }
1916 else {
1917 /* No globals -- use standard builtins, and fake globals */
1918 PyErr_Clear();
1919
1920 if (standard_builtins == NULL) {
1921 standard_builtins =
1922 PyImport_ImportModule("__builtin__");
1923 if (standard_builtins == NULL)
1924 return NULL;
1925 }
1926
1927 builtins = standard_builtins;
1928 Py_INCREF(builtins);
1929 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1930 if (globals == NULL)
1931 goto err;
1932 }
1933
1934 /* Get the __import__ function from the builtins */
1935 if (PyDict_Check(builtins))
1936 import=PyObject_GetItem(builtins, import_str);
1937 else
1938 import=PyObject_GetAttr(builtins, import_str);
1939 if (import == NULL)
1940 goto err;
1941
1942 /* Call the _import__ function with the proper argument list */
1943 r = PyObject_CallFunction(import, "OOOO",
1944 module_name, globals, globals, silly_list);
1945
1946 err:
1947 Py_XDECREF(globals);
1948 Py_XDECREF(builtins);
1949 Py_XDECREF(import);
1950
1951 return r;
1952}
1953
1954
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001955/* Module 'imp' provides Python access to the primitives used for
1956 importing modules.
1957*/
1958
Guido van Rossum79f25d91997-04-29 20:08:16 +00001959static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001960imp_get_magic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001961 PyObject *self;
1962 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001963{
1964 char buf[4];
1965
Guido van Rossum43713e52000-02-29 13:59:29 +00001966 if (!PyArg_ParseTuple(args, ":get_magic"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001967 return NULL;
Guido van Rossum96774c12000-05-01 20:19:08 +00001968 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
1969 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
1970 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
1971 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001972
Guido van Rossum79f25d91997-04-29 20:08:16 +00001973 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001974}
1975
Guido van Rossum79f25d91997-04-29 20:08:16 +00001976static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001977imp_get_suffixes(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001978 PyObject *self;
1979 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001980{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001981 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001982 struct filedescr *fdp;
1983
Guido van Rossum43713e52000-02-29 13:59:29 +00001984 if (!PyArg_ParseTuple(args, ":get_suffixes"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001985 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001986 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001987 if (list == NULL)
1988 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001989 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
1990 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001991 fdp->suffix, fdp->mode, fdp->type);
1992 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001993 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001994 return NULL;
1995 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001996 if (PyList_Append(list, item) < 0) {
1997 Py_DECREF(list);
1998 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001999 return NULL;
2000 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002001 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002002 }
2003 return list;
2004}
2005
Guido van Rossum79f25d91997-04-29 20:08:16 +00002006static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002007call_find_module(name, path)
2008 char *name;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002009 PyObject *path; /* list or None or NULL */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002010{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002011 extern int fclose Py_PROTO((FILE *));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002012 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002013 struct filedescr *fdp;
2014 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002015 FILE *fp = NULL;
2016
2017 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002018 if (path == Py_None)
2019 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002020 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
2021 if (fdp == NULL)
2022 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002023 if (fp != NULL) {
2024 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
2025 if (fob == NULL) {
2026 fclose(fp);
2027 return NULL;
2028 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002029 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002030 else {
2031 fob = Py_None;
2032 Py_INCREF(fob);
2033 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002034 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002035 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002036 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002037 return ret;
2038}
2039
Guido van Rossum79f25d91997-04-29 20:08:16 +00002040static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002041imp_find_module(self, args)
2042 PyObject *self;
2043 PyObject *args;
2044{
2045 char *name;
2046 PyObject *path = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002047 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002048 return NULL;
2049 return call_find_module(name, path);
2050}
2051
2052static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002053imp_init_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002054 PyObject *self;
2055 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002056{
2057 char *name;
2058 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002059 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002060 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002061 return NULL;
2062 ret = init_builtin(name);
2063 if (ret < 0)
2064 return NULL;
2065 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002066 Py_INCREF(Py_None);
2067 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002068 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002069 m = PyImport_AddModule(name);
2070 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002071 return m;
2072}
2073
Guido van Rossum79f25d91997-04-29 20:08:16 +00002074static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002075imp_init_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002076 PyObject *self;
2077 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002078{
2079 char *name;
2080 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002081 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002082 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002083 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002084 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002085 if (ret < 0)
2086 return NULL;
2087 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002088 Py_INCREF(Py_None);
2089 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002090 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002091 m = PyImport_AddModule(name);
2092 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002093 return m;
2094}
2095
Guido van Rossum79f25d91997-04-29 20:08:16 +00002096static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002097imp_get_frozen_object(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002098 PyObject *self;
2099 PyObject *args;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002100{
2101 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002102
Guido van Rossum43713e52000-02-29 13:59:29 +00002103 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002104 return NULL;
2105 return get_frozen_object(name);
2106}
2107
Guido van Rossum79f25d91997-04-29 20:08:16 +00002108static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002109imp_is_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002110 PyObject *self;
2111 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002112{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002113 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002114 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002115 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002116 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002117}
2118
Guido van Rossum79f25d91997-04-29 20:08:16 +00002119static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002120imp_is_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002121 PyObject *self;
2122 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002123{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002124 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002125 struct _frozen *p;
Guido van Rossum43713e52000-02-29 13:59:29 +00002126 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002127 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002128 p = find_frozen(name);
2129 return PyInt_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002130}
2131
2132static FILE *
2133get_file(pathname, fob, mode)
2134 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002135 PyObject *fob;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002136 char *mode;
2137{
2138 FILE *fp;
2139 if (fob == NULL) {
2140 fp = fopen(pathname, mode);
2141 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002142 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002143 }
2144 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002145 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002146 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002147 PyErr_SetString(PyExc_ValueError,
2148 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002149 }
2150 return fp;
2151}
2152
Guido van Rossum79f25d91997-04-29 20:08:16 +00002153static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002154imp_load_compiled(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002155 PyObject *self;
2156 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002157{
2158 char *name;
2159 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002160 PyObject *fob = NULL;
2161 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002162 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002163 if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002164 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002165 return NULL;
2166 fp = get_file(pathname, fob, "rb");
2167 if (fp == NULL)
2168 return NULL;
2169 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002170 if (fob == NULL)
2171 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002172 return m;
2173}
2174
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002175#ifdef HAVE_DYNAMIC_LOADING
2176
Guido van Rossum79f25d91997-04-29 20:08:16 +00002177static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002178imp_load_dynamic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002179 PyObject *self;
2180 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002181{
2182 char *name;
2183 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002184 PyObject *fob = NULL;
2185 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002186 FILE *fp = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002187 if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002188 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002189 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002190 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002191 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002192 if (fp == NULL)
2193 return NULL;
2194 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002195 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002196 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002197}
2198
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002199#endif /* HAVE_DYNAMIC_LOADING */
2200
Guido van Rossum79f25d91997-04-29 20:08:16 +00002201static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002202imp_load_source(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002203 PyObject *self;
2204 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002205{
2206 char *name;
2207 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002208 PyObject *fob = NULL;
2209 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002210 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002211 if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002212 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002213 return NULL;
2214 fp = get_file(pathname, fob, "r");
2215 if (fp == NULL)
2216 return NULL;
2217 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002218 if (fob == NULL)
2219 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002220 return m;
2221}
2222
Jack Jansen9c96a921995-02-15 22:57:06 +00002223#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002224static PyObject *
Jack Jansen9c96a921995-02-15 22:57:06 +00002225imp_load_resource(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002226 PyObject *self;
2227 PyObject *args;
Jack Jansen9c96a921995-02-15 22:57:06 +00002228{
2229 char *name;
2230 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002231 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002232
Guido van Rossum43713e52000-02-29 13:59:29 +00002233 if (!PyArg_ParseTuple(args, "ss:load_resource", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002234 return NULL;
2235 m = PyMac_LoadResourceModule(name, pathname);
2236 return m;
2237}
2238#endif /* macintosh */
2239
Guido van Rossum79f25d91997-04-29 20:08:16 +00002240static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002241imp_load_module(self, args)
2242 PyObject *self;
2243 PyObject *args;
2244{
2245 char *name;
2246 PyObject *fob;
2247 char *pathname;
2248 char *suffix; /* Unused */
2249 char *mode;
2250 int type;
2251 FILE *fp;
2252
Guido van Rossum43713e52000-02-29 13:59:29 +00002253 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002254 &name, &fob, &pathname,
2255 &suffix, &mode, &type))
2256 return NULL;
2257 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
2258 PyErr_Format(PyExc_ValueError,
2259 "invalid file open mode %.200s", mode);
2260 return NULL;
2261 }
2262 if (fob == Py_None)
2263 fp = NULL;
2264 else {
2265 if (!PyFile_Check(fob)) {
2266 PyErr_SetString(PyExc_ValueError,
2267 "load_module arg#2 should be a file or None");
2268 return NULL;
2269 }
2270 fp = get_file(pathname, fob, mode);
2271 if (fp == NULL)
2272 return NULL;
2273 }
2274 return load_module(name, fp, pathname, type);
2275}
2276
2277static PyObject *
2278imp_load_package(self, args)
2279 PyObject *self;
2280 PyObject *args;
2281{
2282 char *name;
2283 char *pathname;
Guido van Rossum43713e52000-02-29 13:59:29 +00002284 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002285 return NULL;
2286 return load_package(name, pathname);
2287}
2288
2289static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002290imp_new_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002291 PyObject *self;
2292 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002293{
2294 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002295 if (!PyArg_ParseTuple(args, "s:new_module", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002296 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002297 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002298}
2299
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002300/* Doc strings */
2301
2302static char doc_imp[] = "\
2303This module provides the components needed to build your own\n\
2304__import__ function. Undocumented functions are obsolete.\n\
2305";
2306
2307static char doc_find_module[] = "\
2308find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
2309Search for a module. If path is omitted or None, search for a\n\
2310built-in, frozen or special module and continue search in sys.path.\n\
2311The module name cannot contain '.'; to search for a submodule of a\n\
2312package, pass the submodule name and the package's __path__.\
2313";
2314
2315static char doc_load_module[] = "\
2316load_module(name, file, filename, (suffix, mode, type)) -> module\n\
2317Load a module, given information returned by find_module().\n\
2318The module name must include the full package name, if any.\
2319";
2320
2321static char doc_get_magic[] = "\
2322get_magic() -> string\n\
2323Return the magic number for .pyc or .pyo files.\
2324";
2325
2326static char doc_get_suffixes[] = "\
2327get_suffixes() -> [(suffix, mode, type), ...]\n\
2328Return a list of (suffix, mode, type) tuples describing the files\n\
2329that find_module() looks for.\
2330";
2331
2332static char doc_new_module[] = "\
2333new_module(name) -> module\n\
2334Create a new module. Do not enter it in sys.modules.\n\
2335The module name must include the full package name, if any.\
2336";
2337
Guido van Rossum79f25d91997-04-29 20:08:16 +00002338static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002339 {"find_module", imp_find_module, 1, doc_find_module},
2340 {"get_magic", imp_get_magic, 1, doc_get_magic},
2341 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2342 {"load_module", imp_load_module, 1, doc_load_module},
2343 {"new_module", imp_new_module, 1, doc_new_module},
2344 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002345 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002346 {"init_builtin", imp_init_builtin, 1},
2347 {"init_frozen", imp_init_frozen, 1},
2348 {"is_builtin", imp_is_builtin, 1},
2349 {"is_frozen", imp_is_frozen, 1},
2350 {"load_compiled", imp_load_compiled, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002351#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002352 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002353#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002354 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002355#ifdef macintosh
2356 {"load_resource", imp_load_resource, 1},
2357#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002358 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002359 {NULL, NULL} /* sentinel */
2360};
2361
Guido van Rossum1a8791e1998-08-04 22:46:29 +00002362static int
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002363setint(d, name, value)
2364 PyObject *d;
2365 char *name;
2366 int value;
2367{
2368 PyObject *v;
2369 int err;
2370
2371 v = PyInt_FromLong((long)value);
2372 err = PyDict_SetItemString(d, name, v);
2373 Py_XDECREF(v);
2374 return err;
2375}
2376
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002377void
2378initimp()
2379{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002380 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002381
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002382 m = Py_InitModule4("imp", imp_methods, doc_imp,
2383 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002384 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002385
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002386 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2387 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2388 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2389 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2390 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2391 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2392 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2393 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00002394 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002395
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002396 failure:
2397 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002398}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002399
2400
Guido van Rossumb18618d2000-05-03 23:44:39 +00002401/* API for embedding applications that want to add their own entries
2402 to the table of built-in modules. This should normally be called
2403 *before* Py_Initialize(). When the table resize fails, -1 is
2404 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002405
2406 After a similar function by Just van Rossum. */
2407
2408int
2409PyImport_ExtendInittab(newtab)
2410 struct _inittab *newtab;
2411{
2412 static struct _inittab *our_copy = NULL;
2413 struct _inittab *p;
2414 int i, n;
2415
2416 /* Count the number of entries in both tables */
2417 for (n = 0; newtab[n].name != NULL; n++)
2418 ;
2419 if (n == 0)
2420 return 0; /* Nothing to do */
2421 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2422 ;
2423
2424 /* Allocate new memory for the combined table */
Guido van Rossumb18618d2000-05-03 23:44:39 +00002425 p = our_copy;
2426 PyMem_RESIZE(p, struct _inittab, i+n+1);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002427 if (p == NULL)
2428 return -1;
2429
2430 /* Copy the tables into the new memory */
2431 if (our_copy != PyImport_Inittab)
2432 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2433 PyImport_Inittab = our_copy = p;
2434 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
2435
2436 return 0;
2437}
2438
2439/* Shorthand to add a single entry given a name and a function */
2440
2441int
2442PyImport_AppendInittab(name, initfunc)
2443 char *name;
2444 void (*initfunc)();
2445{
2446 struct _inittab newtab[2];
2447
2448 memset(newtab, '\0', sizeof newtab);
2449
2450 newtab[0].name = name;
2451 newtab[0].initfunc = initfunc;
2452
2453 return PyImport_ExtendInittab(newtab);
2454}