blob: feed81cdf9b41e44cba66e16a23cd554c8ebc05a [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/* Module definition and import implementation */
33
Guido van Rossum79f25d91997-04-29 20:08:16 +000034#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000035
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000036#include "node.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000037#include "token.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000038#include "errcode.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +000039#include "marshal.h"
40#include "compile.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000041#include "eval.h"
Guido van Rossumd8bac6d1992-02-26 15:19:13 +000042#include "osdefs.h"
Guido van Rossum1ae940a1995-01-02 19:04:15 +000043#include "importdl.h"
Jack Jansen9c96a921995-02-15 22:57:06 +000044#ifdef macintosh
45#include "macglue.h"
46#endif
Guido van Rossumc405b7b1991-06-04 19:39:42 +000047
Guido van Rossum80bb9651996-12-05 23:27:02 +000048#ifdef HAVE_UNISTD_H
49#include <unistd.h>
50#endif
51
Guido van Rossumaee0bad1997-09-05 07:33:22 +000052/* We expect that stat exists on most systems.
53 It's confirmed on Unix, Mac and Windows.
54 If you don't have it, add #define DONT_HAVE_STAT to your config.h. */
55#ifndef DONT_HAVE_STAT
56#define HAVE_STAT
57
58#include <sys/types.h>
59#include <sys/stat.h>
60
Guido van Rossum595d7ba1997-12-05 21:45:29 +000061#if defined(PYCC_VACPP)
62/* VisualAge C/C++ Failed to Define MountType Field in sys/stat.h */
63#define S_IFMT (S_IFDIR|S_IFCHR|S_IFREG)
64#endif
65
Guido van Rossumaee0bad1997-09-05 07:33:22 +000066#ifndef S_ISDIR
67#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
68#endif
69
70#endif
71
72
Guido van Rossum79f25d91997-04-29 20:08:16 +000073extern long PyOS_GetLastModificationTime(); /* In getmtime.c */
Guido van Rossum21d335e1993-10-15 13:01:11 +000074
Guido van Rossum6c849691994-09-26 15:47:17 +000075/* Magic word to reject .pyc files generated by other Python versions */
Guido van Rossum7faeab31995-07-07 22:50:36 +000076/* Change for each incompatible change */
77/* The value of CR and LF is incorporated so if you ever read or write
78 a .pyc file in text mode the magic number will be wrong; also, the
79 Apple MPW compiler swaps their values, botching string constants */
80/* XXX Perhaps the magic number should be frozen and a version field
81 added to the .pyc file header? */
Guido van Rossumdd5db431997-01-17 21:06:11 +000082/* New way to come up with the magic number: (YEAR-1995), MONTH, DAY */
Guido van Rossum99d18251997-01-24 03:44:53 +000083#define MAGIC (20121 | ((long)'\r'<<16) | ((long)'\n'<<24))
Guido van Rossum3ddee711991-12-16 13:06:34 +000084
Guido van Rossum25ce5661997-08-02 03:10:38 +000085/* See _PyImport_FixupExtension() below */
86static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000087
Guido van Rossum771c6c81997-10-31 18:37:24 +000088/* This table is defined in config.c: */
89extern struct _inittab _PyImport_Inittab[];
90
91struct _inittab *PyImport_Inittab = _PyImport_Inittab;
Guido van Rossum66f1fa81991-04-03 19:03:52 +000092
Guido van Rossum1ae940a1995-01-02 19:04:15 +000093/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000094
95void
Guido van Rossum25ce5661997-08-02 03:10:38 +000096_PyImport_Init()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000097{
Guido van Rossum0824f631997-03-11 18:37:35 +000098 if (Py_OptimizeFlag) {
99 /* Replace ".pyc" with ".pyo" in import_filetab */
100 struct filedescr *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000101 for (p = _PyImport_Filetab; p->suffix != NULL; p++) {
Guido van Rossum0824f631997-03-11 18:37:35 +0000102 if (strcmp(p->suffix, ".pyc") == 0)
103 p->suffix = ".pyo";
104 }
105 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000106}
107
Guido van Rossum25ce5661997-08-02 03:10:38 +0000108void
109_PyImport_Fini()
110{
111 Py_XDECREF(extensions);
112 extensions = NULL;
113}
114
115
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000116/* Locking primitives to prevent parallel imports of the same module
117 in different threads to return with a partially loaded module.
118 These calls are serialized by the global interpreter lock. */
119
120#ifdef WITH_THREAD
121
Guido van Rossum49b56061998-10-01 20:42:43 +0000122#include "pythread.h"
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000123
Guido van Rossum65d5b571998-12-21 19:32:43 +0000124static PyThread_type_lock import_lock = 0;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000125static long import_lock_thread = -1;
126static int import_lock_level = 0;
127
128static void
129lock_import()
130{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000131 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000132 if (me == -1)
133 return; /* Too bad */
134 if (import_lock == NULL)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000135 import_lock = PyThread_allocate_lock();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000136 if (import_lock_thread == me) {
137 import_lock_level++;
138 return;
139 }
Guido van Rossum65d5b571998-12-21 19:32:43 +0000140 if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0)) {
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000141 PyThreadState *tstate = PyEval_SaveThread();
Guido van Rossum65d5b571998-12-21 19:32:43 +0000142 PyThread_acquire_lock(import_lock, 1);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000143 PyEval_RestoreThread(tstate);
144 }
145 import_lock_thread = me;
146 import_lock_level = 1;
147}
148
149static void
150unlock_import()
151{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000152 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000153 if (me == -1)
154 return; /* Too bad */
155 if (import_lock_thread != me)
156 Py_FatalError("unlock_import: not holding the import lock");
157 import_lock_level--;
158 if (import_lock_level == 0) {
159 import_lock_thread = -1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000160 PyThread_release_lock(import_lock);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000161 }
162}
163
164#else
165
166#define lock_import()
167#define unlock_import()
168
169#endif
170
Guido van Rossum25ce5661997-08-02 03:10:38 +0000171/* Helper for sys */
172
173PyObject *
174PyImport_GetModuleDict()
175{
176 PyInterpreterState *interp = PyThreadState_Get()->interp;
177 if (interp->modules == NULL)
178 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
179 return interp->modules;
180}
181
Guido van Rossum3f5da241990-12-20 15:06:42 +0000182
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000183/* List of names to clear in sys */
184static char* sys_deletes[] = {
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000185 "path", "argv", "ps1", "ps2", "exitfunc",
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000186 "exc_type", "exc_value", "exc_traceback",
187 "last_type", "last_value", "last_traceback",
188 NULL
189};
190
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000191static char* sys_files[] = {
192 "stdin", "__stdin__",
193 "stdout", "__stdout__",
194 "stderr", "__stderr__",
195 NULL
196};
197
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000198
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000199/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000200
Guido van Rossum3f5da241990-12-20 15:06:42 +0000201void
Guido van Rossum79f25d91997-04-29 20:08:16 +0000202PyImport_Cleanup()
Guido van Rossum3f5da241990-12-20 15:06:42 +0000203{
Guido van Rossum758eec01998-01-19 21:58:26 +0000204 int pos, ndone;
205 char *name;
206 PyObject *key, *value, *dict;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000207 PyInterpreterState *interp = PyThreadState_Get()->interp;
Guido van Rossum758eec01998-01-19 21:58:26 +0000208 PyObject *modules = interp->modules;
209
210 if (modules == NULL)
211 return; /* Already done */
212
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000213 /* Delete some special variables first. These are common
214 places where user values hide and people complain when their
215 destructors fail. Since the modules containing them are
216 deleted *last* of all, they would come too late in the normal
217 destruction order. Sigh. */
218
219 value = PyDict_GetItemString(modules, "__builtin__");
220 if (value != NULL && PyModule_Check(value)) {
221 dict = PyModule_GetDict(value);
222 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000223 PySys_WriteStderr("# clear __builtin__._\n");
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000224 PyDict_SetItemString(dict, "_", Py_None);
225 }
226 value = PyDict_GetItemString(modules, "sys");
227 if (value != NULL && PyModule_Check(value)) {
228 char **p;
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000229 PyObject *v;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000230 dict = PyModule_GetDict(value);
231 for (p = sys_deletes; *p != NULL; p++) {
232 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000233 PySys_WriteStderr("# clear sys.%s\n", *p);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000234 PyDict_SetItemString(dict, *p, Py_None);
235 }
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000236 for (p = sys_files; *p != NULL; p+=2) {
237 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000238 PySys_WriteStderr("# restore sys.%s\n", *p);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000239 v = PyDict_GetItemString(dict, *(p+1));
240 if (v == NULL)
241 v = Py_None;
242 PyDict_SetItemString(dict, *p, v);
243 }
244 }
245
246 /* First, delete __main__ */
247 value = PyDict_GetItemString(modules, "__main__");
248 if (value != NULL && PyModule_Check(value)) {
249 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000250 PySys_WriteStderr("# cleanup __main__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000251 _PyModule_Clear(value);
252 PyDict_SetItemString(modules, "__main__", Py_None);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000253 }
254
Guido van Rossum758eec01998-01-19 21:58:26 +0000255 /* The special treatment of __builtin__ here is because even
256 when it's not referenced as a module, its dictionary is
257 referenced by almost every module's __builtins__. Since
258 deleting a module clears its dictionary (even if there are
259 references left to it), we need to delete the __builtin__
260 module last. Likewise, we don't delete sys until the very
261 end because it is implicitly referenced (e.g. by print).
262
263 Also note that we 'delete' modules by replacing their entry
264 in the modules dict with None, rather than really deleting
265 them; this avoids a rehash of the modules dictionary and
266 also marks them as "non existent" so they won't be
267 re-imported. */
268
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000269 /* Next, repeatedly delete modules with a reference count of
Guido van Rossum758eec01998-01-19 21:58:26 +0000270 one (skipping __builtin__ and sys) and delete them */
271 do {
272 ndone = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000273 pos = 0;
Guido van Rossum758eec01998-01-19 21:58:26 +0000274 while (PyDict_Next(modules, &pos, &key, &value)) {
275 if (value->ob_refcnt != 1)
276 continue;
Guido van Rossum566373e1998-10-01 15:24:50 +0000277 if (PyString_Check(key) && PyModule_Check(value)) {
278 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000279 if (strcmp(name, "__builtin__") == 0)
280 continue;
281 if (strcmp(name, "sys") == 0)
282 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000283 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000284 PySys_WriteStderr(
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000285 "# cleanup[1] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000286 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000287 PyDict_SetItem(modules, key, Py_None);
288 ndone++;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000289 }
290 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000291 } while (ndone > 0);
292
Guido van Rossum758eec01998-01-19 21:58:26 +0000293 /* Next, delete all modules (still skipping __builtin__ and sys) */
294 pos = 0;
295 while (PyDict_Next(modules, &pos, &key, &value)) {
Guido van Rossum566373e1998-10-01 15:24:50 +0000296 if (PyString_Check(key) && PyModule_Check(value)) {
297 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000298 if (strcmp(name, "__builtin__") == 0)
299 continue;
300 if (strcmp(name, "sys") == 0)
301 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000302 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000303 PySys_WriteStderr("# cleanup[2] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000304 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000305 PyDict_SetItem(modules, key, Py_None);
306 }
307 }
308
309 /* Next, delete sys and __builtin__ (in that order) */
310 value = PyDict_GetItemString(modules, "sys");
311 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000312 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000313 PySys_WriteStderr("# cleanup sys\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000314 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000315 PyDict_SetItemString(modules, "sys", Py_None);
316 }
317 value = PyDict_GetItemString(modules, "__builtin__");
318 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000319 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000320 PySys_WriteStderr("# cleanup __builtin__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000321 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000322 PyDict_SetItemString(modules, "__builtin__", Py_None);
323 }
324
325 /* Finally, clear and delete the modules directory */
326 PyDict_Clear(modules);
327 interp->modules = NULL;
328 Py_DECREF(modules);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000329}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000330
331
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000332/* Helper for pythonrun.c -- return magic number */
333
334long
Guido van Rossum79f25d91997-04-29 20:08:16 +0000335PyImport_GetMagicNumber()
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000336{
337 return MAGIC;
338}
339
340
Guido van Rossum25ce5661997-08-02 03:10:38 +0000341/* Magic for extension modules (built-in as well as dynamically
342 loaded). To prevent initializing an extension module more than
343 once, we keep a static dictionary 'extensions' keyed by module name
344 (for built-in modules) or by filename (for dynamically loaded
345 modules), containing these modules. A copy od the module's
346 dictionary is stored by calling _PyImport_FixupExtension()
347 immediately after the module initialization function succeeds. A
348 copy can be retrieved from there by calling
349 _PyImport_FindExtension(). */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000350
Guido van Rossum79f25d91997-04-29 20:08:16 +0000351PyObject *
Guido van Rossum25ce5661997-08-02 03:10:38 +0000352_PyImport_FixupExtension(name, filename)
353 char *name;
354 char *filename;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000355{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000356 PyObject *modules, *mod, *dict, *copy;
357 if (extensions == NULL) {
358 extensions = PyDict_New();
359 if (extensions == NULL)
360 return NULL;
361 }
362 modules = PyImport_GetModuleDict();
363 mod = PyDict_GetItemString(modules, name);
364 if (mod == NULL || !PyModule_Check(mod)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000365 PyErr_Format(PyExc_SystemError,
366 "_PyImport_FixupExtension: module %.200s not loaded", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000367 return NULL;
368 }
369 dict = PyModule_GetDict(mod);
370 if (dict == NULL)
371 return NULL;
372 copy = PyObject_CallMethod(dict, "copy", "");
373 if (copy == NULL)
374 return NULL;
375 PyDict_SetItemString(extensions, filename, copy);
376 Py_DECREF(copy);
377 return copy;
378}
379
380PyObject *
381_PyImport_FindExtension(name, filename)
382 char *name;
383 char *filename;
384{
385 PyObject *dict, *mod, *mdict, *result;
386 if (extensions == NULL)
387 return NULL;
388 dict = PyDict_GetItemString(extensions, filename);
389 if (dict == NULL)
390 return NULL;
391 mod = PyImport_AddModule(name);
392 if (mod == NULL)
393 return NULL;
394 mdict = PyModule_GetDict(mod);
395 if (mdict == NULL)
396 return NULL;
397 result = PyObject_CallMethod(mdict, "update", "O", dict);
398 if (result == NULL)
399 return NULL;
400 Py_DECREF(result);
401 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000402 PySys_WriteStderr("import %s # previously loaded (%s)\n",
Guido van Rossum25ce5661997-08-02 03:10:38 +0000403 name, filename);
404 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000405}
406
407
408/* Get the module object corresponding to a module name.
409 First check the modules dictionary if there's one there,
410 if not, create a new one and insert in in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000411 Because the former action is most common, THIS DOES NOT RETURN A
412 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000413
Guido van Rossum79f25d91997-04-29 20:08:16 +0000414PyObject *
415PyImport_AddModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000416 char *name;
417{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000418 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000419 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000420
Guido van Rossum25ce5661997-08-02 03:10:38 +0000421 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
Guido van Rossum79f25d91997-04-29 20:08:16 +0000422 PyModule_Check(m))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000423 return m;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000424 m = PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000425 if (m == NULL)
426 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000427 if (PyDict_SetItemString(modules, name, m) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000428 Py_DECREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000429 return NULL;
430 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000431 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000432
433 return m;
434}
435
436
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000437/* Execute a code object in a module and return the module object
438 WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000439
Guido van Rossum79f25d91997-04-29 20:08:16 +0000440PyObject *
441PyImport_ExecCodeModule(name, co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000442 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000443 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000444{
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000445 return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
446}
447
448PyObject *
449PyImport_ExecCodeModuleEx(name, co, pathname)
450 char *name;
451 PyObject *co;
452 char *pathname;
453{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000454 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000455 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000456
Guido van Rossum79f25d91997-04-29 20:08:16 +0000457 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000458 if (m == NULL)
459 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000460 d = PyModule_GetDict(m);
461 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
462 if (PyDict_SetItemString(d, "__builtins__",
463 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000464 return NULL;
465 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000466 /* Remember the filename as the __file__ attribute */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000467 v = NULL;
468 if (pathname != NULL) {
469 v = PyString_FromString(pathname);
470 if (v == NULL)
471 PyErr_Clear();
472 }
473 if (v == NULL) {
474 v = ((PyCodeObject *)co)->co_filename;
475 Py_INCREF(v);
476 }
477 if (PyDict_SetItemString(d, "__file__", v) != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000478 PyErr_Clear(); /* Not important enough to report */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000479 Py_DECREF(v);
480
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000481 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000482 if (v == NULL)
483 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000484 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000485
Guido van Rossum25ce5661997-08-02 03:10:38 +0000486 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000487 PyErr_Format(PyExc_ImportError,
488 "Loaded module %.200s not found in sys.modules",
489 name);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000490 return NULL;
491 }
492
Guido van Rossum79f25d91997-04-29 20:08:16 +0000493 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000494
495 return m;
496}
497
498
499/* Given a pathname for a Python source file, fill a buffer with the
500 pathname for the corresponding compiled file. Return the pathname
501 for the compiled file, or NULL if there's no space in the buffer.
502 Doesn't set an exception. */
503
504static char *
505make_compiled_pathname(pathname, buf, buflen)
506 char *pathname;
507 char *buf;
508 int buflen;
509{
510 int len;
511
512 len = strlen(pathname);
513 if (len+2 > buflen)
514 return NULL;
515 strcpy(buf, pathname);
Guido van Rossum0824f631997-03-11 18:37:35 +0000516 strcpy(buf+len, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000517
518 return buf;
519}
520
521
522/* Given a pathname for a Python source file, its time of last
523 modification, and a pathname for a compiled file, check whether the
524 compiled file represents the same version of the source. If so,
525 return a FILE pointer for the compiled file, positioned just after
526 the header; if not, return NULL.
527 Doesn't set an exception. */
528
529static FILE *
530check_compiled_module(pathname, mtime, cpathname)
531 char *pathname;
532 long mtime;
533 char *cpathname;
534{
535 FILE *fp;
536 long magic;
537 long pyc_mtime;
538
539 fp = fopen(cpathname, "rb");
540 if (fp == NULL)
541 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000542 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000543 if (magic != MAGIC) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000544 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000545 PySys_WriteStderr("# %s has bad magic\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000546 fclose(fp);
547 return NULL;
548 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000549 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000550 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000551 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000552 PySys_WriteStderr("# %s has bad mtime\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000553 fclose(fp);
554 return NULL;
555 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000556 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000557 PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000558 return fp;
559}
560
561
562/* Read a code object from a file and check it for validity */
563
Guido van Rossum79f25d91997-04-29 20:08:16 +0000564static PyCodeObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000565read_compiled_module(cpathname, fp)
566 char *cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000567 FILE *fp;
568{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000569 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000570
Guido van Rossum79f25d91997-04-29 20:08:16 +0000571 co = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000572 /* Ugly: rd_object() may return NULL with or without error */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000573 if (co == NULL || !PyCode_Check(co)) {
574 if (!PyErr_Occurred())
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000575 PyErr_Format(PyExc_ImportError,
576 "Non-code object in %.200s", cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000577 Py_XDECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000578 return NULL;
579 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000580 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000581}
582
583
584/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000585 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000586
Guido van Rossum79f25d91997-04-29 20:08:16 +0000587static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000588load_compiled_module(name, cpathname, fp)
589 char *name;
590 char *cpathname;
591 FILE *fp;
592{
593 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000594 PyCodeObject *co;
595 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000596
Guido van Rossum79f25d91997-04-29 20:08:16 +0000597 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000598 if (magic != MAGIC) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000599 PyErr_Format(PyExc_ImportError,
600 "Bad magic number in %.200s", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000601 return NULL;
602 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000603 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000604 co = read_compiled_module(cpathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000605 if (co == NULL)
606 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000607 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000608 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000609 name, cpathname);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000610 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000611 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000612
613 return m;
614}
615
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000616/* Parse a source file and return the corresponding code object */
617
Guido van Rossum79f25d91997-04-29 20:08:16 +0000618static PyCodeObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000619parse_source_module(pathname, fp)
620 char *pathname;
621 FILE *fp;
622{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000623 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000624 node *n;
625
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000626 n = PyParser_SimpleParseFile(fp, pathname, Py_file_input);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000627 if (n == NULL)
628 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000629 co = PyNode_Compile(n, pathname);
630 PyNode_Free(n);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000631
632 return co;
633}
634
635
636/* Write a compiled module to a file, placing the time of last
637 modification of its source into the header.
638 Errors are ignored, if a write error occurs an attempt is made to
639 remove the file. */
640
641static void
642write_compiled_module(co, cpathname, mtime)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000643 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000644 char *cpathname;
645 long mtime;
646{
647 FILE *fp;
648
649 fp = fopen(cpathname, "wb");
650 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000651 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000652 PySys_WriteStderr(
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000653 "# can't create %s\n", cpathname);
654 return;
655 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000656 PyMarshal_WriteLongToFile(MAGIC, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000657 /* First write a 0 for mtime */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000658 PyMarshal_WriteLongToFile(0L, fp);
659 PyMarshal_WriteObjectToFile((PyObject *)co, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000660 if (ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000661 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000662 PySys_WriteStderr("# can't write %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000663 /* Don't keep partial file */
664 fclose(fp);
665 (void) unlink(cpathname);
666 return;
667 }
668 /* Now write the true mtime */
669 fseek(fp, 4L, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000670 PyMarshal_WriteLongToFile(mtime, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000671 fflush(fp);
672 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000673 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000674 PySys_WriteStderr("# wrote %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000675#ifdef macintosh
Guido van Rossumbe1a6e21996-02-21 15:29:20 +0000676 setfiletype(cpathname, 'Pyth', 'PYC ');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000677#endif
678}
679
680
681/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000682 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
683 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000684
Guido van Rossum79f25d91997-04-29 20:08:16 +0000685static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000686load_source_module(name, pathname, fp)
687 char *name;
688 char *pathname;
689 FILE *fp;
690{
691 long mtime;
692 FILE *fpc;
693 char buf[MAXPATHLEN+1];
694 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000695 PyCodeObject *co;
696 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000697
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000698 mtime = PyOS_GetLastModificationTime(pathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000699 cpathname = make_compiled_pathname(pathname, buf, MAXPATHLEN+1);
700 if (cpathname != NULL &&
701 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000702 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000703 fclose(fpc);
704 if (co == NULL)
705 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000706 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000707 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000708 name, cpathname);
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000709 pathname = cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000710 }
711 else {
712 co = parse_source_module(pathname, fp);
713 if (co == NULL)
714 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000715 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000716 PySys_WriteStderr("import %s # from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000717 name, pathname);
718 write_compiled_module(co, cpathname, mtime);
719 }
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000720 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000721 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000722
723 return m;
724}
725
726
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000727/* Forward */
728static PyObject *load_module Py_PROTO((char *, FILE *, char *, int));
729static struct filedescr *find_module Py_PROTO((char *, PyObject *,
730 char *, int, FILE **));
Guido van Rossuma86f77d1997-09-09 18:53:47 +0000731static struct _frozen *find_frozen Py_PROTO((char *name));
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000732
733/* Load a package and return its module object WITH INCREMENTED
734 REFERENCE COUNT */
735
736static PyObject *
737load_package(name, pathname)
738 char *name;
739 char *pathname;
740{
741 PyObject *m, *d, *file, *path;
742 int err;
743 char buf[MAXPATHLEN+1];
744 FILE *fp = NULL;
745 struct filedescr *fdp;
746
747 m = PyImport_AddModule(name);
748 if (m == NULL)
749 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000750 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000751 PySys_WriteStderr("import %s # directory %s\n",
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000752 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000753 d = PyModule_GetDict(m);
754 file = PyString_FromString(pathname);
755 if (file == NULL)
756 return NULL;
757 path = Py_BuildValue("[O]", file);
758 if (path == NULL) {
759 Py_DECREF(file);
760 return NULL;
761 }
762 err = PyDict_SetItemString(d, "__file__", file);
763 if (err == 0)
764 err = PyDict_SetItemString(d, "__path__", path);
765 if (err != 0) {
766 m = NULL;
767 goto cleanup;
768 }
769 buf[0] = '\0';
770 fdp = find_module("__init__", path, buf, sizeof(buf), &fp);
771 if (fdp == NULL) {
772 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
773 PyErr_Clear();
774 }
775 else
776 m = NULL;
777 goto cleanup;
778 }
779 m = load_module(name, fp, buf, fdp->type);
780 if (fp != NULL)
781 fclose(fp);
782 cleanup:
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000783 Py_XDECREF(path);
784 Py_XDECREF(file);
785 return m;
786}
787
788
789/* Helper to test for built-in module */
790
791static int
792is_builtin(name)
793 char *name;
794{
795 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +0000796 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
797 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
798 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000799 return -1;
800 else
801 return 1;
802 }
803 }
804 return 0;
805}
806
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000807
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000808/* Search the path (default sys.path) for a module. Return the
809 corresponding filedescr struct, and (via return arguments) the
810 pathname and an open file. Return NULL if the module is not found. */
811
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000812#ifdef MS_COREDLL
813extern FILE *PyWin_FindRegisteredModule();
814#endif
815
Guido van Rossum0980bd91998-02-13 17:18:36 +0000816#ifdef CHECK_IMPORT_CASE
817static int check_case(char *, int, int, char *);
818#endif
819
Guido van Rossum197346f1997-10-31 18:38:52 +0000820static int find_init_module Py_PROTO((char *)); /* Forward */
821
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000822static struct filedescr *
Guido van Rossum0506a431998-08-11 15:07:39 +0000823find_module(realname, path, buf, buflen, p_fp)
824 char *realname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000825 PyObject *path;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000826 /* Output parameters: */
827 char *buf;
828 int buflen;
829 FILE **p_fp;
830{
831 int i, npath, len, namelen;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000832 struct _frozen *f;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000833 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000834 FILE *fp = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000835 struct stat statbuf;
Guido van Rossuma5568d31998-03-05 03:45:08 +0000836 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
837 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
838 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossum0506a431998-08-11 15:07:39 +0000839 char name[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000840
Guido van Rossum0506a431998-08-11 15:07:39 +0000841 strcpy(name, realname);
842
843 if (path != NULL && PyString_Check(path)) {
844 /* Submodule of "frozen" package:
845 Set name to the fullname, path to NULL
846 and continue as "usual" */
847 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
848 PyErr_SetString(PyExc_ImportError,
849 "full frozen module name too long");
850 return NULL;
851 }
852 strcpy(buf, PyString_AsString(path));
853 strcat(buf, ".");
854 strcat(buf, name);
855 strcpy(name, buf);
856 path = NULL;
857 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000858 if (path == NULL) {
859 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000860 strcpy(buf, name);
861 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000862 }
Guido van Rossuma5568d31998-03-05 03:45:08 +0000863 if ((f = find_frozen(name)) != NULL) {
864 strcpy(buf, name);
865 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000866 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000867
Guido van Rossumac279101996-08-22 23:10:58 +0000868#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000869 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
870 if (fp != NULL) {
871 *p_fp = fp;
872 return fdp;
873 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000874#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000875 path = PySys_GetObject("path");
876 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000877 if (path == NULL || !PyList_Check(path)) {
878 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +0000879 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000880 return NULL;
881 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000882 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000883 namelen = strlen(name);
884 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000885 PyObject *v = PyList_GetItem(path, i);
886 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000887 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000888 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000889 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000890 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000891 strcpy(buf, PyString_AsString(v));
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000892 if ((int)strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000893 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000894#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000895#ifdef INTERN_STRINGS
896 /*
897 ** Speedup: each sys.path item is interned, and
898 ** FindResourceModule remembers which items refer to
899 ** folders (so we don't have to bother trying to look
900 ** into them for resources).
901 */
902 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
903 v = PyList_GET_ITEM(path, i);
904#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000905 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000906 static struct filedescr resfiledescr =
907 {"", "", PY_RESOURCE};
Jack Jansen9c96a921995-02-15 22:57:06 +0000908
909 return &resfiledescr;
910 }
Guido van Rossum0f84a341998-08-06 13:36:01 +0000911 if (PyMac_FindCodeResourceModule((PyStringObject *)v, name, buf)) {
912 static struct filedescr resfiledescr =
913 {"", "", PY_CODERESOURCE};
914
915 return &resfiledescr;
916 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000917#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000918 if (len > 0 && buf[len-1] != SEP
919#ifdef ALTSEP
920 && buf[len-1] != ALTSEP
921#endif
922 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000923 buf[len++] = SEP;
Guido van Rossum40f470f1996-05-23 22:51:04 +0000924#ifdef IMPORT_8x3_NAMES
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000925 /* see if we are searching in directory dos-8x3 */
926 if (len > 7 && !strncmp(buf + len - 8, "dos-8x3", 7)){
Guido van Rossum40f470f1996-05-23 22:51:04 +0000927 int j;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000928 char ch; /* limit name to 8 lower-case characters */
Guido van Rossum40f470f1996-05-23 22:51:04 +0000929 for (j = 0; (ch = name[j]) && j < 8; j++)
930 if (isupper(ch))
931 buf[len++] = tolower(ch);
932 else
933 buf[len++] = ch;
934 }
Guido van Rossume8c27bb1997-12-17 18:57:16 +0000935 else /* Not in dos-8x3, use the full name */
Guido van Rossum6f489d91996-06-28 20:15:15 +0000936#endif
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000937 {
Guido van Rossum40f470f1996-05-23 22:51:04 +0000938 strcpy(buf+len, name);
939 len += namelen;
940 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000941#ifdef HAVE_STAT
942 if (stat(buf, &statbuf) == 0) {
Guido van Rossum197346f1997-10-31 18:38:52 +0000943 if (S_ISDIR(statbuf.st_mode)) {
Guido van Rossum0980bd91998-02-13 17:18:36 +0000944 if (find_init_module(buf)) {
945#ifdef CHECK_IMPORT_CASE
946 if (!check_case(buf, len, namelen,
947 name))
948 return NULL;
949#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000950 return &fd_package;
Guido van Rossum0980bd91998-02-13 17:18:36 +0000951 }
Guido van Rossum197346f1997-10-31 18:38:52 +0000952 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000953 }
954#else
955 /* XXX How are you going to test for directories? */
956#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000957#ifdef macintosh
958 fdp = PyMac_FindModuleExtension(buf, &len, name);
959 if (fdp)
960 fp = fopen(buf, fdp->mode);
961#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000962 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000963 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000964 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000965 PySys_WriteStderr("# trying %s\n", buf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000966 fp = fopen(buf, fdp->mode);
967 if (fp != NULL)
968 break;
969 }
Guido van Rossum741689d1997-08-12 14:53:39 +0000970#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000971 if (fp != NULL)
972 break;
973 }
974 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000975 PyErr_Format(PyExc_ImportError,
976 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000977 return NULL;
978 }
Guido van Rossum0980bd91998-02-13 17:18:36 +0000979#ifdef CHECK_IMPORT_CASE
980 if (!check_case(buf, len, namelen, name)) {
981 fclose(fp);
982 return NULL;
983 }
984#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000985
986 *p_fp = fp;
987 return fdp;
988}
989
Guido van Rossum0980bd91998-02-13 17:18:36 +0000990#ifdef CHECK_IMPORT_CASE
991
992#ifdef MS_WIN32
993#include <windows.h>
Guido van Rossum323bf5e1998-06-24 03:54:06 +0000994#include <ctype.h>
995
996static int
997allcaps8x3(s)
998 char *s;
999{
1000 /* Return 1 if s is an 8.3 filename in ALLCAPS */
1001 char c;
1002 char *dot = strchr(s, '.');
1003 char *end = strchr(s, '\0');
1004 if (dot != NULL) {
1005 if (dot-s > 8)
1006 return 1; /* More than 8 before '.' */
1007 if (end-dot > 4)
1008 return 1; /* More than 3 after '.' */
1009 end = strchr(dot+1, '.');
1010 if (end != NULL)
1011 return 1; /* More than one dot */
1012 }
1013 else if (end-s > 8)
1014 return 1; /* More than 8 and no dot */
1015 while ((c = *s++)) {
1016 if (islower(c))
1017 return 0;
1018 }
1019 return 1;
1020}
1021
Guido van Rossum0980bd91998-02-13 17:18:36 +00001022static int
1023check_case(char *buf, int len, int namelen, char *name)
1024{
1025 WIN32_FIND_DATA data;
1026 HANDLE h;
1027 if (getenv("PYTHONCASEOK") != NULL)
1028 return 1;
1029 h = FindFirstFile(buf, &data);
1030 if (h == INVALID_HANDLE_VALUE) {
1031 PyErr_Format(PyExc_NameError,
1032 "Can't find file for module %.100s\n(filename %.300s)",
1033 name, buf);
1034 return 0;
1035 }
1036 FindClose(h);
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001037 if (allcaps8x3(data.cFileName)) {
1038 /* Skip the test if the filename is ALL.CAPS. This can
1039 happen in certain circumstances beyond our control,
1040 e.g. when software is installed under NT on a FAT
1041 filesystem and then the same FAT filesystem is used
1042 under Windows 95. */
1043 return 1;
1044 }
Guido van Rossum0980bd91998-02-13 17:18:36 +00001045 if (strncmp(data.cFileName, name, namelen) != 0) {
1046 strcpy(buf+len-namelen, data.cFileName);
1047 PyErr_Format(PyExc_NameError,
1048 "Case mismatch for module name %.100s\n(filename %.300s)",
1049 name, buf);
1050 return 0;
1051 }
1052 return 1;
1053}
1054#endif /* MS_WIN32 */
1055
1056#ifdef macintosh
1057#include <TextUtils.h>
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001058#ifdef USE_GUSI
1059#include "TFileSpec.h" /* for Path2FSSpec() */
1060#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001061static int
1062check_case(char *buf, int len, int namelen, char *name)
1063{
1064 FSSpec fss;
1065 OSErr err;
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001066#ifndef USE_GUSI
1067 err = FSMakeFSSpec(0, 0, Pstring(buf), &fss);
1068#else
1069 /* GUSI's Path2FSSpec() resolves all possible aliases nicely on
1070 the way, which is fine for all directories, but here we need
1071 the original name of the alias file (say, Dlg.ppc.slb, not
1072 toolboxmodules.ppc.slb). */
1073 char *colon;
1074 err = Path2FSSpec(buf, &fss);
1075 if (err == noErr) {
1076 colon = strrchr(buf, ':'); /* find filename */
1077 if (colon != NULL)
1078 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1079 Pstring(colon+1), &fss);
1080 else
1081 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
1082 fss.name, &fss);
1083 }
1084#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001085 if (err) {
1086 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001087 "Can't find file for module %.100s\n(filename %.300s)",
1088 name, buf);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001089 return 0;
1090 }
1091 p2cstr(fss.name);
1092 if ( strncmp(name, (char *)fss.name, namelen) != 0 ) {
1093 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001094 "Case mismatch for module name %.100s\n(filename %.300s)",
1095 name, fss.name);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001096 return 0;
1097 }
1098 return 1;
1099}
1100#endif /* macintosh */
1101
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001102#ifdef DJGPP
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001103#include <dir.h>
1104
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001105static int
1106check_case(char *buf, int len, int namelen, char *name)
1107{
1108 struct ffblk ffblk;
1109 int done;
1110
1111 if (getenv("PYTHONCASEOK") != NULL)
1112 return 1;
Guido van Rossumaeca79b1998-02-18 16:21:00 +00001113 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001114 if (done) {
1115 PyErr_Format(PyExc_NameError,
1116 "Can't find file for module %.100s\n(filename %.300s)",
1117 name, buf);
1118 return 0;
1119 }
1120
1121 if (strncmp(ffblk.ff_name, name, namelen) != 0) {
1122 strcpy(buf+len-namelen, ffblk.ff_name);
1123 PyErr_Format(PyExc_NameError,
1124 "Case mismatch for module name %.100s\n(filename %.300s)",
1125 name, buf);
1126 return 0;
1127 }
1128 return 1;
1129}
1130#endif
1131
Guido van Rossum8766a771998-04-10 23:44:32 +00001132#endif /* CHECK_IMPORT_CASE */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001133
Guido van Rossum197346f1997-10-31 18:38:52 +00001134#ifdef HAVE_STAT
1135/* Helper to look for __init__.py or __init__.py[co] in potential package */
1136static int
1137find_init_module(buf)
1138 char *buf;
1139{
1140 int save_len = strlen(buf);
1141 int i = save_len;
1142 struct stat statbuf;
1143
1144 if (save_len + 13 >= MAXPATHLEN)
1145 return 0;
1146 buf[i++] = SEP;
1147 strcpy(buf+i, "__init__.py");
1148 if (stat(buf, &statbuf) == 0) {
1149 buf[save_len] = '\0';
1150 return 1;
1151 }
1152 i += strlen(buf+i);
1153 if (Py_OptimizeFlag)
1154 strcpy(buf+i, "o");
1155 else
1156 strcpy(buf+i, "c");
1157 if (stat(buf, &statbuf) == 0) {
1158 buf[save_len] = '\0';
1159 return 1;
1160 }
1161 buf[save_len] = '\0';
1162 return 0;
1163}
1164#endif /* HAVE_STAT */
1165
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001166
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001167static int init_builtin Py_PROTO((char *)); /* Forward */
1168
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001169/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001170 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001171
Guido van Rossum79f25d91997-04-29 20:08:16 +00001172static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001173load_module(name, fp, buf, type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001174 char *name;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001175 FILE *fp;
1176 char *buf;
1177 int type;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001178{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001179 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001180 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001181 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001182
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001183 /* First check that there's an open file (if we need one) */
1184 switch (type) {
1185 case PY_SOURCE:
1186 case PY_COMPILED:
1187 if (fp == NULL) {
1188 PyErr_Format(PyExc_ValueError,
1189 "file object required for import (type code %d)",
1190 type);
1191 return NULL;
1192 }
1193 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001194
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001195 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001196
1197 case PY_SOURCE:
1198 m = load_source_module(name, buf, fp);
1199 break;
1200
1201 case PY_COMPILED:
1202 m = load_compiled_module(name, buf, fp);
1203 break;
1204
1205 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001206 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001207 break;
1208
Jack Jansen9c96a921995-02-15 22:57:06 +00001209#ifdef macintosh
1210 case PY_RESOURCE:
1211 m = PyMac_LoadResourceModule(name, buf);
1212 break;
Guido van Rossum0f84a341998-08-06 13:36:01 +00001213 case PY_CODERESOURCE:
1214 m = PyMac_LoadCodeResourceModule(name, buf);
1215 break;
Jack Jansen9c96a921995-02-15 22:57:06 +00001216#endif
1217
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001218 case PKG_DIRECTORY:
1219 m = load_package(name, buf);
1220 break;
1221
1222 case C_BUILTIN:
1223 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001224 if (buf != NULL && buf[0] != '\0')
1225 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001226 if (type == C_BUILTIN)
1227 err = init_builtin(name);
1228 else
1229 err = PyImport_ImportFrozenModule(name);
1230 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001231 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001232 if (err == 0) {
1233 PyErr_Format(PyExc_ImportError,
1234 "Purported %s module %.200s not found",
1235 type == C_BUILTIN ?
1236 "builtin" : "frozen",
1237 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001238 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001239 }
1240 modules = PyImport_GetModuleDict();
1241 m = PyDict_GetItemString(modules, name);
1242 if (m == NULL) {
1243 PyErr_Format(
1244 PyExc_ImportError,
1245 "%s module %.200s not properly initialized",
1246 type == C_BUILTIN ?
1247 "builtin" : "frozen",
1248 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001249 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001250 }
1251 Py_INCREF(m);
1252 break;
1253
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001254 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001255 PyErr_Format(PyExc_ImportError,
1256 "Don't know how to import %.200s (type code %d)",
1257 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001258 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001259
1260 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001261
1262 return m;
1263}
1264
1265
1266/* Initialize a built-in module.
1267 Return 1 for succes, 0 if the module is not found, and -1 with
1268 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001269
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001270static int
1271init_builtin(name)
1272 char *name;
1273{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001274 struct _inittab *p;
1275 PyObject *mod;
1276
1277 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
1278 return 1;
1279
Guido van Rossum771c6c81997-10-31 18:37:24 +00001280 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001281 if (strcmp(name, p->name) == 0) {
1282 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001283 PyErr_Format(PyExc_ImportError,
1284 "Cannot re-init internal module %.200s",
1285 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001286 return -1;
1287 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001288 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001289 PySys_WriteStderr("import %s # builtin\n", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001290 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001291 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001292 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001293 if (_PyImport_FixupExtension(name, name) == NULL)
1294 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001295 return 1;
1296 }
1297 }
1298 return 0;
1299}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001300
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001301
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001302/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001303
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001304static struct _frozen *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001305find_frozen(name)
1306 char *name;
1307{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001308 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001309
Guido van Rossum79f25d91997-04-29 20:08:16 +00001310 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001311 if (p->name == NULL)
1312 return NULL;
1313 if (strcmp(p->name, name) == 0)
1314 break;
1315 }
1316 return p;
1317}
1318
Guido van Rossum79f25d91997-04-29 20:08:16 +00001319static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001320get_frozen_object(name)
1321 char *name;
1322{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001323 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001324 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001325
1326 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001327 PyErr_Format(PyExc_ImportError,
1328 "No such frozen object named %.200s",
1329 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001330 return NULL;
1331 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001332 size = p->size;
1333 if (size < 0)
1334 size = -size;
1335 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001336}
1337
1338/* Initialize a frozen module.
1339 Return 1 for succes, 0 if the module is not found, and -1 with
1340 an exception set if the initialization failed.
1341 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001342
1343int
Guido van Rossum79f25d91997-04-29 20:08:16 +00001344PyImport_ImportFrozenModule(name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001345 char *name;
1346{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001347 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001348 PyObject *co;
1349 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001350 int ispackage;
1351 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001352
1353 if (p == NULL)
1354 return 0;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001355 size = p->size;
1356 ispackage = (size < 0);
1357 if (ispackage)
1358 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001359 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001360 PySys_WriteStderr("import %s # frozen%s\n",
Guido van Rossuma5568d31998-03-05 03:45:08 +00001361 name, ispackage ? " package" : "");
1362 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001363 if (co == NULL)
1364 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001365 if (!PyCode_Check(co)) {
1366 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001367 PyErr_Format(PyExc_TypeError,
1368 "frozen object %.200s is not a code object",
1369 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001370 return -1;
1371 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001372 if (ispackage) {
1373 /* Set __path__ to the package name */
1374 PyObject *d, *s;
1375 int err;
1376 m = PyImport_AddModule(name);
1377 if (m == NULL)
1378 return -1;
1379 d = PyModule_GetDict(m);
1380 s = PyString_InternFromString(name);
1381 if (s == NULL)
1382 return -1;
1383 err = PyDict_SetItemString(d, "__path__", s);
1384 Py_DECREF(s);
1385 if (err != 0)
1386 return err;
1387 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001388 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001389 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001390 if (m == NULL)
1391 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001392 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001393 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001394}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001395
1396
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001397/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001398 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001399
Guido van Rossum79f25d91997-04-29 20:08:16 +00001400PyObject *
1401PyImport_ImportModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001402 char *name;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001403{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001404 static PyObject *fromlist = NULL;
1405 if (fromlist == NULL && strchr(name, '.') != NULL) {
1406 fromlist = Py_BuildValue("[s]", "*");
1407 if (fromlist == NULL)
1408 return NULL;
1409 }
1410 return PyImport_ImportModuleEx(name, NULL, NULL, fromlist);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001411}
1412
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001413/* Forward declarations for helper routines */
1414static PyObject *get_parent Py_PROTO((PyObject *globals,
1415 char *buf, int *p_buflen));
1416static PyObject *load_next Py_PROTO((PyObject *mod, PyObject *altmod,
1417 char **p_name, char *buf, int *p_buflen));
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001418static int mark_miss Py_PROTO((char *name));
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001419static int ensure_fromlist Py_PROTO((PyObject *mod, PyObject *fromlist,
Guido van Rossum9905ef91997-09-08 16:07:11 +00001420 char *buf, int buflen, int recursive));
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001421static PyObject * import_submodule Py_PROTO((PyObject *mod,
1422 char *name, char *fullname));
1423
1424/* The Magnum Opus of dotted-name import :-) */
1425
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001426static PyObject *
1427import_module_ex(name, globals, locals, fromlist)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001428 char *name;
1429 PyObject *globals;
1430 PyObject *locals;
1431 PyObject *fromlist;
1432{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001433 char buf[MAXPATHLEN+1];
1434 int buflen = 0;
1435 PyObject *parent, *head, *next, *tail;
1436
1437 parent = get_parent(globals, buf, &buflen);
1438 if (parent == NULL)
1439 return NULL;
1440
1441 head = load_next(parent, Py_None, &name, buf, &buflen);
1442 if (head == NULL)
1443 return NULL;
1444
1445 tail = head;
1446 Py_INCREF(tail);
1447 while (name) {
1448 next = load_next(tail, tail, &name, buf, &buflen);
1449 Py_DECREF(tail);
1450 if (next == NULL) {
1451 Py_DECREF(head);
1452 return NULL;
1453 }
1454 tail = next;
1455 }
1456
1457 if (fromlist != NULL) {
1458 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1459 fromlist = NULL;
1460 }
1461
1462 if (fromlist == NULL) {
1463 Py_DECREF(tail);
1464 return head;
1465 }
1466
1467 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001468 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001469 Py_DECREF(tail);
1470 return NULL;
1471 }
1472
1473 return tail;
1474}
1475
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001476PyObject *
1477PyImport_ImportModuleEx(name, globals, locals, fromlist)
1478 char *name;
1479 PyObject *globals;
1480 PyObject *locals;
1481 PyObject *fromlist;
1482{
1483 PyObject *result;
1484 lock_import();
Guido van Rossumd65911b1998-03-03 22:33:27 +00001485 result = import_module_ex(name, globals, locals, fromlist);
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001486 unlock_import();
1487 return result;
1488}
1489
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001490static PyObject *
1491get_parent(globals, buf, p_buflen)
1492 PyObject *globals;
1493 char *buf;
1494 int *p_buflen;
1495{
1496 static PyObject *namestr = NULL;
1497 static PyObject *pathstr = NULL;
1498 PyObject *modname, *modpath, *modules, *parent;
1499
1500 if (globals == NULL || !PyDict_Check(globals))
1501 return Py_None;
1502
1503 if (namestr == NULL) {
1504 namestr = PyString_InternFromString("__name__");
1505 if (namestr == NULL)
1506 return NULL;
1507 }
1508 if (pathstr == NULL) {
1509 pathstr = PyString_InternFromString("__path__");
1510 if (pathstr == NULL)
1511 return NULL;
1512 }
1513
1514 *buf = '\0';
1515 *p_buflen = 0;
1516 modname = PyDict_GetItem(globals, namestr);
1517 if (modname == NULL || !PyString_Check(modname))
1518 return Py_None;
1519
1520 modpath = PyDict_GetItem(globals, pathstr);
1521 if (modpath != NULL) {
1522 int len = PyString_GET_SIZE(modname);
1523 if (len > MAXPATHLEN) {
1524 PyErr_SetString(PyExc_ValueError,
1525 "Module name too long");
1526 return NULL;
1527 }
1528 strcpy(buf, PyString_AS_STRING(modname));
1529 *p_buflen = len;
1530 }
1531 else {
1532 char *start = PyString_AS_STRING(modname);
1533 char *lastdot = strrchr(start, '.');
1534 int len;
1535 if (lastdot == NULL)
1536 return Py_None;
1537 len = lastdot - start;
1538 if (len >= MAXPATHLEN) {
1539 PyErr_SetString(PyExc_ValueError,
1540 "Module name too long");
1541 return NULL;
1542 }
1543 strncpy(buf, start, len);
1544 buf[len] = '\0';
1545 *p_buflen = len;
1546 }
1547
1548 modules = PyImport_GetModuleDict();
1549 parent = PyDict_GetItemString(modules, buf);
1550 if (parent == NULL)
1551 parent = Py_None;
1552 return parent;
1553 /* We expect, but can't guarantee, if parent != None, that:
1554 - parent.__name__ == buf
1555 - parent.__dict__ is globals
1556 If this is violated... Who cares? */
1557}
1558
1559static PyObject *
1560load_next(mod, altmod, p_name, buf, p_buflen)
1561 PyObject *mod;
1562 PyObject *altmod; /* Either None or same as mod */
1563 char **p_name;
1564 char *buf;
1565 int *p_buflen;
1566{
1567 char *name = *p_name;
1568 char *dot = strchr(name, '.');
1569 int len;
1570 char *p;
1571 PyObject *result;
1572
1573 if (dot == NULL) {
1574 *p_name = NULL;
1575 len = strlen(name);
1576 }
1577 else {
1578 *p_name = dot+1;
1579 len = dot-name;
1580 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00001581 if (len == 0) {
1582 PyErr_SetString(PyExc_ValueError,
1583 "Empty module name");
1584 return NULL;
1585 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001586
1587 p = buf + *p_buflen;
1588 if (p != buf)
1589 *p++ = '.';
1590 if (p+len-buf >= MAXPATHLEN) {
1591 PyErr_SetString(PyExc_ValueError,
1592 "Module name too long");
1593 return NULL;
1594 }
1595 strncpy(p, name, len);
1596 p[len] = '\0';
1597 *p_buflen = p+len-buf;
1598
1599 result = import_submodule(mod, p, buf);
1600 if (result == Py_None && altmod != mod) {
1601 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001602 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001603 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001604 if (result != NULL && result != Py_None) {
1605 if (mark_miss(buf) != 0) {
1606 Py_DECREF(result);
1607 return NULL;
1608 }
1609 strncpy(buf, name, len);
1610 buf[len] = '\0';
1611 *p_buflen = len;
1612 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001613 }
1614 if (result == NULL)
1615 return NULL;
1616
1617 if (result == Py_None) {
1618 Py_DECREF(result);
1619 PyErr_Format(PyExc_ImportError,
1620 "No module named %.200s", name);
1621 return NULL;
1622 }
1623
1624 return result;
1625}
1626
1627static int
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001628mark_miss(name)
1629 char *name;
1630{
1631 PyObject *modules = PyImport_GetModuleDict();
1632 return PyDict_SetItemString(modules, name, Py_None);
1633}
1634
1635static int
Guido van Rossum9905ef91997-09-08 16:07:11 +00001636ensure_fromlist(mod, fromlist, buf, buflen, recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001637 PyObject *mod;
1638 PyObject *fromlist;
1639 char *buf;
1640 int buflen;
Guido van Rossum9905ef91997-09-08 16:07:11 +00001641 int recursive;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001642{
1643 int i;
1644
1645 if (!PyObject_HasAttrString(mod, "__path__"))
1646 return 1;
1647
1648 for (i = 0; ; i++) {
1649 PyObject *item = PySequence_GetItem(fromlist, i);
1650 int hasit;
1651 if (item == NULL) {
1652 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1653 PyErr_Clear();
1654 return 1;
1655 }
1656 return 0;
1657 }
1658 if (!PyString_Check(item)) {
1659 PyErr_SetString(PyExc_TypeError,
1660 "Item in ``from list'' not a string");
1661 Py_DECREF(item);
1662 return 0;
1663 }
1664 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001665 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001666 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001667 /* See if the package defines __all__ */
1668 if (recursive)
1669 continue; /* Avoid endless recursion */
1670 all = PyObject_GetAttrString(mod, "__all__");
1671 if (all == NULL)
1672 PyErr_Clear();
1673 else {
1674 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1675 return 0;
1676 Py_DECREF(all);
1677 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001678 continue;
1679 }
1680 hasit = PyObject_HasAttr(mod, item);
1681 if (!hasit) {
1682 char *subname = PyString_AS_STRING(item);
1683 PyObject *submod;
1684 char *p;
1685 if (buflen + strlen(subname) >= MAXPATHLEN) {
1686 PyErr_SetString(PyExc_ValueError,
1687 "Module name too long");
1688 Py_DECREF(item);
1689 return 0;
1690 }
1691 p = buf + buflen;
1692 *p++ = '.';
1693 strcpy(p, subname);
1694 submod = import_submodule(mod, subname, buf);
1695 Py_XDECREF(submod);
1696 if (submod == NULL) {
1697 Py_DECREF(item);
1698 return 0;
1699 }
1700 }
1701 Py_DECREF(item);
1702 }
1703
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001704 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001705}
1706
1707static PyObject *
1708import_submodule(mod, subname, fullname)
1709 PyObject *mod; /* May be None */
1710 char *subname;
1711 char *fullname;
1712{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001713 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001714 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001715
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001716 /* Require:
1717 if mod == None: subname == fullname
1718 else: mod.__name__ + "." + subname == fullname
1719 */
1720
1721 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001722 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001723 }
1724 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001725 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001726 char buf[MAXPATHLEN+1];
1727 struct filedescr *fdp;
1728 FILE *fp = NULL;
1729
Guido van Rossum9c0afe51998-05-19 15:09:05 +00001730 if (mod == Py_None)
1731 path = NULL;
1732 else {
1733 path = PyObject_GetAttrString(mod, "__path__");
1734 if (path == NULL) {
1735 PyErr_Clear();
1736 Py_INCREF(Py_None);
1737 return Py_None;
1738 }
1739 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001740
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001741 buf[0] = '\0';
Guido van Rossumb68cd421998-07-01 17:36:26 +00001742 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1743 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001744 if (fdp == NULL) {
1745 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1746 return NULL;
1747 PyErr_Clear();
1748 Py_INCREF(Py_None);
1749 return Py_None;
1750 }
1751 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001752 if (fp)
1753 fclose(fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001754 if (m != NULL && mod != Py_None) {
1755 if (PyObject_SetAttrString(mod, subname, m) < 0) {
1756 Py_DECREF(m);
1757 m = NULL;
1758 }
1759 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001760 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001761
1762 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001763}
1764
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001765
1766/* Re-import a module of any kind and return its module object, WITH
1767 INCREMENTED REFERENCE COUNT */
1768
Guido van Rossum79f25d91997-04-29 20:08:16 +00001769PyObject *
1770PyImport_ReloadModule(m)
1771 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001772{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001773 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001774 PyObject *path = NULL;
1775 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001776 char buf[MAXPATHLEN+1];
1777 struct filedescr *fdp;
1778 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001779
Guido van Rossum79f25d91997-04-29 20:08:16 +00001780 if (m == NULL || !PyModule_Check(m)) {
1781 PyErr_SetString(PyExc_TypeError,
1782 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001783 return NULL;
1784 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001785 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001786 if (name == NULL)
1787 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001788 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001789 PyErr_Format(PyExc_ImportError,
1790 "reload(): module %.200s not in sys.modules",
1791 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001792 return NULL;
1793 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001794 subname = strrchr(name, '.');
1795 if (subname == NULL)
1796 subname = name;
1797 else {
1798 PyObject *parentname, *parent;
1799 parentname = PyString_FromStringAndSize(name, (subname-name));
1800 if (parentname == NULL)
1801 return NULL;
1802 parent = PyDict_GetItem(modules, parentname);
1803 if (parent == NULL) {
1804 PyErr_Format(PyExc_ImportError,
1805 "reload(): parent %.200s not in sys.modules",
1806 name);
1807 return NULL;
1808 }
1809 subname++;
1810 path = PyObject_GetAttrString(parent, "__path__");
1811 if (path == NULL)
1812 PyErr_Clear();
1813 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001814 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001815 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1816 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001817 if (fdp == NULL)
1818 return NULL;
1819 m = load_module(name, fp, buf, fdp->type);
1820 if (fp)
1821 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001822 return m;
1823}
1824
1825
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001826/* Higher-level import emulator which emulates the "import" statement
1827 more accurately -- it invokes the __import__() function from the
1828 builtins of the current globals. This means that the import is
1829 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00001830 environment, e.g. by "rexec".
1831 A dummy list ["__doc__"] is passed as the 4th argument so that
1832 e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
1833 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001834
1835PyObject *
1836PyImport_Import(module_name)
1837 PyObject *module_name;
1838{
1839 static PyObject *silly_list = NULL;
1840 static PyObject *builtins_str = NULL;
1841 static PyObject *import_str = NULL;
1842 static PyObject *standard_builtins = NULL;
1843 PyObject *globals = NULL;
1844 PyObject *import = NULL;
1845 PyObject *builtins = NULL;
1846 PyObject *r = NULL;
1847
1848 /* Initialize constant string objects */
1849 if (silly_list == NULL) {
1850 import_str = PyString_InternFromString("__import__");
1851 if (import_str == NULL)
1852 return NULL;
1853 builtins_str = PyString_InternFromString("__builtins__");
1854 if (builtins_str == NULL)
1855 return NULL;
1856 silly_list = Py_BuildValue("[s]", "__doc__");
1857 if (silly_list == NULL)
1858 return NULL;
1859 }
1860
1861 /* Get the builtins from current globals */
1862 globals = PyEval_GetGlobals();
1863 if(globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00001864 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001865 builtins = PyObject_GetItem(globals, builtins_str);
1866 if (builtins == NULL)
1867 goto err;
1868 }
1869 else {
1870 /* No globals -- use standard builtins, and fake globals */
1871 PyErr_Clear();
1872
1873 if (standard_builtins == NULL) {
1874 standard_builtins =
1875 PyImport_ImportModule("__builtin__");
1876 if (standard_builtins == NULL)
1877 return NULL;
1878 }
1879
1880 builtins = standard_builtins;
1881 Py_INCREF(builtins);
1882 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1883 if (globals == NULL)
1884 goto err;
1885 }
1886
1887 /* Get the __import__ function from the builtins */
1888 if (PyDict_Check(builtins))
1889 import=PyObject_GetItem(builtins, import_str);
1890 else
1891 import=PyObject_GetAttr(builtins, import_str);
1892 if (import == NULL)
1893 goto err;
1894
1895 /* Call the _import__ function with the proper argument list */
1896 r = PyObject_CallFunction(import, "OOOO",
1897 module_name, globals, globals, silly_list);
1898
1899 err:
1900 Py_XDECREF(globals);
1901 Py_XDECREF(builtins);
1902 Py_XDECREF(import);
1903
1904 return r;
1905}
1906
1907
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001908/* Module 'imp' provides Python access to the primitives used for
1909 importing modules.
1910*/
1911
Guido van Rossum79f25d91997-04-29 20:08:16 +00001912static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001913imp_get_magic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001914 PyObject *self;
1915 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001916{
1917 char buf[4];
1918
Guido van Rossum79f25d91997-04-29 20:08:16 +00001919 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001920 return NULL;
Guido van Rossum6bf62da1997-04-11 20:37:35 +00001921 buf[0] = (char) ((MAGIC >> 0) & 0xff);
1922 buf[1] = (char) ((MAGIC >> 8) & 0xff);
1923 buf[2] = (char) ((MAGIC >> 16) & 0xff);
1924 buf[3] = (char) ((MAGIC >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001925
Guido van Rossum79f25d91997-04-29 20:08:16 +00001926 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001927}
1928
Guido van Rossum79f25d91997-04-29 20:08:16 +00001929static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001930imp_get_suffixes(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001931 PyObject *self;
1932 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001933{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001934 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001935 struct filedescr *fdp;
1936
Guido van Rossum79f25d91997-04-29 20:08:16 +00001937 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001938 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001939 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001940 if (list == NULL)
1941 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001942 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
1943 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001944 fdp->suffix, fdp->mode, fdp->type);
1945 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001946 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001947 return NULL;
1948 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001949 if (PyList_Append(list, item) < 0) {
1950 Py_DECREF(list);
1951 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001952 return NULL;
1953 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001954 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001955 }
1956 return list;
1957}
1958
Guido van Rossum79f25d91997-04-29 20:08:16 +00001959static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001960call_find_module(name, path)
1961 char *name;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001962 PyObject *path; /* list or None or NULL */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001963{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001964 extern int fclose Py_PROTO((FILE *));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001965 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001966 struct filedescr *fdp;
1967 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001968 FILE *fp = NULL;
1969
1970 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001971 if (path == Py_None)
1972 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001973 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
1974 if (fdp == NULL)
1975 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001976 if (fp != NULL) {
1977 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
1978 if (fob == NULL) {
1979 fclose(fp);
1980 return NULL;
1981 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001982 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001983 else {
1984 fob = Py_None;
1985 Py_INCREF(fob);
1986 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001987 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001988 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001989 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001990 return ret;
1991}
1992
Guido van Rossum79f25d91997-04-29 20:08:16 +00001993static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001994imp_find_module(self, args)
1995 PyObject *self;
1996 PyObject *args;
1997{
1998 char *name;
1999 PyObject *path = NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002000 if (!PyArg_ParseTuple(args, "s|O", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002001 return NULL;
2002 return call_find_module(name, path);
2003}
2004
2005static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002006imp_init_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002007 PyObject *self;
2008 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002009{
2010 char *name;
2011 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002012 PyObject *m;
2013 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002014 return NULL;
2015 ret = init_builtin(name);
2016 if (ret < 0)
2017 return NULL;
2018 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002019 Py_INCREF(Py_None);
2020 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002021 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002022 m = PyImport_AddModule(name);
2023 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002024 return m;
2025}
2026
Guido van Rossum79f25d91997-04-29 20:08:16 +00002027static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002028imp_init_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002029 PyObject *self;
2030 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002031{
2032 char *name;
2033 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002034 PyObject *m;
2035 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002036 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002037 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002038 if (ret < 0)
2039 return NULL;
2040 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002041 Py_INCREF(Py_None);
2042 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002043 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002044 m = PyImport_AddModule(name);
2045 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002046 return m;
2047}
2048
Guido van Rossum79f25d91997-04-29 20:08:16 +00002049static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002050imp_get_frozen_object(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002051 PyObject *self;
2052 PyObject *args;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002053{
2054 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002055
Guido van Rossum79f25d91997-04-29 20:08:16 +00002056 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002057 return NULL;
2058 return get_frozen_object(name);
2059}
2060
Guido van Rossum79f25d91997-04-29 20:08:16 +00002061static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002062imp_is_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002063 PyObject *self;
2064 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002065{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002066 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002067 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002068 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002069 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002070}
2071
Guido van Rossum79f25d91997-04-29 20:08:16 +00002072static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002073imp_is_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002074 PyObject *self;
2075 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002076{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002077 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002078 struct _frozen *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002079 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002080 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002081 p = find_frozen(name);
2082 return PyInt_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002083}
2084
2085static FILE *
2086get_file(pathname, fob, mode)
2087 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002088 PyObject *fob;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002089 char *mode;
2090{
2091 FILE *fp;
2092 if (fob == NULL) {
2093 fp = fopen(pathname, mode);
2094 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002095 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002096 }
2097 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002098 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002099 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002100 PyErr_SetString(PyExc_ValueError,
2101 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002102 }
2103 return fp;
2104}
2105
Guido van Rossum79f25d91997-04-29 20:08:16 +00002106static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002107imp_load_compiled(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002108 PyObject *self;
2109 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002110{
2111 char *name;
2112 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002113 PyObject *fob = NULL;
2114 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002115 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002116 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002117 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002118 return NULL;
2119 fp = get_file(pathname, fob, "rb");
2120 if (fp == NULL)
2121 return NULL;
2122 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002123 if (fob == NULL)
2124 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002125 return m;
2126}
2127
Guido van Rossum79f25d91997-04-29 20:08:16 +00002128static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002129imp_load_dynamic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002130 PyObject *self;
2131 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002132{
2133 char *name;
2134 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002135 PyObject *fob = NULL;
2136 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002137 FILE *fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002138 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
2139 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002140 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002141 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002142 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002143 if (fp == NULL)
2144 return NULL;
2145 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002146 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002147 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002148}
2149
Guido van Rossum79f25d91997-04-29 20:08:16 +00002150static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002151imp_load_source(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002152 PyObject *self;
2153 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002154{
2155 char *name;
2156 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002157 PyObject *fob = NULL;
2158 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002159 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002160 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002161 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002162 return NULL;
2163 fp = get_file(pathname, fob, "r");
2164 if (fp == NULL)
2165 return NULL;
2166 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002167 if (fob == NULL)
2168 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002169 return m;
2170}
2171
Jack Jansen9c96a921995-02-15 22:57:06 +00002172#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002173static PyObject *
Jack Jansen9c96a921995-02-15 22:57:06 +00002174imp_load_resource(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002175 PyObject *self;
2176 PyObject *args;
Jack Jansen9c96a921995-02-15 22:57:06 +00002177{
2178 char *name;
2179 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002180 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002181
Guido van Rossum79f25d91997-04-29 20:08:16 +00002182 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002183 return NULL;
2184 m = PyMac_LoadResourceModule(name, pathname);
2185 return m;
2186}
2187#endif /* macintosh */
2188
Guido van Rossum79f25d91997-04-29 20:08:16 +00002189static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002190imp_load_module(self, args)
2191 PyObject *self;
2192 PyObject *args;
2193{
2194 char *name;
2195 PyObject *fob;
2196 char *pathname;
2197 char *suffix; /* Unused */
2198 char *mode;
2199 int type;
2200 FILE *fp;
2201
2202 if (!PyArg_ParseTuple(args, "sOs(ssi)",
2203 &name, &fob, &pathname,
2204 &suffix, &mode, &type))
2205 return NULL;
2206 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
2207 PyErr_Format(PyExc_ValueError,
2208 "invalid file open mode %.200s", mode);
2209 return NULL;
2210 }
2211 if (fob == Py_None)
2212 fp = NULL;
2213 else {
2214 if (!PyFile_Check(fob)) {
2215 PyErr_SetString(PyExc_ValueError,
2216 "load_module arg#2 should be a file or None");
2217 return NULL;
2218 }
2219 fp = get_file(pathname, fob, mode);
2220 if (fp == NULL)
2221 return NULL;
2222 }
2223 return load_module(name, fp, pathname, type);
2224}
2225
2226static PyObject *
2227imp_load_package(self, args)
2228 PyObject *self;
2229 PyObject *args;
2230{
2231 char *name;
2232 char *pathname;
2233 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
2234 return NULL;
2235 return load_package(name, pathname);
2236}
2237
2238static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002239imp_new_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002240 PyObject *self;
2241 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002242{
2243 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002244 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002245 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002246 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002247}
2248
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002249/* Doc strings */
2250
2251static char doc_imp[] = "\
2252This module provides the components needed to build your own\n\
2253__import__ function. Undocumented functions are obsolete.\n\
2254";
2255
2256static char doc_find_module[] = "\
2257find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
2258Search for a module. If path is omitted or None, search for a\n\
2259built-in, frozen or special module and continue search in sys.path.\n\
2260The module name cannot contain '.'; to search for a submodule of a\n\
2261package, pass the submodule name and the package's __path__.\
2262";
2263
2264static char doc_load_module[] = "\
2265load_module(name, file, filename, (suffix, mode, type)) -> module\n\
2266Load a module, given information returned by find_module().\n\
2267The module name must include the full package name, if any.\
2268";
2269
2270static char doc_get_magic[] = "\
2271get_magic() -> string\n\
2272Return the magic number for .pyc or .pyo files.\
2273";
2274
2275static char doc_get_suffixes[] = "\
2276get_suffixes() -> [(suffix, mode, type), ...]\n\
2277Return a list of (suffix, mode, type) tuples describing the files\n\
2278that find_module() looks for.\
2279";
2280
2281static char doc_new_module[] = "\
2282new_module(name) -> module\n\
2283Create a new module. Do not enter it in sys.modules.\n\
2284The module name must include the full package name, if any.\
2285";
2286
Guido van Rossum79f25d91997-04-29 20:08:16 +00002287static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002288 {"find_module", imp_find_module, 1, doc_find_module},
2289 {"get_magic", imp_get_magic, 1, doc_get_magic},
2290 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
2291 {"load_module", imp_load_module, 1, doc_load_module},
2292 {"new_module", imp_new_module, 1, doc_new_module},
2293 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002294 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002295 {"init_builtin", imp_init_builtin, 1},
2296 {"init_frozen", imp_init_frozen, 1},
2297 {"is_builtin", imp_is_builtin, 1},
2298 {"is_frozen", imp_is_frozen, 1},
2299 {"load_compiled", imp_load_compiled, 1},
2300 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002301 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00002302#ifdef macintosh
2303 {"load_resource", imp_load_resource, 1},
2304#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002305 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002306 {NULL, NULL} /* sentinel */
2307};
2308
Guido van Rossum1a8791e1998-08-04 22:46:29 +00002309static int
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002310setint(d, name, value)
2311 PyObject *d;
2312 char *name;
2313 int value;
2314{
2315 PyObject *v;
2316 int err;
2317
2318 v = PyInt_FromLong((long)value);
2319 err = PyDict_SetItemString(d, name, v);
2320 Py_XDECREF(v);
2321 return err;
2322}
2323
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002324void
2325initimp()
2326{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002327 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002328
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002329 m = Py_InitModule4("imp", imp_methods, doc_imp,
2330 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002331 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002332
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002333 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2334 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2335 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2336 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2337 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2338 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2339 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2340 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00002341 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002342
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002343 failure:
2344 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002345}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002346
2347
2348/* API for embedding applications that want to add their own entries to the
2349 table of built-in modules. This should normally be called *before*
2350 Py_Initialize(). When the malloc() or realloc() call fails, -1 is returned
2351 and the existing table is unchanged.
2352
2353 After a similar function by Just van Rossum. */
2354
2355int
2356PyImport_ExtendInittab(newtab)
2357 struct _inittab *newtab;
2358{
2359 static struct _inittab *our_copy = NULL;
2360 struct _inittab *p;
2361 int i, n;
2362
2363 /* Count the number of entries in both tables */
2364 for (n = 0; newtab[n].name != NULL; n++)
2365 ;
2366 if (n == 0)
2367 return 0; /* Nothing to do */
2368 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2369 ;
2370
2371 /* Allocate new memory for the combined table */
2372 if (our_copy == NULL)
2373 p = malloc((i+n+1) * sizeof(struct _inittab));
2374 else
2375 p = realloc(our_copy, (i+n+1) * sizeof(struct _inittab));
2376 if (p == NULL)
2377 return -1;
2378
2379 /* Copy the tables into the new memory */
2380 if (our_copy != PyImport_Inittab)
2381 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2382 PyImport_Inittab = our_copy = p;
2383 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
2384
2385 return 0;
2386}
2387
2388/* Shorthand to add a single entry given a name and a function */
2389
2390int
2391PyImport_AppendInittab(name, initfunc)
2392 char *name;
2393 void (*initfunc)();
2394{
2395 struct _inittab newtab[2];
2396
2397 memset(newtab, '\0', sizeof newtab);
2398
2399 newtab[0].name = name;
2400 newtab[0].initfunc = initfunc;
2401
2402 return PyImport_ExtendInittab(newtab);
2403}