blob: 52e6c05346ea755d46f2700e889ac3517c9a8524 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Module definition and import implementation */
3
Guido van Rossum79f25d91997-04-29 20:08:16 +00004#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00005
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00006#include "node.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00007#include "token.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00008#include "errcode.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +00009#include "marshal.h"
10#include "compile.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000011#include "eval.h"
Guido van Rossumd8bac6d1992-02-26 15:19:13 +000012#include "osdefs.h"
Guido van Rossum1ae940a1995-01-02 19:04:15 +000013#include "importdl.h"
Jack Jansen9c96a921995-02-15 22:57:06 +000014#ifdef macintosh
15#include "macglue.h"
16#endif
Guido van Rossumc405b7b1991-06-04 19:39:42 +000017
Guido van Rossum55a83382000-09-20 20:31:38 +000018#ifdef HAVE_FCNTL_H
19#include <fcntl.h>
20#endif
21
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000022extern time_t PyOS_GetLastModificationTime(char *, FILE *);
23 /* In getmtime.c */
Guido van Rossum21d335e1993-10-15 13:01:11 +000024
Guido van Rossum6c849691994-09-26 15:47:17 +000025/* Magic word to reject .pyc files generated by other Python versions */
Guido van Rossum7faeab31995-07-07 22:50:36 +000026/* Change for each incompatible change */
27/* The value of CR and LF is incorporated so if you ever read or write
28 a .pyc file in text mode the magic number will be wrong; also, the
Tim Peters36515e22001-11-18 04:06:29 +000029 Apple MPW compiler swaps their values, botching string constants.
30 XXX That probably isn't important anymore.
31*/
Guido van Rossum7faeab31995-07-07 22:50:36 +000032/* XXX Perhaps the magic number should be frozen and a version field
33 added to the .pyc file header? */
Tim Peters36515e22001-11-18 04:06:29 +000034/* New way to come up with the low 16 bits of the magic number:
35 (YEAR-1995) * 10000 + MONTH * 100 + DAY
36 where MONTH and DAY are 1-based.
37 XXX Whatever the "old way" may have been isn't documented.
38 XXX This scheme breaks in 2002, as (2002-1995)*10000 = 70000 doesn't
39 fit in 16 bits.
40 XXX Later, sometimes 1 gets added to MAGIC in order to record that
41 the Unicode -U option is in use. IMO (Tim's), that's a Bad Idea
42 (quite apart from that the -U option doesn't work so isn't used
43 anyway).
Marc-André Lemburgbd3be8f2002-02-07 11:33:49 +000044
45 XXX MAL, 2002-02-07: I had to modify the MAGIC due to a fix of the
46 UTF-8 encoder (it previously produced invalid UTF-8 for unpaired
47 high surrogates), so I simply bumped the month value to 20 (invalid
48 month) and set the day to 1. This should be recognizable by any
49 algorithm relying on the above scheme. Perhaps we should simply
50 start counting in increments of 10 from now on ?!
51
Michael W. Hudsondd32a912002-08-15 14:59:02 +000052 MWH, 2002-08-03: Removed SET_LINENO. Couldn't be bothered figuring
53 out the MAGIC schemes, so just incremented it by 10.
54
Guido van Rossumf6894922002-08-31 15:16:14 +000055 GvR, 2002-08-31: Because MWH changed the bytecode again, moved the
56 magic number *back* to 62011. This should get the snake-farm to
57 throw away its old .pyc files, amongst others.
58
Marc-André Lemburgbd3be8f2002-02-07 11:33:49 +000059 Known values:
60 Python 1.5: 20121
61 Python 1.5.1: 20121
62 Python 1.5.2: 20121
63 Python 2.0: 50823
64 Python 2.0.1: 50823
65 Python 2.1: 60202
66 Python 2.1.1: 60202
67 Python 2.1.2: 60202
68 Python 2.2: 60717
Neal Norwitz7fdcb412002-06-14 01:07:39 +000069 Python 2.3a0: 62011
Michael W. Hudsondd32a912002-08-15 14:59:02 +000070 Python 2.3a0: 62021
Guido van Rossumf6894922002-08-31 15:16:14 +000071 Python 2.3a0: 62011 (!)
Tim Peters36515e22001-11-18 04:06:29 +000072*/
Guido van Rossumf6894922002-08-31 15:16:14 +000073#define MAGIC (62011 | ((long)'\r'<<16) | ((long)'\n'<<24))
Guido van Rossum3ddee711991-12-16 13:06:34 +000074
Guido van Rossum96774c12000-05-01 20:19:08 +000075/* Magic word as global; note that _PyImport_Init() can change the
Jeremy Hylton9262b8a2000-06-30 04:59:17 +000076 value of this global to accommodate for alterations of how the
Guido van Rossum96774c12000-05-01 20:19:08 +000077 compiler works which are enabled by command line switches. */
78static long pyc_magic = MAGIC;
79
Guido van Rossum25ce5661997-08-02 03:10:38 +000080/* See _PyImport_FixupExtension() below */
81static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000082
Guido van Rossum771c6c81997-10-31 18:37:24 +000083/* This table is defined in config.c: */
84extern struct _inittab _PyImport_Inittab[];
85
86struct _inittab *PyImport_Inittab = _PyImport_Inittab;
Guido van Rossum66f1fa81991-04-03 19:03:52 +000087
Guido van Rossumed1170e1999-12-20 21:23:41 +000088/* these tables define the module suffixes that Python recognizes */
89struct filedescr * _PyImport_Filetab = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +000090
91#ifdef RISCOS
92static const struct filedescr _PyImport_StandardFiletab[] = {
Jack Jansenc88da1f2002-05-28 10:58:19 +000093 {"/py", "U", PY_SOURCE},
Guido van Rossum48a680c2001-03-02 06:34:14 +000094 {"/pyc", "rb", PY_COMPILED},
95 {0, 0}
96};
97#else
Guido van Rossumed1170e1999-12-20 21:23:41 +000098static const struct filedescr _PyImport_StandardFiletab[] = {
Jack Jansenc88da1f2002-05-28 10:58:19 +000099 {".py", "U", PY_SOURCE},
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000100#ifdef MS_WINDOWS
Jack Jansenc88da1f2002-05-28 10:58:19 +0000101 {".pyw", "U", PY_SOURCE},
Tim Peters36515e22001-11-18 04:06:29 +0000102#endif
Guido van Rossumed1170e1999-12-20 21:23:41 +0000103 {".pyc", "rb", PY_COMPILED},
104 {0, 0}
105};
Guido van Rossum48a680c2001-03-02 06:34:14 +0000106#endif
Guido van Rossumed1170e1999-12-20 21:23:41 +0000107
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000108/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000109
110void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000111_PyImport_Init(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000112{
Guido van Rossumed1170e1999-12-20 21:23:41 +0000113 const struct filedescr *scan;
114 struct filedescr *filetab;
115 int countD = 0;
116 int countS = 0;
117
118 /* prepare _PyImport_Filetab: copy entries from
119 _PyImport_DynLoadFiletab and _PyImport_StandardFiletab.
120 */
121 for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan)
122 ++countD;
123 for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan)
124 ++countS;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000125 filetab = PyMem_NEW(struct filedescr, countD + countS + 1);
Guido van Rossumed1170e1999-12-20 21:23:41 +0000126 memcpy(filetab, _PyImport_DynLoadFiletab,
127 countD * sizeof(struct filedescr));
128 memcpy(filetab + countD, _PyImport_StandardFiletab,
129 countS * sizeof(struct filedescr));
130 filetab[countD + countS].suffix = NULL;
131
132 _PyImport_Filetab = filetab;
133
Guido van Rossum0824f631997-03-11 18:37:35 +0000134 if (Py_OptimizeFlag) {
Guido van Rossumed1170e1999-12-20 21:23:41 +0000135 /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */
136 for (; filetab->suffix != NULL; filetab++) {
Guido van Rossum48a680c2001-03-02 06:34:14 +0000137#ifndef RISCOS
Guido van Rossumed1170e1999-12-20 21:23:41 +0000138 if (strcmp(filetab->suffix, ".pyc") == 0)
139 filetab->suffix = ".pyo";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000140#else
141 if (strcmp(filetab->suffix, "/pyc") == 0)
142 filetab->suffix = "/pyo";
143#endif
Guido van Rossum0824f631997-03-11 18:37:35 +0000144 }
145 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000146
147 if (Py_UnicodeFlag) {
148 /* Fix the pyc_magic so that byte compiled code created
149 using the all-Unicode method doesn't interfere with
150 code created in normal operation mode. */
151 pyc_magic = MAGIC + 1;
152 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000153}
154
Guido van Rossum25ce5661997-08-02 03:10:38 +0000155void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000156_PyImport_Fini(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000157{
158 Py_XDECREF(extensions);
159 extensions = NULL;
Barry Warsaw84294482000-10-03 16:02:05 +0000160 PyMem_DEL(_PyImport_Filetab);
161 _PyImport_Filetab = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000162}
163
164
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000165/* Locking primitives to prevent parallel imports of the same module
166 in different threads to return with a partially loaded module.
167 These calls are serialized by the global interpreter lock. */
168
169#ifdef WITH_THREAD
170
Guido van Rossum49b56061998-10-01 20:42:43 +0000171#include "pythread.h"
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000172
Guido van Rossum65d5b571998-12-21 19:32:43 +0000173static PyThread_type_lock import_lock = 0;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000174static long import_lock_thread = -1;
175static int import_lock_level = 0;
176
177static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000178lock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000179{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000180 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000181 if (me == -1)
182 return; /* Too bad */
183 if (import_lock == NULL)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000184 import_lock = PyThread_allocate_lock();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000185 if (import_lock_thread == me) {
186 import_lock_level++;
187 return;
188 }
Guido van Rossum65d5b571998-12-21 19:32:43 +0000189 if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0)) {
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000190 PyThreadState *tstate = PyEval_SaveThread();
Guido van Rossum65d5b571998-12-21 19:32:43 +0000191 PyThread_acquire_lock(import_lock, 1);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000192 PyEval_RestoreThread(tstate);
193 }
194 import_lock_thread = me;
195 import_lock_level = 1;
196}
197
198static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000199unlock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000200{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000201 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000202 if (me == -1)
203 return; /* Too bad */
204 if (import_lock_thread != me)
205 Py_FatalError("unlock_import: not holding the import lock");
206 import_lock_level--;
207 if (import_lock_level == 0) {
208 import_lock_thread = -1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000209 PyThread_release_lock(import_lock);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000210 }
211}
212
213#else
214
215#define lock_import()
216#define unlock_import()
217
218#endif
219
Tim Peters69232342001-08-30 05:16:13 +0000220static PyObject *
221imp_lock_held(PyObject *self, PyObject *args)
222{
223 if (!PyArg_ParseTuple(args, ":lock_held"))
224 return NULL;
225#ifdef WITH_THREAD
Guido van Rossumb8bff3f2002-04-07 06:34:38 +0000226 return PyBool_FromLong(import_lock_thread != -1);
Tim Peters69232342001-08-30 05:16:13 +0000227#else
Guido van Rossumb8bff3f2002-04-07 06:34:38 +0000228 return PyBool_FromLong(0);
Tim Peters69232342001-08-30 05:16:13 +0000229#endif
230}
231
Guido van Rossum25ce5661997-08-02 03:10:38 +0000232/* Helper for sys */
233
234PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000235PyImport_GetModuleDict(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000236{
237 PyInterpreterState *interp = PyThreadState_Get()->interp;
238 if (interp->modules == NULL)
239 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
240 return interp->modules;
241}
242
Guido van Rossum3f5da241990-12-20 15:06:42 +0000243
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000244/* List of names to clear in sys */
245static char* sys_deletes[] = {
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000246 "path", "argv", "ps1", "ps2", "exitfunc",
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000247 "exc_type", "exc_value", "exc_traceback",
248 "last_type", "last_value", "last_traceback",
249 NULL
250};
251
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000252static char* sys_files[] = {
253 "stdin", "__stdin__",
254 "stdout", "__stdout__",
255 "stderr", "__stderr__",
256 NULL
257};
258
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000259
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000260/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000261
Guido van Rossum3f5da241990-12-20 15:06:42 +0000262void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000263PyImport_Cleanup(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000264{
Guido van Rossum758eec01998-01-19 21:58:26 +0000265 int pos, ndone;
266 char *name;
267 PyObject *key, *value, *dict;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000268 PyInterpreterState *interp = PyThreadState_Get()->interp;
Guido van Rossum758eec01998-01-19 21:58:26 +0000269 PyObject *modules = interp->modules;
270
271 if (modules == NULL)
272 return; /* Already done */
273
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000274 /* Delete some special variables first. These are common
275 places where user values hide and people complain when their
276 destructors fail. Since the modules containing them are
277 deleted *last* of all, they would come too late in the normal
278 destruction order. Sigh. */
279
280 value = PyDict_GetItemString(modules, "__builtin__");
281 if (value != NULL && PyModule_Check(value)) {
282 dict = PyModule_GetDict(value);
283 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000284 PySys_WriteStderr("# clear __builtin__._\n");
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000285 PyDict_SetItemString(dict, "_", Py_None);
286 }
287 value = PyDict_GetItemString(modules, "sys");
288 if (value != NULL && PyModule_Check(value)) {
289 char **p;
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000290 PyObject *v;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000291 dict = PyModule_GetDict(value);
292 for (p = sys_deletes; *p != NULL; p++) {
293 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000294 PySys_WriteStderr("# clear sys.%s\n", *p);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000295 PyDict_SetItemString(dict, *p, Py_None);
296 }
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000297 for (p = sys_files; *p != NULL; p+=2) {
298 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000299 PySys_WriteStderr("# restore sys.%s\n", *p);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000300 v = PyDict_GetItemString(dict, *(p+1));
301 if (v == NULL)
302 v = Py_None;
303 PyDict_SetItemString(dict, *p, v);
304 }
305 }
306
307 /* First, delete __main__ */
308 value = PyDict_GetItemString(modules, "__main__");
309 if (value != NULL && PyModule_Check(value)) {
310 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000311 PySys_WriteStderr("# cleanup __main__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000312 _PyModule_Clear(value);
313 PyDict_SetItemString(modules, "__main__", Py_None);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000314 }
315
Guido van Rossum758eec01998-01-19 21:58:26 +0000316 /* The special treatment of __builtin__ here is because even
317 when it's not referenced as a module, its dictionary is
318 referenced by almost every module's __builtins__. Since
319 deleting a module clears its dictionary (even if there are
320 references left to it), we need to delete the __builtin__
321 module last. Likewise, we don't delete sys until the very
322 end because it is implicitly referenced (e.g. by print).
323
324 Also note that we 'delete' modules by replacing their entry
325 in the modules dict with None, rather than really deleting
326 them; this avoids a rehash of the modules dictionary and
327 also marks them as "non existent" so they won't be
328 re-imported. */
329
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000330 /* Next, repeatedly delete modules with a reference count of
Guido van Rossum758eec01998-01-19 21:58:26 +0000331 one (skipping __builtin__ and sys) and delete them */
332 do {
333 ndone = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000334 pos = 0;
Guido van Rossum758eec01998-01-19 21:58:26 +0000335 while (PyDict_Next(modules, &pos, &key, &value)) {
336 if (value->ob_refcnt != 1)
337 continue;
Guido van Rossum566373e1998-10-01 15:24:50 +0000338 if (PyString_Check(key) && PyModule_Check(value)) {
339 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000340 if (strcmp(name, "__builtin__") == 0)
341 continue;
342 if (strcmp(name, "sys") == 0)
343 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000344 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000345 PySys_WriteStderr(
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000346 "# cleanup[1] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000347 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000348 PyDict_SetItem(modules, key, Py_None);
349 ndone++;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000350 }
351 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000352 } while (ndone > 0);
353
Guido van Rossum758eec01998-01-19 21:58:26 +0000354 /* Next, delete all modules (still skipping __builtin__ and sys) */
355 pos = 0;
356 while (PyDict_Next(modules, &pos, &key, &value)) {
Guido van Rossum566373e1998-10-01 15:24:50 +0000357 if (PyString_Check(key) && PyModule_Check(value)) {
358 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000359 if (strcmp(name, "__builtin__") == 0)
360 continue;
361 if (strcmp(name, "sys") == 0)
362 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000363 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000364 PySys_WriteStderr("# cleanup[2] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000365 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000366 PyDict_SetItem(modules, key, Py_None);
367 }
368 }
369
370 /* Next, delete sys and __builtin__ (in that order) */
371 value = PyDict_GetItemString(modules, "sys");
372 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000373 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000374 PySys_WriteStderr("# cleanup sys\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000375 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000376 PyDict_SetItemString(modules, "sys", Py_None);
377 }
378 value = PyDict_GetItemString(modules, "__builtin__");
379 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000380 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000381 PySys_WriteStderr("# cleanup __builtin__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000382 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000383 PyDict_SetItemString(modules, "__builtin__", Py_None);
384 }
385
386 /* Finally, clear and delete the modules directory */
387 PyDict_Clear(modules);
388 interp->modules = NULL;
389 Py_DECREF(modules);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000390}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000391
392
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000393/* Helper for pythonrun.c -- return magic number */
394
395long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000396PyImport_GetMagicNumber(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000397{
Guido van Rossum96774c12000-05-01 20:19:08 +0000398 return pyc_magic;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000399}
400
401
Guido van Rossum25ce5661997-08-02 03:10:38 +0000402/* Magic for extension modules (built-in as well as dynamically
403 loaded). To prevent initializing an extension module more than
404 once, we keep a static dictionary 'extensions' keyed by module name
405 (for built-in modules) or by filename (for dynamically loaded
Barry Warsaw92883382001-08-13 23:05:44 +0000406 modules), containing these modules. A copy of the module's
Guido van Rossum25ce5661997-08-02 03:10:38 +0000407 dictionary is stored by calling _PyImport_FixupExtension()
408 immediately after the module initialization function succeeds. A
409 copy can be retrieved from there by calling
410 _PyImport_FindExtension(). */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000411
Guido van Rossum79f25d91997-04-29 20:08:16 +0000412PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000413_PyImport_FixupExtension(char *name, char *filename)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000414{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000415 PyObject *modules, *mod, *dict, *copy;
416 if (extensions == NULL) {
417 extensions = PyDict_New();
418 if (extensions == NULL)
419 return NULL;
420 }
421 modules = PyImport_GetModuleDict();
422 mod = PyDict_GetItemString(modules, name);
423 if (mod == NULL || !PyModule_Check(mod)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000424 PyErr_Format(PyExc_SystemError,
425 "_PyImport_FixupExtension: module %.200s not loaded", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000426 return NULL;
427 }
428 dict = PyModule_GetDict(mod);
429 if (dict == NULL)
430 return NULL;
Fred Drake9cd0efc2001-10-25 21:38:59 +0000431 copy = PyDict_Copy(dict);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000432 if (copy == NULL)
433 return NULL;
434 PyDict_SetItemString(extensions, filename, copy);
435 Py_DECREF(copy);
436 return copy;
437}
438
439PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000440_PyImport_FindExtension(char *name, char *filename)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000441{
Fred Drake9cd0efc2001-10-25 21:38:59 +0000442 PyObject *dict, *mod, *mdict;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000443 if (extensions == NULL)
444 return NULL;
445 dict = PyDict_GetItemString(extensions, filename);
446 if (dict == NULL)
447 return NULL;
448 mod = PyImport_AddModule(name);
449 if (mod == NULL)
450 return NULL;
451 mdict = PyModule_GetDict(mod);
452 if (mdict == NULL)
453 return NULL;
Fred Drake9cd0efc2001-10-25 21:38:59 +0000454 if (PyDict_Update(mdict, dict))
Guido van Rossum25ce5661997-08-02 03:10:38 +0000455 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000456 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000457 PySys_WriteStderr("import %s # previously loaded (%s)\n",
Guido van Rossum25ce5661997-08-02 03:10:38 +0000458 name, filename);
459 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000460}
461
462
463/* Get the module object corresponding to a module name.
464 First check the modules dictionary if there's one there,
465 if not, create a new one and insert in in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000466 Because the former action is most common, THIS DOES NOT RETURN A
467 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000468
Guido van Rossum79f25d91997-04-29 20:08:16 +0000469PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000470PyImport_AddModule(char *name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000471{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000472 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000473 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000474
Guido van Rossum25ce5661997-08-02 03:10:38 +0000475 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
Guido van Rossum79f25d91997-04-29 20:08:16 +0000476 PyModule_Check(m))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000477 return m;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000478 m = PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000479 if (m == NULL)
480 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000481 if (PyDict_SetItemString(modules, name, m) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000482 Py_DECREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000483 return NULL;
484 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000485 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000486
487 return m;
488}
489
490
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000491/* Execute a code object in a module and return the module object
492 WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000493
Guido van Rossum79f25d91997-04-29 20:08:16 +0000494PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000495PyImport_ExecCodeModule(char *name, PyObject *co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000496{
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000497 return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
498}
499
500PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000501PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname)
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000502{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000503 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000504 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000505
Guido van Rossum79f25d91997-04-29 20:08:16 +0000506 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000507 if (m == NULL)
508 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000509 d = PyModule_GetDict(m);
510 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
511 if (PyDict_SetItemString(d, "__builtins__",
512 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000513 return NULL;
514 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000515 /* Remember the filename as the __file__ attribute */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000516 v = NULL;
517 if (pathname != NULL) {
518 v = PyString_FromString(pathname);
519 if (v == NULL)
520 PyErr_Clear();
521 }
522 if (v == NULL) {
523 v = ((PyCodeObject *)co)->co_filename;
524 Py_INCREF(v);
525 }
526 if (PyDict_SetItemString(d, "__file__", v) != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000527 PyErr_Clear(); /* Not important enough to report */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000528 Py_DECREF(v);
529
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000530 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000531 if (v == NULL)
532 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000533 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000534
Guido van Rossum25ce5661997-08-02 03:10:38 +0000535 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000536 PyErr_Format(PyExc_ImportError,
537 "Loaded module %.200s not found in sys.modules",
538 name);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000539 return NULL;
540 }
541
Guido van Rossum79f25d91997-04-29 20:08:16 +0000542 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000543
544 return m;
545}
546
547
548/* Given a pathname for a Python source file, fill a buffer with the
549 pathname for the corresponding compiled file. Return the pathname
550 for the compiled file, or NULL if there's no space in the buffer.
551 Doesn't set an exception. */
552
553static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000554make_compiled_pathname(char *pathname, char *buf, size_t buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000555{
Tim Petersc1731372001-08-04 08:12:36 +0000556 size_t len = strlen(pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000557 if (len+2 > buflen)
558 return NULL;
Tim Petersc1731372001-08-04 08:12:36 +0000559
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000560#ifdef MS_WINDOWS
Tim Petersc1731372001-08-04 08:12:36 +0000561 /* Treat .pyw as if it were .py. The case of ".pyw" must match
562 that used in _PyImport_StandardFiletab. */
563 if (len >= 4 && strcmp(&pathname[len-4], ".pyw") == 0)
564 --len; /* pretend 'w' isn't there */
565#endif
566 memcpy(buf, pathname, len);
567 buf[len] = Py_OptimizeFlag ? 'o' : 'c';
568 buf[len+1] = '\0';
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000569
570 return buf;
571}
572
573
574/* Given a pathname for a Python source file, its time of last
575 modification, and a pathname for a compiled file, check whether the
576 compiled file represents the same version of the source. If so,
577 return a FILE pointer for the compiled file, positioned just after
578 the header; if not, return NULL.
579 Doesn't set an exception. */
580
581static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000582check_compiled_module(char *pathname, long mtime, char *cpathname)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000583{
584 FILE *fp;
585 long magic;
586 long pyc_mtime;
587
588 fp = fopen(cpathname, "rb");
589 if (fp == NULL)
590 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000591 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000592 if (magic != pyc_magic) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000593 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000594 PySys_WriteStderr("# %s has bad magic\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000595 fclose(fp);
596 return NULL;
597 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000598 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000599 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000600 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000601 PySys_WriteStderr("# %s has bad mtime\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000602 fclose(fp);
603 return NULL;
604 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000605 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000606 PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000607 return fp;
608}
609
610
611/* Read a code object from a file and check it for validity */
612
Guido van Rossum79f25d91997-04-29 20:08:16 +0000613static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000614read_compiled_module(char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000615{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000616 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000617
Tim Petersd9b9ac82001-01-28 00:27:39 +0000618 co = PyMarshal_ReadLastObjectFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000619 /* Ugly: rd_object() may return NULL with or without error */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000620 if (co == NULL || !PyCode_Check(co)) {
621 if (!PyErr_Occurred())
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000622 PyErr_Format(PyExc_ImportError,
623 "Non-code object in %.200s", cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000624 Py_XDECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000625 return NULL;
626 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000627 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000628}
629
630
631/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000632 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000633
Guido van Rossum79f25d91997-04-29 20:08:16 +0000634static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000635load_compiled_module(char *name, char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000636{
637 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000638 PyCodeObject *co;
639 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000640
Guido van Rossum79f25d91997-04-29 20:08:16 +0000641 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000642 if (magic != pyc_magic) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000643 PyErr_Format(PyExc_ImportError,
644 "Bad magic number in %.200s", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000645 return NULL;
646 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000647 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000648 co = read_compiled_module(cpathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000649 if (co == NULL)
650 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000651 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000652 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000653 name, cpathname);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000654 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000655 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000656
657 return m;
658}
659
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000660/* Parse a source file and return the corresponding code object */
661
Guido van Rossum79f25d91997-04-29 20:08:16 +0000662static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000663parse_source_module(char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000664{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000665 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000666 node *n;
667
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000668 n = PyParser_SimpleParseFile(fp, pathname, Py_file_input);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000669 if (n == NULL)
670 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000671 co = PyNode_Compile(n, pathname);
672 PyNode_Free(n);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000673
674 return co;
675}
676
677
Guido van Rossum55a83382000-09-20 20:31:38 +0000678/* Helper to open a bytecode file for writing in exclusive mode */
679
680static FILE *
681open_exclusive(char *filename)
682{
683#if defined(O_EXCL)&&defined(O_CREAT)&&defined(O_WRONLY)&&defined(O_TRUNC)
684 /* Use O_EXCL to avoid a race condition when another process tries to
685 write the same file. When that happens, our open() call fails,
686 which is just fine (since it's only a cache).
687 XXX If the file exists and is writable but the directory is not
688 writable, the file will never be written. Oh well.
689 */
690 int fd;
691 (void) unlink(filename);
Tim Peters42c83af2000-09-29 04:03:10 +0000692 fd = open(filename, O_EXCL|O_CREAT|O_WRONLY|O_TRUNC
693#ifdef O_BINARY
694 |O_BINARY /* necessary for Windows */
695#endif
Tim Peters50d8d372001-02-28 05:34:27 +0000696
Tim Peters42c83af2000-09-29 04:03:10 +0000697 , 0666);
Guido van Rossum55a83382000-09-20 20:31:38 +0000698 if (fd < 0)
699 return NULL;
700 return fdopen(fd, "wb");
701#else
702 /* Best we can do -- on Windows this can't happen anyway */
703 return fopen(filename, "wb");
704#endif
705}
706
707
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000708/* Write a compiled module to a file, placing the time of last
709 modification of its source into the header.
710 Errors are ignored, if a write error occurs an attempt is made to
711 remove the file. */
712
713static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000714write_compiled_module(PyCodeObject *co, char *cpathname, long mtime)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000715{
716 FILE *fp;
717
Guido van Rossum55a83382000-09-20 20:31:38 +0000718 fp = open_exclusive(cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000719 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000720 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000721 PySys_WriteStderr(
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000722 "# can't create %s\n", cpathname);
723 return;
724 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000725 PyMarshal_WriteLongToFile(pyc_magic, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000726 /* First write a 0 for mtime */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000727 PyMarshal_WriteLongToFile(0L, fp);
728 PyMarshal_WriteObjectToFile((PyObject *)co, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000729 if (ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000730 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000731 PySys_WriteStderr("# can't write %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000732 /* Don't keep partial file */
733 fclose(fp);
734 (void) unlink(cpathname);
735 return;
736 }
737 /* Now write the true mtime */
738 fseek(fp, 4L, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000739 PyMarshal_WriteLongToFile(mtime, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000740 fflush(fp);
741 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000742 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000743 PySys_WriteStderr("# wrote %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000744#ifdef macintosh
Jack Jansencbf630f2000-07-11 21:59:16 +0000745 PyMac_setfiletype(cpathname, 'Pyth', 'PYC ');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000746#endif
747}
748
749
750/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000751 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
752 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000753
Guido van Rossum79f25d91997-04-29 20:08:16 +0000754static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000755load_source_module(char *name, char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000756{
Fred Drake4c82b232000-06-30 16:18:57 +0000757 time_t mtime;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000758 FILE *fpc;
759 char buf[MAXPATHLEN+1];
760 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000761 PyCodeObject *co;
762 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000763
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000764 mtime = PyOS_GetLastModificationTime(pathname, fp);
Fred Drakec63d3e92001-03-01 06:33:32 +0000765 if (mtime == (time_t)(-1))
Fred Drake4c82b232000-06-30 16:18:57 +0000766 return NULL;
767#if SIZEOF_TIME_T > 4
768 /* Python's .pyc timestamp handling presumes that the timestamp fits
769 in 4 bytes. This will be fine until sometime in the year 2038,
770 when a 4-byte signed time_t will overflow.
771 */
772 if (mtime >> 32) {
773 PyErr_SetString(PyExc_OverflowError,
Fred Drakec63d3e92001-03-01 06:33:32 +0000774 "modification time overflows a 4 byte field");
Fred Drake4c82b232000-06-30 16:18:57 +0000775 return NULL;
776 }
777#endif
Tim Peters36515e22001-11-18 04:06:29 +0000778 cpathname = make_compiled_pathname(pathname, buf,
Jeremy Hylton37832f02001-04-13 17:50:20 +0000779 (size_t)MAXPATHLEN + 1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000780 if (cpathname != NULL &&
781 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000782 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000783 fclose(fpc);
784 if (co == NULL)
785 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000786 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000787 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000788 name, cpathname);
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000789 pathname = cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000790 }
791 else {
792 co = parse_source_module(pathname, fp);
793 if (co == NULL)
794 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000795 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000796 PySys_WriteStderr("import %s # from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000797 name, pathname);
798 write_compiled_module(co, cpathname, mtime);
799 }
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000800 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000801 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000802
803 return m;
804}
805
806
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000807/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +0000808static PyObject *load_module(char *, FILE *, char *, int);
809static struct filedescr *find_module(char *, PyObject *,
810 char *, size_t, FILE **);
811static struct _frozen *find_frozen(char *name);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000812
813/* Load a package and return its module object WITH INCREMENTED
814 REFERENCE COUNT */
815
816static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000817load_package(char *name, char *pathname)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000818{
819 PyObject *m, *d, *file, *path;
820 int err;
821 char buf[MAXPATHLEN+1];
822 FILE *fp = NULL;
823 struct filedescr *fdp;
824
825 m = PyImport_AddModule(name);
826 if (m == NULL)
827 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000828 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000829 PySys_WriteStderr("import %s # directory %s\n",
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000830 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000831 d = PyModule_GetDict(m);
832 file = PyString_FromString(pathname);
833 if (file == NULL)
834 return NULL;
835 path = Py_BuildValue("[O]", file);
836 if (path == NULL) {
837 Py_DECREF(file);
838 return NULL;
839 }
840 err = PyDict_SetItemString(d, "__file__", file);
841 if (err == 0)
842 err = PyDict_SetItemString(d, "__path__", path);
843 if (err != 0) {
844 m = NULL;
845 goto cleanup;
846 }
847 buf[0] = '\0';
848 fdp = find_module("__init__", path, buf, sizeof(buf), &fp);
849 if (fdp == NULL) {
850 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
851 PyErr_Clear();
852 }
853 else
854 m = NULL;
855 goto cleanup;
856 }
857 m = load_module(name, fp, buf, fdp->type);
858 if (fp != NULL)
859 fclose(fp);
860 cleanup:
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000861 Py_XDECREF(path);
862 Py_XDECREF(file);
863 return m;
864}
865
866
867/* Helper to test for built-in module */
868
869static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000870is_builtin(char *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000871{
872 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +0000873 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
874 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
875 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000876 return -1;
877 else
878 return 1;
879 }
880 }
881 return 0;
882}
883
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000884
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000885/* Search the path (default sys.path) for a module. Return the
886 corresponding filedescr struct, and (via return arguments) the
887 pathname and an open file. Return NULL if the module is not found. */
888
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000889#ifdef MS_COREDLL
Thomas Woutersb4bd21c2000-07-22 23:38:01 +0000890extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **,
891 char *, int);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000892#endif
893
Tim Peters50d8d372001-02-28 05:34:27 +0000894static int case_ok(char *, int, int, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000895static int find_init_module(char *); /* Forward */
Guido van Rossum197346f1997-10-31 18:38:52 +0000896
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000897static struct filedescr *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000898find_module(char *realname, PyObject *path, char *buf, size_t buflen,
899 FILE **p_fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000900{
Fred Drake4c82b232000-06-30 16:18:57 +0000901 int i, npath;
902 size_t len, namelen;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000903 struct filedescr *fdp = NULL;
Jack Jansenc88da1f2002-05-28 10:58:19 +0000904 char *filemode;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000905 FILE *fp = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000906#ifndef RISCOS
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000907 struct stat statbuf;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000908#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000909 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
910 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
911 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossum0506a431998-08-11 15:07:39 +0000912 char name[MAXPATHLEN+1];
Andrew MacIntyred9400542002-02-26 11:41:34 +0000913#if defined(PYOS_OS2)
914 size_t saved_len;
915 size_t saved_namelen;
916 char *saved_buf = NULL;
917#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000918
Fred Drake4c82b232000-06-30 16:18:57 +0000919 if (strlen(realname) > MAXPATHLEN) {
Guido van Rossum8f4d3312001-10-18 18:54:11 +0000920 PyErr_SetString(PyExc_OverflowError,
921 "module name is too long");
Fred Drake4c82b232000-06-30 16:18:57 +0000922 return NULL;
923 }
Guido van Rossum0506a431998-08-11 15:07:39 +0000924 strcpy(name, realname);
925
926 if (path != NULL && PyString_Check(path)) {
Guido van Rossum8f4d3312001-10-18 18:54:11 +0000927 /* The only type of submodule allowed inside a "frozen"
928 package are other frozen modules or packages. */
Guido van Rossum0506a431998-08-11 15:07:39 +0000929 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
930 PyErr_SetString(PyExc_ImportError,
931 "full frozen module name too long");
932 return NULL;
933 }
934 strcpy(buf, PyString_AsString(path));
935 strcat(buf, ".");
936 strcat(buf, name);
937 strcpy(name, buf);
Jack Jansen550fdae2001-10-30 13:08:39 +0000938#ifdef macintosh
939 /* Freezing on the mac works different, and the modules are
940 ** actually on sys.path. So we don't take the quick exit but
941 ** continue with the normal flow.
942 */
943 path = NULL;
944#else
Guido van Rossum8f4d3312001-10-18 18:54:11 +0000945 if (find_frozen(name) != NULL) {
946 strcpy(buf, name);
947 return &fd_frozen;
948 }
949 PyErr_Format(PyExc_ImportError,
950 "No frozen submodule named %.200s", name);
951 return NULL;
Jack Jansen550fdae2001-10-30 13:08:39 +0000952#endif
Guido van Rossum0506a431998-08-11 15:07:39 +0000953 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000954 if (path == NULL) {
955 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000956 strcpy(buf, name);
957 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000958 }
Greg Ward201baee2001-10-04 14:52:06 +0000959 if ((find_frozen(name)) != NULL) {
Guido van Rossuma5568d31998-03-05 03:45:08 +0000960 strcpy(buf, name);
961 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000962 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000963
Guido van Rossumac279101996-08-22 23:10:58 +0000964#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000965 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
966 if (fp != NULL) {
967 *p_fp = fp;
968 return fdp;
969 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000970#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +0000971 path = PySys_GetObject("path");
972 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000973 if (path == NULL || !PyList_Check(path)) {
974 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +0000975 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000976 return NULL;
977 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000978 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000979 namelen = strlen(name);
980 for (i = 0; i < npath; i++) {
Walter Dörwald3430d702002-06-17 10:43:59 +0000981 PyObject *copy = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000982 PyObject *v = PyList_GetItem(path, i);
Walter Dörwald3430d702002-06-17 10:43:59 +0000983#ifdef Py_USING_UNICODE
984 if (PyUnicode_Check(v)) {
985 copy = PyUnicode_Encode(PyUnicode_AS_UNICODE(v),
986 PyUnicode_GET_SIZE(v), Py_FileSystemDefaultEncoding, NULL);
987 if (copy == NULL)
988 return NULL;
989 v = copy;
990 }
991 else
992#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +0000993 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000994 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000995 len = PyString_Size(v);
Walter Dörwald3430d702002-06-17 10:43:59 +0000996 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen) {
997 Py_XDECREF(copy);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000998 continue; /* Too long */
Walter Dörwald3430d702002-06-17 10:43:59 +0000999 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001000 strcpy(buf, PyString_AsString(v));
Walter Dörwald3430d702002-06-17 10:43:59 +00001001 if (strlen(buf) != len) {
1002 Py_XDECREF(copy);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001003 continue; /* v contains '\0' */
Walter Dörwald3430d702002-06-17 10:43:59 +00001004 }
Jack Jansen9c96a921995-02-15 22:57:06 +00001005#ifdef macintosh
Tim Peters50d8d372001-02-28 05:34:27 +00001006 /*
Guido van Rossum741689d1997-08-12 14:53:39 +00001007 ** Speedup: each sys.path item is interned, and
1008 ** FindResourceModule remembers which items refer to
1009 ** folders (so we don't have to bother trying to look
Tim Peters50d8d372001-02-28 05:34:27 +00001010 ** into them for resources).
Guido van Rossum741689d1997-08-12 14:53:39 +00001011 */
1012 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
1013 v = PyList_GET_ITEM(path, i);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001014 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001015 static struct filedescr resfiledescr =
1016 {"", "", PY_RESOURCE};
Tim Peters50d8d372001-02-28 05:34:27 +00001017
Walter Dörwald3430d702002-06-17 10:43:59 +00001018 Py_XDECREF(copy);
Jack Jansen9c96a921995-02-15 22:57:06 +00001019 return &resfiledescr;
1020 }
Guido van Rossum0f84a341998-08-06 13:36:01 +00001021 if (PyMac_FindCodeResourceModule((PyStringObject *)v, name, buf)) {
1022 static struct filedescr resfiledescr =
1023 {"", "", PY_CODERESOURCE};
Tim Peters50d8d372001-02-28 05:34:27 +00001024
Walter Dörwald3430d702002-06-17 10:43:59 +00001025 Py_XDECREF(copy);
Guido van Rossum0f84a341998-08-06 13:36:01 +00001026 return &resfiledescr;
1027 }
Jack Jansen9c96a921995-02-15 22:57:06 +00001028#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001029 if (len > 0 && buf[len-1] != SEP
1030#ifdef ALTSEP
1031 && buf[len-1] != ALTSEP
1032#endif
1033 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001034 buf[len++] = SEP;
Guido van Rossum215c3402000-11-13 17:26:32 +00001035 strcpy(buf+len, name);
1036 len += namelen;
Tim Peters50d8d372001-02-28 05:34:27 +00001037
1038 /* Check for package import (buf holds a directory name,
1039 and there's an __init__ module in that directory */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001040#ifdef HAVE_STAT
Walter Dörwald3430d702002-06-17 10:43:59 +00001041 if (stat(buf, &statbuf) == 0 && /* it exists */
1042 S_ISDIR(statbuf.st_mode) && /* it's a directory */
1043 find_init_module(buf) && /* it has __init__.py */
1044 case_ok(buf, len, namelen, name)) { /* and case matches */
1045 Py_XDECREF(copy);
Tim Peterscab3f682001-04-29 22:21:25 +00001046 return &fd_package;
Walter Dörwald3430d702002-06-17 10:43:59 +00001047 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001048#else
1049 /* XXX How are you going to test for directories? */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001050#ifdef RISCOS
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001051 if (isdir(buf) &&
1052 find_init_module(buf) &&
Walter Dörwald3430d702002-06-17 10:43:59 +00001053 case_ok(buf, len, namelen, name)) {
1054 Py_XDECREF(copy);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001055 return &fd_package;
Walter Dörwald3430d702002-06-17 10:43:59 +00001056 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001057#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001058#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +00001059#ifdef macintosh
1060 fdp = PyMac_FindModuleExtension(buf, &len, name);
Jack Jansen4df3c522001-03-20 23:09:54 +00001061 if (fdp) {
Guido van Rossum9a61dc91997-10-08 15:25:08 +00001062#else
Andrew MacIntyred9400542002-02-26 11:41:34 +00001063#if defined(PYOS_OS2)
1064 /* take a snapshot of the module spec for restoration
1065 * after the 8 character DLL hackery
1066 */
1067 saved_buf = strdup(buf);
1068 saved_len = len;
1069 saved_namelen = namelen;
1070#endif /* PYOS_OS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001071 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Andrew MacIntyred9400542002-02-26 11:41:34 +00001072#if defined(PYOS_OS2)
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001073 /* OS/2 limits DLLs to 8 character names (w/o
1074 extension)
Andrew MacIntyred9400542002-02-26 11:41:34 +00001075 * so if the name is longer than that and its a
1076 * dynamically loaded module we're going to try,
1077 * truncate the name before trying
1078 */
1079 if (strlen(realname) > 8) {
1080 /* is this an attempt to load a C extension? */
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001081 const struct filedescr *scan;
1082 scan = _PyImport_DynLoadFiletab;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001083 while (scan->suffix != NULL) {
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001084 if (!strcmp(scan->suffix, fdp->suffix))
Andrew MacIntyred9400542002-02-26 11:41:34 +00001085 break;
1086 else
1087 scan++;
1088 }
1089 if (scan->suffix != NULL) {
1090 /* yes, so truncate the name */
1091 namelen = 8;
1092 len -= strlen(realname) - namelen;
1093 buf[len] = '\0';
1094 }
1095 }
1096#endif /* PYOS_OS2 */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001097 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001098 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001099 PySys_WriteStderr("# trying %s\n", buf);
Jack Jansen4df3c522001-03-20 23:09:54 +00001100#endif /* !macintosh */
Jack Jansenc88da1f2002-05-28 10:58:19 +00001101 filemode = fdp->mode;
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001102 if (filemode[0] == 'U')
1103 filemode = "r" PY_STDIOTEXTMODE;
Jack Jansenc88da1f2002-05-28 10:58:19 +00001104 fp = fopen(buf, filemode);
Tim Peters50d8d372001-02-28 05:34:27 +00001105 if (fp != NULL) {
1106 if (case_ok(buf, len, namelen, name))
1107 break;
1108 else { /* continue search */
1109 fclose(fp);
1110 fp = NULL;
Barry Warsaw914a0b12001-02-02 19:12:16 +00001111 }
Barry Warsaw914a0b12001-02-02 19:12:16 +00001112 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001113#if defined(PYOS_OS2)
1114 /* restore the saved snapshot */
1115 strcpy(buf, saved_buf);
1116 len = saved_len;
1117 namelen = saved_namelen;
1118#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001119 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001120#if defined(PYOS_OS2)
1121 /* don't need/want the module name snapshot anymore */
1122 if (saved_buf)
1123 {
1124 free(saved_buf);
1125 saved_buf = NULL;
1126 }
1127#endif
Walter Dörwald3430d702002-06-17 10:43:59 +00001128 Py_XDECREF(copy);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001129 if (fp != NULL)
1130 break;
1131 }
1132 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001133 PyErr_Format(PyExc_ImportError,
1134 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001135 return NULL;
1136 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001137 *p_fp = fp;
1138 return fdp;
1139}
1140
Tim Petersd1e87a82001-03-01 18:12:00 +00001141/* case_ok(char* buf, int len, int namelen, char* name)
1142 * The arguments here are tricky, best shown by example:
1143 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1144 * ^ ^ ^ ^
1145 * |--------------------- buf ---------------------|
1146 * |------------------- len ------------------|
1147 * |------ name -------|
1148 * |----- namelen -----|
1149 * buf is the full path, but len only counts up to (& exclusive of) the
1150 * extension. name is the module name, also exclusive of extension.
1151 *
1152 * We've already done a successful stat() or fopen() on buf, so know that
1153 * there's some match, possibly case-insensitive.
1154 *
Tim Peters50d8d372001-02-28 05:34:27 +00001155 * case_ok() is to return 1 if there's a case-sensitive match for
1156 * name, else 0. case_ok() is also to return 1 if envar PYTHONCASEOK
1157 * exists.
Tim Petersd1e87a82001-03-01 18:12:00 +00001158 *
Tim Peters50d8d372001-02-28 05:34:27 +00001159 * case_ok() is used to implement case-sensitive import semantics even
1160 * on platforms with case-insensitive filesystems. It's trivial to implement
1161 * for case-sensitive filesystems. It's pretty much a cross-platform
1162 * nightmare for systems with case-insensitive filesystems.
1163 */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001164
Tim Peters50d8d372001-02-28 05:34:27 +00001165/* First we may need a pile of platform-specific header files; the sequence
1166 * of #if's here should match the sequence in the body of case_ok().
1167 */
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001168#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001169#include <windows.h>
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001170#ifdef __CYGWIN__
1171#include <sys/cygwin.h>
1172#endif
1173
Tim Peters50d8d372001-02-28 05:34:27 +00001174#elif defined(DJGPP)
1175#include <dir.h>
1176
1177#elif defined(macintosh)
1178#include <TextUtils.h>
Tim Peters50d8d372001-02-28 05:34:27 +00001179
Tim Petersd1e87a82001-03-01 18:12:00 +00001180#elif defined(__MACH__) && defined(__APPLE__) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001181#include <sys/types.h>
1182#include <dirent.h>
1183
Andrew MacIntyred9400542002-02-26 11:41:34 +00001184#elif defined(PYOS_OS2)
1185#define INCL_DOS
1186#define INCL_DOSERRORS
1187#define INCL_NOPMAPI
1188#include <os2.h>
1189
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001190#elif defined(RISCOS)
1191#include "oslib/osfscontrol.h"
Tim Peters50d8d372001-02-28 05:34:27 +00001192#endif
1193
Guido van Rossum0980bd91998-02-13 17:18:36 +00001194static int
Tim Peters50d8d372001-02-28 05:34:27 +00001195case_ok(char *buf, int len, int namelen, char *name)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001196{
Tim Peters50d8d372001-02-28 05:34:27 +00001197/* Pick a platform-specific implementation; the sequence of #if's here should
1198 * match the sequence just above.
1199 */
1200
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001201/* MS_WINDOWS || __CYGWIN__ */
1202#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001203 WIN32_FIND_DATA data;
1204 HANDLE h;
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001205#ifdef __CYGWIN__
1206 char tempbuf[MAX_PATH];
1207#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001208
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001209 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001210 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001211
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001212#ifdef __CYGWIN__
1213 cygwin32_conv_to_win32_path(buf, tempbuf);
1214 h = FindFirstFile(tempbuf, &data);
1215#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001216 h = FindFirstFile(buf, &data);
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001217#endif
Guido van Rossum0980bd91998-02-13 17:18:36 +00001218 if (h == INVALID_HANDLE_VALUE) {
1219 PyErr_Format(PyExc_NameError,
1220 "Can't find file for module %.100s\n(filename %.300s)",
1221 name, buf);
1222 return 0;
1223 }
1224 FindClose(h);
Tim Peters50d8d372001-02-28 05:34:27 +00001225 return strncmp(data.cFileName, name, namelen) == 0;
1226
1227/* DJGPP */
1228#elif defined(DJGPP)
1229 struct ffblk ffblk;
1230 int done;
1231
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001232 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001233 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001234
1235 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
1236 if (done) {
Guido van Rossum0980bd91998-02-13 17:18:36 +00001237 PyErr_Format(PyExc_NameError,
Tim Peters50d8d372001-02-28 05:34:27 +00001238 "Can't find file for module %.100s\n(filename %.300s)",
Guido van Rossum0980bd91998-02-13 17:18:36 +00001239 name, buf);
1240 return 0;
1241 }
Tim Peters50d8d372001-02-28 05:34:27 +00001242 return strncmp(ffblk.ff_name, name, namelen) == 0;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001243
Tim Peters50d8d372001-02-28 05:34:27 +00001244/* macintosh */
1245#elif defined(macintosh)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001246 FSSpec fss;
1247 OSErr err;
Tim Peters50d8d372001-02-28 05:34:27 +00001248
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001249 if (Py_GETENV("PYTHONCASEOK") != NULL)
Tim Peters50d8d372001-02-28 05:34:27 +00001250 return 1;
1251
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001252 err = FSMakeFSSpec(0, 0, Pstring(buf), &fss);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001253 if (err) {
1254 PyErr_Format(PyExc_NameError,
Guido van Rossuma0f0a331998-09-14 13:40:53 +00001255 "Can't find file for module %.100s\n(filename %.300s)",
1256 name, buf);
Guido van Rossum0980bd91998-02-13 17:18:36 +00001257 return 0;
1258 }
Tim Peters50d8d372001-02-28 05:34:27 +00001259 return fss.name[0] >= namelen &&
1260 strncmp(name, (char *)fss.name+1, namelen) == 0;
1261
Tim Peters677898a2001-03-02 03:28:03 +00001262/* new-fangled macintosh (macosx) */
Tim Petersd1e87a82001-03-01 18:12:00 +00001263#elif defined(__MACH__) && defined(__APPLE__) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001264 DIR *dirp;
1265 struct dirent *dp;
Tim Petersd1e87a82001-03-01 18:12:00 +00001266 char dirname[MAXPATHLEN + 1];
1267 const int dirlen = len - namelen - 1; /* don't want trailing SEP */
Tim Peters430f5d42001-03-01 01:30:56 +00001268
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001269 if (Py_GETENV("PYTHONCASEOK") != NULL)
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001270 return 1;
1271
Tim Petersd1e87a82001-03-01 18:12:00 +00001272 /* Copy the dir component into dirname; substitute "." if empty */
1273 if (dirlen <= 0) {
1274 dirname[0] = '.';
1275 dirname[1] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001276 }
1277 else {
Tim Petersd1e87a82001-03-01 18:12:00 +00001278 assert(dirlen <= MAXPATHLEN);
1279 memcpy(dirname, buf, dirlen);
1280 dirname[dirlen] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001281 }
1282 /* Open the directory and search the entries for an exact match. */
Tim Petersd1e87a82001-03-01 18:12:00 +00001283 dirp = opendir(dirname);
Tim Peters430f5d42001-03-01 01:30:56 +00001284 if (dirp) {
Tim Peters677898a2001-03-02 03:28:03 +00001285 char *nameWithExt = buf + len - namelen;
Tim Peters430f5d42001-03-01 01:30:56 +00001286 while ((dp = readdir(dirp)) != NULL) {
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001287 const int thislen =
Tim Peters430f5d42001-03-01 01:30:56 +00001288#ifdef _DIRENT_HAVE_D_NAMELEN
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001289 dp->d_namlen;
Tim Peters430f5d42001-03-01 01:30:56 +00001290#else
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001291 strlen(dp->d_name);
Tim Peters430f5d42001-03-01 01:30:56 +00001292#endif
Tim Petersd1e87a82001-03-01 18:12:00 +00001293 if (thislen >= namelen &&
Tim Peters677898a2001-03-02 03:28:03 +00001294 strcmp(dp->d_name, nameWithExt) == 0) {
Tim Peters430f5d42001-03-01 01:30:56 +00001295 (void)closedir(dirp);
1296 return 1; /* Found */
1297 }
1298 }
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001299 (void)closedir(dirp);
Tim Peters430f5d42001-03-01 01:30:56 +00001300 }
Tim Peters430f5d42001-03-01 01:30:56 +00001301 return 0 ; /* Not found */
Tim Peters430f5d42001-03-01 01:30:56 +00001302
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001303/* RISC OS */
1304#elif defined(RISCOS)
1305 char canon[MAXPATHLEN+1]; /* buffer for the canonical form of the path */
1306 char buf2[MAXPATHLEN+2];
1307 char *nameWithExt = buf+len-namelen;
1308 int canonlen;
1309 os_error *e;
1310
1311 if (Py_GETENV("PYTHONCASEOK") != NULL)
1312 return 1;
1313
1314 /* workaround:
1315 append wildcard, otherwise case of filename wouldn't be touched */
1316 strcpy(buf2, buf);
1317 strcat(buf2, "*");
1318
1319 e = xosfscontrol_canonicalise_path(buf2,canon,0,0,MAXPATHLEN+1,&canonlen);
1320 canonlen = MAXPATHLEN+1-canonlen;
1321 if (e || canonlen<=0 || canonlen>(MAXPATHLEN+1) )
1322 return 0;
1323 if (strcmp(nameWithExt, canon+canonlen-strlen(nameWithExt))==0)
1324 return 1; /* match */
1325
1326 return 0;
1327
Andrew MacIntyred9400542002-02-26 11:41:34 +00001328/* OS/2 */
1329#elif defined(PYOS_OS2)
1330 HDIR hdir = 1;
1331 ULONG srchcnt = 1;
1332 FILEFINDBUF3 ffbuf;
1333 APIRET rc;
1334
1335 if (getenv("PYTHONCASEOK") != NULL)
1336 return 1;
1337
1338 rc = DosFindFirst(buf,
1339 &hdir,
1340 FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY,
1341 &ffbuf, sizeof(ffbuf),
1342 &srchcnt,
1343 FIL_STANDARD);
1344 if (rc != NO_ERROR)
1345 return 0;
1346 return strncmp(ffbuf.achName, name, namelen) == 0;
1347
Tim Peters50d8d372001-02-28 05:34:27 +00001348/* assuming it's a case-sensitive filesystem, so there's nothing to do! */
1349#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001350 return 1;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001351
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001352#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001353}
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001354
Guido van Rossum0980bd91998-02-13 17:18:36 +00001355
Guido van Rossum197346f1997-10-31 18:38:52 +00001356#ifdef HAVE_STAT
1357/* Helper to look for __init__.py or __init__.py[co] in potential package */
1358static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001359find_init_module(char *buf)
Guido van Rossum197346f1997-10-31 18:38:52 +00001360{
Tim Peters0f9431f2001-07-05 03:47:53 +00001361 const size_t save_len = strlen(buf);
Fred Drake4c82b232000-06-30 16:18:57 +00001362 size_t i = save_len;
Tim Peters0f9431f2001-07-05 03:47:53 +00001363 char *pname; /* pointer to start of __init__ */
Guido van Rossum197346f1997-10-31 18:38:52 +00001364 struct stat statbuf;
1365
Tim Peters0f9431f2001-07-05 03:47:53 +00001366/* For calling case_ok(buf, len, namelen, name):
1367 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1368 * ^ ^ ^ ^
1369 * |--------------------- buf ---------------------|
1370 * |------------------- len ------------------|
1371 * |------ name -------|
1372 * |----- namelen -----|
1373 */
Guido van Rossum197346f1997-10-31 18:38:52 +00001374 if (save_len + 13 >= MAXPATHLEN)
1375 return 0;
1376 buf[i++] = SEP;
Tim Peters0f9431f2001-07-05 03:47:53 +00001377 pname = buf + i;
1378 strcpy(pname, "__init__.py");
Guido van Rossum197346f1997-10-31 18:38:52 +00001379 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001380 if (case_ok(buf,
1381 save_len + 9, /* len("/__init__") */
1382 8, /* len("__init__") */
1383 pname)) {
1384 buf[save_len] = '\0';
1385 return 1;
1386 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001387 }
Tim Peters0f9431f2001-07-05 03:47:53 +00001388 i += strlen(pname);
1389 strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum197346f1997-10-31 18:38:52 +00001390 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001391 if (case_ok(buf,
1392 save_len + 9, /* len("/__init__") */
1393 8, /* len("__init__") */
1394 pname)) {
1395 buf[save_len] = '\0';
1396 return 1;
1397 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001398 }
1399 buf[save_len] = '\0';
1400 return 0;
1401}
Guido van Rossum48a680c2001-03-02 06:34:14 +00001402
1403#else
1404
1405#ifdef RISCOS
1406static int
1407find_init_module(buf)
1408 char *buf;
1409{
1410 int save_len = strlen(buf);
1411 int i = save_len;
1412
1413 if (save_len + 13 >= MAXPATHLEN)
1414 return 0;
1415 buf[i++] = SEP;
1416 strcpy(buf+i, "__init__/py");
1417 if (isfile(buf)) {
1418 buf[save_len] = '\0';
1419 return 1;
1420 }
1421
1422 if (Py_OptimizeFlag)
1423 strcpy(buf+i, "o");
1424 else
1425 strcpy(buf+i, "c");
1426 if (isfile(buf)) {
1427 buf[save_len] = '\0';
1428 return 1;
1429 }
1430 buf[save_len] = '\0';
1431 return 0;
1432}
1433#endif /*RISCOS*/
1434
Guido van Rossum197346f1997-10-31 18:38:52 +00001435#endif /* HAVE_STAT */
1436
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001437
Tim Petersdbd9ba62000-07-09 03:09:57 +00001438static int init_builtin(char *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001439
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001440/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001441 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001442
Guido van Rossum79f25d91997-04-29 20:08:16 +00001443static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001444load_module(char *name, FILE *fp, char *buf, int type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001445{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001446 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001447 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001448 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001449
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001450 /* First check that there's an open file (if we need one) */
1451 switch (type) {
1452 case PY_SOURCE:
1453 case PY_COMPILED:
1454 if (fp == NULL) {
1455 PyErr_Format(PyExc_ValueError,
1456 "file object required for import (type code %d)",
1457 type);
1458 return NULL;
1459 }
1460 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001461
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001462 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001463
1464 case PY_SOURCE:
1465 m = load_source_module(name, buf, fp);
1466 break;
1467
1468 case PY_COMPILED:
1469 m = load_compiled_module(name, buf, fp);
1470 break;
1471
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001472#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001473 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001474 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001475 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001476#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001477
Jack Jansen9c96a921995-02-15 22:57:06 +00001478#ifdef macintosh
1479 case PY_RESOURCE:
1480 m = PyMac_LoadResourceModule(name, buf);
1481 break;
Guido van Rossum0f84a341998-08-06 13:36:01 +00001482 case PY_CODERESOURCE:
1483 m = PyMac_LoadCodeResourceModule(name, buf);
1484 break;
Jack Jansen9c96a921995-02-15 22:57:06 +00001485#endif
1486
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001487 case PKG_DIRECTORY:
1488 m = load_package(name, buf);
1489 break;
1490
1491 case C_BUILTIN:
1492 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001493 if (buf != NULL && buf[0] != '\0')
1494 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001495 if (type == C_BUILTIN)
1496 err = init_builtin(name);
1497 else
1498 err = PyImport_ImportFrozenModule(name);
1499 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001500 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001501 if (err == 0) {
1502 PyErr_Format(PyExc_ImportError,
1503 "Purported %s module %.200s not found",
1504 type == C_BUILTIN ?
1505 "builtin" : "frozen",
1506 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001507 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001508 }
1509 modules = PyImport_GetModuleDict();
1510 m = PyDict_GetItemString(modules, name);
1511 if (m == NULL) {
1512 PyErr_Format(
1513 PyExc_ImportError,
1514 "%s module %.200s not properly initialized",
1515 type == C_BUILTIN ?
1516 "builtin" : "frozen",
1517 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001518 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001519 }
1520 Py_INCREF(m);
1521 break;
1522
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001523 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001524 PyErr_Format(PyExc_ImportError,
1525 "Don't know how to import %.200s (type code %d)",
1526 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001527 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001528
1529 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001530
1531 return m;
1532}
1533
1534
1535/* Initialize a built-in module.
1536 Return 1 for succes, 0 if the module is not found, and -1 with
1537 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001538
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001539static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001540init_builtin(char *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001541{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001542 struct _inittab *p;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001543
Greg Ward201baee2001-10-04 14:52:06 +00001544 if (_PyImport_FindExtension(name, name) != NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00001545 return 1;
1546
Guido van Rossum771c6c81997-10-31 18:37:24 +00001547 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001548 if (strcmp(name, p->name) == 0) {
1549 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001550 PyErr_Format(PyExc_ImportError,
1551 "Cannot re-init internal module %.200s",
1552 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001553 return -1;
1554 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001555 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001556 PySys_WriteStderr("import %s # builtin\n", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001557 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001558 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001559 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001560 if (_PyImport_FixupExtension(name, name) == NULL)
1561 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001562 return 1;
1563 }
1564 }
1565 return 0;
1566}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001567
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001568
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001569/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001570
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001571static struct _frozen *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001572find_frozen(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001573{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001574 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001575
Guido van Rossum79f25d91997-04-29 20:08:16 +00001576 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001577 if (p->name == NULL)
1578 return NULL;
1579 if (strcmp(p->name, name) == 0)
1580 break;
1581 }
1582 return p;
1583}
1584
Guido van Rossum79f25d91997-04-29 20:08:16 +00001585static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001586get_frozen_object(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001587{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001588 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001589 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001590
1591 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001592 PyErr_Format(PyExc_ImportError,
1593 "No such frozen object named %.200s",
1594 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001595 return NULL;
1596 }
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001597 if (p->code == NULL) {
1598 PyErr_Format(PyExc_ImportError,
1599 "Excluded frozen object named %.200s",
1600 name);
1601 return NULL;
1602 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001603 size = p->size;
1604 if (size < 0)
1605 size = -size;
1606 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001607}
1608
1609/* Initialize a frozen module.
1610 Return 1 for succes, 0 if the module is not found, and -1 with
1611 an exception set if the initialization failed.
1612 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001613
1614int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001615PyImport_ImportFrozenModule(char *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001616{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001617 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001618 PyObject *co;
1619 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001620 int ispackage;
1621 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001622
1623 if (p == NULL)
1624 return 0;
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001625 if (p->code == NULL) {
1626 PyErr_Format(PyExc_ImportError,
1627 "Excluded frozen object named %.200s",
1628 name);
1629 return -1;
1630 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001631 size = p->size;
1632 ispackage = (size < 0);
1633 if (ispackage)
1634 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001635 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001636 PySys_WriteStderr("import %s # frozen%s\n",
Guido van Rossuma5568d31998-03-05 03:45:08 +00001637 name, ispackage ? " package" : "");
1638 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001639 if (co == NULL)
1640 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001641 if (!PyCode_Check(co)) {
1642 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001643 PyErr_Format(PyExc_TypeError,
1644 "frozen object %.200s is not a code object",
1645 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001646 return -1;
1647 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001648 if (ispackage) {
1649 /* Set __path__ to the package name */
1650 PyObject *d, *s;
1651 int err;
1652 m = PyImport_AddModule(name);
1653 if (m == NULL)
1654 return -1;
1655 d = PyModule_GetDict(m);
1656 s = PyString_InternFromString(name);
1657 if (s == NULL)
1658 return -1;
1659 err = PyDict_SetItemString(d, "__path__", s);
1660 Py_DECREF(s);
1661 if (err != 0)
1662 return err;
1663 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001664 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001665 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001666 if (m == NULL)
1667 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001668 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001669 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001670}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001671
1672
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001673/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001674 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001675
Guido van Rossum79f25d91997-04-29 20:08:16 +00001676PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001677PyImport_ImportModule(char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00001678{
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00001679 PyObject *pname;
1680 PyObject *result;
1681
1682 pname = PyString_FromString(name);
1683 result = PyImport_Import(pname);
1684 Py_DECREF(pname);
1685 return result;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001686}
1687
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001688/* Forward declarations for helper routines */
Tim Petersdbd9ba62000-07-09 03:09:57 +00001689static PyObject *get_parent(PyObject *globals, char *buf, int *p_buflen);
1690static PyObject *load_next(PyObject *mod, PyObject *altmod,
1691 char **p_name, char *buf, int *p_buflen);
1692static int mark_miss(char *name);
1693static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
1694 char *buf, int buflen, int recursive);
1695static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001696
1697/* The Magnum Opus of dotted-name import :-) */
1698
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001699static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001700import_module_ex(char *name, PyObject *globals, PyObject *locals,
1701 PyObject *fromlist)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001702{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001703 char buf[MAXPATHLEN+1];
1704 int buflen = 0;
1705 PyObject *parent, *head, *next, *tail;
1706
1707 parent = get_parent(globals, buf, &buflen);
1708 if (parent == NULL)
1709 return NULL;
1710
1711 head = load_next(parent, Py_None, &name, buf, &buflen);
1712 if (head == NULL)
1713 return NULL;
1714
1715 tail = head;
1716 Py_INCREF(tail);
1717 while (name) {
1718 next = load_next(tail, tail, &name, buf, &buflen);
1719 Py_DECREF(tail);
1720 if (next == NULL) {
1721 Py_DECREF(head);
1722 return NULL;
1723 }
1724 tail = next;
1725 }
1726
1727 if (fromlist != NULL) {
1728 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1729 fromlist = NULL;
1730 }
1731
1732 if (fromlist == NULL) {
1733 Py_DECREF(tail);
1734 return head;
1735 }
1736
1737 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001738 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001739 Py_DECREF(tail);
1740 return NULL;
1741 }
1742
1743 return tail;
1744}
1745
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001746PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001747PyImport_ImportModuleEx(char *name, PyObject *globals, PyObject *locals,
1748 PyObject *fromlist)
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001749{
1750 PyObject *result;
1751 lock_import();
Guido van Rossumd65911b1998-03-03 22:33:27 +00001752 result = import_module_ex(name, globals, locals, fromlist);
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001753 unlock_import();
1754 return result;
1755}
1756
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001757static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001758get_parent(PyObject *globals, char *buf, int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001759{
1760 static PyObject *namestr = NULL;
1761 static PyObject *pathstr = NULL;
1762 PyObject *modname, *modpath, *modules, *parent;
1763
1764 if (globals == NULL || !PyDict_Check(globals))
1765 return Py_None;
1766
1767 if (namestr == NULL) {
1768 namestr = PyString_InternFromString("__name__");
1769 if (namestr == NULL)
1770 return NULL;
1771 }
1772 if (pathstr == NULL) {
1773 pathstr = PyString_InternFromString("__path__");
1774 if (pathstr == NULL)
1775 return NULL;
1776 }
1777
1778 *buf = '\0';
1779 *p_buflen = 0;
1780 modname = PyDict_GetItem(globals, namestr);
1781 if (modname == NULL || !PyString_Check(modname))
1782 return Py_None;
1783
1784 modpath = PyDict_GetItem(globals, pathstr);
1785 if (modpath != NULL) {
1786 int len = PyString_GET_SIZE(modname);
1787 if (len > MAXPATHLEN) {
1788 PyErr_SetString(PyExc_ValueError,
1789 "Module name too long");
1790 return NULL;
1791 }
1792 strcpy(buf, PyString_AS_STRING(modname));
1793 *p_buflen = len;
1794 }
1795 else {
1796 char *start = PyString_AS_STRING(modname);
1797 char *lastdot = strrchr(start, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001798 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001799 if (lastdot == NULL)
1800 return Py_None;
1801 len = lastdot - start;
1802 if (len >= MAXPATHLEN) {
1803 PyErr_SetString(PyExc_ValueError,
1804 "Module name too long");
1805 return NULL;
1806 }
1807 strncpy(buf, start, len);
1808 buf[len] = '\0';
1809 *p_buflen = len;
1810 }
1811
1812 modules = PyImport_GetModuleDict();
1813 parent = PyDict_GetItemString(modules, buf);
1814 if (parent == NULL)
1815 parent = Py_None;
1816 return parent;
1817 /* We expect, but can't guarantee, if parent != None, that:
1818 - parent.__name__ == buf
1819 - parent.__dict__ is globals
1820 If this is violated... Who cares? */
1821}
1822
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001823/* altmod is either None or same as mod */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001824static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001825load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
1826 int *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001827{
1828 char *name = *p_name;
1829 char *dot = strchr(name, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00001830 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001831 char *p;
1832 PyObject *result;
1833
1834 if (dot == NULL) {
1835 *p_name = NULL;
1836 len = strlen(name);
1837 }
1838 else {
1839 *p_name = dot+1;
1840 len = dot-name;
1841 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00001842 if (len == 0) {
1843 PyErr_SetString(PyExc_ValueError,
1844 "Empty module name");
1845 return NULL;
1846 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001847
1848 p = buf + *p_buflen;
1849 if (p != buf)
1850 *p++ = '.';
1851 if (p+len-buf >= MAXPATHLEN) {
1852 PyErr_SetString(PyExc_ValueError,
1853 "Module name too long");
1854 return NULL;
1855 }
1856 strncpy(p, name, len);
1857 p[len] = '\0';
1858 *p_buflen = p+len-buf;
1859
1860 result = import_submodule(mod, p, buf);
1861 if (result == Py_None && altmod != mod) {
1862 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001863 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001864 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001865 if (result != NULL && result != Py_None) {
1866 if (mark_miss(buf) != 0) {
1867 Py_DECREF(result);
1868 return NULL;
1869 }
1870 strncpy(buf, name, len);
1871 buf[len] = '\0';
1872 *p_buflen = len;
1873 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001874 }
1875 if (result == NULL)
1876 return NULL;
1877
1878 if (result == Py_None) {
1879 Py_DECREF(result);
1880 PyErr_Format(PyExc_ImportError,
1881 "No module named %.200s", name);
1882 return NULL;
1883 }
1884
1885 return result;
1886}
1887
1888static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001889mark_miss(char *name)
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001890{
1891 PyObject *modules = PyImport_GetModuleDict();
1892 return PyDict_SetItemString(modules, name, Py_None);
1893}
1894
1895static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001896ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, int buflen,
1897 int recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001898{
1899 int i;
1900
1901 if (!PyObject_HasAttrString(mod, "__path__"))
1902 return 1;
1903
1904 for (i = 0; ; i++) {
1905 PyObject *item = PySequence_GetItem(fromlist, i);
1906 int hasit;
1907 if (item == NULL) {
1908 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1909 PyErr_Clear();
1910 return 1;
1911 }
1912 return 0;
1913 }
1914 if (!PyString_Check(item)) {
1915 PyErr_SetString(PyExc_TypeError,
1916 "Item in ``from list'' not a string");
1917 Py_DECREF(item);
1918 return 0;
1919 }
1920 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001921 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001922 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001923 /* See if the package defines __all__ */
1924 if (recursive)
1925 continue; /* Avoid endless recursion */
1926 all = PyObject_GetAttrString(mod, "__all__");
1927 if (all == NULL)
1928 PyErr_Clear();
1929 else {
1930 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1931 return 0;
1932 Py_DECREF(all);
1933 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001934 continue;
1935 }
1936 hasit = PyObject_HasAttr(mod, item);
1937 if (!hasit) {
1938 char *subname = PyString_AS_STRING(item);
1939 PyObject *submod;
1940 char *p;
1941 if (buflen + strlen(subname) >= MAXPATHLEN) {
1942 PyErr_SetString(PyExc_ValueError,
1943 "Module name too long");
1944 Py_DECREF(item);
1945 return 0;
1946 }
1947 p = buf + buflen;
1948 *p++ = '.';
1949 strcpy(p, subname);
1950 submod = import_submodule(mod, subname, buf);
1951 Py_XDECREF(submod);
1952 if (submod == NULL) {
1953 Py_DECREF(item);
1954 return 0;
1955 }
1956 }
1957 Py_DECREF(item);
1958 }
1959
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001960 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001961}
1962
1963static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001964import_submodule(PyObject *mod, char *subname, char *fullname)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001965{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001966 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossumf48f11c2001-07-23 13:27:49 +00001967 PyObject *m, *res = NULL;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001968
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001969 /* Require:
1970 if mod == None: subname == fullname
1971 else: mod.__name__ + "." + subname == fullname
1972 */
1973
Tim Peters50d8d372001-02-28 05:34:27 +00001974 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001975 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001976 }
1977 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001978 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001979 char buf[MAXPATHLEN+1];
1980 struct filedescr *fdp;
1981 FILE *fp = NULL;
1982
Guido van Rossum9c0afe51998-05-19 15:09:05 +00001983 if (mod == Py_None)
1984 path = NULL;
1985 else {
1986 path = PyObject_GetAttrString(mod, "__path__");
1987 if (path == NULL) {
1988 PyErr_Clear();
1989 Py_INCREF(Py_None);
1990 return Py_None;
1991 }
1992 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001993
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001994 buf[0] = '\0';
Guido van Rossumb68cd421998-07-01 17:36:26 +00001995 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1996 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001997 if (fdp == NULL) {
1998 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1999 return NULL;
2000 PyErr_Clear();
2001 Py_INCREF(Py_None);
2002 return Py_None;
2003 }
2004 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002005 if (fp)
2006 fclose(fp);
Guido van Rossumf48f11c2001-07-23 13:27:49 +00002007 if (mod != Py_None) {
2008 /* Irrespective of the success of this load, make a
2009 reference to it in the parent package module.
2010 A copy gets saved in the modules dictionary
2011 under the full name, so get a reference from
2012 there, if need be. (The exception is when
2013 the load failed with a SyntaxError -- then
2014 there's no trace in sys.modules. In that case,
2015 of course, do nothing extra.) */
2016 res = m;
2017 if (res == NULL)
2018 res = PyDict_GetItemString(modules, fullname);
2019 if (res != NULL &&
2020 PyObject_SetAttrString(mod, subname, res) < 0) {
2021 Py_XDECREF(m);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002022 m = NULL;
2023 }
2024 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00002025 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002026
2027 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00002028}
2029
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002030
2031/* Re-import a module of any kind and return its module object, WITH
2032 INCREMENTED REFERENCE COUNT */
2033
Guido van Rossum79f25d91997-04-29 20:08:16 +00002034PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002035PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002036{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002037 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00002038 PyObject *path = NULL;
2039 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002040 char buf[MAXPATHLEN+1];
2041 struct filedescr *fdp;
2042 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002043
Guido van Rossum79f25d91997-04-29 20:08:16 +00002044 if (m == NULL || !PyModule_Check(m)) {
2045 PyErr_SetString(PyExc_TypeError,
2046 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002047 return NULL;
2048 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002049 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002050 if (name == NULL)
2051 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00002052 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002053 PyErr_Format(PyExc_ImportError,
2054 "reload(): module %.200s not in sys.modules",
2055 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002056 return NULL;
2057 }
Guido van Rossum222ef561997-09-06 19:41:09 +00002058 subname = strrchr(name, '.');
2059 if (subname == NULL)
2060 subname = name;
2061 else {
2062 PyObject *parentname, *parent;
2063 parentname = PyString_FromStringAndSize(name, (subname-name));
2064 if (parentname == NULL)
2065 return NULL;
2066 parent = PyDict_GetItem(modules, parentname);
Barry Warsaw38793331999-01-27 17:54:20 +00002067 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00002068 if (parent == NULL) {
2069 PyErr_Format(PyExc_ImportError,
2070 "reload(): parent %.200s not in sys.modules",
2071 name);
2072 return NULL;
2073 }
2074 subname++;
2075 path = PyObject_GetAttrString(parent, "__path__");
2076 if (path == NULL)
2077 PyErr_Clear();
2078 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002079 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00002080 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
2081 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002082 if (fdp == NULL)
2083 return NULL;
2084 m = load_module(name, fp, buf, fdp->type);
2085 if (fp)
2086 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002087 return m;
2088}
2089
2090
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002091/* Higher-level import emulator which emulates the "import" statement
2092 more accurately -- it invokes the __import__() function from the
2093 builtins of the current globals. This means that the import is
2094 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00002095 environment, e.g. by "rexec".
2096 A dummy list ["__doc__"] is passed as the 4th argument so that
2097 e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
2098 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002099
2100PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002101PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002102{
2103 static PyObject *silly_list = NULL;
2104 static PyObject *builtins_str = NULL;
2105 static PyObject *import_str = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002106 PyObject *globals = NULL;
2107 PyObject *import = NULL;
2108 PyObject *builtins = NULL;
2109 PyObject *r = NULL;
2110
2111 /* Initialize constant string objects */
2112 if (silly_list == NULL) {
2113 import_str = PyString_InternFromString("__import__");
2114 if (import_str == NULL)
2115 return NULL;
2116 builtins_str = PyString_InternFromString("__builtins__");
2117 if (builtins_str == NULL)
2118 return NULL;
2119 silly_list = Py_BuildValue("[s]", "__doc__");
2120 if (silly_list == NULL)
2121 return NULL;
2122 }
2123
2124 /* Get the builtins from current globals */
2125 globals = PyEval_GetGlobals();
Guido van Rossum85cd1d62001-02-20 21:43:24 +00002126 if (globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00002127 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002128 builtins = PyObject_GetItem(globals, builtins_str);
2129 if (builtins == NULL)
2130 goto err;
2131 }
2132 else {
2133 /* No globals -- use standard builtins, and fake globals */
2134 PyErr_Clear();
2135
Guido van Rossum85cd1d62001-02-20 21:43:24 +00002136 builtins = PyImport_ImportModuleEx("__builtin__",
2137 NULL, NULL, NULL);
2138 if (builtins == NULL)
2139 return NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002140 globals = Py_BuildValue("{OO}", builtins_str, builtins);
2141 if (globals == NULL)
2142 goto err;
2143 }
2144
2145 /* Get the __import__ function from the builtins */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002146 if (PyDict_Check(builtins)) {
Fred Drakea76ba6e2001-03-06 06:31:15 +00002147 import = PyObject_GetItem(builtins, import_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002148 if (import == NULL)
2149 PyErr_SetObject(PyExc_KeyError, import_str);
2150 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002151 else
Fred Drakea76ba6e2001-03-06 06:31:15 +00002152 import = PyObject_GetAttr(builtins, import_str);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002153 if (import == NULL)
2154 goto err;
2155
2156 /* Call the _import__ function with the proper argument list */
2157 r = PyObject_CallFunction(import, "OOOO",
2158 module_name, globals, globals, silly_list);
2159
2160 err:
2161 Py_XDECREF(globals);
2162 Py_XDECREF(builtins);
2163 Py_XDECREF(import);
Tim Peters50d8d372001-02-28 05:34:27 +00002164
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002165 return r;
2166}
2167
2168
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002169/* Module 'imp' provides Python access to the primitives used for
2170 importing modules.
2171*/
2172
Guido van Rossum79f25d91997-04-29 20:08:16 +00002173static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002174imp_get_magic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002175{
2176 char buf[4];
2177
Guido van Rossum43713e52000-02-29 13:59:29 +00002178 if (!PyArg_ParseTuple(args, ":get_magic"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002179 return NULL;
Guido van Rossum96774c12000-05-01 20:19:08 +00002180 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
2181 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
2182 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
2183 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002184
Guido van Rossum79f25d91997-04-29 20:08:16 +00002185 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002186}
2187
Guido van Rossum79f25d91997-04-29 20:08:16 +00002188static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002189imp_get_suffixes(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002190{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002191 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002192 struct filedescr *fdp;
2193
Guido van Rossum43713e52000-02-29 13:59:29 +00002194 if (!PyArg_ParseTuple(args, ":get_suffixes"))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002195 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002196 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002197 if (list == NULL)
2198 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002199 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
2200 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002201 fdp->suffix, fdp->mode, fdp->type);
2202 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002203 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002204 return NULL;
2205 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002206 if (PyList_Append(list, item) < 0) {
2207 Py_DECREF(list);
2208 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002209 return NULL;
2210 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002211 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002212 }
2213 return list;
2214}
2215
Guido van Rossum79f25d91997-04-29 20:08:16 +00002216static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002217call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002218{
Tim Petersdbd9ba62000-07-09 03:09:57 +00002219 extern int fclose(FILE *);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002220 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002221 struct filedescr *fdp;
2222 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002223 FILE *fp = NULL;
2224
2225 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002226 if (path == Py_None)
2227 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002228 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
2229 if (fdp == NULL)
2230 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002231 if (fp != NULL) {
2232 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
2233 if (fob == NULL) {
2234 fclose(fp);
2235 return NULL;
2236 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002237 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002238 else {
2239 fob = Py_None;
2240 Py_INCREF(fob);
Tim Peters50d8d372001-02-28 05:34:27 +00002241 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002242 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002243 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002244 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002245 return ret;
2246}
2247
Guido van Rossum79f25d91997-04-29 20:08:16 +00002248static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002249imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002250{
2251 char *name;
2252 PyObject *path = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002253 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002254 return NULL;
2255 return call_find_module(name, path);
2256}
2257
2258static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002259imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002260{
2261 char *name;
2262 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002263 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002264 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002265 return NULL;
2266 ret = init_builtin(name);
2267 if (ret < 0)
2268 return NULL;
2269 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002270 Py_INCREF(Py_None);
2271 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002272 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002273 m = PyImport_AddModule(name);
2274 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002275 return m;
2276}
2277
Guido van Rossum79f25d91997-04-29 20:08:16 +00002278static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002279imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002280{
2281 char *name;
2282 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002283 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002284 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002285 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002286 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002287 if (ret < 0)
2288 return NULL;
2289 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002290 Py_INCREF(Py_None);
2291 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002292 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002293 m = PyImport_AddModule(name);
2294 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002295 return m;
2296}
2297
Guido van Rossum79f25d91997-04-29 20:08:16 +00002298static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002299imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002300{
2301 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002302
Guido van Rossum43713e52000-02-29 13:59:29 +00002303 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002304 return NULL;
2305 return get_frozen_object(name);
2306}
2307
Guido van Rossum79f25d91997-04-29 20:08:16 +00002308static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002309imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002310{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002311 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002312 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002313 return NULL;
Guido van Rossum50ee94f2002-04-09 18:00:58 +00002314 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002315}
2316
Guido van Rossum79f25d91997-04-29 20:08:16 +00002317static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002318imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002319{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002320 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002321 struct _frozen *p;
Guido van Rossum43713e52000-02-29 13:59:29 +00002322 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002323 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002324 p = find_frozen(name);
Guido van Rossumb8bff3f2002-04-07 06:34:38 +00002325 return PyBool_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002326}
2327
2328static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002329get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002330{
2331 FILE *fp;
2332 if (fob == NULL) {
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00002333 if (mode[0] == 'U')
2334 mode = "r" PY_STDIOTEXTMODE;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002335 fp = fopen(pathname, mode);
2336 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002337 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002338 }
2339 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002340 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002341 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002342 PyErr_SetString(PyExc_ValueError,
2343 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002344 }
2345 return fp;
2346}
2347
Guido van Rossum79f25d91997-04-29 20:08:16 +00002348static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002349imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002350{
2351 char *name;
2352 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002353 PyObject *fob = NULL;
2354 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002355 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002356 if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002357 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002358 return NULL;
2359 fp = get_file(pathname, fob, "rb");
2360 if (fp == NULL)
2361 return NULL;
2362 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002363 if (fob == NULL)
2364 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002365 return m;
2366}
2367
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002368#ifdef HAVE_DYNAMIC_LOADING
2369
Guido van Rossum79f25d91997-04-29 20:08:16 +00002370static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002371imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002372{
2373 char *name;
2374 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002375 PyObject *fob = NULL;
2376 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002377 FILE *fp = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002378 if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002379 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002380 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002381 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002382 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002383 if (fp == NULL)
2384 return NULL;
2385 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002386 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002387 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002388}
2389
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002390#endif /* HAVE_DYNAMIC_LOADING */
2391
Guido van Rossum79f25d91997-04-29 20:08:16 +00002392static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002393imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002394{
2395 char *name;
2396 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002397 PyObject *fob = NULL;
2398 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002399 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002400 if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002401 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002402 return NULL;
2403 fp = get_file(pathname, fob, "r");
2404 if (fp == NULL)
2405 return NULL;
2406 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002407 if (fob == NULL)
2408 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002409 return m;
2410}
2411
Jack Jansen9c96a921995-02-15 22:57:06 +00002412#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00002413static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002414imp_load_resource(PyObject *self, PyObject *args)
Jack Jansen9c96a921995-02-15 22:57:06 +00002415{
2416 char *name;
2417 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002418 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00002419
Guido van Rossum43713e52000-02-29 13:59:29 +00002420 if (!PyArg_ParseTuple(args, "ss:load_resource", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00002421 return NULL;
2422 m = PyMac_LoadResourceModule(name, pathname);
2423 return m;
2424}
2425#endif /* macintosh */
2426
Guido van Rossum79f25d91997-04-29 20:08:16 +00002427static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002428imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002429{
2430 char *name;
2431 PyObject *fob;
2432 char *pathname;
2433 char *suffix; /* Unused */
2434 char *mode;
2435 int type;
2436 FILE *fp;
2437
Guido van Rossum43713e52000-02-29 13:59:29 +00002438 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002439 &name, &fob, &pathname,
2440 &suffix, &mode, &type))
2441 return NULL;
Guido van Rossum5e2c5fa2002-05-30 17:33:07 +00002442 if (*mode) {
2443 /* Mode must start with 'r' or 'U' and must not contain '+'.
2444 Implicit in this test is the assumption that the mode
2445 may contain other modifiers like 'b' or 't'. */
2446
2447 if (!(*mode == 'r' || *mode == 'U') || strchr(mode, '+')) {
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00002448 PyErr_Format(PyExc_ValueError,
2449 "invalid file open mode %.200s", mode);
2450 return NULL;
Guido van Rossum5e2c5fa2002-05-30 17:33:07 +00002451 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002452 }
2453 if (fob == Py_None)
2454 fp = NULL;
2455 else {
2456 if (!PyFile_Check(fob)) {
2457 PyErr_SetString(PyExc_ValueError,
2458 "load_module arg#2 should be a file or None");
2459 return NULL;
2460 }
2461 fp = get_file(pathname, fob, mode);
2462 if (fp == NULL)
2463 return NULL;
2464 }
2465 return load_module(name, fp, pathname, type);
2466}
2467
2468static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002469imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002470{
2471 char *name;
2472 char *pathname;
Guido van Rossum43713e52000-02-29 13:59:29 +00002473 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002474 return NULL;
2475 return load_package(name, pathname);
2476}
2477
2478static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002479imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002480{
2481 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002482 if (!PyArg_ParseTuple(args, "s:new_module", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002483 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002484 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002485}
2486
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002487/* Doc strings */
2488
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002489PyDoc_STRVAR(doc_imp,
2490"This module provides the components needed to build your own\n\
2491__import__ function. Undocumented functions are obsolete.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002492
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002493PyDoc_STRVAR(doc_find_module,
2494"find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002495Search for a module. If path is omitted or None, search for a\n\
2496built-in, frozen or special module and continue search in sys.path.\n\
2497The module name cannot contain '.'; to search for a submodule of a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002498package, pass the submodule name and the package's __path__.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002499
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002500PyDoc_STRVAR(doc_load_module,
2501"load_module(name, file, filename, (suffix, mode, type)) -> module\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002502Load a module, given information returned by find_module().\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002503The module name must include the full package name, if any.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002504
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002505PyDoc_STRVAR(doc_get_magic,
2506"get_magic() -> string\n\
2507Return the magic number for .pyc or .pyo files.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002508
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002509PyDoc_STRVAR(doc_get_suffixes,
2510"get_suffixes() -> [(suffix, mode, type), ...]\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002511Return a list of (suffix, mode, type) tuples describing the files\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002512that find_module() looks for.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002513
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002514PyDoc_STRVAR(doc_new_module,
2515"new_module(name) -> module\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002516Create a new module. Do not enter it in sys.modules.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002517The module name must include the full package name, if any.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002518
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002519PyDoc_STRVAR(doc_lock_held,
2520"lock_held() -> 0 or 1\n\
Tim Peters69232342001-08-30 05:16:13 +00002521Return 1 if the import lock is currently held.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002522On platforms without threads, return 0.");
Tim Peters69232342001-08-30 05:16:13 +00002523
Guido van Rossum79f25d91997-04-29 20:08:16 +00002524static PyMethodDef imp_methods[] = {
Neal Norwitz031829d2002-03-31 14:37:44 +00002525 {"find_module", imp_find_module, METH_VARARGS, doc_find_module},
2526 {"get_magic", imp_get_magic, METH_VARARGS, doc_get_magic},
2527 {"get_suffixes", imp_get_suffixes, METH_VARARGS, doc_get_suffixes},
2528 {"load_module", imp_load_module, METH_VARARGS, doc_load_module},
2529 {"new_module", imp_new_module, METH_VARARGS, doc_new_module},
2530 {"lock_held", imp_lock_held, METH_VARARGS, doc_lock_held},
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002531 /* The rest are obsolete */
Neal Norwitz031829d2002-03-31 14:37:44 +00002532 {"get_frozen_object", imp_get_frozen_object, METH_VARARGS},
2533 {"init_builtin", imp_init_builtin, METH_VARARGS},
2534 {"init_frozen", imp_init_frozen, METH_VARARGS},
2535 {"is_builtin", imp_is_builtin, METH_VARARGS},
2536 {"is_frozen", imp_is_frozen, METH_VARARGS},
2537 {"load_compiled", imp_load_compiled, METH_VARARGS},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002538#ifdef HAVE_DYNAMIC_LOADING
Neal Norwitz031829d2002-03-31 14:37:44 +00002539 {"load_dynamic", imp_load_dynamic, METH_VARARGS},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002540#endif
Neal Norwitz031829d2002-03-31 14:37:44 +00002541 {"load_package", imp_load_package, METH_VARARGS},
Jack Jansen9c96a921995-02-15 22:57:06 +00002542#ifdef macintosh
Neal Norwitz031829d2002-03-31 14:37:44 +00002543 {"load_resource", imp_load_resource, METH_VARARGS},
Jack Jansen9c96a921995-02-15 22:57:06 +00002544#endif
Neal Norwitz031829d2002-03-31 14:37:44 +00002545 {"load_source", imp_load_source, METH_VARARGS},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002546 {NULL, NULL} /* sentinel */
2547};
2548
Guido van Rossum1a8791e1998-08-04 22:46:29 +00002549static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002550setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002551{
2552 PyObject *v;
2553 int err;
2554
2555 v = PyInt_FromLong((long)value);
2556 err = PyDict_SetItemString(d, name, v);
2557 Py_XDECREF(v);
2558 return err;
2559}
2560
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002561void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002562initimp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002563{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002564 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002565
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002566 m = Py_InitModule4("imp", imp_methods, doc_imp,
2567 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002568 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002569
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002570 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2571 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2572 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2573 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2574 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2575 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2576 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2577 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00002578 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002579
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002580 failure:
2581 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002582}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002583
2584
Guido van Rossumb18618d2000-05-03 23:44:39 +00002585/* API for embedding applications that want to add their own entries
2586 to the table of built-in modules. This should normally be called
2587 *before* Py_Initialize(). When the table resize fails, -1 is
2588 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002589
2590 After a similar function by Just van Rossum. */
2591
2592int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002593PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002594{
2595 static struct _inittab *our_copy = NULL;
2596 struct _inittab *p;
2597 int i, n;
2598
2599 /* Count the number of entries in both tables */
2600 for (n = 0; newtab[n].name != NULL; n++)
2601 ;
2602 if (n == 0)
2603 return 0; /* Nothing to do */
2604 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2605 ;
2606
2607 /* Allocate new memory for the combined table */
Guido van Rossumb18618d2000-05-03 23:44:39 +00002608 p = our_copy;
2609 PyMem_RESIZE(p, struct _inittab, i+n+1);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002610 if (p == NULL)
2611 return -1;
2612
2613 /* Copy the tables into the new memory */
2614 if (our_copy != PyImport_Inittab)
2615 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2616 PyImport_Inittab = our_copy = p;
2617 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
2618
2619 return 0;
2620}
2621
2622/* Shorthand to add a single entry given a name and a function */
2623
2624int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002625PyImport_AppendInittab(char *name, void (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002626{
2627 struct _inittab newtab[2];
2628
2629 memset(newtab, '\0', sizeof newtab);
2630
2631 newtab[0].name = name;
2632 newtab[0].initfunc = initfunc;
2633
2634 return PyImport_ExtendInittab(newtab);
2635}