blob: e58dbd5a1b94472b0924622f20a47bc4010625c0 [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
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006#include "Python-ast.h"
Neal Norwitzadb69fc2005-12-17 20:54:49 +00007#include "pyarena.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008#include "pythonrun.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00009#include "errcode.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +000010#include "marshal.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000011#include "code.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +000012#include "compile.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000013#include "eval.h"
Guido van Rossumd8bac6d1992-02-26 15:19:13 +000014#include "osdefs.h"
Guido van Rossum1ae940a1995-01-02 19:04:15 +000015#include "importdl.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +000016
Guido van Rossum55a83382000-09-20 20:31:38 +000017#ifdef HAVE_FCNTL_H
18#include <fcntl.h>
19#endif
20
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000021extern time_t PyOS_GetLastModificationTime(char *, FILE *);
22 /* In getmtime.c */
Guido van Rossum21d335e1993-10-15 13:01:11 +000023
Jeremy Hyltond4ceb312004-04-01 02:45:22 +000024/* Magic word to reject .pyc files generated by other Python versions.
25 It should change for each incompatible change to the bytecode.
26
27 The value of CR and LF is incorporated so if you ever read or write
Guido van Rossum7faeab31995-07-07 22:50:36 +000028 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.
Marc-André Lemburgbd3be8f2002-02-07 11:33:49 +000030
Martin v. Löwisef82d2f2004-06-27 16:51:46 +000031 The magic numbers must be spaced apart atleast 2 values, as the
32 -U interpeter flag will cause MAGIC+1 being used. They have been
33 odd numbers for some time now.
Marc-André Lemburgbd3be8f2002-02-07 11:33:49 +000034
Jeremy Hyltond4ceb312004-04-01 02:45:22 +000035 There were a variety of old schemes for setting the magic number.
36 The current working scheme is to increment the previous value by
37 10.
Guido van Rossumf6894922002-08-31 15:16:14 +000038
Marc-André Lemburgbd3be8f2002-02-07 11:33:49 +000039 Known values:
40 Python 1.5: 20121
41 Python 1.5.1: 20121
42 Python 1.5.2: 20121
43 Python 2.0: 50823
44 Python 2.0.1: 50823
45 Python 2.1: 60202
46 Python 2.1.1: 60202
47 Python 2.1.2: 60202
48 Python 2.2: 60717
Neal Norwitz7fdcb412002-06-14 01:07:39 +000049 Python 2.3a0: 62011
Michael W. Hudsondd32a912002-08-15 14:59:02 +000050 Python 2.3a0: 62021
Guido van Rossumf6894922002-08-31 15:16:14 +000051 Python 2.3a0: 62011 (!)
Martin v. Löwisef82d2f2004-06-27 16:51:46 +000052 Python 2.4a0: 62041
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +000053 Python 2.4a3: 62051
Raymond Hettinger2c31a052004-09-22 18:44:21 +000054 Python 2.4b1: 62061
Michael W. Hudsondf888462005-06-03 14:41:55 +000055 Python 2.5a0: 62071
Michael W. Hudsonaee2e282005-10-21 11:32:20 +000056 Python 2.5a0: 62081 (ast-branch)
Guido van Rossumc2e20742006-02-27 22:32:47 +000057 Python 2.5a0: 62091 (with)
Guido van Rossumf6694362006-03-10 02:28:35 +000058 Python 2.5a0: 62092 (changed WITH_CLEANUP opcode)
Michael W. Hudsonaee2e282005-10-21 11:32:20 +000059.
Tim Peters36515e22001-11-18 04:06:29 +000060*/
Thomas Woutersf7f438b2006-02-28 16:09:29 +000061#define MAGIC (62092 | ((long)'\r'<<16) | ((long)'\n'<<24))
Guido van Rossum3ddee711991-12-16 13:06:34 +000062
Guido van Rossum96774c12000-05-01 20:19:08 +000063/* Magic word as global; note that _PyImport_Init() can change the
Jeremy Hylton9262b8a2000-06-30 04:59:17 +000064 value of this global to accommodate for alterations of how the
Guido van Rossum96774c12000-05-01 20:19:08 +000065 compiler works which are enabled by command line switches. */
66static long pyc_magic = MAGIC;
67
Guido van Rossum25ce5661997-08-02 03:10:38 +000068/* See _PyImport_FixupExtension() below */
69static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000070
Guido van Rossum771c6c81997-10-31 18:37:24 +000071/* This table is defined in config.c: */
72extern struct _inittab _PyImport_Inittab[];
73
74struct _inittab *PyImport_Inittab = _PyImport_Inittab;
Guido van Rossum66f1fa81991-04-03 19:03:52 +000075
Guido van Rossumed1170e1999-12-20 21:23:41 +000076/* these tables define the module suffixes that Python recognizes */
77struct filedescr * _PyImport_Filetab = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +000078
79#ifdef RISCOS
80static const struct filedescr _PyImport_StandardFiletab[] = {
Jack Jansenc88da1f2002-05-28 10:58:19 +000081 {"/py", "U", PY_SOURCE},
Guido van Rossum48a680c2001-03-02 06:34:14 +000082 {"/pyc", "rb", PY_COMPILED},
83 {0, 0}
84};
85#else
Guido van Rossumed1170e1999-12-20 21:23:41 +000086static const struct filedescr _PyImport_StandardFiletab[] = {
Jack Jansenc88da1f2002-05-28 10:58:19 +000087 {".py", "U", PY_SOURCE},
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000088#ifdef MS_WINDOWS
Jack Jansenc88da1f2002-05-28 10:58:19 +000089 {".pyw", "U", PY_SOURCE},
Tim Peters36515e22001-11-18 04:06:29 +000090#endif
Guido van Rossumed1170e1999-12-20 21:23:41 +000091 {".pyc", "rb", PY_COMPILED},
92 {0, 0}
93};
Guido van Rossum48a680c2001-03-02 06:34:14 +000094#endif
Guido van Rossumed1170e1999-12-20 21:23:41 +000095
Guido van Rossum1ae940a1995-01-02 19:04:15 +000096/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000097
98void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000099_PyImport_Init(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000100{
Guido van Rossumed1170e1999-12-20 21:23:41 +0000101 const struct filedescr *scan;
102 struct filedescr *filetab;
103 int countD = 0;
104 int countS = 0;
105
106 /* prepare _PyImport_Filetab: copy entries from
107 _PyImport_DynLoadFiletab and _PyImport_StandardFiletab.
108 */
109 for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan)
110 ++countD;
111 for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan)
112 ++countS;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000113 filetab = PyMem_NEW(struct filedescr, countD + countS + 1);
Guido van Rossumed1170e1999-12-20 21:23:41 +0000114 memcpy(filetab, _PyImport_DynLoadFiletab,
115 countD * sizeof(struct filedescr));
116 memcpy(filetab + countD, _PyImport_StandardFiletab,
117 countS * sizeof(struct filedescr));
118 filetab[countD + countS].suffix = NULL;
119
120 _PyImport_Filetab = filetab;
121
Guido van Rossum0824f631997-03-11 18:37:35 +0000122 if (Py_OptimizeFlag) {
Guido van Rossumed1170e1999-12-20 21:23:41 +0000123 /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */
124 for (; filetab->suffix != NULL; filetab++) {
Guido van Rossum48a680c2001-03-02 06:34:14 +0000125#ifndef RISCOS
Guido van Rossumed1170e1999-12-20 21:23:41 +0000126 if (strcmp(filetab->suffix, ".pyc") == 0)
127 filetab->suffix = ".pyo";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000128#else
129 if (strcmp(filetab->suffix, "/pyc") == 0)
130 filetab->suffix = "/pyo";
131#endif
Guido van Rossum0824f631997-03-11 18:37:35 +0000132 }
133 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000134
135 if (Py_UnicodeFlag) {
136 /* Fix the pyc_magic so that byte compiled code created
137 using the all-Unicode method doesn't interfere with
138 code created in normal operation mode. */
139 pyc_magic = MAGIC + 1;
140 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000141}
142
Guido van Rossum25ce5661997-08-02 03:10:38 +0000143void
Just van Rossum52e14d62002-12-30 22:08:05 +0000144_PyImportHooks_Init(void)
145{
146 PyObject *v, *path_hooks = NULL, *zimpimport;
147 int err = 0;
148
149 /* adding sys.path_hooks and sys.path_importer_cache, setting up
150 zipimport */
151
152 if (Py_VerboseFlag)
153 PySys_WriteStderr("# installing zipimport hook\n");
154
155 v = PyList_New(0);
156 if (v == NULL)
157 goto error;
158 err = PySys_SetObject("meta_path", v);
159 Py_DECREF(v);
160 if (err)
161 goto error;
162 v = PyDict_New();
163 if (v == NULL)
164 goto error;
165 err = PySys_SetObject("path_importer_cache", v);
166 Py_DECREF(v);
167 if (err)
168 goto error;
169 path_hooks = PyList_New(0);
170 if (path_hooks == NULL)
171 goto error;
172 err = PySys_SetObject("path_hooks", path_hooks);
173 if (err) {
174 error:
175 PyErr_Print();
176 Py_FatalError("initializing sys.meta_path, sys.path_hooks or "
177 "path_importer_cache failed");
178 }
179 zimpimport = PyImport_ImportModule("zipimport");
180 if (zimpimport == NULL) {
181 PyErr_Clear(); /* No zip import module -- okay */
182 if (Py_VerboseFlag)
183 PySys_WriteStderr("# can't import zipimport\n");
184 }
185 else {
186 PyObject *zipimporter = PyObject_GetAttrString(zimpimport,
187 "zipimporter");
188 Py_DECREF(zimpimport);
189 if (zipimporter == NULL) {
190 PyErr_Clear(); /* No zipimporter object -- okay */
191 if (Py_VerboseFlag)
192 PySys_WriteStderr(
Fred Drake1e5fc552003-07-11 15:01:02 +0000193 "# can't import zipimport.zipimporter\n");
Just van Rossum52e14d62002-12-30 22:08:05 +0000194 }
195 else {
196 /* sys.path_hooks.append(zipimporter) */
197 err = PyList_Append(path_hooks, zipimporter);
198 Py_DECREF(zipimporter);
199 if (err)
200 goto error;
201 if (Py_VerboseFlag)
202 PySys_WriteStderr(
203 "# installed zipimport hook\n");
204 }
205 }
206 Py_DECREF(path_hooks);
207}
208
209void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000210_PyImport_Fini(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000211{
212 Py_XDECREF(extensions);
213 extensions = NULL;
Barry Warsaw84294482000-10-03 16:02:05 +0000214 PyMem_DEL(_PyImport_Filetab);
215 _PyImport_Filetab = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000216}
217
218
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000219/* Locking primitives to prevent parallel imports of the same module
220 in different threads to return with a partially loaded module.
221 These calls are serialized by the global interpreter lock. */
222
223#ifdef WITH_THREAD
224
Guido van Rossum49b56061998-10-01 20:42:43 +0000225#include "pythread.h"
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000226
Guido van Rossum65d5b571998-12-21 19:32:43 +0000227static PyThread_type_lock import_lock = 0;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000228static long import_lock_thread = -1;
229static int import_lock_level = 0;
230
231static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000232lock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000233{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000234 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000235 if (me == -1)
236 return; /* Too bad */
237 if (import_lock == NULL)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000238 import_lock = PyThread_allocate_lock();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000239 if (import_lock_thread == me) {
240 import_lock_level++;
241 return;
242 }
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000243 if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0))
244 {
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000245 PyThreadState *tstate = PyEval_SaveThread();
Guido van Rossum65d5b571998-12-21 19:32:43 +0000246 PyThread_acquire_lock(import_lock, 1);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000247 PyEval_RestoreThread(tstate);
248 }
249 import_lock_thread = me;
250 import_lock_level = 1;
251}
252
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000253static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000254unlock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000255{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000256 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000257 if (me == -1)
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000258 return 0; /* Too bad */
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000259 if (import_lock_thread != me)
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000260 return -1;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000261 import_lock_level--;
262 if (import_lock_level == 0) {
263 import_lock_thread = -1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000264 PyThread_release_lock(import_lock);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000265 }
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000266 return 1;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000267}
268
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +0000269/* This function is called from PyOS_AfterFork to ensure that newly
270 created child processes do not share locks with the parent. */
271
272void
273_PyImport_ReInitLock(void)
274{
275#ifdef _AIX
276 if (import_lock != NULL)
277 import_lock = PyThread_allocate_lock();
278#endif
279}
280
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000281#else
282
283#define lock_import()
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000284#define unlock_import() 0
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000285
286#endif
287
Tim Peters69232342001-08-30 05:16:13 +0000288static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +0000289imp_lock_held(PyObject *self, PyObject *noargs)
Tim Peters69232342001-08-30 05:16:13 +0000290{
Tim Peters69232342001-08-30 05:16:13 +0000291#ifdef WITH_THREAD
Guido van Rossumb8bff3f2002-04-07 06:34:38 +0000292 return PyBool_FromLong(import_lock_thread != -1);
Tim Peters69232342001-08-30 05:16:13 +0000293#else
Guido van Rossumb8bff3f2002-04-07 06:34:38 +0000294 return PyBool_FromLong(0);
Tim Peters69232342001-08-30 05:16:13 +0000295#endif
296}
297
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000298static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +0000299imp_acquire_lock(PyObject *self, PyObject *noargs)
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000300{
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000301#ifdef WITH_THREAD
302 lock_import();
303#endif
Neal Norwitz2294c0d2003-02-12 23:02:21 +0000304 Py_INCREF(Py_None);
305 return Py_None;
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000306}
307
308static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +0000309imp_release_lock(PyObject *self, PyObject *noargs)
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000310{
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000311#ifdef WITH_THREAD
312 if (unlock_import() < 0) {
313 PyErr_SetString(PyExc_RuntimeError,
314 "not holding the import lock");
315 return NULL;
316 }
317#endif
Neal Norwitz2294c0d2003-02-12 23:02:21 +0000318 Py_INCREF(Py_None);
319 return Py_None;
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000320}
321
Guido van Rossum25ce5661997-08-02 03:10:38 +0000322/* Helper for sys */
323
324PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000325PyImport_GetModuleDict(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000326{
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000327 PyInterpreterState *interp = PyThreadState_GET()->interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000328 if (interp->modules == NULL)
329 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
330 return interp->modules;
331}
332
Guido van Rossum3f5da241990-12-20 15:06:42 +0000333
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000334/* List of names to clear in sys */
335static char* sys_deletes[] = {
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000336 "path", "argv", "ps1", "ps2", "exitfunc",
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000337 "exc_type", "exc_value", "exc_traceback",
338 "last_type", "last_value", "last_traceback",
Just van Rossum52e14d62002-12-30 22:08:05 +0000339 "path_hooks", "path_importer_cache", "meta_path",
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000340 NULL
341};
342
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000343static char* sys_files[] = {
344 "stdin", "__stdin__",
345 "stdout", "__stdout__",
346 "stderr", "__stderr__",
347 NULL
348};
349
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000350
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000351/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000352
Guido van Rossum3f5da241990-12-20 15:06:42 +0000353void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000354PyImport_Cleanup(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000355{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000356 Py_ssize_t pos, ndone;
Guido van Rossum758eec01998-01-19 21:58:26 +0000357 char *name;
358 PyObject *key, *value, *dict;
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000359 PyInterpreterState *interp = PyThreadState_GET()->interp;
Guido van Rossum758eec01998-01-19 21:58:26 +0000360 PyObject *modules = interp->modules;
361
362 if (modules == NULL)
363 return; /* Already done */
364
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000365 /* Delete some special variables first. These are common
366 places where user values hide and people complain when their
367 destructors fail. Since the modules containing them are
368 deleted *last* of all, they would come too late in the normal
369 destruction order. Sigh. */
370
371 value = PyDict_GetItemString(modules, "__builtin__");
372 if (value != NULL && PyModule_Check(value)) {
373 dict = PyModule_GetDict(value);
374 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000375 PySys_WriteStderr("# clear __builtin__._\n");
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000376 PyDict_SetItemString(dict, "_", Py_None);
377 }
378 value = PyDict_GetItemString(modules, "sys");
379 if (value != NULL && PyModule_Check(value)) {
380 char **p;
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000381 PyObject *v;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000382 dict = PyModule_GetDict(value);
383 for (p = sys_deletes; *p != NULL; p++) {
384 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000385 PySys_WriteStderr("# clear sys.%s\n", *p);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000386 PyDict_SetItemString(dict, *p, Py_None);
387 }
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000388 for (p = sys_files; *p != NULL; p+=2) {
389 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000390 PySys_WriteStderr("# restore sys.%s\n", *p);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000391 v = PyDict_GetItemString(dict, *(p+1));
392 if (v == NULL)
393 v = Py_None;
394 PyDict_SetItemString(dict, *p, v);
395 }
396 }
397
398 /* First, delete __main__ */
399 value = PyDict_GetItemString(modules, "__main__");
400 if (value != NULL && PyModule_Check(value)) {
401 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000402 PySys_WriteStderr("# cleanup __main__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000403 _PyModule_Clear(value);
404 PyDict_SetItemString(modules, "__main__", Py_None);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000405 }
406
Guido van Rossum758eec01998-01-19 21:58:26 +0000407 /* The special treatment of __builtin__ here is because even
408 when it's not referenced as a module, its dictionary is
409 referenced by almost every module's __builtins__. Since
410 deleting a module clears its dictionary (even if there are
411 references left to it), we need to delete the __builtin__
412 module last. Likewise, we don't delete sys until the very
413 end because it is implicitly referenced (e.g. by print).
414
415 Also note that we 'delete' modules by replacing their entry
416 in the modules dict with None, rather than really deleting
417 them; this avoids a rehash of the modules dictionary and
418 also marks them as "non existent" so they won't be
419 re-imported. */
420
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000421 /* Next, repeatedly delete modules with a reference count of
Guido van Rossum758eec01998-01-19 21:58:26 +0000422 one (skipping __builtin__ and sys) and delete them */
423 do {
424 ndone = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000425 pos = 0;
Guido van Rossum758eec01998-01-19 21:58:26 +0000426 while (PyDict_Next(modules, &pos, &key, &value)) {
427 if (value->ob_refcnt != 1)
428 continue;
Guido van Rossum566373e1998-10-01 15:24:50 +0000429 if (PyString_Check(key) && PyModule_Check(value)) {
430 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000431 if (strcmp(name, "__builtin__") == 0)
432 continue;
433 if (strcmp(name, "sys") == 0)
434 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000435 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000436 PySys_WriteStderr(
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000437 "# cleanup[1] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000438 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000439 PyDict_SetItem(modules, key, Py_None);
440 ndone++;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000441 }
442 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000443 } while (ndone > 0);
444
Guido van Rossum758eec01998-01-19 21:58:26 +0000445 /* Next, delete all modules (still skipping __builtin__ and sys) */
446 pos = 0;
447 while (PyDict_Next(modules, &pos, &key, &value)) {
Guido van Rossum566373e1998-10-01 15:24:50 +0000448 if (PyString_Check(key) && PyModule_Check(value)) {
449 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000450 if (strcmp(name, "__builtin__") == 0)
451 continue;
452 if (strcmp(name, "sys") == 0)
453 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000454 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000455 PySys_WriteStderr("# cleanup[2] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000456 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000457 PyDict_SetItem(modules, key, Py_None);
458 }
459 }
460
461 /* Next, delete sys and __builtin__ (in that order) */
462 value = PyDict_GetItemString(modules, "sys");
463 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000464 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000465 PySys_WriteStderr("# cleanup sys\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000466 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000467 PyDict_SetItemString(modules, "sys", Py_None);
468 }
469 value = PyDict_GetItemString(modules, "__builtin__");
470 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000471 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000472 PySys_WriteStderr("# cleanup __builtin__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000473 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000474 PyDict_SetItemString(modules, "__builtin__", Py_None);
475 }
476
477 /* Finally, clear and delete the modules directory */
478 PyDict_Clear(modules);
479 interp->modules = NULL;
480 Py_DECREF(modules);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000481}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000482
483
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000484/* Helper for pythonrun.c -- return magic number */
485
486long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000487PyImport_GetMagicNumber(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000488{
Guido van Rossum96774c12000-05-01 20:19:08 +0000489 return pyc_magic;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000490}
491
492
Guido van Rossum25ce5661997-08-02 03:10:38 +0000493/* Magic for extension modules (built-in as well as dynamically
494 loaded). To prevent initializing an extension module more than
495 once, we keep a static dictionary 'extensions' keyed by module name
496 (for built-in modules) or by filename (for dynamically loaded
Barry Warsaw92883382001-08-13 23:05:44 +0000497 modules), containing these modules. A copy of the module's
Guido van Rossum25ce5661997-08-02 03:10:38 +0000498 dictionary is stored by calling _PyImport_FixupExtension()
499 immediately after the module initialization function succeeds. A
500 copy can be retrieved from there by calling
501 _PyImport_FindExtension(). */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000502
Guido van Rossum79f25d91997-04-29 20:08:16 +0000503PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000504_PyImport_FixupExtension(char *name, char *filename)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000505{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000506 PyObject *modules, *mod, *dict, *copy;
507 if (extensions == NULL) {
508 extensions = PyDict_New();
509 if (extensions == NULL)
510 return NULL;
511 }
512 modules = PyImport_GetModuleDict();
513 mod = PyDict_GetItemString(modules, name);
514 if (mod == NULL || !PyModule_Check(mod)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000515 PyErr_Format(PyExc_SystemError,
516 "_PyImport_FixupExtension: module %.200s not loaded", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000517 return NULL;
518 }
519 dict = PyModule_GetDict(mod);
520 if (dict == NULL)
521 return NULL;
Fred Drake9cd0efc2001-10-25 21:38:59 +0000522 copy = PyDict_Copy(dict);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000523 if (copy == NULL)
524 return NULL;
525 PyDict_SetItemString(extensions, filename, copy);
526 Py_DECREF(copy);
527 return copy;
528}
529
530PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000531_PyImport_FindExtension(char *name, char *filename)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000532{
Fred Drake9cd0efc2001-10-25 21:38:59 +0000533 PyObject *dict, *mod, *mdict;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000534 if (extensions == NULL)
535 return NULL;
536 dict = PyDict_GetItemString(extensions, filename);
537 if (dict == NULL)
538 return NULL;
539 mod = PyImport_AddModule(name);
540 if (mod == NULL)
541 return NULL;
542 mdict = PyModule_GetDict(mod);
543 if (mdict == NULL)
544 return NULL;
Fred Drake9cd0efc2001-10-25 21:38:59 +0000545 if (PyDict_Update(mdict, dict))
Guido van Rossum25ce5661997-08-02 03:10:38 +0000546 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000547 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000548 PySys_WriteStderr("import %s # previously loaded (%s)\n",
Guido van Rossum25ce5661997-08-02 03:10:38 +0000549 name, filename);
550 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000551}
552
553
554/* Get the module object corresponding to a module name.
555 First check the modules dictionary if there's one there,
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000556 if not, create a new one and insert it in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000557 Because the former action is most common, THIS DOES NOT RETURN A
558 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000559
Guido van Rossum79f25d91997-04-29 20:08:16 +0000560PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000561PyImport_AddModule(const char *name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000562{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000563 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000564 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000565
Guido van Rossum25ce5661997-08-02 03:10:38 +0000566 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
Guido van Rossum79f25d91997-04-29 20:08:16 +0000567 PyModule_Check(m))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000568 return m;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000569 m = PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000570 if (m == NULL)
571 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000572 if (PyDict_SetItemString(modules, name, m) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000573 Py_DECREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000574 return NULL;
575 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000576 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000577
578 return m;
579}
580
Tim Peters1cd70172004-08-02 03:52:12 +0000581/* Remove name from sys.modules, if it's there. */
582static void
583_RemoveModule(const char *name)
584{
585 PyObject *modules = PyImport_GetModuleDict();
586 if (PyDict_GetItemString(modules, name) == NULL)
587 return;
588 if (PyDict_DelItemString(modules, name) < 0)
589 Py_FatalError("import: deleting existing key in"
590 "sys.modules failed");
591}
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000592
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000593/* Execute a code object in a module and return the module object
Tim Peters1cd70172004-08-02 03:52:12 +0000594 * WITH INCREMENTED REFERENCE COUNT. If an error occurs, name is
595 * removed from sys.modules, to avoid leaving damaged module objects
596 * in sys.modules. The caller may wish to restore the original
597 * module object (if any) in this case; PyImport_ReloadModule is an
598 * example.
599 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000600PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000601PyImport_ExecCodeModule(char *name, PyObject *co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000602{
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000603 return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
604}
605
606PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000607PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname)
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000608{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000609 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000610 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000611
Guido van Rossum79f25d91997-04-29 20:08:16 +0000612 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000613 if (m == NULL)
614 return NULL;
Jeremy Hyltonecd91292004-01-02 23:25:32 +0000615 /* If the module is being reloaded, we get the old module back
616 and re-use its dict to exec the new code. */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000617 d = PyModule_GetDict(m);
618 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
619 if (PyDict_SetItemString(d, "__builtins__",
620 PyEval_GetBuiltins()) != 0)
Tim Peters1cd70172004-08-02 03:52:12 +0000621 goto error;
Guido van Rossum6135a871995-01-09 17:53:26 +0000622 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000623 /* Remember the filename as the __file__ attribute */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000624 v = NULL;
625 if (pathname != NULL) {
626 v = PyString_FromString(pathname);
627 if (v == NULL)
628 PyErr_Clear();
629 }
630 if (v == NULL) {
631 v = ((PyCodeObject *)co)->co_filename;
632 Py_INCREF(v);
633 }
634 if (PyDict_SetItemString(d, "__file__", v) != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000635 PyErr_Clear(); /* Not important enough to report */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000636 Py_DECREF(v);
637
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000638 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000639 if (v == NULL)
Tim Peters1cd70172004-08-02 03:52:12 +0000640 goto error;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000641 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000642
Guido van Rossum25ce5661997-08-02 03:10:38 +0000643 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000644 PyErr_Format(PyExc_ImportError,
645 "Loaded module %.200s not found in sys.modules",
646 name);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000647 return NULL;
648 }
649
Guido van Rossum79f25d91997-04-29 20:08:16 +0000650 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000651
652 return m;
Tim Peters1cd70172004-08-02 03:52:12 +0000653
654 error:
655 _RemoveModule(name);
656 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000657}
658
659
660/* Given a pathname for a Python source file, fill a buffer with the
661 pathname for the corresponding compiled file. Return the pathname
662 for the compiled file, or NULL if there's no space in the buffer.
663 Doesn't set an exception. */
664
665static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000666make_compiled_pathname(char *pathname, char *buf, size_t buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000667{
Tim Petersc1731372001-08-04 08:12:36 +0000668 size_t len = strlen(pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000669 if (len+2 > buflen)
670 return NULL;
Tim Petersc1731372001-08-04 08:12:36 +0000671
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000672#ifdef MS_WINDOWS
Tim Petersc1731372001-08-04 08:12:36 +0000673 /* Treat .pyw as if it were .py. The case of ".pyw" must match
674 that used in _PyImport_StandardFiletab. */
675 if (len >= 4 && strcmp(&pathname[len-4], ".pyw") == 0)
676 --len; /* pretend 'w' isn't there */
677#endif
678 memcpy(buf, pathname, len);
679 buf[len] = Py_OptimizeFlag ? 'o' : 'c';
680 buf[len+1] = '\0';
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000681
682 return buf;
683}
684
685
686/* Given a pathname for a Python source file, its time of last
687 modification, and a pathname for a compiled file, check whether the
688 compiled file represents the same version of the source. If so,
689 return a FILE pointer for the compiled file, positioned just after
690 the header; if not, return NULL.
691 Doesn't set an exception. */
692
693static FILE *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000694check_compiled_module(char *pathname, time_t mtime, char *cpathname)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000695{
696 FILE *fp;
697 long magic;
698 long pyc_mtime;
699
700 fp = fopen(cpathname, "rb");
701 if (fp == NULL)
702 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000703 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000704 if (magic != pyc_magic) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000705 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000706 PySys_WriteStderr("# %s has bad magic\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000707 fclose(fp);
708 return NULL;
709 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000710 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000711 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000712 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000713 PySys_WriteStderr("# %s has bad mtime\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000714 fclose(fp);
715 return NULL;
716 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000717 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000718 PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000719 return fp;
720}
721
722
723/* Read a code object from a file and check it for validity */
724
Guido van Rossum79f25d91997-04-29 20:08:16 +0000725static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000726read_compiled_module(char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000727{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000728 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000729
Tim Petersd9b9ac82001-01-28 00:27:39 +0000730 co = PyMarshal_ReadLastObjectFromFile(fp);
Armin Rigo01ab2792004-03-26 15:09:27 +0000731 if (co == NULL)
732 return NULL;
733 if (!PyCode_Check(co)) {
734 PyErr_Format(PyExc_ImportError,
735 "Non-code object in %.200s", cpathname);
736 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000737 return NULL;
738 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000739 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000740}
741
742
743/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000744 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000745
Guido van Rossum79f25d91997-04-29 20:08:16 +0000746static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000747load_compiled_module(char *name, char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000748{
749 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000750 PyCodeObject *co;
751 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000752
Guido van Rossum79f25d91997-04-29 20:08:16 +0000753 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000754 if (magic != pyc_magic) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000755 PyErr_Format(PyExc_ImportError,
756 "Bad magic number in %.200s", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000757 return NULL;
758 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000759 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000760 co = read_compiled_module(cpathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000761 if (co == NULL)
762 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000763 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000764 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000765 name, cpathname);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000766 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000767 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000768
769 return m;
770}
771
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000772/* Parse a source file and return the corresponding code object */
773
Guido van Rossum79f25d91997-04-29 20:08:16 +0000774static PyCodeObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000775parse_source_module(const char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000776{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000777 PyCodeObject *co = NULL;
778 mod_ty mod;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000779 PyArena *arena = PyArena_New();
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000780
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000781 mod = PyParser_ASTFromFile(fp, pathname, Py_file_input, 0, 0, 0,
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000782 NULL, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000783 if (mod) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000784 co = PyAST_Compile(mod, pathname, NULL, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000785 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000786 PyArena_Free(arena);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000787 return co;
788}
789
790
Guido van Rossum55a83382000-09-20 20:31:38 +0000791/* Helper to open a bytecode file for writing in exclusive mode */
792
793static FILE *
794open_exclusive(char *filename)
795{
796#if defined(O_EXCL)&&defined(O_CREAT)&&defined(O_WRONLY)&&defined(O_TRUNC)
797 /* Use O_EXCL to avoid a race condition when another process tries to
798 write the same file. When that happens, our open() call fails,
799 which is just fine (since it's only a cache).
800 XXX If the file exists and is writable but the directory is not
801 writable, the file will never be written. Oh well.
802 */
803 int fd;
804 (void) unlink(filename);
Tim Peters42c83af2000-09-29 04:03:10 +0000805 fd = open(filename, O_EXCL|O_CREAT|O_WRONLY|O_TRUNC
806#ifdef O_BINARY
807 |O_BINARY /* necessary for Windows */
808#endif
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000809#ifdef __VMS
Martin v. Löwis18e16552006-02-15 17:27:45 +0000810 , 0666, "ctxt=bin", "shr=nil"
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000811#else
Martin v. Löwis18e16552006-02-15 17:27:45 +0000812 , 0666
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000813#endif
Martin v. Löwis18e16552006-02-15 17:27:45 +0000814 );
Guido van Rossum55a83382000-09-20 20:31:38 +0000815 if (fd < 0)
816 return NULL;
817 return fdopen(fd, "wb");
818#else
819 /* Best we can do -- on Windows this can't happen anyway */
820 return fopen(filename, "wb");
821#endif
822}
823
824
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000825/* Write a compiled module to a file, placing the time of last
826 modification of its source into the header.
827 Errors are ignored, if a write error occurs an attempt is made to
828 remove the file. */
829
830static void
Martin v. Löwis18e16552006-02-15 17:27:45 +0000831write_compiled_module(PyCodeObject *co, char *cpathname, time_t mtime)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000832{
833 FILE *fp;
834
Guido van Rossum55a83382000-09-20 20:31:38 +0000835 fp = open_exclusive(cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000836 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000837 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000838 PySys_WriteStderr(
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000839 "# can't create %s\n", cpathname);
840 return;
841 }
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000842 PyMarshal_WriteLongToFile(pyc_magic, fp, Py_MARSHAL_VERSION);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000843 /* First write a 0 for mtime */
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000844 PyMarshal_WriteLongToFile(0L, fp, Py_MARSHAL_VERSION);
845 PyMarshal_WriteObjectToFile((PyObject *)co, fp, Py_MARSHAL_VERSION);
Armin Rigo01ab2792004-03-26 15:09:27 +0000846 if (fflush(fp) != 0 || ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000847 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000848 PySys_WriteStderr("# can't write %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000849 /* Don't keep partial file */
850 fclose(fp);
851 (void) unlink(cpathname);
852 return;
853 }
854 /* Now write the true mtime */
855 fseek(fp, 4L, 0);
Martin v. Löwis18e16552006-02-15 17:27:45 +0000856 assert(mtime < LONG_MAX);
Martin v. Löwis725507b2006-03-07 12:08:51 +0000857 PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000858 fflush(fp);
859 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000860 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000861 PySys_WriteStderr("# wrote %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000862}
863
864
865/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000866 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
867 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000868
Guido van Rossum79f25d91997-04-29 20:08:16 +0000869static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000870load_source_module(char *name, char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000871{
Fred Drake4c82b232000-06-30 16:18:57 +0000872 time_t mtime;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000873 FILE *fpc;
874 char buf[MAXPATHLEN+1];
875 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000876 PyCodeObject *co;
877 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000878
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000879 mtime = PyOS_GetLastModificationTime(pathname, fp);
Neal Norwitz708e51a2005-10-03 04:48:15 +0000880 if (mtime == (time_t)(-1)) {
881 PyErr_Format(PyExc_RuntimeError,
882 "unable to get modification time from '%s'",
883 pathname);
Fred Drake4c82b232000-06-30 16:18:57 +0000884 return NULL;
Neal Norwitz708e51a2005-10-03 04:48:15 +0000885 }
Fred Drake4c82b232000-06-30 16:18:57 +0000886#if SIZEOF_TIME_T > 4
887 /* Python's .pyc timestamp handling presumes that the timestamp fits
888 in 4 bytes. This will be fine until sometime in the year 2038,
889 when a 4-byte signed time_t will overflow.
890 */
891 if (mtime >> 32) {
892 PyErr_SetString(PyExc_OverflowError,
Fred Drakec63d3e92001-03-01 06:33:32 +0000893 "modification time overflows a 4 byte field");
Fred Drake4c82b232000-06-30 16:18:57 +0000894 return NULL;
895 }
896#endif
Tim Peters36515e22001-11-18 04:06:29 +0000897 cpathname = make_compiled_pathname(pathname, buf,
Jeremy Hylton37832f02001-04-13 17:50:20 +0000898 (size_t)MAXPATHLEN + 1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000899 if (cpathname != NULL &&
900 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000901 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000902 fclose(fpc);
903 if (co == NULL)
904 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000905 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000906 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000907 name, cpathname);
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000908 pathname = cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000909 }
910 else {
911 co = parse_source_module(pathname, fp);
912 if (co == NULL)
913 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000914 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000915 PySys_WriteStderr("import %s # from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000916 name, pathname);
917 write_compiled_module(co, cpathname, mtime);
918 }
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000919 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000920 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000921
922 return m;
923}
924
925
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000926/* Forward */
Just van Rossum52e14d62002-12-30 22:08:05 +0000927static PyObject *load_module(char *, FILE *, char *, int, PyObject *);
928static struct filedescr *find_module(char *, char *, PyObject *,
929 char *, size_t, FILE **, PyObject **);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000930static struct _frozen *find_frozen(char *name);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000931
932/* Load a package and return its module object WITH INCREMENTED
933 REFERENCE COUNT */
934
935static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000936load_package(char *name, char *pathname)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000937{
Tim Peters1cd70172004-08-02 03:52:12 +0000938 PyObject *m, *d;
939 PyObject *file = NULL;
940 PyObject *path = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000941 int err;
942 char buf[MAXPATHLEN+1];
943 FILE *fp = NULL;
944 struct filedescr *fdp;
945
946 m = PyImport_AddModule(name);
947 if (m == NULL)
948 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000949 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000950 PySys_WriteStderr("import %s # directory %s\n",
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000951 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000952 d = PyModule_GetDict(m);
953 file = PyString_FromString(pathname);
954 if (file == NULL)
Tim Peters1cd70172004-08-02 03:52:12 +0000955 goto error;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000956 path = Py_BuildValue("[O]", file);
Tim Peters1cd70172004-08-02 03:52:12 +0000957 if (path == NULL)
958 goto error;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000959 err = PyDict_SetItemString(d, "__file__", file);
960 if (err == 0)
961 err = PyDict_SetItemString(d, "__path__", path);
Tim Peters1cd70172004-08-02 03:52:12 +0000962 if (err != 0)
963 goto error;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000964 buf[0] = '\0';
Just van Rossum52e14d62002-12-30 22:08:05 +0000965 fdp = find_module(name, "__init__", path, buf, sizeof(buf), &fp, NULL);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000966 if (fdp == NULL) {
967 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
968 PyErr_Clear();
Thomas Heller25653242004-06-07 15:04:10 +0000969 Py_INCREF(m);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000970 }
971 else
972 m = NULL;
973 goto cleanup;
974 }
Just van Rossum52e14d62002-12-30 22:08:05 +0000975 m = load_module(name, fp, buf, fdp->type, NULL);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000976 if (fp != NULL)
977 fclose(fp);
Tim Peters1cd70172004-08-02 03:52:12 +0000978 goto cleanup;
979
980 error:
981 m = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000982 cleanup:
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000983 Py_XDECREF(path);
984 Py_XDECREF(file);
985 return m;
986}
987
988
989/* Helper to test for built-in module */
990
991static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000992is_builtin(char *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000993{
994 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +0000995 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
996 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
997 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000998 return -1;
999 else
1000 return 1;
1001 }
1002 }
1003 return 0;
1004}
1005
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001006
Just van Rossum52e14d62002-12-30 22:08:05 +00001007/* Return an importer object for a sys.path/pkg.__path__ item 'p',
1008 possibly by fetching it from the path_importer_cache dict. If it
1009 wasn't yet cached, traverse path_hooks until it a hook is found
1010 that can handle the path item. Return None if no hook could;
1011 this tells our caller it should fall back to the builtin
1012 import mechanism. Cache the result in path_importer_cache.
1013 Returns a borrowed reference. */
1014
1015static PyObject *
1016get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks,
1017 PyObject *p)
1018{
1019 PyObject *importer;
Martin v. Löwis725507b2006-03-07 12:08:51 +00001020 Py_ssize_t j, nhooks;
Just van Rossum52e14d62002-12-30 22:08:05 +00001021
1022 /* These conditions are the caller's responsibility: */
1023 assert(PyList_Check(path_hooks));
1024 assert(PyDict_Check(path_importer_cache));
1025
1026 nhooks = PyList_Size(path_hooks);
1027 if (nhooks < 0)
1028 return NULL; /* Shouldn't happen */
1029
1030 importer = PyDict_GetItem(path_importer_cache, p);
1031 if (importer != NULL)
1032 return importer;
1033
1034 /* set path_importer_cache[p] to None to avoid recursion */
1035 if (PyDict_SetItem(path_importer_cache, p, Py_None) != 0)
1036 return NULL;
1037
1038 for (j = 0; j < nhooks; j++) {
1039 PyObject *hook = PyList_GetItem(path_hooks, j);
1040 if (hook == NULL)
1041 return NULL;
1042 importer = PyObject_CallFunction(hook, "O", p);
1043 if (importer != NULL)
1044 break;
1045
1046 if (!PyErr_ExceptionMatches(PyExc_ImportError)) {
1047 return NULL;
1048 }
1049 PyErr_Clear();
1050 }
1051 if (importer == NULL)
1052 importer = Py_None;
1053 else if (importer != Py_None) {
1054 int err = PyDict_SetItem(path_importer_cache, p, importer);
1055 Py_DECREF(importer);
1056 if (err != 0)
1057 return NULL;
1058 }
1059 return importer;
1060}
1061
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001062/* Search the path (default sys.path) for a module. Return the
1063 corresponding filedescr struct, and (via return arguments) the
1064 pathname and an open file. Return NULL if the module is not found. */
1065
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001066#ifdef MS_COREDLL
Thomas Woutersb4bd21c2000-07-22 23:38:01 +00001067extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **,
Martin v. Löwis18e16552006-02-15 17:27:45 +00001068 char *, Py_ssize_t);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001069#endif
1070
Martin v. Löwis18e16552006-02-15 17:27:45 +00001071static int case_ok(char *, Py_ssize_t, Py_ssize_t, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001072static int find_init_module(char *); /* Forward */
Just van Rossum52e14d62002-12-30 22:08:05 +00001073static struct filedescr importhookdescr = {"", "", IMP_HOOK};
Guido van Rossum197346f1997-10-31 18:38:52 +00001074
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001075static struct filedescr *
Just van Rossum52e14d62002-12-30 22:08:05 +00001076find_module(char *fullname, char *subname, PyObject *path, char *buf,
1077 size_t buflen, FILE **p_fp, PyObject **p_loader)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001078{
Martin v. Löwis725507b2006-03-07 12:08:51 +00001079 Py_ssize_t i, npath;
Fred Drake4c82b232000-06-30 16:18:57 +00001080 size_t len, namelen;
Guido van Rossum80bb9651996-12-05 23:27:02 +00001081 struct filedescr *fdp = NULL;
Jack Jansenc88da1f2002-05-28 10:58:19 +00001082 char *filemode;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001083 FILE *fp = NULL;
Just van Rossum52e14d62002-12-30 22:08:05 +00001084 PyObject *path_hooks, *path_importer_cache;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001085#ifndef RISCOS
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001086 struct stat statbuf;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001087#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +00001088 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
1089 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
1090 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossum0506a431998-08-11 15:07:39 +00001091 char name[MAXPATHLEN+1];
Andrew MacIntyred9400542002-02-26 11:41:34 +00001092#if defined(PYOS_OS2)
1093 size_t saved_len;
1094 size_t saved_namelen;
1095 char *saved_buf = NULL;
1096#endif
Just van Rossum52e14d62002-12-30 22:08:05 +00001097 if (p_loader != NULL)
1098 *p_loader = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001099
Just van Rossum52e14d62002-12-30 22:08:05 +00001100 if (strlen(subname) > MAXPATHLEN) {
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001101 PyErr_SetString(PyExc_OverflowError,
1102 "module name is too long");
Fred Drake4c82b232000-06-30 16:18:57 +00001103 return NULL;
1104 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001105 strcpy(name, subname);
1106
1107 /* sys.meta_path import hook */
1108 if (p_loader != NULL) {
1109 PyObject *meta_path;
1110
1111 meta_path = PySys_GetObject("meta_path");
1112 if (meta_path == NULL || !PyList_Check(meta_path)) {
1113 PyErr_SetString(PyExc_ImportError,
1114 "sys.meta_path must be a list of "
1115 "import hooks");
1116 return NULL;
1117 }
1118 Py_INCREF(meta_path); /* zap guard */
1119 npath = PyList_Size(meta_path);
1120 for (i = 0; i < npath; i++) {
1121 PyObject *loader;
1122 PyObject *hook = PyList_GetItem(meta_path, i);
1123 loader = PyObject_CallMethod(hook, "find_module",
1124 "sO", fullname,
1125 path != NULL ?
1126 path : Py_None);
1127 if (loader == NULL) {
1128 Py_DECREF(meta_path);
1129 return NULL; /* true error */
1130 }
1131 if (loader != Py_None) {
1132 /* a loader was found */
1133 *p_loader = loader;
1134 Py_DECREF(meta_path);
1135 return &importhookdescr;
1136 }
1137 Py_DECREF(loader);
1138 }
1139 Py_DECREF(meta_path);
1140 }
Guido van Rossum0506a431998-08-11 15:07:39 +00001141
1142 if (path != NULL && PyString_Check(path)) {
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001143 /* The only type of submodule allowed inside a "frozen"
1144 package are other frozen modules or packages. */
Guido van Rossum0506a431998-08-11 15:07:39 +00001145 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
1146 PyErr_SetString(PyExc_ImportError,
1147 "full frozen module name too long");
1148 return NULL;
1149 }
1150 strcpy(buf, PyString_AsString(path));
1151 strcat(buf, ".");
1152 strcat(buf, name);
1153 strcpy(name, buf);
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001154 if (find_frozen(name) != NULL) {
1155 strcpy(buf, name);
1156 return &fd_frozen;
1157 }
1158 PyErr_Format(PyExc_ImportError,
1159 "No frozen submodule named %.200s", name);
1160 return NULL;
Guido van Rossum0506a431998-08-11 15:07:39 +00001161 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001162 if (path == NULL) {
1163 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +00001164 strcpy(buf, name);
1165 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001166 }
Greg Ward201baee2001-10-04 14:52:06 +00001167 if ((find_frozen(name)) != NULL) {
Guido van Rossuma5568d31998-03-05 03:45:08 +00001168 strcpy(buf, name);
1169 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001170 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001171
Guido van Rossumac279101996-08-22 23:10:58 +00001172#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001173 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
1174 if (fp != NULL) {
1175 *p_fp = fp;
1176 return fdp;
1177 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +00001178#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +00001179 path = PySys_GetObject("path");
1180 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001181 if (path == NULL || !PyList_Check(path)) {
1182 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +00001183 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001184 return NULL;
1185 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001186
1187 path_hooks = PySys_GetObject("path_hooks");
1188 if (path_hooks == NULL || !PyList_Check(path_hooks)) {
1189 PyErr_SetString(PyExc_ImportError,
1190 "sys.path_hooks must be a list of "
1191 "import hooks");
1192 return NULL;
1193 }
1194 path_importer_cache = PySys_GetObject("path_importer_cache");
1195 if (path_importer_cache == NULL ||
1196 !PyDict_Check(path_importer_cache)) {
1197 PyErr_SetString(PyExc_ImportError,
1198 "sys.path_importer_cache must be a dict");
1199 return NULL;
1200 }
1201
Guido van Rossum79f25d91997-04-29 20:08:16 +00001202 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001203 namelen = strlen(name);
1204 for (i = 0; i < npath; i++) {
Walter Dörwald3430d702002-06-17 10:43:59 +00001205 PyObject *copy = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001206 PyObject *v = PyList_GetItem(path, i);
Walter Dörwald3430d702002-06-17 10:43:59 +00001207#ifdef Py_USING_UNICODE
1208 if (PyUnicode_Check(v)) {
1209 copy = PyUnicode_Encode(PyUnicode_AS_UNICODE(v),
1210 PyUnicode_GET_SIZE(v), Py_FileSystemDefaultEncoding, NULL);
1211 if (copy == NULL)
1212 return NULL;
1213 v = copy;
1214 }
1215 else
1216#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00001217 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001218 continue;
Neal Norwitz2aa9a5d2006-03-20 01:53:23 +00001219 len = PyString_GET_SIZE(v);
Walter Dörwald3430d702002-06-17 10:43:59 +00001220 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen) {
1221 Py_XDECREF(copy);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001222 continue; /* Too long */
Walter Dörwald3430d702002-06-17 10:43:59 +00001223 }
Neal Norwitz2aa9a5d2006-03-20 01:53:23 +00001224 strcpy(buf, PyString_AS_STRING(v));
Walter Dörwald3430d702002-06-17 10:43:59 +00001225 if (strlen(buf) != len) {
1226 Py_XDECREF(copy);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001227 continue; /* v contains '\0' */
Walter Dörwald3430d702002-06-17 10:43:59 +00001228 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001229
1230 /* sys.path_hooks import hook */
1231 if (p_loader != NULL) {
1232 PyObject *importer;
1233
1234 importer = get_path_importer(path_importer_cache,
1235 path_hooks, v);
1236 if (importer == NULL)
1237 return NULL;
1238 /* Note: importer is a borrowed reference */
1239 if (importer != Py_None) {
1240 PyObject *loader;
1241 loader = PyObject_CallMethod(importer,
1242 "find_module",
1243 "s", fullname);
1244 if (loader == NULL)
1245 return NULL; /* error */
1246 if (loader != Py_None) {
1247 /* a loader was found */
1248 *p_loader = loader;
1249 return &importhookdescr;
1250 }
1251 Py_DECREF(loader);
1252 }
1253 /* no hook was successful, use builtin import */
1254 }
1255
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001256 if (len > 0 && buf[len-1] != SEP
1257#ifdef ALTSEP
1258 && buf[len-1] != ALTSEP
1259#endif
1260 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001261 buf[len++] = SEP;
Guido van Rossum215c3402000-11-13 17:26:32 +00001262 strcpy(buf+len, name);
1263 len += namelen;
Tim Peters50d8d372001-02-28 05:34:27 +00001264
1265 /* Check for package import (buf holds a directory name,
1266 and there's an __init__ module in that directory */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001267#ifdef HAVE_STAT
Walter Dörwald3430d702002-06-17 10:43:59 +00001268 if (stat(buf, &statbuf) == 0 && /* it exists */
1269 S_ISDIR(statbuf.st_mode) && /* it's a directory */
1270 find_init_module(buf) && /* it has __init__.py */
1271 case_ok(buf, len, namelen, name)) { /* and case matches */
1272 Py_XDECREF(copy);
Tim Peterscab3f682001-04-29 22:21:25 +00001273 return &fd_package;
Walter Dörwald3430d702002-06-17 10:43:59 +00001274 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001275#else
1276 /* XXX How are you going to test for directories? */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001277#ifdef RISCOS
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001278 if (isdir(buf) &&
1279 find_init_module(buf) &&
Walter Dörwald3430d702002-06-17 10:43:59 +00001280 case_ok(buf, len, namelen, name)) {
1281 Py_XDECREF(copy);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001282 return &fd_package;
Walter Dörwald3430d702002-06-17 10:43:59 +00001283 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001284#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001285#endif
Andrew MacIntyred9400542002-02-26 11:41:34 +00001286#if defined(PYOS_OS2)
1287 /* take a snapshot of the module spec for restoration
1288 * after the 8 character DLL hackery
1289 */
1290 saved_buf = strdup(buf);
1291 saved_len = len;
1292 saved_namelen = namelen;
1293#endif /* PYOS_OS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001294 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Andrew MacIntyred9400542002-02-26 11:41:34 +00001295#if defined(PYOS_OS2)
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001296 /* OS/2 limits DLLs to 8 character names (w/o
1297 extension)
Andrew MacIntyred9400542002-02-26 11:41:34 +00001298 * so if the name is longer than that and its a
1299 * dynamically loaded module we're going to try,
1300 * truncate the name before trying
1301 */
Just van Rossum52e14d62002-12-30 22:08:05 +00001302 if (strlen(subname) > 8) {
Andrew MacIntyred9400542002-02-26 11:41:34 +00001303 /* is this an attempt to load a C extension? */
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001304 const struct filedescr *scan;
1305 scan = _PyImport_DynLoadFiletab;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001306 while (scan->suffix != NULL) {
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001307 if (!strcmp(scan->suffix, fdp->suffix))
Andrew MacIntyred9400542002-02-26 11:41:34 +00001308 break;
1309 else
1310 scan++;
1311 }
1312 if (scan->suffix != NULL) {
1313 /* yes, so truncate the name */
1314 namelen = 8;
Just van Rossum52e14d62002-12-30 22:08:05 +00001315 len -= strlen(subname) - namelen;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001316 buf[len] = '\0';
1317 }
1318 }
1319#endif /* PYOS_OS2 */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001320 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001321 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001322 PySys_WriteStderr("# trying %s\n", buf);
Jack Jansenc88da1f2002-05-28 10:58:19 +00001323 filemode = fdp->mode;
Tim Peters86c7d2f2004-08-01 23:24:21 +00001324 if (filemode[0] == 'U')
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001325 filemode = "r" PY_STDIOTEXTMODE;
Jack Jansenc88da1f2002-05-28 10:58:19 +00001326 fp = fopen(buf, filemode);
Tim Peters50d8d372001-02-28 05:34:27 +00001327 if (fp != NULL) {
1328 if (case_ok(buf, len, namelen, name))
1329 break;
1330 else { /* continue search */
1331 fclose(fp);
1332 fp = NULL;
Barry Warsaw914a0b12001-02-02 19:12:16 +00001333 }
Barry Warsaw914a0b12001-02-02 19:12:16 +00001334 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001335#if defined(PYOS_OS2)
1336 /* restore the saved snapshot */
1337 strcpy(buf, saved_buf);
1338 len = saved_len;
1339 namelen = saved_namelen;
1340#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001341 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001342#if defined(PYOS_OS2)
1343 /* don't need/want the module name snapshot anymore */
1344 if (saved_buf)
1345 {
1346 free(saved_buf);
1347 saved_buf = NULL;
1348 }
1349#endif
Walter Dörwald3430d702002-06-17 10:43:59 +00001350 Py_XDECREF(copy);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001351 if (fp != NULL)
1352 break;
1353 }
1354 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001355 PyErr_Format(PyExc_ImportError,
1356 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001357 return NULL;
1358 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001359 *p_fp = fp;
1360 return fdp;
1361}
1362
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +00001363/* Helpers for main.c
1364 * Find the source file corresponding to a named module
1365 */
1366struct filedescr *
1367_PyImport_FindModule(const char *name, PyObject *path, char *buf,
1368 size_t buflen, FILE **p_fp, PyObject **p_loader)
1369{
1370 return find_module((char *) name, (char *) name, path,
1371 buf, buflen, p_fp, p_loader);
1372}
1373
1374PyAPI_FUNC(int) _PyImport_IsScript(struct filedescr * fd)
1375{
1376 return fd->type == PY_SOURCE || fd->type == PY_COMPILED;
1377}
1378
Martin v. Löwis18e16552006-02-15 17:27:45 +00001379/* case_ok(char* buf, Py_ssize_t len, Py_ssize_t namelen, char* name)
Tim Petersd1e87a82001-03-01 18:12:00 +00001380 * The arguments here are tricky, best shown by example:
1381 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1382 * ^ ^ ^ ^
1383 * |--------------------- buf ---------------------|
1384 * |------------------- len ------------------|
1385 * |------ name -------|
1386 * |----- namelen -----|
1387 * buf is the full path, but len only counts up to (& exclusive of) the
1388 * extension. name is the module name, also exclusive of extension.
1389 *
1390 * We've already done a successful stat() or fopen() on buf, so know that
1391 * there's some match, possibly case-insensitive.
1392 *
Tim Peters50d8d372001-02-28 05:34:27 +00001393 * case_ok() is to return 1 if there's a case-sensitive match for
1394 * name, else 0. case_ok() is also to return 1 if envar PYTHONCASEOK
1395 * exists.
Tim Petersd1e87a82001-03-01 18:12:00 +00001396 *
Tim Peters50d8d372001-02-28 05:34:27 +00001397 * case_ok() is used to implement case-sensitive import semantics even
1398 * on platforms with case-insensitive filesystems. It's trivial to implement
1399 * for case-sensitive filesystems. It's pretty much a cross-platform
1400 * nightmare for systems with case-insensitive filesystems.
1401 */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001402
Tim Peters50d8d372001-02-28 05:34:27 +00001403/* First we may need a pile of platform-specific header files; the sequence
1404 * of #if's here should match the sequence in the body of case_ok().
1405 */
Jason Tishler7961aa62005-05-20 00:56:54 +00001406#if defined(MS_WINDOWS)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001407#include <windows.h>
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001408
Tim Peters50d8d372001-02-28 05:34:27 +00001409#elif defined(DJGPP)
1410#include <dir.h>
1411
Jason Tishler7961aa62005-05-20 00:56:54 +00001412#elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001413#include <sys/types.h>
1414#include <dirent.h>
1415
Andrew MacIntyred9400542002-02-26 11:41:34 +00001416#elif defined(PYOS_OS2)
1417#define INCL_DOS
1418#define INCL_DOSERRORS
1419#define INCL_NOPMAPI
1420#include <os2.h>
1421
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001422#elif defined(RISCOS)
1423#include "oslib/osfscontrol.h"
Tim Peters50d8d372001-02-28 05:34:27 +00001424#endif
1425
Guido van Rossum0980bd91998-02-13 17:18:36 +00001426static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001427case_ok(char *buf, Py_ssize_t len, Py_ssize_t namelen, char *name)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001428{
Tim Peters50d8d372001-02-28 05:34:27 +00001429/* Pick a platform-specific implementation; the sequence of #if's here should
1430 * match the sequence just above.
1431 */
1432
Jason Tishler7961aa62005-05-20 00:56:54 +00001433/* MS_WINDOWS */
1434#if defined(MS_WINDOWS)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001435 WIN32_FIND_DATA data;
1436 HANDLE h;
Tim Peters50d8d372001-02-28 05:34:27 +00001437
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001438 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001439 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001440
Guido van Rossum0980bd91998-02-13 17:18:36 +00001441 h = FindFirstFile(buf, &data);
1442 if (h == INVALID_HANDLE_VALUE) {
1443 PyErr_Format(PyExc_NameError,
1444 "Can't find file for module %.100s\n(filename %.300s)",
1445 name, buf);
1446 return 0;
1447 }
1448 FindClose(h);
Tim Peters50d8d372001-02-28 05:34:27 +00001449 return strncmp(data.cFileName, name, namelen) == 0;
1450
1451/* DJGPP */
1452#elif defined(DJGPP)
1453 struct ffblk ffblk;
1454 int done;
1455
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001456 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001457 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001458
1459 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
1460 if (done) {
Guido van Rossum0980bd91998-02-13 17:18:36 +00001461 PyErr_Format(PyExc_NameError,
Tim Peters50d8d372001-02-28 05:34:27 +00001462 "Can't find file for module %.100s\n(filename %.300s)",
Guido van Rossum0980bd91998-02-13 17:18:36 +00001463 name, buf);
1464 return 0;
1465 }
Tim Peters50d8d372001-02-28 05:34:27 +00001466 return strncmp(ffblk.ff_name, name, namelen) == 0;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001467
Jason Tishler7961aa62005-05-20 00:56:54 +00001468/* new-fangled macintosh (macosx) or Cygwin */
1469#elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001470 DIR *dirp;
1471 struct dirent *dp;
Tim Petersd1e87a82001-03-01 18:12:00 +00001472 char dirname[MAXPATHLEN + 1];
1473 const int dirlen = len - namelen - 1; /* don't want trailing SEP */
Tim Peters430f5d42001-03-01 01:30:56 +00001474
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001475 if (Py_GETENV("PYTHONCASEOK") != NULL)
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001476 return 1;
1477
Tim Petersd1e87a82001-03-01 18:12:00 +00001478 /* Copy the dir component into dirname; substitute "." if empty */
1479 if (dirlen <= 0) {
1480 dirname[0] = '.';
1481 dirname[1] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001482 }
1483 else {
Tim Petersd1e87a82001-03-01 18:12:00 +00001484 assert(dirlen <= MAXPATHLEN);
1485 memcpy(dirname, buf, dirlen);
1486 dirname[dirlen] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001487 }
1488 /* Open the directory and search the entries for an exact match. */
Tim Petersd1e87a82001-03-01 18:12:00 +00001489 dirp = opendir(dirname);
Tim Peters430f5d42001-03-01 01:30:56 +00001490 if (dirp) {
Tim Peters677898a2001-03-02 03:28:03 +00001491 char *nameWithExt = buf + len - namelen;
Tim Peters430f5d42001-03-01 01:30:56 +00001492 while ((dp = readdir(dirp)) != NULL) {
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001493 const int thislen =
Tim Peters430f5d42001-03-01 01:30:56 +00001494#ifdef _DIRENT_HAVE_D_NAMELEN
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001495 dp->d_namlen;
Tim Peters430f5d42001-03-01 01:30:56 +00001496#else
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001497 strlen(dp->d_name);
Tim Peters430f5d42001-03-01 01:30:56 +00001498#endif
Tim Petersd1e87a82001-03-01 18:12:00 +00001499 if (thislen >= namelen &&
Tim Peters677898a2001-03-02 03:28:03 +00001500 strcmp(dp->d_name, nameWithExt) == 0) {
Tim Peters430f5d42001-03-01 01:30:56 +00001501 (void)closedir(dirp);
1502 return 1; /* Found */
1503 }
1504 }
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001505 (void)closedir(dirp);
Tim Peters430f5d42001-03-01 01:30:56 +00001506 }
Tim Peters430f5d42001-03-01 01:30:56 +00001507 return 0 ; /* Not found */
Tim Peters430f5d42001-03-01 01:30:56 +00001508
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001509/* RISC OS */
1510#elif defined(RISCOS)
1511 char canon[MAXPATHLEN+1]; /* buffer for the canonical form of the path */
1512 char buf2[MAXPATHLEN+2];
1513 char *nameWithExt = buf+len-namelen;
1514 int canonlen;
1515 os_error *e;
1516
1517 if (Py_GETENV("PYTHONCASEOK") != NULL)
1518 return 1;
1519
1520 /* workaround:
1521 append wildcard, otherwise case of filename wouldn't be touched */
1522 strcpy(buf2, buf);
1523 strcat(buf2, "*");
1524
1525 e = xosfscontrol_canonicalise_path(buf2,canon,0,0,MAXPATHLEN+1,&canonlen);
1526 canonlen = MAXPATHLEN+1-canonlen;
1527 if (e || canonlen<=0 || canonlen>(MAXPATHLEN+1) )
1528 return 0;
1529 if (strcmp(nameWithExt, canon+canonlen-strlen(nameWithExt))==0)
1530 return 1; /* match */
1531
1532 return 0;
1533
Andrew MacIntyred9400542002-02-26 11:41:34 +00001534/* OS/2 */
1535#elif defined(PYOS_OS2)
1536 HDIR hdir = 1;
1537 ULONG srchcnt = 1;
1538 FILEFINDBUF3 ffbuf;
1539 APIRET rc;
1540
1541 if (getenv("PYTHONCASEOK") != NULL)
1542 return 1;
1543
1544 rc = DosFindFirst(buf,
1545 &hdir,
1546 FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY,
1547 &ffbuf, sizeof(ffbuf),
1548 &srchcnt,
1549 FIL_STANDARD);
1550 if (rc != NO_ERROR)
1551 return 0;
1552 return strncmp(ffbuf.achName, name, namelen) == 0;
1553
Tim Peters50d8d372001-02-28 05:34:27 +00001554/* assuming it's a case-sensitive filesystem, so there's nothing to do! */
1555#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001556 return 1;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001557
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001558#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001559}
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001560
Guido van Rossum0980bd91998-02-13 17:18:36 +00001561
Guido van Rossum197346f1997-10-31 18:38:52 +00001562#ifdef HAVE_STAT
1563/* Helper to look for __init__.py or __init__.py[co] in potential package */
1564static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001565find_init_module(char *buf)
Guido van Rossum197346f1997-10-31 18:38:52 +00001566{
Tim Peters0f9431f2001-07-05 03:47:53 +00001567 const size_t save_len = strlen(buf);
Fred Drake4c82b232000-06-30 16:18:57 +00001568 size_t i = save_len;
Tim Peters0f9431f2001-07-05 03:47:53 +00001569 char *pname; /* pointer to start of __init__ */
Guido van Rossum197346f1997-10-31 18:38:52 +00001570 struct stat statbuf;
1571
Tim Peters0f9431f2001-07-05 03:47:53 +00001572/* For calling case_ok(buf, len, namelen, name):
1573 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1574 * ^ ^ ^ ^
1575 * |--------------------- buf ---------------------|
1576 * |------------------- len ------------------|
1577 * |------ name -------|
1578 * |----- namelen -----|
1579 */
Guido van Rossum197346f1997-10-31 18:38:52 +00001580 if (save_len + 13 >= MAXPATHLEN)
1581 return 0;
1582 buf[i++] = SEP;
Tim Peters0f9431f2001-07-05 03:47:53 +00001583 pname = buf + i;
1584 strcpy(pname, "__init__.py");
Guido van Rossum197346f1997-10-31 18:38:52 +00001585 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001586 if (case_ok(buf,
1587 save_len + 9, /* len("/__init__") */
1588 8, /* len("__init__") */
1589 pname)) {
1590 buf[save_len] = '\0';
1591 return 1;
1592 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001593 }
Tim Peters0f9431f2001-07-05 03:47:53 +00001594 i += strlen(pname);
1595 strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum197346f1997-10-31 18:38:52 +00001596 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001597 if (case_ok(buf,
1598 save_len + 9, /* len("/__init__") */
1599 8, /* len("__init__") */
1600 pname)) {
1601 buf[save_len] = '\0';
1602 return 1;
1603 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001604 }
1605 buf[save_len] = '\0';
1606 return 0;
1607}
Guido van Rossum48a680c2001-03-02 06:34:14 +00001608
1609#else
1610
1611#ifdef RISCOS
1612static int
1613find_init_module(buf)
1614 char *buf;
1615{
1616 int save_len = strlen(buf);
1617 int i = save_len;
1618
1619 if (save_len + 13 >= MAXPATHLEN)
1620 return 0;
1621 buf[i++] = SEP;
1622 strcpy(buf+i, "__init__/py");
1623 if (isfile(buf)) {
1624 buf[save_len] = '\0';
1625 return 1;
1626 }
1627
1628 if (Py_OptimizeFlag)
1629 strcpy(buf+i, "o");
1630 else
1631 strcpy(buf+i, "c");
1632 if (isfile(buf)) {
1633 buf[save_len] = '\0';
1634 return 1;
1635 }
1636 buf[save_len] = '\0';
1637 return 0;
1638}
1639#endif /*RISCOS*/
1640
Guido van Rossum197346f1997-10-31 18:38:52 +00001641#endif /* HAVE_STAT */
1642
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001643
Tim Petersdbd9ba62000-07-09 03:09:57 +00001644static int init_builtin(char *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001645
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001646/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001647 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001648
Guido van Rossum79f25d91997-04-29 20:08:16 +00001649static PyObject *
Just van Rossum52e14d62002-12-30 22:08:05 +00001650load_module(char *name, FILE *fp, char *buf, int type, PyObject *loader)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001651{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001652 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001653 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001654 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001655
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001656 /* First check that there's an open file (if we need one) */
1657 switch (type) {
1658 case PY_SOURCE:
1659 case PY_COMPILED:
1660 if (fp == NULL) {
1661 PyErr_Format(PyExc_ValueError,
1662 "file object required for import (type code %d)",
1663 type);
1664 return NULL;
1665 }
1666 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001667
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001668 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001669
1670 case PY_SOURCE:
1671 m = load_source_module(name, buf, fp);
1672 break;
1673
1674 case PY_COMPILED:
1675 m = load_compiled_module(name, buf, fp);
1676 break;
1677
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001678#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001679 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001680 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001681 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001682#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001683
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001684 case PKG_DIRECTORY:
1685 m = load_package(name, buf);
1686 break;
1687
1688 case C_BUILTIN:
1689 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001690 if (buf != NULL && buf[0] != '\0')
1691 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001692 if (type == C_BUILTIN)
1693 err = init_builtin(name);
1694 else
1695 err = PyImport_ImportFrozenModule(name);
1696 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001697 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001698 if (err == 0) {
1699 PyErr_Format(PyExc_ImportError,
1700 "Purported %s module %.200s not found",
1701 type == C_BUILTIN ?
1702 "builtin" : "frozen",
1703 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001704 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001705 }
1706 modules = PyImport_GetModuleDict();
1707 m = PyDict_GetItemString(modules, name);
1708 if (m == NULL) {
1709 PyErr_Format(
1710 PyExc_ImportError,
1711 "%s module %.200s not properly initialized",
1712 type == C_BUILTIN ?
1713 "builtin" : "frozen",
1714 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001715 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001716 }
1717 Py_INCREF(m);
1718 break;
1719
Just van Rossum52e14d62002-12-30 22:08:05 +00001720 case IMP_HOOK: {
1721 if (loader == NULL) {
1722 PyErr_SetString(PyExc_ImportError,
1723 "import hook without loader");
1724 return NULL;
1725 }
1726 m = PyObject_CallMethod(loader, "load_module", "s", name);
1727 break;
1728 }
1729
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001730 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001731 PyErr_Format(PyExc_ImportError,
1732 "Don't know how to import %.200s (type code %d)",
1733 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001734 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001735
1736 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001737
1738 return m;
1739}
1740
1741
1742/* Initialize a built-in module.
1743 Return 1 for succes, 0 if the module is not found, and -1 with
1744 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001745
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001746static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001747init_builtin(char *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001748{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001749 struct _inittab *p;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001750
Greg Ward201baee2001-10-04 14:52:06 +00001751 if (_PyImport_FindExtension(name, name) != NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00001752 return 1;
1753
Guido van Rossum771c6c81997-10-31 18:37:24 +00001754 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001755 if (strcmp(name, p->name) == 0) {
1756 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001757 PyErr_Format(PyExc_ImportError,
1758 "Cannot re-init internal module %.200s",
1759 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001760 return -1;
1761 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001762 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001763 PySys_WriteStderr("import %s # builtin\n", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001764 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001765 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001766 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001767 if (_PyImport_FixupExtension(name, name) == NULL)
1768 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001769 return 1;
1770 }
1771 }
1772 return 0;
1773}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001774
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001775
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001776/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001777
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001778static struct _frozen *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001779find_frozen(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001780{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001781 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001782
Guido van Rossum79f25d91997-04-29 20:08:16 +00001783 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001784 if (p->name == NULL)
1785 return NULL;
1786 if (strcmp(p->name, name) == 0)
1787 break;
1788 }
1789 return p;
1790}
1791
Guido van Rossum79f25d91997-04-29 20:08:16 +00001792static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001793get_frozen_object(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001794{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001795 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001796 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001797
1798 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001799 PyErr_Format(PyExc_ImportError,
1800 "No such frozen object named %.200s",
1801 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001802 return NULL;
1803 }
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001804 if (p->code == NULL) {
1805 PyErr_Format(PyExc_ImportError,
1806 "Excluded frozen object named %.200s",
1807 name);
1808 return NULL;
1809 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001810 size = p->size;
1811 if (size < 0)
1812 size = -size;
1813 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001814}
1815
1816/* Initialize a frozen module.
1817 Return 1 for succes, 0 if the module is not found, and -1 with
1818 an exception set if the initialization failed.
1819 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001820
1821int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001822PyImport_ImportFrozenModule(char *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001823{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001824 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001825 PyObject *co;
1826 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001827 int ispackage;
1828 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001829
1830 if (p == NULL)
1831 return 0;
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001832 if (p->code == NULL) {
1833 PyErr_Format(PyExc_ImportError,
1834 "Excluded frozen object named %.200s",
1835 name);
1836 return -1;
1837 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001838 size = p->size;
1839 ispackage = (size < 0);
1840 if (ispackage)
1841 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001842 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001843 PySys_WriteStderr("import %s # frozen%s\n",
Guido van Rossuma5568d31998-03-05 03:45:08 +00001844 name, ispackage ? " package" : "");
1845 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001846 if (co == NULL)
1847 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001848 if (!PyCode_Check(co)) {
1849 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001850 PyErr_Format(PyExc_TypeError,
1851 "frozen object %.200s is not a code object",
1852 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001853 return -1;
1854 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001855 if (ispackage) {
1856 /* Set __path__ to the package name */
1857 PyObject *d, *s;
1858 int err;
1859 m = PyImport_AddModule(name);
1860 if (m == NULL)
1861 return -1;
1862 d = PyModule_GetDict(m);
1863 s = PyString_InternFromString(name);
1864 if (s == NULL)
1865 return -1;
1866 err = PyDict_SetItemString(d, "__path__", s);
1867 Py_DECREF(s);
1868 if (err != 0)
1869 return err;
1870 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001871 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001872 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001873 if (m == NULL)
1874 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001875 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001876 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001877}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001878
1879
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001880/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001881 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001882
Guido van Rossum79f25d91997-04-29 20:08:16 +00001883PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00001884PyImport_ImportModule(const char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00001885{
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00001886 PyObject *pname;
1887 PyObject *result;
1888
1889 pname = PyString_FromString(name);
Neal Norwitza11e4c12003-03-23 14:31:01 +00001890 if (pname == NULL)
1891 return NULL;
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00001892 result = PyImport_Import(pname);
1893 Py_DECREF(pname);
1894 return result;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001895}
1896
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001897/* Forward declarations for helper routines */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001898static PyObject *get_parent(PyObject *globals, char *buf,
1899 Py_ssize_t *p_buflen, int level);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001900static PyObject *load_next(PyObject *mod, PyObject *altmod,
Martin v. Löwis18e16552006-02-15 17:27:45 +00001901 char **p_name, char *buf, Py_ssize_t *p_buflen);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001902static int mark_miss(char *name);
1903static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
Martin v. Löwis18e16552006-02-15 17:27:45 +00001904 char *buf, Py_ssize_t buflen, int recursive);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001905static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001906
1907/* The Magnum Opus of dotted-name import :-) */
1908
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001909static PyObject *
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001910import_module_level(char *name, PyObject *globals, PyObject *locals,
1911 PyObject *fromlist, int level)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001912{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001913 char buf[MAXPATHLEN+1];
Martin v. Löwis18e16552006-02-15 17:27:45 +00001914 Py_ssize_t buflen = 0;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001915 PyObject *parent, *head, *next, *tail;
1916
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001917 parent = get_parent(globals, buf, &buflen, level);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001918 if (parent == NULL)
1919 return NULL;
1920
1921 head = load_next(parent, Py_None, &name, buf, &buflen);
1922 if (head == NULL)
1923 return NULL;
1924
1925 tail = head;
1926 Py_INCREF(tail);
1927 while (name) {
1928 next = load_next(tail, tail, &name, buf, &buflen);
1929 Py_DECREF(tail);
1930 if (next == NULL) {
1931 Py_DECREF(head);
1932 return NULL;
1933 }
1934 tail = next;
1935 }
1936
1937 if (fromlist != NULL) {
1938 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1939 fromlist = NULL;
1940 }
1941
1942 if (fromlist == NULL) {
1943 Py_DECREF(tail);
1944 return head;
1945 }
1946
1947 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001948 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001949 Py_DECREF(tail);
1950 return NULL;
1951 }
1952
1953 return tail;
1954}
1955
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001956/* For DLL compatibility */
1957#undef PyImport_ImportModuleEx
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001958PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001959PyImport_ImportModuleEx(char *name, PyObject *globals, PyObject *locals,
1960 PyObject *fromlist)
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001961{
1962 PyObject *result;
1963 lock_import();
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001964 result = import_module_level(name, globals, locals, fromlist, -1);
1965 if (unlock_import() < 0) {
1966 Py_XDECREF(result);
1967 PyErr_SetString(PyExc_RuntimeError,
1968 "not holding the import lock");
1969 return NULL;
1970 }
1971 return result;
1972}
1973#define PyImport_ImportModuleEx(n, g, l, f) \
1974 PyImport_ImportModuleLevel(n, g, l, f, -1);
1975
1976PyObject *
1977PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals,
1978 PyObject *fromlist, int level)
1979{
1980 PyObject *result;
1981 lock_import();
1982 result = import_module_level(name, globals, locals, fromlist, level);
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00001983 if (unlock_import() < 0) {
1984 Py_XDECREF(result);
1985 PyErr_SetString(PyExc_RuntimeError,
1986 "not holding the import lock");
1987 return NULL;
1988 }
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001989 return result;
1990}
1991
Fred Drake87590902004-05-28 20:21:36 +00001992/* Return the package that an import is being performed in. If globals comes
1993 from the module foo.bar.bat (not itself a package), this returns the
1994 sys.modules entry for foo.bar. If globals is from a package's __init__.py,
1995 the package's entry in sys.modules is returned.
1996
1997 The *name* of the returned package is returned in buf, with the length of
1998 the name in *p_buflen.
1999
2000 If globals doesn't come from a package or a module in a package, or a
2001 corresponding entry is not found in sys.modules, Py_None is returned.
2002*/
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002003static PyObject *
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002004get_parent(PyObject *globals, char *buf, Py_ssize_t *p_buflen, int level)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002005{
2006 static PyObject *namestr = NULL;
2007 static PyObject *pathstr = NULL;
2008 PyObject *modname, *modpath, *modules, *parent;
2009
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002010 if (globals == NULL || !PyDict_Check(globals) || !level)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002011 return Py_None;
2012
2013 if (namestr == NULL) {
2014 namestr = PyString_InternFromString("__name__");
2015 if (namestr == NULL)
2016 return NULL;
2017 }
2018 if (pathstr == NULL) {
2019 pathstr = PyString_InternFromString("__path__");
2020 if (pathstr == NULL)
2021 return NULL;
2022 }
2023
2024 *buf = '\0';
2025 *p_buflen = 0;
2026 modname = PyDict_GetItem(globals, namestr);
2027 if (modname == NULL || !PyString_Check(modname))
2028 return Py_None;
2029
2030 modpath = PyDict_GetItem(globals, pathstr);
2031 if (modpath != NULL) {
Martin v. Löwis725507b2006-03-07 12:08:51 +00002032 Py_ssize_t len = PyString_GET_SIZE(modname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002033 if (len > MAXPATHLEN) {
2034 PyErr_SetString(PyExc_ValueError,
2035 "Module name too long");
2036 return NULL;
2037 }
2038 strcpy(buf, PyString_AS_STRING(modname));
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002039 }
2040 else {
2041 char *start = PyString_AS_STRING(modname);
2042 char *lastdot = strrchr(start, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00002043 size_t len;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002044 if (lastdot == NULL && level > 0) {
2045 PyErr_SetString(PyExc_ValueError,
2046 "Relative importpath too deep");
2047 return NULL;
2048 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002049 if (lastdot == NULL)
2050 return Py_None;
2051 len = lastdot - start;
2052 if (len >= MAXPATHLEN) {
2053 PyErr_SetString(PyExc_ValueError,
2054 "Module name too long");
2055 return NULL;
2056 }
2057 strncpy(buf, start, len);
2058 buf[len] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002059 }
2060
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002061 while (--level > 0) {
2062 char *dot = strrchr(buf, '.');
2063 if (dot == NULL) {
2064 PyErr_SetString(PyExc_ValueError,
2065 "Relative importpath too deep");
2066 return NULL;
2067 }
2068 *dot = '\0';
2069 }
2070 *p_buflen = strlen(buf);
2071
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002072 modules = PyImport_GetModuleDict();
2073 parent = PyDict_GetItemString(modules, buf);
2074 if (parent == NULL)
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002075 PyErr_Format(PyExc_SystemError,
2076 "Parent module '%.200s' not loaded", buf);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002077 return parent;
2078 /* We expect, but can't guarantee, if parent != None, that:
2079 - parent.__name__ == buf
2080 - parent.__dict__ is globals
2081 If this is violated... Who cares? */
2082}
2083
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002084/* altmod is either None or same as mod */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002085static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002086load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
Martin v. Löwis18e16552006-02-15 17:27:45 +00002087 Py_ssize_t *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002088{
2089 char *name = *p_name;
2090 char *dot = strchr(name, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00002091 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002092 char *p;
2093 PyObject *result;
2094
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002095 if (strlen(name) == 0) {
2096 /* empty module name only happens in 'from . import' */
2097 Py_INCREF(mod);
2098 *p_name = NULL;
2099 return mod;
2100 }
2101
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002102 if (dot == NULL) {
2103 *p_name = NULL;
2104 len = strlen(name);
2105 }
2106 else {
2107 *p_name = dot+1;
2108 len = dot-name;
2109 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00002110 if (len == 0) {
2111 PyErr_SetString(PyExc_ValueError,
2112 "Empty module name");
2113 return NULL;
2114 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002115
2116 p = buf + *p_buflen;
2117 if (p != buf)
2118 *p++ = '.';
2119 if (p+len-buf >= MAXPATHLEN) {
2120 PyErr_SetString(PyExc_ValueError,
2121 "Module name too long");
2122 return NULL;
2123 }
2124 strncpy(p, name, len);
2125 p[len] = '\0';
2126 *p_buflen = p+len-buf;
2127
2128 result = import_submodule(mod, p, buf);
2129 if (result == Py_None && altmod != mod) {
2130 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00002131 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00002132 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00002133 if (result != NULL && result != Py_None) {
2134 if (mark_miss(buf) != 0) {
2135 Py_DECREF(result);
2136 return NULL;
2137 }
2138 strncpy(buf, name, len);
2139 buf[len] = '\0';
2140 *p_buflen = len;
2141 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002142 }
2143 if (result == NULL)
2144 return NULL;
2145
2146 if (result == Py_None) {
2147 Py_DECREF(result);
2148 PyErr_Format(PyExc_ImportError,
2149 "No module named %.200s", name);
2150 return NULL;
2151 }
2152
2153 return result;
2154}
2155
2156static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002157mark_miss(char *name)
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00002158{
2159 PyObject *modules = PyImport_GetModuleDict();
2160 return PyDict_SetItemString(modules, name, Py_None);
2161}
2162
2163static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002164ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, Py_ssize_t buflen,
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002165 int recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002166{
2167 int i;
2168
2169 if (!PyObject_HasAttrString(mod, "__path__"))
2170 return 1;
2171
2172 for (i = 0; ; i++) {
2173 PyObject *item = PySequence_GetItem(fromlist, i);
2174 int hasit;
2175 if (item == NULL) {
2176 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2177 PyErr_Clear();
2178 return 1;
2179 }
2180 return 0;
2181 }
2182 if (!PyString_Check(item)) {
2183 PyErr_SetString(PyExc_TypeError,
2184 "Item in ``from list'' not a string");
2185 Py_DECREF(item);
2186 return 0;
2187 }
2188 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00002189 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002190 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00002191 /* See if the package defines __all__ */
2192 if (recursive)
2193 continue; /* Avoid endless recursion */
2194 all = PyObject_GetAttrString(mod, "__all__");
2195 if (all == NULL)
2196 PyErr_Clear();
2197 else {
Martin v. Löwis83969ee2004-03-23 16:28:13 +00002198 int ret = ensure_fromlist(mod, all, buf, buflen, 1);
Guido van Rossum9905ef91997-09-08 16:07:11 +00002199 Py_DECREF(all);
Martin v. Löwis83969ee2004-03-23 16:28:13 +00002200 if (!ret)
2201 return 0;
Guido van Rossum9905ef91997-09-08 16:07:11 +00002202 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002203 continue;
2204 }
2205 hasit = PyObject_HasAttr(mod, item);
2206 if (!hasit) {
2207 char *subname = PyString_AS_STRING(item);
2208 PyObject *submod;
2209 char *p;
2210 if (buflen + strlen(subname) >= MAXPATHLEN) {
2211 PyErr_SetString(PyExc_ValueError,
2212 "Module name too long");
2213 Py_DECREF(item);
2214 return 0;
2215 }
2216 p = buf + buflen;
2217 *p++ = '.';
2218 strcpy(p, subname);
2219 submod = import_submodule(mod, subname, buf);
2220 Py_XDECREF(submod);
2221 if (submod == NULL) {
2222 Py_DECREF(item);
2223 return 0;
2224 }
2225 }
2226 Py_DECREF(item);
2227 }
2228
Guido van Rossuma7f2e811997-10-03 15:33:32 +00002229 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002230}
2231
Neil Schemenauer00b09662003-06-16 21:03:07 +00002232static int
2233add_submodule(PyObject *mod, PyObject *submod, char *fullname, char *subname,
2234 PyObject *modules)
2235{
2236 if (mod == Py_None)
2237 return 1;
2238 /* Irrespective of the success of this load, make a
2239 reference to it in the parent package module. A copy gets
2240 saved in the modules dictionary under the full name, so get a
2241 reference from there, if need be. (The exception is when the
2242 load failed with a SyntaxError -- then there's no trace in
2243 sys.modules. In that case, of course, do nothing extra.) */
2244 if (submod == NULL) {
2245 submod = PyDict_GetItemString(modules, fullname);
2246 if (submod == NULL)
2247 return 1;
2248 }
2249 if (PyModule_Check(mod)) {
2250 /* We can't use setattr here since it can give a
2251 * spurious warning if the submodule name shadows a
2252 * builtin name */
2253 PyObject *dict = PyModule_GetDict(mod);
2254 if (!dict)
2255 return 0;
2256 if (PyDict_SetItemString(dict, subname, submod) < 0)
2257 return 0;
2258 }
2259 else {
2260 if (PyObject_SetAttrString(mod, subname, submod) < 0)
2261 return 0;
2262 }
2263 return 1;
2264}
2265
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002266static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002267import_submodule(PyObject *mod, char *subname, char *fullname)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002268{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002269 PyObject *modules = PyImport_GetModuleDict();
Neil Schemenauer00b09662003-06-16 21:03:07 +00002270 PyObject *m = NULL;
Guido van Rossum74e6a111994-08-29 12:54:38 +00002271
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002272 /* Require:
2273 if mod == None: subname == fullname
2274 else: mod.__name__ + "." + subname == fullname
2275 */
2276
Tim Peters50d8d372001-02-28 05:34:27 +00002277 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002278 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00002279 }
2280 else {
Just van Rossum52e14d62002-12-30 22:08:05 +00002281 PyObject *path, *loader = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002282 char buf[MAXPATHLEN+1];
2283 struct filedescr *fdp;
2284 FILE *fp = NULL;
2285
Guido van Rossum9c0afe51998-05-19 15:09:05 +00002286 if (mod == Py_None)
2287 path = NULL;
2288 else {
2289 path = PyObject_GetAttrString(mod, "__path__");
2290 if (path == NULL) {
2291 PyErr_Clear();
2292 Py_INCREF(Py_None);
2293 return Py_None;
2294 }
2295 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002296
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002297 buf[0] = '\0';
Just van Rossum52e14d62002-12-30 22:08:05 +00002298 fdp = find_module(fullname, subname, path, buf, MAXPATHLEN+1,
2299 &fp, &loader);
Guido van Rossumb68cd421998-07-01 17:36:26 +00002300 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002301 if (fdp == NULL) {
2302 if (!PyErr_ExceptionMatches(PyExc_ImportError))
2303 return NULL;
2304 PyErr_Clear();
2305 Py_INCREF(Py_None);
2306 return Py_None;
2307 }
Just van Rossum52e14d62002-12-30 22:08:05 +00002308 m = load_module(fullname, fp, buf, fdp->type, loader);
2309 Py_XDECREF(loader);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002310 if (fp)
2311 fclose(fp);
Neil Schemenauer00b09662003-06-16 21:03:07 +00002312 if (!add_submodule(mod, m, fullname, subname, modules)) {
2313 Py_XDECREF(m);
2314 m = NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002315 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00002316 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002317
2318 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00002319}
2320
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002321
2322/* Re-import a module of any kind and return its module object, WITH
2323 INCREMENTED REFERENCE COUNT */
2324
Guido van Rossum79f25d91997-04-29 20:08:16 +00002325PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002326PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002327{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002328 PyObject *modules = PyImport_GetModuleDict();
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002329 PyObject *path = NULL, *loader = NULL;
Guido van Rossum222ef561997-09-06 19:41:09 +00002330 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002331 char buf[MAXPATHLEN+1];
2332 struct filedescr *fdp;
2333 FILE *fp = NULL;
Tim Peters1cd70172004-08-02 03:52:12 +00002334 PyObject *newm;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002335
Guido van Rossum79f25d91997-04-29 20:08:16 +00002336 if (m == NULL || !PyModule_Check(m)) {
2337 PyErr_SetString(PyExc_TypeError,
2338 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002339 return NULL;
2340 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002341 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002342 if (name == NULL)
2343 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00002344 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002345 PyErr_Format(PyExc_ImportError,
2346 "reload(): module %.200s not in sys.modules",
2347 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002348 return NULL;
2349 }
Guido van Rossum222ef561997-09-06 19:41:09 +00002350 subname = strrchr(name, '.');
2351 if (subname == NULL)
2352 subname = name;
2353 else {
2354 PyObject *parentname, *parent;
2355 parentname = PyString_FromStringAndSize(name, (subname-name));
2356 if (parentname == NULL)
2357 return NULL;
2358 parent = PyDict_GetItem(modules, parentname);
2359 if (parent == NULL) {
2360 PyErr_Format(PyExc_ImportError,
2361 "reload(): parent %.200s not in sys.modules",
Georg Brandl0c55f292005-09-14 06:56:20 +00002362 PyString_AS_STRING(parentname));
2363 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00002364 return NULL;
2365 }
Georg Brandl0c55f292005-09-14 06:56:20 +00002366 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00002367 subname++;
2368 path = PyObject_GetAttrString(parent, "__path__");
2369 if (path == NULL)
2370 PyErr_Clear();
2371 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002372 buf[0] = '\0';
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002373 fdp = find_module(name, subname, path, buf, MAXPATHLEN+1, &fp, &loader);
Guido van Rossum222ef561997-09-06 19:41:09 +00002374 Py_XDECREF(path);
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002375
2376 if (fdp == NULL) {
2377 Py_XDECREF(loader);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002378 return NULL;
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002379 }
2380
2381 newm = load_module(name, fp, buf, fdp->type, loader);
2382 Py_XDECREF(loader);
2383
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002384 if (fp)
2385 fclose(fp);
Tim Peters1cd70172004-08-02 03:52:12 +00002386 if (newm == NULL) {
2387 /* load_module probably removed name from modules because of
2388 * the error. Put back the original module object. We're
2389 * going to return NULL in this case regardless of whether
2390 * replacing name succeeds, so the return value is ignored.
2391 */
2392 PyDict_SetItemString(modules, name, m);
2393 }
2394 return newm;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002395}
2396
2397
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002398/* Higher-level import emulator which emulates the "import" statement
2399 more accurately -- it invokes the __import__() function from the
2400 builtins of the current globals. This means that the import is
2401 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00002402 environment, e.g. by "rexec".
2403 A dummy list ["__doc__"] is passed as the 4th argument so that
2404 e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
2405 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002406
2407PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002408PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002409{
2410 static PyObject *silly_list = NULL;
2411 static PyObject *builtins_str = NULL;
2412 static PyObject *import_str = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002413 PyObject *globals = NULL;
2414 PyObject *import = NULL;
2415 PyObject *builtins = NULL;
2416 PyObject *r = NULL;
2417
2418 /* Initialize constant string objects */
2419 if (silly_list == NULL) {
2420 import_str = PyString_InternFromString("__import__");
2421 if (import_str == NULL)
2422 return NULL;
2423 builtins_str = PyString_InternFromString("__builtins__");
2424 if (builtins_str == NULL)
2425 return NULL;
2426 silly_list = Py_BuildValue("[s]", "__doc__");
2427 if (silly_list == NULL)
2428 return NULL;
2429 }
2430
2431 /* Get the builtins from current globals */
2432 globals = PyEval_GetGlobals();
Guido van Rossum85cd1d62001-02-20 21:43:24 +00002433 if (globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00002434 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002435 builtins = PyObject_GetItem(globals, builtins_str);
2436 if (builtins == NULL)
2437 goto err;
2438 }
2439 else {
2440 /* No globals -- use standard builtins, and fake globals */
2441 PyErr_Clear();
2442
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002443 builtins = PyImport_ImportModuleLevel("__builtin__",
2444 NULL, NULL, NULL, 0);
Guido van Rossum85cd1d62001-02-20 21:43:24 +00002445 if (builtins == NULL)
2446 return NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002447 globals = Py_BuildValue("{OO}", builtins_str, builtins);
2448 if (globals == NULL)
2449 goto err;
2450 }
2451
2452 /* Get the __import__ function from the builtins */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002453 if (PyDict_Check(builtins)) {
Fred Drakea76ba6e2001-03-06 06:31:15 +00002454 import = PyObject_GetItem(builtins, import_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002455 if (import == NULL)
2456 PyErr_SetObject(PyExc_KeyError, import_str);
2457 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002458 else
Fred Drakea76ba6e2001-03-06 06:31:15 +00002459 import = PyObject_GetAttr(builtins, import_str);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002460 if (import == NULL)
2461 goto err;
2462
2463 /* Call the _import__ function with the proper argument list */
2464 r = PyObject_CallFunction(import, "OOOO",
2465 module_name, globals, globals, silly_list);
2466
2467 err:
2468 Py_XDECREF(globals);
2469 Py_XDECREF(builtins);
2470 Py_XDECREF(import);
Tim Peters50d8d372001-02-28 05:34:27 +00002471
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002472 return r;
2473}
2474
2475
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002476/* Module 'imp' provides Python access to the primitives used for
2477 importing modules.
2478*/
2479
Guido van Rossum79f25d91997-04-29 20:08:16 +00002480static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +00002481imp_get_magic(PyObject *self, PyObject *noargs)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002482{
2483 char buf[4];
2484
Guido van Rossum96774c12000-05-01 20:19:08 +00002485 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
2486 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
2487 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
2488 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002489
Guido van Rossum79f25d91997-04-29 20:08:16 +00002490 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002491}
2492
Guido van Rossum79f25d91997-04-29 20:08:16 +00002493static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +00002494imp_get_suffixes(PyObject *self, PyObject *noargs)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002495{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002496 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002497 struct filedescr *fdp;
2498
Guido van Rossum79f25d91997-04-29 20:08:16 +00002499 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002500 if (list == NULL)
2501 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002502 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
2503 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002504 fdp->suffix, fdp->mode, fdp->type);
2505 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002506 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002507 return NULL;
2508 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002509 if (PyList_Append(list, item) < 0) {
2510 Py_DECREF(list);
2511 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002512 return NULL;
2513 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002514 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002515 }
2516 return list;
2517}
2518
Guido van Rossum79f25d91997-04-29 20:08:16 +00002519static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002520call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002521{
Tim Petersdbd9ba62000-07-09 03:09:57 +00002522 extern int fclose(FILE *);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002523 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002524 struct filedescr *fdp;
2525 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002526 FILE *fp = NULL;
2527
2528 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002529 if (path == Py_None)
2530 path = NULL;
Just van Rossum52e14d62002-12-30 22:08:05 +00002531 fdp = find_module(NULL, name, path, pathname, MAXPATHLEN+1, &fp, NULL);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002532 if (fdp == NULL)
2533 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002534 if (fp != NULL) {
2535 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
2536 if (fob == NULL) {
2537 fclose(fp);
2538 return NULL;
2539 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002540 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002541 else {
2542 fob = Py_None;
2543 Py_INCREF(fob);
Tim Peters50d8d372001-02-28 05:34:27 +00002544 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002545 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002546 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002547 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002548 return ret;
2549}
2550
Guido van Rossum79f25d91997-04-29 20:08:16 +00002551static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002552imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002553{
2554 char *name;
2555 PyObject *path = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002556 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002557 return NULL;
2558 return call_find_module(name, path);
2559}
2560
2561static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002562imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002563{
2564 char *name;
2565 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002566 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002567 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002568 return NULL;
2569 ret = init_builtin(name);
2570 if (ret < 0)
2571 return NULL;
2572 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002573 Py_INCREF(Py_None);
2574 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002575 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002576 m = PyImport_AddModule(name);
2577 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002578 return m;
2579}
2580
Guido van Rossum79f25d91997-04-29 20:08:16 +00002581static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002582imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002583{
2584 char *name;
2585 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002586 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002587 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002588 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002589 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002590 if (ret < 0)
2591 return NULL;
2592 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002593 Py_INCREF(Py_None);
2594 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002595 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002596 m = PyImport_AddModule(name);
2597 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002598 return m;
2599}
2600
Guido van Rossum79f25d91997-04-29 20:08:16 +00002601static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002602imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002603{
2604 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002605
Guido van Rossum43713e52000-02-29 13:59:29 +00002606 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002607 return NULL;
2608 return get_frozen_object(name);
2609}
2610
Guido van Rossum79f25d91997-04-29 20:08:16 +00002611static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002612imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002613{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002614 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002615 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002616 return NULL;
Guido van Rossum50ee94f2002-04-09 18:00:58 +00002617 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002618}
2619
Guido van Rossum79f25d91997-04-29 20:08:16 +00002620static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002621imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002622{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002623 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002624 struct _frozen *p;
Guido van Rossum43713e52000-02-29 13:59:29 +00002625 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002626 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002627 p = find_frozen(name);
Guido van Rossumb8bff3f2002-04-07 06:34:38 +00002628 return PyBool_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002629}
2630
2631static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002632get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002633{
2634 FILE *fp;
2635 if (fob == NULL) {
Tim Peters86c7d2f2004-08-01 23:24:21 +00002636 if (mode[0] == 'U')
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00002637 mode = "r" PY_STDIOTEXTMODE;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002638 fp = fopen(pathname, mode);
2639 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002640 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002641 }
2642 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002643 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002644 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002645 PyErr_SetString(PyExc_ValueError,
2646 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002647 }
2648 return fp;
2649}
2650
Guido van Rossum79f25d91997-04-29 20:08:16 +00002651static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002652imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002653{
2654 char *name;
2655 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002656 PyObject *fob = NULL;
2657 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002658 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002659 if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002660 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002661 return NULL;
2662 fp = get_file(pathname, fob, "rb");
2663 if (fp == NULL)
2664 return NULL;
2665 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002666 if (fob == NULL)
2667 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002668 return m;
2669}
2670
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002671#ifdef HAVE_DYNAMIC_LOADING
2672
Guido van Rossum79f25d91997-04-29 20:08:16 +00002673static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002674imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002675{
2676 char *name;
2677 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002678 PyObject *fob = NULL;
2679 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002680 FILE *fp = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002681 if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002682 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002683 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002684 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002685 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002686 if (fp == NULL)
2687 return NULL;
2688 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002689 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002690 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002691}
2692
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002693#endif /* HAVE_DYNAMIC_LOADING */
2694
Guido van Rossum79f25d91997-04-29 20:08:16 +00002695static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002696imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002697{
2698 char *name;
2699 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002700 PyObject *fob = NULL;
2701 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002702 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002703 if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002704 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002705 return NULL;
2706 fp = get_file(pathname, fob, "r");
2707 if (fp == NULL)
2708 return NULL;
2709 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002710 if (fob == NULL)
2711 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002712 return m;
2713}
2714
Guido van Rossum79f25d91997-04-29 20:08:16 +00002715static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002716imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002717{
2718 char *name;
2719 PyObject *fob;
2720 char *pathname;
2721 char *suffix; /* Unused */
2722 char *mode;
2723 int type;
2724 FILE *fp;
2725
Guido van Rossum43713e52000-02-29 13:59:29 +00002726 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002727 &name, &fob, &pathname,
2728 &suffix, &mode, &type))
2729 return NULL;
Guido van Rossum5e2c5fa2002-05-30 17:33:07 +00002730 if (*mode) {
2731 /* Mode must start with 'r' or 'U' and must not contain '+'.
2732 Implicit in this test is the assumption that the mode
2733 may contain other modifiers like 'b' or 't'. */
2734
2735 if (!(*mode == 'r' || *mode == 'U') || strchr(mode, '+')) {
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00002736 PyErr_Format(PyExc_ValueError,
2737 "invalid file open mode %.200s", mode);
2738 return NULL;
Guido van Rossum5e2c5fa2002-05-30 17:33:07 +00002739 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002740 }
2741 if (fob == Py_None)
2742 fp = NULL;
2743 else {
2744 if (!PyFile_Check(fob)) {
2745 PyErr_SetString(PyExc_ValueError,
2746 "load_module arg#2 should be a file or None");
2747 return NULL;
2748 }
2749 fp = get_file(pathname, fob, mode);
2750 if (fp == NULL)
2751 return NULL;
2752 }
Just van Rossum52e14d62002-12-30 22:08:05 +00002753 return load_module(name, fp, pathname, type, NULL);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002754}
2755
2756static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002757imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002758{
2759 char *name;
2760 char *pathname;
Guido van Rossum43713e52000-02-29 13:59:29 +00002761 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002762 return NULL;
2763 return load_package(name, pathname);
2764}
2765
2766static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002767imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002768{
2769 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002770 if (!PyArg_ParseTuple(args, "s:new_module", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002771 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002772 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002773}
2774
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002775/* Doc strings */
2776
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002777PyDoc_STRVAR(doc_imp,
2778"This module provides the components needed to build your own\n\
2779__import__ function. Undocumented functions are obsolete.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002780
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002781PyDoc_STRVAR(doc_find_module,
2782"find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002783Search for a module. If path is omitted or None, search for a\n\
2784built-in, frozen or special module and continue search in sys.path.\n\
2785The module name cannot contain '.'; to search for a submodule of a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002786package, pass the submodule name and the package's __path__.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002787
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002788PyDoc_STRVAR(doc_load_module,
2789"load_module(name, file, filename, (suffix, mode, type)) -> module\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002790Load a module, given information returned by find_module().\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002791The module name must include the full package name, if any.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002792
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002793PyDoc_STRVAR(doc_get_magic,
2794"get_magic() -> string\n\
2795Return the magic number for .pyc or .pyo files.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002796
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002797PyDoc_STRVAR(doc_get_suffixes,
2798"get_suffixes() -> [(suffix, mode, type), ...]\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002799Return a list of (suffix, mode, type) tuples describing the files\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002800that find_module() looks for.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002801
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002802PyDoc_STRVAR(doc_new_module,
2803"new_module(name) -> module\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002804Create a new module. Do not enter it in sys.modules.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002805The module name must include the full package name, if any.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002806
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002807PyDoc_STRVAR(doc_lock_held,
Tim Petersa7c65092004-08-01 23:26:05 +00002808"lock_held() -> boolean\n\
2809Return True if the import lock is currently held, else False.\n\
2810On platforms without threads, return False.");
Tim Peters69232342001-08-30 05:16:13 +00002811
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00002812PyDoc_STRVAR(doc_acquire_lock,
2813"acquire_lock() -> None\n\
Neal Norwitz2294c0d2003-02-12 23:02:21 +00002814Acquires the interpreter's import lock for the current thread.\n\
2815This lock should be used by import hooks to ensure thread-safety\n\
2816when importing modules.\n\
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00002817On platforms without threads, this function does nothing.");
2818
2819PyDoc_STRVAR(doc_release_lock,
2820"release_lock() -> None\n\
2821Release the interpreter's import lock.\n\
2822On platforms without threads, this function does nothing.");
2823
Guido van Rossum79f25d91997-04-29 20:08:16 +00002824static PyMethodDef imp_methods[] = {
Neal Norwitz08ea61a2003-02-17 18:18:00 +00002825 {"find_module", imp_find_module, METH_VARARGS, doc_find_module},
2826 {"get_magic", imp_get_magic, METH_NOARGS, doc_get_magic},
2827 {"get_suffixes", imp_get_suffixes, METH_NOARGS, doc_get_suffixes},
2828 {"load_module", imp_load_module, METH_VARARGS, doc_load_module},
2829 {"new_module", imp_new_module, METH_VARARGS, doc_new_module},
2830 {"lock_held", imp_lock_held, METH_NOARGS, doc_lock_held},
2831 {"acquire_lock", imp_acquire_lock, METH_NOARGS, doc_acquire_lock},
2832 {"release_lock", imp_release_lock, METH_NOARGS, doc_release_lock},
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002833 /* The rest are obsolete */
Neal Norwitz031829d2002-03-31 14:37:44 +00002834 {"get_frozen_object", imp_get_frozen_object, METH_VARARGS},
2835 {"init_builtin", imp_init_builtin, METH_VARARGS},
2836 {"init_frozen", imp_init_frozen, METH_VARARGS},
2837 {"is_builtin", imp_is_builtin, METH_VARARGS},
2838 {"is_frozen", imp_is_frozen, METH_VARARGS},
2839 {"load_compiled", imp_load_compiled, METH_VARARGS},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002840#ifdef HAVE_DYNAMIC_LOADING
Neal Norwitz031829d2002-03-31 14:37:44 +00002841 {"load_dynamic", imp_load_dynamic, METH_VARARGS},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002842#endif
Neal Norwitz031829d2002-03-31 14:37:44 +00002843 {"load_package", imp_load_package, METH_VARARGS},
Neal Norwitz031829d2002-03-31 14:37:44 +00002844 {"load_source", imp_load_source, METH_VARARGS},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002845 {NULL, NULL} /* sentinel */
2846};
2847
Guido van Rossum1a8791e1998-08-04 22:46:29 +00002848static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002849setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002850{
2851 PyObject *v;
2852 int err;
2853
2854 v = PyInt_FromLong((long)value);
2855 err = PyDict_SetItemString(d, name, v);
2856 Py_XDECREF(v);
2857 return err;
2858}
2859
Jason Tishler6bc06ec2003-09-04 11:59:50 +00002860PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002861initimp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002862{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002863 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002864
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002865 m = Py_InitModule4("imp", imp_methods, doc_imp,
2866 NULL, PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00002867 if (m == NULL)
2868 goto failure;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002869 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002870
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002871 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2872 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2873 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2874 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2875 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2876 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2877 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2878 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00002879 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Just van Rossum52e14d62002-12-30 22:08:05 +00002880 if (setint(d, "IMP_HOOK", IMP_HOOK) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002881
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002882 failure:
2883 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002884}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002885
2886
Guido van Rossumb18618d2000-05-03 23:44:39 +00002887/* API for embedding applications that want to add their own entries
2888 to the table of built-in modules. This should normally be called
2889 *before* Py_Initialize(). When the table resize fails, -1 is
2890 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002891
2892 After a similar function by Just van Rossum. */
2893
2894int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002895PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002896{
2897 static struct _inittab *our_copy = NULL;
2898 struct _inittab *p;
2899 int i, n;
2900
2901 /* Count the number of entries in both tables */
2902 for (n = 0; newtab[n].name != NULL; n++)
2903 ;
2904 if (n == 0)
2905 return 0; /* Nothing to do */
2906 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2907 ;
2908
2909 /* Allocate new memory for the combined table */
Guido van Rossumb18618d2000-05-03 23:44:39 +00002910 p = our_copy;
2911 PyMem_RESIZE(p, struct _inittab, i+n+1);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002912 if (p == NULL)
2913 return -1;
2914
2915 /* Copy the tables into the new memory */
2916 if (our_copy != PyImport_Inittab)
2917 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2918 PyImport_Inittab = our_copy = p;
2919 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
2920
2921 return 0;
2922}
2923
2924/* Shorthand to add a single entry given a name and a function */
2925
2926int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002927PyImport_AppendInittab(char *name, void (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002928{
2929 struct _inittab newtab[2];
2930
2931 memset(newtab, '\0', sizeof newtab);
2932
2933 newtab[0].name = name;
2934 newtab[0].initfunc = initfunc;
2935
2936 return PyImport_ExtendInittab(newtab);
2937}