blob: 07f572000fe6a8f2e939eece5040d3ba21e4f653 [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"
Kristján Valur Jónsson67387fb2007-04-25 00:17:39 +00007#undef Yield /* undefine macro conflicting with winbase.h */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00008#include "pyarena.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00009#include "pythonrun.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000010#include "errcode.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +000011#include "marshal.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000012#include "code.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +000013#include "compile.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000014#include "eval.h"
Guido van Rossumd8bac6d1992-02-26 15:19:13 +000015#include "osdefs.h"
Guido van Rossum1ae940a1995-01-02 19:04:15 +000016#include "importdl.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +000017
Guido van Rossum55a83382000-09-20 20:31:38 +000018#ifdef HAVE_FCNTL_H
19#include <fcntl.h>
20#endif
Anthony Baxterac6bd462006-04-13 02:06:09 +000021#ifdef __cplusplus
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000022extern "C" {
Anthony Baxterac6bd462006-04-13 02:06:09 +000023#endif
Guido van Rossum55a83382000-09-20 20:31:38 +000024
Christian Heimes5e8e6d22008-02-23 23:59:45 +000025#ifdef MS_WINDOWS
26/* for stat.st_mode */
27typedef unsigned short mode_t;
28#endif
29
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000030extern time_t PyOS_GetLastModificationTime(char *, FILE *);
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000031 /* In getmtime.c */
Guido van Rossum21d335e1993-10-15 13:01:11 +000032
Jeremy Hyltond4ceb312004-04-01 02:45:22 +000033/* Magic word to reject .pyc files generated by other Python versions.
34 It should change for each incompatible change to the bytecode.
35
36 The value of CR and LF is incorporated so if you ever read or write
Guido van Rossum7faeab31995-07-07 22:50:36 +000037 a .pyc file in text mode the magic number will be wrong; also, the
Tim Peters36515e22001-11-18 04:06:29 +000038 Apple MPW compiler swaps their values, botching string constants.
Marc-André Lemburgbd3be8f2002-02-07 11:33:49 +000039
Martin v. Löwisef82d2f2004-06-27 16:51:46 +000040 The magic numbers must be spaced apart atleast 2 values, as the
41 -U interpeter flag will cause MAGIC+1 being used. They have been
42 odd numbers for some time now.
Marc-André Lemburgbd3be8f2002-02-07 11:33:49 +000043
Jeremy Hyltond4ceb312004-04-01 02:45:22 +000044 There were a variety of old schemes for setting the magic number.
45 The current working scheme is to increment the previous value by
46 10.
Guido van Rossumf6894922002-08-31 15:16:14 +000047
Marc-André Lemburgbd3be8f2002-02-07 11:33:49 +000048 Known values:
49 Python 1.5: 20121
50 Python 1.5.1: 20121
51 Python 1.5.2: 20121
Skip Montanaro4ec3c262006-03-25 14:12:03 +000052 Python 1.6: 50428
Marc-André Lemburgbd3be8f2002-02-07 11:33:49 +000053 Python 2.0: 50823
54 Python 2.0.1: 50823
55 Python 2.1: 60202
56 Python 2.1.1: 60202
57 Python 2.1.2: 60202
58 Python 2.2: 60717
Neal Norwitz7fdcb412002-06-14 01:07:39 +000059 Python 2.3a0: 62011
Michael W. Hudsondd32a912002-08-15 14:59:02 +000060 Python 2.3a0: 62021
Guido van Rossumf6894922002-08-31 15:16:14 +000061 Python 2.3a0: 62011 (!)
Martin v. Löwisef82d2f2004-06-27 16:51:46 +000062 Python 2.4a0: 62041
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +000063 Python 2.4a3: 62051
Raymond Hettinger2c31a052004-09-22 18:44:21 +000064 Python 2.4b1: 62061
Michael W. Hudsondf888462005-06-03 14:41:55 +000065 Python 2.5a0: 62071
Michael W. Hudsonaee2e282005-10-21 11:32:20 +000066 Python 2.5a0: 62081 (ast-branch)
Guido van Rossumc2e20742006-02-27 22:32:47 +000067 Python 2.5a0: 62091 (with)
Guido van Rossumf6694362006-03-10 02:28:35 +000068 Python 2.5a0: 62092 (changed WITH_CLEANUP opcode)
Neal Norwitz0d62a062006-07-30 06:53:31 +000069 Python 2.5b3: 62101 (fix wrong code: for x, in ...)
70 Python 2.5b3: 62111 (fix wrong code: x += yield)
Neal Norwitz9a70f952006-08-04 05:12:19 +000071 Python 2.5c1: 62121 (fix wrong lnotab with for loops and
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000072 storing constants that should have been removed)
Neal Norwitzdac090d2006-09-05 03:53:08 +000073 Python 2.5c2: 62131 (fix wrong code: for x, in ... in listcomp/genexp)
Raymond Hettingereffde122007-12-18 18:26:18 +000074 Python 2.6a0: 62151 (peephole optimizations and STORE_MAP opcode)
Nick Coghlan7af53be2008-03-07 14:13:28 +000075 Python 2.6a1: 62161 (WITH_CLEANUP optimization)
Michael W. Hudsonaee2e282005-10-21 11:32:20 +000076.
Tim Peters36515e22001-11-18 04:06:29 +000077*/
Nick Coghlan7af53be2008-03-07 14:13:28 +000078#define MAGIC (62161 | ((long)'\r'<<16) | ((long)'\n'<<24))
Guido van Rossum3ddee711991-12-16 13:06:34 +000079
Guido van Rossum96774c12000-05-01 20:19:08 +000080/* Magic word as global; note that _PyImport_Init() can change the
Jeremy Hylton9262b8a2000-06-30 04:59:17 +000081 value of this global to accommodate for alterations of how the
Guido van Rossum96774c12000-05-01 20:19:08 +000082 compiler works which are enabled by command line switches. */
Christian Heimes61e45902008-03-27 10:35:52 +000083static long pyc_magic = MAGIC;
Guido van Rossum96774c12000-05-01 20:19:08 +000084
Guido van Rossum25ce5661997-08-02 03:10:38 +000085/* See _PyImport_FixupExtension() below */
86static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000087
Guido van Rossum771c6c81997-10-31 18:37:24 +000088/* This table is defined in config.c: */
89extern struct _inittab _PyImport_Inittab[];
90
91struct _inittab *PyImport_Inittab = _PyImport_Inittab;
Guido van Rossum66f1fa81991-04-03 19:03:52 +000092
Guido van Rossumed1170e1999-12-20 21:23:41 +000093/* these tables define the module suffixes that Python recognizes */
94struct filedescr * _PyImport_Filetab = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +000095
96#ifdef RISCOS
97static const struct filedescr _PyImport_StandardFiletab[] = {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000098 {"/py", "U", PY_SOURCE},
99 {"/pyc", "rb", PY_COMPILED},
100 {0, 0}
Guido van Rossum48a680c2001-03-02 06:34:14 +0000101};
102#else
Guido van Rossumed1170e1999-12-20 21:23:41 +0000103static const struct filedescr _PyImport_StandardFiletab[] = {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000104 {".py", "U", PY_SOURCE},
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000105#ifdef MS_WINDOWS
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000106 {".pyw", "U", PY_SOURCE},
Tim Peters36515e22001-11-18 04:06:29 +0000107#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000108 {".pyc", "rb", PY_COMPILED},
109 {0, 0}
Guido van Rossumed1170e1999-12-20 21:23:41 +0000110};
Guido van Rossum48a680c2001-03-02 06:34:14 +0000111#endif
Guido van Rossumed1170e1999-12-20 21:23:41 +0000112
Phillip J. Ebyf7575d02006-07-28 21:12:07 +0000113
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000114/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000115
116void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000117_PyImport_Init(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000118{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000119 const struct filedescr *scan;
120 struct filedescr *filetab;
121 int countD = 0;
122 int countS = 0;
Guido van Rossumed1170e1999-12-20 21:23:41 +0000123
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000124 /* prepare _PyImport_Filetab: copy entries from
125 _PyImport_DynLoadFiletab and _PyImport_StandardFiletab.
126 */
Georg Brandladd36e52007-08-23 18:08:06 +0000127#ifdef HAVE_DYNAMIC_LOADING
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000128 for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan)
129 ++countD;
Georg Brandladd36e52007-08-23 18:08:06 +0000130#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000131 for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan)
132 ++countS;
133 filetab = PyMem_NEW(struct filedescr, countD + countS + 1);
134 if (filetab == NULL)
135 Py_FatalError("Can't initialize import file table.");
Georg Brandladd36e52007-08-23 18:08:06 +0000136#ifdef HAVE_DYNAMIC_LOADING
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000137 memcpy(filetab, _PyImport_DynLoadFiletab,
138 countD * sizeof(struct filedescr));
Georg Brandladd36e52007-08-23 18:08:06 +0000139#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000140 memcpy(filetab + countD, _PyImport_StandardFiletab,
141 countS * sizeof(struct filedescr));
142 filetab[countD + countS].suffix = NULL;
Guido van Rossumed1170e1999-12-20 21:23:41 +0000143
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000144 _PyImport_Filetab = filetab;
Guido van Rossumed1170e1999-12-20 21:23:41 +0000145
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000146 if (Py_OptimizeFlag) {
147 /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */
148 for (; filetab->suffix != NULL; filetab++) {
Guido van Rossum48a680c2001-03-02 06:34:14 +0000149#ifndef RISCOS
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000150 if (strcmp(filetab->suffix, ".pyc") == 0)
151 filetab->suffix = ".pyo";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000152#else
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000153 if (strcmp(filetab->suffix, "/pyc") == 0)
154 filetab->suffix = "/pyo";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000155#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000156 }
157 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000158
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000159 if (Py_UnicodeFlag) {
160 /* Fix the pyc_magic so that byte compiled code created
161 using the all-Unicode method doesn't interfere with
162 code created in normal operation mode. */
163 pyc_magic = MAGIC + 1;
164 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000165}
166
Guido van Rossum25ce5661997-08-02 03:10:38 +0000167void
Just van Rossum52e14d62002-12-30 22:08:05 +0000168_PyImportHooks_Init(void)
169{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000170 PyObject *v, *path_hooks = NULL, *zimpimport;
171 int err = 0;
Just van Rossum52e14d62002-12-30 22:08:05 +0000172
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000173 /* adding sys.path_hooks and sys.path_importer_cache, setting up
174 zipimport */
175 if (PyType_Ready(&PyNullImporter_Type) < 0)
176 goto error;
Just van Rossum52e14d62002-12-30 22:08:05 +0000177
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000178 if (Py_VerboseFlag)
179 PySys_WriteStderr("# installing zipimport hook\n");
Just van Rossum52e14d62002-12-30 22:08:05 +0000180
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000181 v = PyList_New(0);
182 if (v == NULL)
183 goto error;
184 err = PySys_SetObject("meta_path", v);
185 Py_DECREF(v);
186 if (err)
187 goto error;
188 v = PyDict_New();
189 if (v == NULL)
190 goto error;
191 err = PySys_SetObject("path_importer_cache", v);
192 Py_DECREF(v);
193 if (err)
194 goto error;
195 path_hooks = PyList_New(0);
196 if (path_hooks == NULL)
197 goto error;
198 err = PySys_SetObject("path_hooks", path_hooks);
199 if (err) {
Just van Rossum52e14d62002-12-30 22:08:05 +0000200 error:
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000201 PyErr_Print();
202 Py_FatalError("initializing sys.meta_path, sys.path_hooks, "
203 "path_importer_cache, or NullImporter failed"
204 );
205 }
Phillip J. Ebyf7575d02006-07-28 21:12:07 +0000206
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000207 zimpimport = PyImport_ImportModule("zipimport");
208 if (zimpimport == NULL) {
209 PyErr_Clear(); /* No zip import module -- okay */
210 if (Py_VerboseFlag)
211 PySys_WriteStderr("# can't import zipimport\n");
212 }
213 else {
214 PyObject *zipimporter = PyObject_GetAttrString(zimpimport,
215 "zipimporter");
216 Py_DECREF(zimpimport);
217 if (zipimporter == NULL) {
218 PyErr_Clear(); /* No zipimporter object -- okay */
219 if (Py_VerboseFlag)
220 PySys_WriteStderr(
221 "# can't import zipimport.zipimporter\n");
222 }
223 else {
224 /* sys.path_hooks.append(zipimporter) */
225 err = PyList_Append(path_hooks, zipimporter);
226 Py_DECREF(zipimporter);
227 if (err)
228 goto error;
229 if (Py_VerboseFlag)
230 PySys_WriteStderr(
231 "# installed zipimport hook\n");
232 }
233 }
234 Py_DECREF(path_hooks);
Just van Rossum52e14d62002-12-30 22:08:05 +0000235}
236
237void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000238_PyImport_Fini(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000239{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000240 Py_XDECREF(extensions);
241 extensions = NULL;
242 PyMem_DEL(_PyImport_Filetab);
243 _PyImport_Filetab = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000244}
245
246
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000247/* Locking primitives to prevent parallel imports of the same module
248 in different threads to return with a partially loaded module.
249 These calls are serialized by the global interpreter lock. */
250
251#ifdef WITH_THREAD
252
Guido van Rossum49b56061998-10-01 20:42:43 +0000253#include "pythread.h"
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000254
Guido van Rossum65d5b571998-12-21 19:32:43 +0000255static PyThread_type_lock import_lock = 0;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000256static long import_lock_thread = -1;
257static int import_lock_level = 0;
258
Thomas Wouters448db212009-09-16 20:06:36 +0000259void
260_PyImport_AcquireLock(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000261{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000262 long me = PyThread_get_thread_ident();
263 if (me == -1)
264 return; /* Too bad */
265 if (import_lock == NULL) {
266 import_lock = PyThread_allocate_lock();
267 if (import_lock == NULL)
268 return; /* Nothing much we can do. */
269 }
270 if (import_lock_thread == me) {
271 import_lock_level++;
272 return;
273 }
274 if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0))
275 {
276 PyThreadState *tstate = PyEval_SaveThread();
277 PyThread_acquire_lock(import_lock, 1);
278 PyEval_RestoreThread(tstate);
279 }
280 import_lock_thread = me;
281 import_lock_level = 1;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000282}
283
Thomas Wouters448db212009-09-16 20:06:36 +0000284int
285_PyImport_ReleaseLock(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000286{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000287 long me = PyThread_get_thread_ident();
288 if (me == -1 || import_lock == NULL)
289 return 0; /* Too bad */
290 if (import_lock_thread != me)
291 return -1;
292 import_lock_level--;
293 if (import_lock_level == 0) {
294 import_lock_thread = -1;
295 PyThread_release_lock(import_lock);
296 }
297 return 1;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000298}
299
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +0000300/* This function is called from PyOS_AfterFork to ensure that newly
Gregory P. Smithc21d0cb2010-03-01 04:40:36 +0000301 created child processes do not share locks with the parent.
302 We now acquire the import lock around fork() calls but on some platforms
303 (Solaris 9 and earlier? see isue7242) that still left us with problems. */
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +0000304
305void
306_PyImport_ReInitLock(void)
307{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000308 if (import_lock != NULL)
309 import_lock = PyThread_allocate_lock();
310 import_lock_thread = -1;
311 import_lock_level = 0;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +0000312}
313
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000314#endif
315
Tim Peters69232342001-08-30 05:16:13 +0000316static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +0000317imp_lock_held(PyObject *self, PyObject *noargs)
Tim Peters69232342001-08-30 05:16:13 +0000318{
Tim Peters69232342001-08-30 05:16:13 +0000319#ifdef WITH_THREAD
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000320 return PyBool_FromLong(import_lock_thread != -1);
Tim Peters69232342001-08-30 05:16:13 +0000321#else
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000322 return PyBool_FromLong(0);
Tim Peters69232342001-08-30 05:16:13 +0000323#endif
324}
325
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000326static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +0000327imp_acquire_lock(PyObject *self, PyObject *noargs)
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000328{
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000329#ifdef WITH_THREAD
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000330 _PyImport_AcquireLock();
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000331#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000332 Py_INCREF(Py_None);
333 return Py_None;
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000334}
335
336static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +0000337imp_release_lock(PyObject *self, PyObject *noargs)
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000338{
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000339#ifdef WITH_THREAD
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000340 if (_PyImport_ReleaseLock() < 0) {
341 PyErr_SetString(PyExc_RuntimeError,
342 "not holding the import lock");
343 return NULL;
344 }
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000345#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000346 Py_INCREF(Py_None);
347 return Py_None;
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000348}
349
Collin Winter276887b2007-03-12 16:11:39 +0000350static void
Neal Norwitz75c7c802007-03-13 05:31:38 +0000351imp_modules_reloading_clear(void)
Collin Winter276887b2007-03-12 16:11:39 +0000352{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000353 PyInterpreterState *interp = PyThreadState_Get()->interp;
354 if (interp->modules_reloading != NULL)
355 PyDict_Clear(interp->modules_reloading);
Collin Winter276887b2007-03-12 16:11:39 +0000356}
357
Guido van Rossum25ce5661997-08-02 03:10:38 +0000358/* Helper for sys */
359
360PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000361PyImport_GetModuleDict(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000362{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000363 PyInterpreterState *interp = PyThreadState_GET()->interp;
364 if (interp->modules == NULL)
365 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
366 return interp->modules;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000367}
368
Guido van Rossum3f5da241990-12-20 15:06:42 +0000369
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000370/* List of names to clear in sys */
371static char* sys_deletes[] = {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000372 "path", "argv", "ps1", "ps2", "exitfunc",
373 "exc_type", "exc_value", "exc_traceback",
374 "last_type", "last_value", "last_traceback",
375 "path_hooks", "path_importer_cache", "meta_path",
376 /* misc stuff */
377 "flags", "float_info",
378 NULL
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000379};
380
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000381static char* sys_files[] = {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000382 "stdin", "__stdin__",
383 "stdout", "__stdout__",
384 "stderr", "__stderr__",
385 NULL
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000386};
387
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000388
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000389/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000390
Guido van Rossum3f5da241990-12-20 15:06:42 +0000391void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000392PyImport_Cleanup(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000393{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000394 Py_ssize_t pos, ndone;
395 char *name;
396 PyObject *key, *value, *dict;
397 PyInterpreterState *interp = PyThreadState_GET()->interp;
398 PyObject *modules = interp->modules;
Guido van Rossum758eec01998-01-19 21:58:26 +0000399
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000400 if (modules == NULL)
401 return; /* Already done */
Guido van Rossum758eec01998-01-19 21:58:26 +0000402
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000403 /* Delete some special variables first. These are common
404 places where user values hide and people complain when their
405 destructors fail. Since the modules containing them are
406 deleted *last* of all, they would come too late in the normal
407 destruction order. Sigh. */
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000408
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000409 value = PyDict_GetItemString(modules, "__builtin__");
410 if (value != NULL && PyModule_Check(value)) {
411 dict = PyModule_GetDict(value);
412 if (Py_VerboseFlag)
413 PySys_WriteStderr("# clear __builtin__._\n");
414 PyDict_SetItemString(dict, "_", Py_None);
415 }
416 value = PyDict_GetItemString(modules, "sys");
417 if (value != NULL && PyModule_Check(value)) {
418 char **p;
419 PyObject *v;
420 dict = PyModule_GetDict(value);
421 for (p = sys_deletes; *p != NULL; p++) {
422 if (Py_VerboseFlag)
423 PySys_WriteStderr("# clear sys.%s\n", *p);
424 PyDict_SetItemString(dict, *p, Py_None);
425 }
426 for (p = sys_files; *p != NULL; p+=2) {
427 if (Py_VerboseFlag)
428 PySys_WriteStderr("# restore sys.%s\n", *p);
429 v = PyDict_GetItemString(dict, *(p+1));
430 if (v == NULL)
431 v = Py_None;
432 PyDict_SetItemString(dict, *p, v);
433 }
434 }
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000435
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000436 /* First, delete __main__ */
437 value = PyDict_GetItemString(modules, "__main__");
438 if (value != NULL && PyModule_Check(value)) {
439 if (Py_VerboseFlag)
440 PySys_WriteStderr("# cleanup __main__\n");
441 _PyModule_Clear(value);
442 PyDict_SetItemString(modules, "__main__", Py_None);
443 }
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000444
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000445 /* The special treatment of __builtin__ here is because even
446 when it's not referenced as a module, its dictionary is
447 referenced by almost every module's __builtins__. Since
448 deleting a module clears its dictionary (even if there are
449 references left to it), we need to delete the __builtin__
450 module last. Likewise, we don't delete sys until the very
451 end because it is implicitly referenced (e.g. by print).
Guido van Rossum758eec01998-01-19 21:58:26 +0000452
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000453 Also note that we 'delete' modules by replacing their entry
454 in the modules dict with None, rather than really deleting
455 them; this avoids a rehash of the modules dictionary and
456 also marks them as "non existent" so they won't be
457 re-imported. */
Guido van Rossum758eec01998-01-19 21:58:26 +0000458
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000459 /* Next, repeatedly delete modules with a reference count of
460 one (skipping __builtin__ and sys) and delete them */
461 do {
462 ndone = 0;
463 pos = 0;
464 while (PyDict_Next(modules, &pos, &key, &value)) {
465 if (value->ob_refcnt != 1)
466 continue;
467 if (PyString_Check(key) && PyModule_Check(value)) {
468 name = PyString_AS_STRING(key);
469 if (strcmp(name, "__builtin__") == 0)
470 continue;
471 if (strcmp(name, "sys") == 0)
472 continue;
473 if (Py_VerboseFlag)
474 PySys_WriteStderr(
475 "# cleanup[1] %s\n", name);
476 _PyModule_Clear(value);
477 PyDict_SetItem(modules, key, Py_None);
478 ndone++;
479 }
480 }
481 } while (ndone > 0);
Guido van Rossum758eec01998-01-19 21:58:26 +0000482
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000483 /* Next, delete all modules (still skipping __builtin__ and sys) */
484 pos = 0;
485 while (PyDict_Next(modules, &pos, &key, &value)) {
486 if (PyString_Check(key) && PyModule_Check(value)) {
487 name = PyString_AS_STRING(key);
488 if (strcmp(name, "__builtin__") == 0)
489 continue;
490 if (strcmp(name, "sys") == 0)
491 continue;
492 if (Py_VerboseFlag)
493 PySys_WriteStderr("# cleanup[2] %s\n", name);
494 _PyModule_Clear(value);
495 PyDict_SetItem(modules, key, Py_None);
496 }
497 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000498
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000499 /* Next, delete sys and __builtin__ (in that order) */
500 value = PyDict_GetItemString(modules, "sys");
501 if (value != NULL && PyModule_Check(value)) {
502 if (Py_VerboseFlag)
503 PySys_WriteStderr("# cleanup sys\n");
504 _PyModule_Clear(value);
505 PyDict_SetItemString(modules, "sys", Py_None);
506 }
507 value = PyDict_GetItemString(modules, "__builtin__");
508 if (value != NULL && PyModule_Check(value)) {
509 if (Py_VerboseFlag)
510 PySys_WriteStderr("# cleanup __builtin__\n");
511 _PyModule_Clear(value);
512 PyDict_SetItemString(modules, "__builtin__", Py_None);
513 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000514
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000515 /* Finally, clear and delete the modules directory */
516 PyDict_Clear(modules);
517 interp->modules = NULL;
518 Py_DECREF(modules);
519 Py_CLEAR(interp->modules_reloading);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000520}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000521
522
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000523/* Helper for pythonrun.c -- return magic number */
524
525long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000526PyImport_GetMagicNumber(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000527{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000528 return pyc_magic;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000529}
530
531
Guido van Rossum25ce5661997-08-02 03:10:38 +0000532/* Magic for extension modules (built-in as well as dynamically
533 loaded). To prevent initializing an extension module more than
534 once, we keep a static dictionary 'extensions' keyed by module name
535 (for built-in modules) or by filename (for dynamically loaded
Barry Warsaw92883382001-08-13 23:05:44 +0000536 modules), containing these modules. A copy of the module's
Guido van Rossum25ce5661997-08-02 03:10:38 +0000537 dictionary is stored by calling _PyImport_FixupExtension()
538 immediately after the module initialization function succeeds. A
539 copy can be retrieved from there by calling
540 _PyImport_FindExtension(). */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000541
Guido van Rossum79f25d91997-04-29 20:08:16 +0000542PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000543_PyImport_FixupExtension(char *name, char *filename)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000544{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000545 PyObject *modules, *mod, *dict, *copy;
546 if (extensions == NULL) {
547 extensions = PyDict_New();
548 if (extensions == NULL)
549 return NULL;
550 }
551 modules = PyImport_GetModuleDict();
552 mod = PyDict_GetItemString(modules, name);
553 if (mod == NULL || !PyModule_Check(mod)) {
554 PyErr_Format(PyExc_SystemError,
555 "_PyImport_FixupExtension: module %.200s not loaded", name);
556 return NULL;
557 }
558 dict = PyModule_GetDict(mod);
559 if (dict == NULL)
560 return NULL;
561 copy = PyDict_Copy(dict);
562 if (copy == NULL)
563 return NULL;
564 PyDict_SetItemString(extensions, filename, copy);
565 Py_DECREF(copy);
566 return copy;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000567}
568
569PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000570_PyImport_FindExtension(char *name, char *filename)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000571{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000572 PyObject *dict, *mod, *mdict;
573 if (extensions == NULL)
574 return NULL;
575 dict = PyDict_GetItemString(extensions, filename);
576 if (dict == NULL)
577 return NULL;
578 mod = PyImport_AddModule(name);
579 if (mod == NULL)
580 return NULL;
581 mdict = PyModule_GetDict(mod);
582 if (mdict == NULL)
583 return NULL;
584 if (PyDict_Update(mdict, dict))
585 return NULL;
586 if (Py_VerboseFlag)
587 PySys_WriteStderr("import %s # previously loaded (%s)\n",
588 name, filename);
589 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000590}
591
592
593/* Get the module object corresponding to a module name.
594 First check the modules dictionary if there's one there,
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000595 if not, create a new one and insert it in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000596 Because the former action is most common, THIS DOES NOT RETURN A
597 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000598
Guido van Rossum79f25d91997-04-29 20:08:16 +0000599PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000600PyImport_AddModule(const char *name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000601{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000602 PyObject *modules = PyImport_GetModuleDict();
603 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000604
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000605 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
606 PyModule_Check(m))
607 return m;
608 m = PyModule_New(name);
609 if (m == NULL)
610 return NULL;
611 if (PyDict_SetItemString(modules, name, m) != 0) {
612 Py_DECREF(m);
613 return NULL;
614 }
615 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000616
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000617 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000618}
619
Tim Peters1cd70172004-08-02 03:52:12 +0000620/* Remove name from sys.modules, if it's there. */
621static void
622_RemoveModule(const char *name)
623{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000624 PyObject *modules = PyImport_GetModuleDict();
625 if (PyDict_GetItemString(modules, name) == NULL)
626 return;
627 if (PyDict_DelItemString(modules, name) < 0)
628 Py_FatalError("import: deleting existing key in"
629 "sys.modules failed");
Tim Peters1cd70172004-08-02 03:52:12 +0000630}
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000631
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000632/* Execute a code object in a module and return the module object
Tim Peters1cd70172004-08-02 03:52:12 +0000633 * WITH INCREMENTED REFERENCE COUNT. If an error occurs, name is
634 * removed from sys.modules, to avoid leaving damaged module objects
635 * in sys.modules. The caller may wish to restore the original
636 * module object (if any) in this case; PyImport_ReloadModule is an
637 * example.
638 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000639PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000640PyImport_ExecCodeModule(char *name, PyObject *co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000641{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000642 return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000643}
644
645PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000646PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname)
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000647{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000648 PyObject *modules = PyImport_GetModuleDict();
649 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000650
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000651 m = PyImport_AddModule(name);
652 if (m == NULL)
653 return NULL;
654 /* If the module is being reloaded, we get the old module back
655 and re-use its dict to exec the new code. */
656 d = PyModule_GetDict(m);
657 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
658 if (PyDict_SetItemString(d, "__builtins__",
659 PyEval_GetBuiltins()) != 0)
660 goto error;
661 }
662 /* Remember the filename as the __file__ attribute */
663 v = NULL;
664 if (pathname != NULL) {
665 v = PyString_FromString(pathname);
666 if (v == NULL)
667 PyErr_Clear();
668 }
669 if (v == NULL) {
670 v = ((PyCodeObject *)co)->co_filename;
671 Py_INCREF(v);
672 }
673 if (PyDict_SetItemString(d, "__file__", v) != 0)
674 PyErr_Clear(); /* Not important enough to report */
675 Py_DECREF(v);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000676
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000677 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
678 if (v == NULL)
679 goto error;
680 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000681
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000682 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
683 PyErr_Format(PyExc_ImportError,
684 "Loaded module %.200s not found in sys.modules",
685 name);
686 return NULL;
687 }
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000688
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000689 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000690
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000691 return m;
Tim Peters1cd70172004-08-02 03:52:12 +0000692
693 error:
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000694 _RemoveModule(name);
695 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000696}
697
698
699/* Given a pathname for a Python source file, fill a buffer with the
700 pathname for the corresponding compiled file. Return the pathname
701 for the compiled file, or NULL if there's no space in the buffer.
702 Doesn't set an exception. */
703
704static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000705make_compiled_pathname(char *pathname, char *buf, size_t buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000706{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000707 size_t len = strlen(pathname);
708 if (len+2 > buflen)
709 return NULL;
Tim Petersc1731372001-08-04 08:12:36 +0000710
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000711#ifdef MS_WINDOWS
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000712 /* Treat .pyw as if it were .py. The case of ".pyw" must match
713 that used in _PyImport_StandardFiletab. */
714 if (len >= 4 && strcmp(&pathname[len-4], ".pyw") == 0)
715 --len; /* pretend 'w' isn't there */
Tim Petersc1731372001-08-04 08:12:36 +0000716#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000717 memcpy(buf, pathname, len);
718 buf[len] = Py_OptimizeFlag ? 'o' : 'c';
719 buf[len+1] = '\0';
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000720
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000721 return buf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000722}
723
724
725/* Given a pathname for a Python source file, its time of last
726 modification, and a pathname for a compiled file, check whether the
727 compiled file represents the same version of the source. If so,
728 return a FILE pointer for the compiled file, positioned just after
729 the header; if not, return NULL.
730 Doesn't set an exception. */
731
732static FILE *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000733check_compiled_module(char *pathname, time_t mtime, char *cpathname)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000734{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000735 FILE *fp;
736 long magic;
737 long pyc_mtime;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000738
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000739 fp = fopen(cpathname, "rb");
740 if (fp == NULL)
741 return NULL;
742 magic = PyMarshal_ReadLongFromFile(fp);
743 if (magic != pyc_magic) {
744 if (Py_VerboseFlag)
745 PySys_WriteStderr("# %s has bad magic\n", cpathname);
746 fclose(fp);
747 return NULL;
748 }
749 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
750 if (pyc_mtime != mtime) {
751 if (Py_VerboseFlag)
752 PySys_WriteStderr("# %s has bad mtime\n", cpathname);
753 fclose(fp);
754 return NULL;
755 }
756 if (Py_VerboseFlag)
757 PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
758 return fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000759}
760
761
762/* Read a code object from a file and check it for validity */
763
Guido van Rossum79f25d91997-04-29 20:08:16 +0000764static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000765read_compiled_module(char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000766{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000767 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000768
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000769 co = PyMarshal_ReadLastObjectFromFile(fp);
770 if (co == NULL)
771 return NULL;
772 if (!PyCode_Check(co)) {
773 PyErr_Format(PyExc_ImportError,
774 "Non-code object in %.200s", cpathname);
775 Py_DECREF(co);
776 return NULL;
777 }
778 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000779}
780
781
782/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000783 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000784
Guido van Rossum79f25d91997-04-29 20:08:16 +0000785static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000786load_compiled_module(char *name, char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000787{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000788 long magic;
789 PyCodeObject *co;
790 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000791
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000792 magic = PyMarshal_ReadLongFromFile(fp);
793 if (magic != pyc_magic) {
794 PyErr_Format(PyExc_ImportError,
795 "Bad magic number in %.200s", cpathname);
796 return NULL;
797 }
798 (void) PyMarshal_ReadLongFromFile(fp);
799 co = read_compiled_module(cpathname, fp);
800 if (co == NULL)
801 return NULL;
802 if (Py_VerboseFlag)
803 PySys_WriteStderr("import %s # precompiled from %s\n",
804 name, cpathname);
805 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
806 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000807
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000808 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000809}
810
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000811/* Parse a source file and return the corresponding code object */
812
Guido van Rossum79f25d91997-04-29 20:08:16 +0000813static PyCodeObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000814parse_source_module(const char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000815{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000816 PyCodeObject *co = NULL;
817 mod_ty mod;
818 PyCompilerFlags flags;
819 PyArena *arena = PyArena_New();
820 if (arena == NULL)
821 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000822
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000823 flags.cf_flags = 0;
Christian Heimes7f23d862008-03-26 22:51:58 +0000824
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000825 mod = PyParser_ASTFromFile(fp, pathname, Py_file_input, 0, 0, &flags,
826 NULL, arena);
827 if (mod) {
828 co = PyAST_Compile(mod, pathname, NULL, arena);
829 }
830 PyArena_Free(arena);
831 return co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000832}
833
834
Guido van Rossum55a83382000-09-20 20:31:38 +0000835/* Helper to open a bytecode file for writing in exclusive mode */
836
837static FILE *
Christian Heimes40346852008-02-23 17:52:07 +0000838open_exclusive(char *filename, mode_t mode)
Guido van Rossum55a83382000-09-20 20:31:38 +0000839{
840#if defined(O_EXCL)&&defined(O_CREAT)&&defined(O_WRONLY)&&defined(O_TRUNC)
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000841 /* Use O_EXCL to avoid a race condition when another process tries to
842 write the same file. When that happens, our open() call fails,
843 which is just fine (since it's only a cache).
844 XXX If the file exists and is writable but the directory is not
845 writable, the file will never be written. Oh well.
846 */
847 int fd;
848 (void) unlink(filename);
849 fd = open(filename, O_EXCL|O_CREAT|O_WRONLY|O_TRUNC
Tim Peters42c83af2000-09-29 04:03:10 +0000850#ifdef O_BINARY
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000851 |O_BINARY /* necessary for Windows */
Tim Peters42c83af2000-09-29 04:03:10 +0000852#endif
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000853#ifdef __VMS
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000854 , mode, "ctxt=bin", "shr=nil"
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000855#else
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000856 , mode
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000857#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000858 );
859 if (fd < 0)
860 return NULL;
861 return fdopen(fd, "wb");
Guido van Rossum55a83382000-09-20 20:31:38 +0000862#else
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000863 /* Best we can do -- on Windows this can't happen anyway */
864 return fopen(filename, "wb");
Guido van Rossum55a83382000-09-20 20:31:38 +0000865#endif
866}
867
868
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000869/* Write a compiled module to a file, placing the time of last
870 modification of its source into the header.
871 Errors are ignored, if a write error occurs an attempt is made to
872 remove the file. */
873
874static void
Christian Heimes40346852008-02-23 17:52:07 +0000875write_compiled_module(PyCodeObject *co, char *cpathname, struct stat *srcstat)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000876{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000877 FILE *fp;
878 time_t mtime = srcstat->st_mtime;
R. David Murraye38b0a82009-07-19 01:44:23 +0000879#ifdef MS_WINDOWS /* since Windows uses different permissions */
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000880 mode_t mode = srcstat->st_mode & ~S_IEXEC;
R. David Murraye38b0a82009-07-19 01:44:23 +0000881#else
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000882 mode_t mode = srcstat->st_mode & ~S_IXUSR & ~S_IXGRP & ~S_IXOTH;
883#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000884
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000885 fp = open_exclusive(cpathname, mode);
886 if (fp == NULL) {
887 if (Py_VerboseFlag)
888 PySys_WriteStderr(
889 "# can't create %s\n", cpathname);
890 return;
891 }
892 PyMarshal_WriteLongToFile(pyc_magic, fp, Py_MARSHAL_VERSION);
893 /* First write a 0 for mtime */
894 PyMarshal_WriteLongToFile(0L, fp, Py_MARSHAL_VERSION);
895 PyMarshal_WriteObjectToFile((PyObject *)co, fp, Py_MARSHAL_VERSION);
896 if (fflush(fp) != 0 || ferror(fp)) {
897 if (Py_VerboseFlag)
898 PySys_WriteStderr("# can't write %s\n", cpathname);
899 /* Don't keep partial file */
900 fclose(fp);
901 (void) unlink(cpathname);
902 return;
903 }
904 /* Now write the true mtime */
905 fseek(fp, 4L, 0);
906 assert(mtime < LONG_MAX);
907 PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION);
908 fflush(fp);
909 fclose(fp);
910 if (Py_VerboseFlag)
911 PySys_WriteStderr("# wrote %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000912}
913
Antoine Pitrou5b0767c2009-01-06 19:00:59 +0000914static void
915update_code_filenames(PyCodeObject *co, PyObject *oldname, PyObject *newname)
916{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000917 PyObject *constants, *tmp;
918 Py_ssize_t i, n;
Antoine Pitrou5b0767c2009-01-06 19:00:59 +0000919
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000920 if (!_PyString_Eq(co->co_filename, oldname))
921 return;
Antoine Pitrou5b0767c2009-01-06 19:00:59 +0000922
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000923 tmp = co->co_filename;
924 co->co_filename = newname;
925 Py_INCREF(co->co_filename);
926 Py_DECREF(tmp);
Antoine Pitrou5b0767c2009-01-06 19:00:59 +0000927
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000928 constants = co->co_consts;
929 n = PyTuple_GET_SIZE(constants);
930 for (i = 0; i < n; i++) {
931 tmp = PyTuple_GET_ITEM(constants, i);
932 if (PyCode_Check(tmp))
933 update_code_filenames((PyCodeObject *)tmp,
934 oldname, newname);
935 }
Antoine Pitrou5b0767c2009-01-06 19:00:59 +0000936}
937
938static int
939update_compiled_module(PyCodeObject *co, char *pathname)
940{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000941 PyObject *oldname, *newname;
Antoine Pitrou5b0767c2009-01-06 19:00:59 +0000942
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000943 if (strcmp(PyString_AsString(co->co_filename), pathname) == 0)
944 return 0;
Antoine Pitrou5b0767c2009-01-06 19:00:59 +0000945
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000946 newname = PyString_FromString(pathname);
947 if (newname == NULL)
948 return -1;
Antoine Pitrou5b0767c2009-01-06 19:00:59 +0000949
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000950 oldname = co->co_filename;
951 Py_INCREF(oldname);
952 update_code_filenames(co, oldname, newname);
953 Py_DECREF(oldname);
954 Py_DECREF(newname);
955 return 1;
Antoine Pitrou5b0767c2009-01-06 19:00:59 +0000956}
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000957
958/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000959 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
960 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000961
Guido van Rossum79f25d91997-04-29 20:08:16 +0000962static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000963load_source_module(char *name, char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000964{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000965 struct stat st;
966 FILE *fpc;
967 char buf[MAXPATHLEN+1];
968 char *cpathname;
969 PyCodeObject *co;
970 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000971
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000972 if (fstat(fileno(fp), &st) != 0) {
973 PyErr_Format(PyExc_RuntimeError,
974 "unable to get file status from '%s'",
975 pathname);
976 return NULL;
977 }
978#if SIZEOF_TIME_T > 4
979 /* Python's .pyc timestamp handling presumes that the timestamp fits
980 in 4 bytes. This will be fine until sometime in the year 2038,
981 when a 4-byte signed time_t will overflow.
982 */
983 if (st.st_mtime >> 32) {
984 PyErr_SetString(PyExc_OverflowError,
985 "modification time overflows a 4 byte field");
986 return NULL;
987 }
988#endif
989 cpathname = make_compiled_pathname(pathname, buf,
990 (size_t)MAXPATHLEN + 1);
991 if (cpathname != NULL &&
992 (fpc = check_compiled_module(pathname, st.st_mtime, cpathname))) {
993 co = read_compiled_module(cpathname, fpc);
994 fclose(fpc);
995 if (co == NULL)
996 return NULL;
997 if (update_compiled_module(co, pathname) < 0)
998 return NULL;
999 if (Py_VerboseFlag)
1000 PySys_WriteStderr("import %s # precompiled from %s\n",
1001 name, cpathname);
1002 pathname = cpathname;
1003 }
1004 else {
1005 co = parse_source_module(pathname, fp);
1006 if (co == NULL)
1007 return NULL;
1008 if (Py_VerboseFlag)
1009 PySys_WriteStderr("import %s # from %s\n",
1010 name, pathname);
1011 if (cpathname) {
1012 PyObject *ro = PySys_GetObject("dont_write_bytecode");
1013 if (ro == NULL || !PyObject_IsTrue(ro))
1014 write_compiled_module(co, cpathname, &st);
1015 }
1016 }
1017 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
1018 Py_DECREF(co);
1019
1020 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001021}
1022
1023
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001024/* Forward */
Just van Rossum52e14d62002-12-30 22:08:05 +00001025static PyObject *load_module(char *, FILE *, char *, int, PyObject *);
1026static struct filedescr *find_module(char *, char *, PyObject *,
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001027 char *, size_t, FILE **, PyObject **);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001028static struct _frozen *find_frozen(char *name);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001029
1030/* Load a package and return its module object WITH INCREMENTED
1031 REFERENCE COUNT */
1032
1033static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001034load_package(char *name, char *pathname)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001035{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001036 PyObject *m, *d;
1037 PyObject *file = NULL;
1038 PyObject *path = NULL;
1039 int err;
1040 char buf[MAXPATHLEN+1];
1041 FILE *fp = NULL;
1042 struct filedescr *fdp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001043
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001044 m = PyImport_AddModule(name);
1045 if (m == NULL)
1046 return NULL;
1047 if (Py_VerboseFlag)
1048 PySys_WriteStderr("import %s # directory %s\n",
1049 name, pathname);
1050 d = PyModule_GetDict(m);
1051 file = PyString_FromString(pathname);
1052 if (file == NULL)
1053 goto error;
1054 path = Py_BuildValue("[O]", file);
1055 if (path == NULL)
1056 goto error;
1057 err = PyDict_SetItemString(d, "__file__", file);
1058 if (err == 0)
1059 err = PyDict_SetItemString(d, "__path__", path);
1060 if (err != 0)
1061 goto error;
1062 buf[0] = '\0';
1063 fdp = find_module(name, "__init__", path, buf, sizeof(buf), &fp, NULL);
1064 if (fdp == NULL) {
1065 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
1066 PyErr_Clear();
1067 Py_INCREF(m);
1068 }
1069 else
1070 m = NULL;
1071 goto cleanup;
1072 }
1073 m = load_module(name, fp, buf, fdp->type, NULL);
1074 if (fp != NULL)
1075 fclose(fp);
1076 goto cleanup;
Tim Peters1cd70172004-08-02 03:52:12 +00001077
1078 error:
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001079 m = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001080 cleanup:
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001081 Py_XDECREF(path);
1082 Py_XDECREF(file);
1083 return m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001084}
1085
1086
1087/* Helper to test for built-in module */
1088
1089static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001090is_builtin(char *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001091{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001092 int i;
1093 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
1094 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
1095 if (PyImport_Inittab[i].initfunc == NULL)
1096 return -1;
1097 else
1098 return 1;
1099 }
1100 }
1101 return 0;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001102}
1103
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001104
Just van Rossum52e14d62002-12-30 22:08:05 +00001105/* Return an importer object for a sys.path/pkg.__path__ item 'p',
1106 possibly by fetching it from the path_importer_cache dict. If it
Brett Cannon94b69f62006-09-28 22:10:14 +00001107 wasn't yet cached, traverse path_hooks until a hook is found
Just van Rossum52e14d62002-12-30 22:08:05 +00001108 that can handle the path item. Return None if no hook could;
1109 this tells our caller it should fall back to the builtin
1110 import mechanism. Cache the result in path_importer_cache.
1111 Returns a borrowed reference. */
1112
1113static PyObject *
1114get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks,
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001115 PyObject *p)
Just van Rossum52e14d62002-12-30 22:08:05 +00001116{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001117 PyObject *importer;
1118 Py_ssize_t j, nhooks;
Just van Rossum52e14d62002-12-30 22:08:05 +00001119
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001120 /* These conditions are the caller's responsibility: */
1121 assert(PyList_Check(path_hooks));
1122 assert(PyDict_Check(path_importer_cache));
Just van Rossum52e14d62002-12-30 22:08:05 +00001123
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001124 nhooks = PyList_Size(path_hooks);
1125 if (nhooks < 0)
1126 return NULL; /* Shouldn't happen */
Just van Rossum52e14d62002-12-30 22:08:05 +00001127
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001128 importer = PyDict_GetItem(path_importer_cache, p);
1129 if (importer != NULL)
1130 return importer;
Just van Rossum52e14d62002-12-30 22:08:05 +00001131
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001132 /* set path_importer_cache[p] to None to avoid recursion */
1133 if (PyDict_SetItem(path_importer_cache, p, Py_None) != 0)
1134 return NULL;
Just van Rossum52e14d62002-12-30 22:08:05 +00001135
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001136 for (j = 0; j < nhooks; j++) {
1137 PyObject *hook = PyList_GetItem(path_hooks, j);
1138 if (hook == NULL)
1139 return NULL;
1140 importer = PyObject_CallFunctionObjArgs(hook, p, NULL);
1141 if (importer != NULL)
1142 break;
Just van Rossum52e14d62002-12-30 22:08:05 +00001143
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001144 if (!PyErr_ExceptionMatches(PyExc_ImportError)) {
1145 return NULL;
1146 }
1147 PyErr_Clear();
1148 }
1149 if (importer == NULL) {
1150 importer = PyObject_CallFunctionObjArgs(
1151 (PyObject *)&PyNullImporter_Type, p, NULL
1152 );
1153 if (importer == NULL) {
1154 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
1155 PyErr_Clear();
1156 return Py_None;
1157 }
1158 }
1159 }
1160 if (importer != NULL) {
1161 int err = PyDict_SetItem(path_importer_cache, p, importer);
1162 Py_DECREF(importer);
1163 if (err != 0)
1164 return NULL;
1165 }
1166 return importer;
Just van Rossum52e14d62002-12-30 22:08:05 +00001167}
1168
Nick Coghlan327a39b2007-11-18 11:56:28 +00001169PyAPI_FUNC(PyObject *)
1170PyImport_GetImporter(PyObject *path) {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001171 PyObject *importer=NULL, *path_importer_cache=NULL, *path_hooks=NULL;
Nick Coghlan327a39b2007-11-18 11:56:28 +00001172
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001173 if ((path_importer_cache = PySys_GetObject("path_importer_cache"))) {
1174 if ((path_hooks = PySys_GetObject("path_hooks"))) {
1175 importer = get_path_importer(path_importer_cache,
1176 path_hooks, path);
1177 }
1178 }
1179 Py_XINCREF(importer); /* get_path_importer returns a borrowed reference */
1180 return importer;
Nick Coghlan327a39b2007-11-18 11:56:28 +00001181}
1182
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001183/* Search the path (default sys.path) for a module. Return the
1184 corresponding filedescr struct, and (via return arguments) the
1185 pathname and an open file. Return NULL if the module is not found. */
1186
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001187#ifdef MS_COREDLL
Thomas Woutersb4bd21c2000-07-22 23:38:01 +00001188extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **,
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001189 char *, Py_ssize_t);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001190#endif
1191
Martin v. Löwis18e16552006-02-15 17:27:45 +00001192static int case_ok(char *, Py_ssize_t, Py_ssize_t, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001193static int find_init_module(char *); /* Forward */
Just van Rossum52e14d62002-12-30 22:08:05 +00001194static struct filedescr importhookdescr = {"", "", IMP_HOOK};
Guido van Rossum197346f1997-10-31 18:38:52 +00001195
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001196static struct filedescr *
Just van Rossum52e14d62002-12-30 22:08:05 +00001197find_module(char *fullname, char *subname, PyObject *path, char *buf,
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001198 size_t buflen, FILE **p_fp, PyObject **p_loader)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001199{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001200 Py_ssize_t i, npath;
1201 size_t len, namelen;
1202 struct filedescr *fdp = NULL;
1203 char *filemode;
1204 FILE *fp = NULL;
1205 PyObject *path_hooks, *path_importer_cache;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001206#ifndef RISCOS
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001207 struct stat statbuf;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001208#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001209 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
1210 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
1211 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
1212 char name[MAXPATHLEN+1];
Andrew MacIntyred9400542002-02-26 11:41:34 +00001213#if defined(PYOS_OS2)
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001214 size_t saved_len;
1215 size_t saved_namelen;
1216 char *saved_buf = NULL;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001217#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001218 if (p_loader != NULL)
1219 *p_loader = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001220
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001221 if (strlen(subname) > MAXPATHLEN) {
1222 PyErr_SetString(PyExc_OverflowError,
1223 "module name is too long");
1224 return NULL;
1225 }
1226 strcpy(name, subname);
Just van Rossum52e14d62002-12-30 22:08:05 +00001227
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001228 /* sys.meta_path import hook */
1229 if (p_loader != NULL) {
1230 PyObject *meta_path;
Just van Rossum52e14d62002-12-30 22:08:05 +00001231
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001232 meta_path = PySys_GetObject("meta_path");
1233 if (meta_path == NULL || !PyList_Check(meta_path)) {
1234 PyErr_SetString(PyExc_ImportError,
1235 "sys.meta_path must be a list of "
1236 "import hooks");
1237 return NULL;
1238 }
1239 Py_INCREF(meta_path); /* zap guard */
1240 npath = PyList_Size(meta_path);
1241 for (i = 0; i < npath; i++) {
1242 PyObject *loader;
1243 PyObject *hook = PyList_GetItem(meta_path, i);
1244 loader = PyObject_CallMethod(hook, "find_module",
1245 "sO", fullname,
1246 path != NULL ?
1247 path : Py_None);
1248 if (loader == NULL) {
1249 Py_DECREF(meta_path);
1250 return NULL; /* true error */
1251 }
1252 if (loader != Py_None) {
1253 /* a loader was found */
1254 *p_loader = loader;
1255 Py_DECREF(meta_path);
1256 return &importhookdescr;
1257 }
1258 Py_DECREF(loader);
1259 }
1260 Py_DECREF(meta_path);
1261 }
Guido van Rossum0506a431998-08-11 15:07:39 +00001262
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001263 if (path != NULL && PyString_Check(path)) {
1264 /* The only type of submodule allowed inside a "frozen"
1265 package are other frozen modules or packages. */
1266 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
1267 PyErr_SetString(PyExc_ImportError,
1268 "full frozen module name too long");
1269 return NULL;
1270 }
1271 strcpy(buf, PyString_AsString(path));
1272 strcat(buf, ".");
1273 strcat(buf, name);
1274 strcpy(name, buf);
1275 if (find_frozen(name) != NULL) {
1276 strcpy(buf, name);
1277 return &fd_frozen;
1278 }
1279 PyErr_Format(PyExc_ImportError,
1280 "No frozen submodule named %.200s", name);
1281 return NULL;
1282 }
1283 if (path == NULL) {
1284 if (is_builtin(name)) {
1285 strcpy(buf, name);
1286 return &fd_builtin;
1287 }
1288 if ((find_frozen(name)) != NULL) {
1289 strcpy(buf, name);
1290 return &fd_frozen;
1291 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001292
Guido van Rossumac279101996-08-22 23:10:58 +00001293#ifdef MS_COREDLL
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001294 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
1295 if (fp != NULL) {
1296 *p_fp = fp;
1297 return fdp;
1298 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +00001299#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001300 path = PySys_GetObject("path");
1301 }
1302 if (path == NULL || !PyList_Check(path)) {
1303 PyErr_SetString(PyExc_ImportError,
1304 "sys.path must be a list of directory names");
1305 return NULL;
1306 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001307
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001308 path_hooks = PySys_GetObject("path_hooks");
1309 if (path_hooks == NULL || !PyList_Check(path_hooks)) {
1310 PyErr_SetString(PyExc_ImportError,
1311 "sys.path_hooks must be a list of "
1312 "import hooks");
1313 return NULL;
1314 }
1315 path_importer_cache = PySys_GetObject("path_importer_cache");
1316 if (path_importer_cache == NULL ||
1317 !PyDict_Check(path_importer_cache)) {
1318 PyErr_SetString(PyExc_ImportError,
1319 "sys.path_importer_cache must be a dict");
1320 return NULL;
1321 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001322
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001323 npath = PyList_Size(path);
1324 namelen = strlen(name);
1325 for (i = 0; i < npath; i++) {
1326 PyObject *copy = NULL;
1327 PyObject *v = PyList_GetItem(path, i);
1328 if (!v)
1329 return NULL;
Walter Dörwald3430d702002-06-17 10:43:59 +00001330#ifdef Py_USING_UNICODE
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001331 if (PyUnicode_Check(v)) {
1332 copy = PyUnicode_Encode(PyUnicode_AS_UNICODE(v),
1333 PyUnicode_GET_SIZE(v), Py_FileSystemDefaultEncoding, NULL);
1334 if (copy == NULL)
1335 return NULL;
1336 v = copy;
1337 }
1338 else
Walter Dörwald3430d702002-06-17 10:43:59 +00001339#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001340 if (!PyString_Check(v))
1341 continue;
1342 len = PyString_GET_SIZE(v);
1343 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen) {
1344 Py_XDECREF(copy);
1345 continue; /* Too long */
1346 }
1347 strcpy(buf, PyString_AS_STRING(v));
1348 if (strlen(buf) != len) {
1349 Py_XDECREF(copy);
1350 continue; /* v contains '\0' */
1351 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001352
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001353 /* sys.path_hooks import hook */
1354 if (p_loader != NULL) {
1355 PyObject *importer;
Just van Rossum52e14d62002-12-30 22:08:05 +00001356
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001357 importer = get_path_importer(path_importer_cache,
1358 path_hooks, v);
1359 if (importer == NULL) {
1360 Py_XDECREF(copy);
1361 return NULL;
1362 }
1363 /* Note: importer is a borrowed reference */
1364 if (importer != Py_None) {
1365 PyObject *loader;
1366 loader = PyObject_CallMethod(importer,
1367 "find_module",
1368 "s", fullname);
1369 Py_XDECREF(copy);
1370 if (loader == NULL)
1371 return NULL; /* error */
1372 if (loader != Py_None) {
1373 /* a loader was found */
1374 *p_loader = loader;
1375 return &importhookdescr;
1376 }
1377 Py_DECREF(loader);
1378 continue;
1379 }
1380 }
1381 /* no hook was found, use builtin import */
Just van Rossum52e14d62002-12-30 22:08:05 +00001382
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001383 if (len > 0 && buf[len-1] != SEP
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001384#ifdef ALTSEP
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001385 && buf[len-1] != ALTSEP
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001386#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001387 )
1388 buf[len++] = SEP;
1389 strcpy(buf+len, name);
1390 len += namelen;
Tim Peters50d8d372001-02-28 05:34:27 +00001391
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001392 /* Check for package import (buf holds a directory name,
1393 and there's an __init__ module in that directory */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001394#ifdef HAVE_STAT
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001395 if (stat(buf, &statbuf) == 0 && /* it exists */
1396 S_ISDIR(statbuf.st_mode) && /* it's a directory */
1397 case_ok(buf, len, namelen, name)) { /* case matches */
1398 if (find_init_module(buf)) { /* and has __init__.py */
1399 Py_XDECREF(copy);
1400 return &fd_package;
1401 }
1402 else {
1403 char warnstr[MAXPATHLEN+80];
1404 sprintf(warnstr, "Not importing directory "
1405 "'%.*s': missing __init__.py",
1406 MAXPATHLEN, buf);
1407 if (PyErr_Warn(PyExc_ImportWarning,
1408 warnstr)) {
1409 Py_XDECREF(copy);
1410 return NULL;
1411 }
1412 }
1413 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001414#else
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001415 /* XXX How are you going to test for directories? */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001416#ifdef RISCOS
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001417 if (isdir(buf) &&
1418 case_ok(buf, len, namelen, name)) {
1419 if (find_init_module(buf)) {
1420 Py_XDECREF(copy);
1421 return &fd_package;
1422 }
1423 else {
1424 char warnstr[MAXPATHLEN+80];
1425 sprintf(warnstr, "Not importing directory "
1426 "'%.*s': missing __init__.py",
1427 MAXPATHLEN, buf);
1428 if (PyErr_Warn(PyExc_ImportWarning,
1429 warnstr)) {
1430 Py_XDECREF(copy);
1431 return NULL;
1432 }
1433 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001434#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001435#endif
Andrew MacIntyred9400542002-02-26 11:41:34 +00001436#if defined(PYOS_OS2)
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001437 /* take a snapshot of the module spec for restoration
1438 * after the 8 character DLL hackery
1439 */
1440 saved_buf = strdup(buf);
1441 saved_len = len;
1442 saved_namelen = namelen;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001443#endif /* PYOS_OS2 */
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001444 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Georg Brandladd36e52007-08-23 18:08:06 +00001445#if defined(PYOS_OS2) && defined(HAVE_DYNAMIC_LOADING)
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001446 /* OS/2 limits DLLs to 8 character names (w/o
1447 extension)
1448 * so if the name is longer than that and its a
1449 * dynamically loaded module we're going to try,
1450 * truncate the name before trying
1451 */
1452 if (strlen(subname) > 8) {
1453 /* is this an attempt to load a C extension? */
1454 const struct filedescr *scan;
1455 scan = _PyImport_DynLoadFiletab;
1456 while (scan->suffix != NULL) {
1457 if (!strcmp(scan->suffix, fdp->suffix))
1458 break;
1459 else
1460 scan++;
1461 }
1462 if (scan->suffix != NULL) {
1463 /* yes, so truncate the name */
1464 namelen = 8;
1465 len -= strlen(subname) - namelen;
1466 buf[len] = '\0';
1467 }
1468 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001469#endif /* PYOS_OS2 */
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001470 strcpy(buf+len, fdp->suffix);
1471 if (Py_VerboseFlag > 1)
1472 PySys_WriteStderr("# trying %s\n", buf);
1473 filemode = fdp->mode;
1474 if (filemode[0] == 'U')
1475 filemode = "r" PY_STDIOTEXTMODE;
1476 fp = fopen(buf, filemode);
1477 if (fp != NULL) {
1478 if (case_ok(buf, len, namelen, name))
1479 break;
1480 else { /* continue search */
1481 fclose(fp);
1482 fp = NULL;
1483 }
1484 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001485#if defined(PYOS_OS2)
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001486 /* restore the saved snapshot */
1487 strcpy(buf, saved_buf);
1488 len = saved_len;
1489 namelen = saved_namelen;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001490#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001491 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001492#if defined(PYOS_OS2)
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001493 /* don't need/want the module name snapshot anymore */
1494 if (saved_buf)
1495 {
1496 free(saved_buf);
1497 saved_buf = NULL;
1498 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001499#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001500 Py_XDECREF(copy);
1501 if (fp != NULL)
1502 break;
1503 }
1504 if (fp == NULL) {
1505 PyErr_Format(PyExc_ImportError,
1506 "No module named %.200s", name);
1507 return NULL;
1508 }
1509 *p_fp = fp;
1510 return fdp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001511}
1512
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +00001513/* Helpers for main.c
1514 * Find the source file corresponding to a named module
1515 */
1516struct filedescr *
1517_PyImport_FindModule(const char *name, PyObject *path, char *buf,
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001518 size_t buflen, FILE **p_fp, PyObject **p_loader)
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +00001519{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001520 return find_module((char *) name, (char *) name, path,
1521 buf, buflen, p_fp, p_loader);
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +00001522}
1523
1524PyAPI_FUNC(int) _PyImport_IsScript(struct filedescr * fd)
1525{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001526 return fd->type == PY_SOURCE || fd->type == PY_COMPILED;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +00001527}
1528
Martin v. Löwis18e16552006-02-15 17:27:45 +00001529/* case_ok(char* buf, Py_ssize_t len, Py_ssize_t namelen, char* name)
Tim Petersd1e87a82001-03-01 18:12:00 +00001530 * The arguments here are tricky, best shown by example:
1531 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1532 * ^ ^ ^ ^
1533 * |--------------------- buf ---------------------|
1534 * |------------------- len ------------------|
1535 * |------ name -------|
1536 * |----- namelen -----|
1537 * buf is the full path, but len only counts up to (& exclusive of) the
1538 * extension. name is the module name, also exclusive of extension.
1539 *
1540 * We've already done a successful stat() or fopen() on buf, so know that
1541 * there's some match, possibly case-insensitive.
1542 *
Tim Peters50d8d372001-02-28 05:34:27 +00001543 * case_ok() is to return 1 if there's a case-sensitive match for
1544 * name, else 0. case_ok() is also to return 1 if envar PYTHONCASEOK
1545 * exists.
Tim Petersd1e87a82001-03-01 18:12:00 +00001546 *
Tim Peters50d8d372001-02-28 05:34:27 +00001547 * case_ok() is used to implement case-sensitive import semantics even
1548 * on platforms with case-insensitive filesystems. It's trivial to implement
1549 * for case-sensitive filesystems. It's pretty much a cross-platform
1550 * nightmare for systems with case-insensitive filesystems.
1551 */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001552
Tim Peters50d8d372001-02-28 05:34:27 +00001553/* First we may need a pile of platform-specific header files; the sequence
1554 * of #if's here should match the sequence in the body of case_ok().
1555 */
Jason Tishler7961aa62005-05-20 00:56:54 +00001556#if defined(MS_WINDOWS)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001557#include <windows.h>
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001558
Tim Peters50d8d372001-02-28 05:34:27 +00001559#elif defined(DJGPP)
1560#include <dir.h>
1561
Jason Tishler7961aa62005-05-20 00:56:54 +00001562#elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001563#include <sys/types.h>
1564#include <dirent.h>
1565
Andrew MacIntyred9400542002-02-26 11:41:34 +00001566#elif defined(PYOS_OS2)
1567#define INCL_DOS
1568#define INCL_DOSERRORS
1569#define INCL_NOPMAPI
1570#include <os2.h>
1571
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001572#elif defined(RISCOS)
1573#include "oslib/osfscontrol.h"
Tim Peters50d8d372001-02-28 05:34:27 +00001574#endif
1575
Guido van Rossum0980bd91998-02-13 17:18:36 +00001576static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001577case_ok(char *buf, Py_ssize_t len, Py_ssize_t namelen, char *name)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001578{
Tim Peters50d8d372001-02-28 05:34:27 +00001579/* Pick a platform-specific implementation; the sequence of #if's here should
1580 * match the sequence just above.
1581 */
1582
Jason Tishler7961aa62005-05-20 00:56:54 +00001583/* MS_WINDOWS */
1584#if defined(MS_WINDOWS)
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001585 WIN32_FIND_DATA data;
1586 HANDLE h;
Tim Peters50d8d372001-02-28 05:34:27 +00001587
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001588 if (Py_GETENV("PYTHONCASEOK") != NULL)
1589 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001590
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001591 h = FindFirstFile(buf, &data);
1592 if (h == INVALID_HANDLE_VALUE) {
1593 PyErr_Format(PyExc_NameError,
1594 "Can't find file for module %.100s\n(filename %.300s)",
1595 name, buf);
1596 return 0;
1597 }
1598 FindClose(h);
1599 return strncmp(data.cFileName, name, namelen) == 0;
Tim Peters50d8d372001-02-28 05:34:27 +00001600
1601/* DJGPP */
1602#elif defined(DJGPP)
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001603 struct ffblk ffblk;
1604 int done;
Tim Peters50d8d372001-02-28 05:34:27 +00001605
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001606 if (Py_GETENV("PYTHONCASEOK") != NULL)
1607 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001608
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001609 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
1610 if (done) {
1611 PyErr_Format(PyExc_NameError,
1612 "Can't find file for module %.100s\n(filename %.300s)",
1613 name, buf);
1614 return 0;
1615 }
1616 return strncmp(ffblk.ff_name, name, namelen) == 0;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001617
Jason Tishler7961aa62005-05-20 00:56:54 +00001618/* new-fangled macintosh (macosx) or Cygwin */
1619#elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H)
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001620 DIR *dirp;
1621 struct dirent *dp;
1622 char dirname[MAXPATHLEN + 1];
1623 const int dirlen = len - namelen - 1; /* don't want trailing SEP */
Tim Peters430f5d42001-03-01 01:30:56 +00001624
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001625 if (Py_GETENV("PYTHONCASEOK") != NULL)
1626 return 1;
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001627
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001628 /* Copy the dir component into dirname; substitute "." if empty */
1629 if (dirlen <= 0) {
1630 dirname[0] = '.';
1631 dirname[1] = '\0';
1632 }
1633 else {
1634 assert(dirlen <= MAXPATHLEN);
1635 memcpy(dirname, buf, dirlen);
1636 dirname[dirlen] = '\0';
1637 }
1638 /* Open the directory and search the entries for an exact match. */
1639 dirp = opendir(dirname);
1640 if (dirp) {
1641 char *nameWithExt = buf + len - namelen;
1642 while ((dp = readdir(dirp)) != NULL) {
1643 const int thislen =
Tim Peters430f5d42001-03-01 01:30:56 +00001644#ifdef _DIRENT_HAVE_D_NAMELEN
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001645 dp->d_namlen;
Tim Peters430f5d42001-03-01 01:30:56 +00001646#else
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001647 strlen(dp->d_name);
Tim Peters430f5d42001-03-01 01:30:56 +00001648#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001649 if (thislen >= namelen &&
1650 strcmp(dp->d_name, nameWithExt) == 0) {
1651 (void)closedir(dirp);
1652 return 1; /* Found */
1653 }
1654 }
1655 (void)closedir(dirp);
1656 }
1657 return 0 ; /* Not found */
Tim Peters430f5d42001-03-01 01:30:56 +00001658
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001659/* RISC OS */
1660#elif defined(RISCOS)
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001661 char canon[MAXPATHLEN+1]; /* buffer for the canonical form of the path */
1662 char buf2[MAXPATHLEN+2];
1663 char *nameWithExt = buf+len-namelen;
1664 int canonlen;
1665 os_error *e;
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001666
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001667 if (Py_GETENV("PYTHONCASEOK") != NULL)
1668 return 1;
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001669
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001670 /* workaround:
1671 append wildcard, otherwise case of filename wouldn't be touched */
1672 strcpy(buf2, buf);
1673 strcat(buf2, "*");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001674
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001675 e = xosfscontrol_canonicalise_path(buf2,canon,0,0,MAXPATHLEN+1,&canonlen);
1676 canonlen = MAXPATHLEN+1-canonlen;
1677 if (e || canonlen<=0 || canonlen>(MAXPATHLEN+1) )
1678 return 0;
1679 if (strcmp(nameWithExt, canon+canonlen-strlen(nameWithExt))==0)
1680 return 1; /* match */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001681
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001682 return 0;
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001683
Andrew MacIntyred9400542002-02-26 11:41:34 +00001684/* OS/2 */
1685#elif defined(PYOS_OS2)
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001686 HDIR hdir = 1;
1687 ULONG srchcnt = 1;
1688 FILEFINDBUF3 ffbuf;
1689 APIRET rc;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001690
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001691 if (Py_GETENV("PYTHONCASEOK") != NULL)
1692 return 1;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001693
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001694 rc = DosFindFirst(buf,
1695 &hdir,
1696 FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY,
1697 &ffbuf, sizeof(ffbuf),
1698 &srchcnt,
1699 FIL_STANDARD);
1700 if (rc != NO_ERROR)
1701 return 0;
1702 return strncmp(ffbuf.achName, name, namelen) == 0;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001703
Tim Peters50d8d372001-02-28 05:34:27 +00001704/* assuming it's a case-sensitive filesystem, so there's nothing to do! */
1705#else
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001706 return 1;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001707
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001708#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001709}
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001710
Guido van Rossum0980bd91998-02-13 17:18:36 +00001711
Guido van Rossum197346f1997-10-31 18:38:52 +00001712#ifdef HAVE_STAT
1713/* Helper to look for __init__.py or __init__.py[co] in potential package */
1714static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001715find_init_module(char *buf)
Guido van Rossum197346f1997-10-31 18:38:52 +00001716{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001717 const size_t save_len = strlen(buf);
1718 size_t i = save_len;
1719 char *pname; /* pointer to start of __init__ */
1720 struct stat statbuf;
Guido van Rossum197346f1997-10-31 18:38:52 +00001721
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001722/* For calling case_ok(buf, len, namelen, name):
1723 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1724 * ^ ^ ^ ^
1725 * |--------------------- buf ---------------------|
1726 * |------------------- len ------------------|
1727 * |------ name -------|
1728 * |----- namelen -----|
Tim Peters0f9431f2001-07-05 03:47:53 +00001729 */
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001730 if (save_len + 13 >= MAXPATHLEN)
1731 return 0;
1732 buf[i++] = SEP;
1733 pname = buf + i;
1734 strcpy(pname, "__init__.py");
1735 if (stat(buf, &statbuf) == 0) {
1736 if (case_ok(buf,
1737 save_len + 9, /* len("/__init__") */
1738 8, /* len("__init__") */
1739 pname)) {
1740 buf[save_len] = '\0';
1741 return 1;
1742 }
1743 }
1744 i += strlen(pname);
1745 strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
1746 if (stat(buf, &statbuf) == 0) {
1747 if (case_ok(buf,
1748 save_len + 9, /* len("/__init__") */
1749 8, /* len("__init__") */
1750 pname)) {
1751 buf[save_len] = '\0';
1752 return 1;
1753 }
1754 }
1755 buf[save_len] = '\0';
1756 return 0;
Guido van Rossum197346f1997-10-31 18:38:52 +00001757}
Guido van Rossum48a680c2001-03-02 06:34:14 +00001758
1759#else
1760
1761#ifdef RISCOS
1762static int
1763find_init_module(buf)
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001764 char *buf;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001765{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001766 int save_len = strlen(buf);
1767 int i = save_len;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001768
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001769 if (save_len + 13 >= MAXPATHLEN)
1770 return 0;
1771 buf[i++] = SEP;
1772 strcpy(buf+i, "__init__/py");
1773 if (isfile(buf)) {
1774 buf[save_len] = '\0';
1775 return 1;
1776 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001777
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001778 if (Py_OptimizeFlag)
1779 strcpy(buf+i, "o");
1780 else
1781 strcpy(buf+i, "c");
1782 if (isfile(buf)) {
1783 buf[save_len] = '\0';
1784 return 1;
1785 }
1786 buf[save_len] = '\0';
1787 return 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001788}
1789#endif /*RISCOS*/
1790
Guido van Rossum197346f1997-10-31 18:38:52 +00001791#endif /* HAVE_STAT */
1792
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001793
Tim Petersdbd9ba62000-07-09 03:09:57 +00001794static int init_builtin(char *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001795
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001796/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001797 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001798
Guido van Rossum79f25d91997-04-29 20:08:16 +00001799static PyObject *
Just van Rossum52e14d62002-12-30 22:08:05 +00001800load_module(char *name, FILE *fp, char *buf, int type, PyObject *loader)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001801{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001802 PyObject *modules;
1803 PyObject *m;
1804 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001805
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001806 /* First check that there's an open file (if we need one) */
1807 switch (type) {
1808 case PY_SOURCE:
1809 case PY_COMPILED:
1810 if (fp == NULL) {
1811 PyErr_Format(PyExc_ValueError,
1812 "file object required for import (type code %d)",
1813 type);
1814 return NULL;
1815 }
1816 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001817
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001818 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001819
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001820 case PY_SOURCE:
1821 m = load_source_module(name, buf, fp);
1822 break;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001823
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001824 case PY_COMPILED:
1825 m = load_compiled_module(name, buf, fp);
1826 break;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001827
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001828#ifdef HAVE_DYNAMIC_LOADING
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001829 case C_EXTENSION:
1830 m = _PyImport_LoadDynamicModule(name, buf, fp);
1831 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001832#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001833
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001834 case PKG_DIRECTORY:
1835 m = load_package(name, buf);
1836 break;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001837
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001838 case C_BUILTIN:
1839 case PY_FROZEN:
1840 if (buf != NULL && buf[0] != '\0')
1841 name = buf;
1842 if (type == C_BUILTIN)
1843 err = init_builtin(name);
1844 else
1845 err = PyImport_ImportFrozenModule(name);
1846 if (err < 0)
1847 return NULL;
1848 if (err == 0) {
1849 PyErr_Format(PyExc_ImportError,
1850 "Purported %s module %.200s not found",
1851 type == C_BUILTIN ?
1852 "builtin" : "frozen",
1853 name);
1854 return NULL;
1855 }
1856 modules = PyImport_GetModuleDict();
1857 m = PyDict_GetItemString(modules, name);
1858 if (m == NULL) {
1859 PyErr_Format(
1860 PyExc_ImportError,
1861 "%s module %.200s not properly initialized",
1862 type == C_BUILTIN ?
1863 "builtin" : "frozen",
1864 name);
1865 return NULL;
1866 }
1867 Py_INCREF(m);
1868 break;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001869
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001870 case IMP_HOOK: {
1871 if (loader == NULL) {
1872 PyErr_SetString(PyExc_ImportError,
1873 "import hook without loader");
1874 return NULL;
1875 }
1876 m = PyObject_CallMethod(loader, "load_module", "s", name);
1877 break;
1878 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001879
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001880 default:
1881 PyErr_Format(PyExc_ImportError,
1882 "Don't know how to import %.200s (type code %d)",
1883 name, type);
1884 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001885
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001886 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001887
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001888 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001889}
1890
1891
1892/* Initialize a built-in module.
Brett Cannon5a9aa4f2006-10-03 21:58:55 +00001893 Return 1 for success, 0 if the module is not found, and -1 with
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001894 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001895
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001896static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001897init_builtin(char *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001898{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001899 struct _inittab *p;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001900
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001901 if (_PyImport_FindExtension(name, name) != NULL)
1902 return 1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001903
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001904 for (p = PyImport_Inittab; p->name != NULL; p++) {
1905 if (strcmp(name, p->name) == 0) {
1906 if (p->initfunc == NULL) {
1907 PyErr_Format(PyExc_ImportError,
1908 "Cannot re-init internal module %.200s",
1909 name);
1910 return -1;
1911 }
1912 if (Py_VerboseFlag)
1913 PySys_WriteStderr("import %s # builtin\n", name);
1914 (*p->initfunc)();
1915 if (PyErr_Occurred())
1916 return -1;
1917 if (_PyImport_FixupExtension(name, name) == NULL)
1918 return -1;
1919 return 1;
1920 }
1921 }
1922 return 0;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001923}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001924
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001925
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001926/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001927
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001928static struct _frozen *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001929find_frozen(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001930{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001931 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001932
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001933 for (p = PyImport_FrozenModules; ; p++) {
1934 if (p->name == NULL)
1935 return NULL;
1936 if (strcmp(p->name, name) == 0)
1937 break;
1938 }
1939 return p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001940}
1941
Guido van Rossum79f25d91997-04-29 20:08:16 +00001942static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001943get_frozen_object(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001944{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001945 struct _frozen *p = find_frozen(name);
1946 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001947
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001948 if (p == NULL) {
1949 PyErr_Format(PyExc_ImportError,
1950 "No such frozen object named %.200s",
1951 name);
1952 return NULL;
1953 }
1954 if (p->code == NULL) {
1955 PyErr_Format(PyExc_ImportError,
1956 "Excluded frozen object named %.200s",
1957 name);
1958 return NULL;
1959 }
1960 size = p->size;
1961 if (size < 0)
1962 size = -size;
1963 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001964}
1965
1966/* Initialize a frozen module.
1967 Return 1 for succes, 0 if the module is not found, and -1 with
1968 an exception set if the initialization failed.
1969 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001970
1971int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001972PyImport_ImportFrozenModule(char *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001973{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001974 struct _frozen *p = find_frozen(name);
1975 PyObject *co;
1976 PyObject *m;
1977 int ispackage;
1978 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001979
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001980 if (p == NULL)
1981 return 0;
1982 if (p->code == NULL) {
1983 PyErr_Format(PyExc_ImportError,
1984 "Excluded frozen object named %.200s",
1985 name);
1986 return -1;
1987 }
1988 size = p->size;
1989 ispackage = (size < 0);
1990 if (ispackage)
1991 size = -size;
1992 if (Py_VerboseFlag)
1993 PySys_WriteStderr("import %s # frozen%s\n",
1994 name, ispackage ? " package" : "");
1995 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
1996 if (co == NULL)
1997 return -1;
1998 if (!PyCode_Check(co)) {
1999 PyErr_Format(PyExc_TypeError,
2000 "frozen object %.200s is not a code object",
2001 name);
2002 goto err_return;
2003 }
2004 if (ispackage) {
2005 /* Set __path__ to the package name */
2006 PyObject *d, *s;
2007 int err;
2008 m = PyImport_AddModule(name);
2009 if (m == NULL)
2010 goto err_return;
2011 d = PyModule_GetDict(m);
2012 s = PyString_InternFromString(name);
2013 if (s == NULL)
2014 goto err_return;
2015 err = PyDict_SetItemString(d, "__path__", s);
2016 Py_DECREF(s);
2017 if (err != 0)
2018 goto err_return;
2019 }
2020 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
2021 if (m == NULL)
2022 goto err_return;
2023 Py_DECREF(co);
2024 Py_DECREF(m);
2025 return 1;
Neal Norwitzc0cde4d2006-07-16 02:17:36 +00002026err_return:
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002027 Py_DECREF(co);
2028 return -1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00002029}
Guido van Rossum74e6a111994-08-29 12:54:38 +00002030
2031
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002032/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00002033 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00002034
Guido van Rossum79f25d91997-04-29 20:08:16 +00002035PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00002036PyImport_ImportModule(const char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00002037{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002038 PyObject *pname;
2039 PyObject *result;
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00002040
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002041 pname = PyString_FromString(name);
2042 if (pname == NULL)
2043 return NULL;
2044 result = PyImport_Import(pname);
2045 Py_DECREF(pname);
2046 return result;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002047}
2048
Christian Heimes000a0742008-01-03 22:16:32 +00002049/* Import a module without blocking
2050 *
2051 * At first it tries to fetch the module from sys.modules. If the module was
2052 * never loaded before it loads it with PyImport_ImportModule() unless another
2053 * thread holds the import lock. In the latter case the function raises an
2054 * ImportError instead of blocking.
2055 *
2056 * Returns the module object with incremented ref count.
2057 */
2058PyObject *
2059PyImport_ImportModuleNoBlock(const char *name)
2060{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002061 PyObject *result;
2062 PyObject *modules;
2063 long me;
Christian Heimes000a0742008-01-03 22:16:32 +00002064
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002065 /* Try to get the module from sys.modules[name] */
2066 modules = PyImport_GetModuleDict();
2067 if (modules == NULL)
2068 return NULL;
Christian Heimes000a0742008-01-03 22:16:32 +00002069
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002070 result = PyDict_GetItemString(modules, name);
2071 if (result != NULL) {
2072 Py_INCREF(result);
2073 return result;
2074 }
2075 else {
2076 PyErr_Clear();
2077 }
Benjamin Peterson17f03ca2008-09-01 14:18:30 +00002078#ifdef WITH_THREAD
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002079 /* check the import lock
2080 * me might be -1 but I ignore the error here, the lock function
2081 * takes care of the problem */
2082 me = PyThread_get_thread_ident();
2083 if (import_lock_thread == -1 || import_lock_thread == me) {
2084 /* no thread or me is holding the lock */
2085 return PyImport_ImportModule(name);
2086 }
2087 else {
2088 PyErr_Format(PyExc_ImportError,
2089 "Failed to import %.200s because the import lock"
2090 "is held by another thread.",
2091 name);
2092 return NULL;
2093 }
Benjamin Peterson17f03ca2008-09-01 14:18:30 +00002094#else
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002095 return PyImport_ImportModule(name);
Benjamin Peterson17f03ca2008-09-01 14:18:30 +00002096#endif
Christian Heimes000a0742008-01-03 22:16:32 +00002097}
2098
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002099/* Forward declarations for helper routines */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002100static PyObject *get_parent(PyObject *globals, char *buf,
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002101 Py_ssize_t *p_buflen, int level);
Tim Petersdbd9ba62000-07-09 03:09:57 +00002102static PyObject *load_next(PyObject *mod, PyObject *altmod,
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002103 char **p_name, char *buf, Py_ssize_t *p_buflen);
Tim Petersdbd9ba62000-07-09 03:09:57 +00002104static int mark_miss(char *name);
2105static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002106 char *buf, Py_ssize_t buflen, int recursive);
Tim Petersdbd9ba62000-07-09 03:09:57 +00002107static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002108
2109/* The Magnum Opus of dotted-name import :-) */
2110
Guido van Rossum75acc9c1998-03-03 22:26:50 +00002111static PyObject *
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002112import_module_level(char *name, PyObject *globals, PyObject *locals,
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002113 PyObject *fromlist, int level)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002114{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002115 char buf[MAXPATHLEN+1];
2116 Py_ssize_t buflen = 0;
2117 PyObject *parent, *head, *next, *tail;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002118
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002119 if (strchr(name, '/') != NULL
Christian Heimes3403f152008-01-09 19:56:33 +00002120#ifdef MS_WINDOWS
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002121 || strchr(name, '\\') != NULL
Christian Heimes3403f152008-01-09 19:56:33 +00002122#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002123 ) {
2124 PyErr_SetString(PyExc_ImportError,
2125 "Import by filename is not supported.");
2126 return NULL;
2127 }
Christian Heimes3403f152008-01-09 19:56:33 +00002128
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002129 parent = get_parent(globals, buf, &buflen, level);
2130 if (parent == NULL)
2131 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002132
Brett Cannon7d006262010-05-20 18:41:08 +00002133 head = load_next(parent, level < 0 ? Py_None : parent, &name, buf,
2134 &buflen);
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002135 if (head == NULL)
2136 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002137
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002138 tail = head;
2139 Py_INCREF(tail);
2140 while (name) {
2141 next = load_next(tail, tail, &name, buf, &buflen);
2142 Py_DECREF(tail);
2143 if (next == NULL) {
2144 Py_DECREF(head);
2145 return NULL;
2146 }
2147 tail = next;
2148 }
2149 if (tail == Py_None) {
2150 /* If tail is Py_None, both get_parent and load_next found
2151 an empty module name: someone called __import__("") or
2152 doctored faulty bytecode */
2153 Py_DECREF(tail);
2154 Py_DECREF(head);
2155 PyErr_SetString(PyExc_ValueError,
2156 "Empty module name");
2157 return NULL;
2158 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002159
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002160 if (fromlist != NULL) {
2161 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
2162 fromlist = NULL;
2163 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002164
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002165 if (fromlist == NULL) {
2166 Py_DECREF(tail);
2167 return head;
2168 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002169
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002170 Py_DECREF(head);
2171 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
2172 Py_DECREF(tail);
2173 return NULL;
2174 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002175
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002176 return tail;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002177}
2178
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002179PyObject *
2180PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals,
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002181 PyObject *fromlist, int level)
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002182{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002183 PyObject *result;
2184 _PyImport_AcquireLock();
2185 result = import_module_level(name, globals, locals, fromlist, level);
2186 if (_PyImport_ReleaseLock() < 0) {
2187 Py_XDECREF(result);
2188 PyErr_SetString(PyExc_RuntimeError,
2189 "not holding the import lock");
2190 return NULL;
2191 }
2192 return result;
Guido van Rossum75acc9c1998-03-03 22:26:50 +00002193}
2194
Fred Drake87590902004-05-28 20:21:36 +00002195/* Return the package that an import is being performed in. If globals comes
2196 from the module foo.bar.bat (not itself a package), this returns the
2197 sys.modules entry for foo.bar. If globals is from a package's __init__.py,
Georg Brandl5f6861d2006-05-28 21:57:35 +00002198 the package's entry in sys.modules is returned, as a borrowed reference.
Fred Drake87590902004-05-28 20:21:36 +00002199
2200 The *name* of the returned package is returned in buf, with the length of
2201 the name in *p_buflen.
2202
2203 If globals doesn't come from a package or a module in a package, or a
2204 corresponding entry is not found in sys.modules, Py_None is returned.
2205*/
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002206static PyObject *
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002207get_parent(PyObject *globals, char *buf, Py_ssize_t *p_buflen, int level)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002208{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002209 static PyObject *namestr = NULL;
2210 static PyObject *pathstr = NULL;
2211 static PyObject *pkgstr = NULL;
2212 PyObject *pkgname, *modname, *modpath, *modules, *parent;
2213 int orig_level = level;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002214
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002215 if (globals == NULL || !PyDict_Check(globals) || !level)
2216 return Py_None;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002217
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002218 if (namestr == NULL) {
2219 namestr = PyString_InternFromString("__name__");
2220 if (namestr == NULL)
2221 return NULL;
2222 }
2223 if (pathstr == NULL) {
2224 pathstr = PyString_InternFromString("__path__");
2225 if (pathstr == NULL)
2226 return NULL;
2227 }
2228 if (pkgstr == NULL) {
2229 pkgstr = PyString_InternFromString("__package__");
2230 if (pkgstr == NULL)
2231 return NULL;
2232 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002233
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002234 *buf = '\0';
2235 *p_buflen = 0;
2236 pkgname = PyDict_GetItem(globals, pkgstr);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002237
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002238 if ((pkgname != NULL) && (pkgname != Py_None)) {
2239 /* __package__ is set, so use it */
2240 Py_ssize_t len;
2241 if (!PyString_Check(pkgname)) {
2242 PyErr_SetString(PyExc_ValueError,
2243 "__package__ set to non-string");
2244 return NULL;
2245 }
2246 len = PyString_GET_SIZE(pkgname);
2247 if (len == 0) {
2248 if (level > 0) {
2249 PyErr_SetString(PyExc_ValueError,
2250 "Attempted relative import in non-package");
2251 return NULL;
2252 }
2253 return Py_None;
2254 }
2255 if (len > MAXPATHLEN) {
2256 PyErr_SetString(PyExc_ValueError,
2257 "Package name too long");
2258 return NULL;
2259 }
2260 strcpy(buf, PyString_AS_STRING(pkgname));
2261 } else {
2262 /* __package__ not set, so figure it out and set it */
2263 modname = PyDict_GetItem(globals, namestr);
2264 if (modname == NULL || !PyString_Check(modname))
2265 return Py_None;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002266
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002267 modpath = PyDict_GetItem(globals, pathstr);
2268 if (modpath != NULL) {
2269 /* __path__ is set, so modname is already the package name */
2270 Py_ssize_t len = PyString_GET_SIZE(modname);
2271 int error;
2272 if (len > MAXPATHLEN) {
2273 PyErr_SetString(PyExc_ValueError,
2274 "Module name too long");
2275 return NULL;
2276 }
2277 strcpy(buf, PyString_AS_STRING(modname));
2278 error = PyDict_SetItem(globals, pkgstr, modname);
2279 if (error) {
2280 PyErr_SetString(PyExc_ValueError,
2281 "Could not set __package__");
2282 return NULL;
2283 }
2284 } else {
2285 /* Normal module, so work out the package name if any */
2286 char *start = PyString_AS_STRING(modname);
2287 char *lastdot = strrchr(start, '.');
2288 size_t len;
2289 int error;
2290 if (lastdot == NULL && level > 0) {
2291 PyErr_SetString(PyExc_ValueError,
2292 "Attempted relative import in non-package");
2293 return NULL;
2294 }
2295 if (lastdot == NULL) {
2296 error = PyDict_SetItem(globals, pkgstr, Py_None);
2297 if (error) {
2298 PyErr_SetString(PyExc_ValueError,
2299 "Could not set __package__");
2300 return NULL;
2301 }
2302 return Py_None;
2303 }
2304 len = lastdot - start;
2305 if (len >= MAXPATHLEN) {
2306 PyErr_SetString(PyExc_ValueError,
2307 "Module name too long");
2308 return NULL;
2309 }
2310 strncpy(buf, start, len);
2311 buf[len] = '\0';
2312 pkgname = PyString_FromString(buf);
2313 if (pkgname == NULL) {
2314 return NULL;
2315 }
2316 error = PyDict_SetItem(globals, pkgstr, pkgname);
2317 Py_DECREF(pkgname);
2318 if (error) {
2319 PyErr_SetString(PyExc_ValueError,
2320 "Could not set __package__");
2321 return NULL;
2322 }
2323 }
2324 }
2325 while (--level > 0) {
2326 char *dot = strrchr(buf, '.');
2327 if (dot == NULL) {
2328 PyErr_SetString(PyExc_ValueError,
2329 "Attempted relative import beyond "
2330 "toplevel package");
2331 return NULL;
2332 }
2333 *dot = '\0';
2334 }
2335 *p_buflen = strlen(buf);
2336
2337 modules = PyImport_GetModuleDict();
2338 parent = PyDict_GetItemString(modules, buf);
2339 if (parent == NULL) {
2340 if (orig_level < 1) {
2341 PyObject *err_msg = PyString_FromFormat(
2342 "Parent module '%.200s' not found "
2343 "while handling absolute import", buf);
2344 if (err_msg == NULL) {
2345 return NULL;
2346 }
2347 if (!PyErr_WarnEx(PyExc_RuntimeWarning,
2348 PyString_AsString(err_msg), 1)) {
2349 *buf = '\0';
2350 *p_buflen = 0;
2351 parent = Py_None;
2352 }
2353 Py_DECREF(err_msg);
2354 } else {
2355 PyErr_Format(PyExc_SystemError,
2356 "Parent module '%.200s' not loaded, "
2357 "cannot perform relative import", buf);
2358 }
2359 }
2360 return parent;
2361 /* We expect, but can't guarantee, if parent != None, that:
2362 - parent.__name__ == buf
2363 - parent.__dict__ is globals
2364 If this is violated... Who cares? */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002365}
2366
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002367/* altmod is either None or same as mod */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002368static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002369load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002370 Py_ssize_t *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002371{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002372 char *name = *p_name;
2373 char *dot = strchr(name, '.');
2374 size_t len;
2375 char *p;
2376 PyObject *result;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002377
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002378 if (strlen(name) == 0) {
2379 /* completely empty module name should only happen in
2380 'from . import' (or '__import__("")')*/
2381 Py_INCREF(mod);
2382 *p_name = NULL;
2383 return mod;
2384 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002385
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002386 if (dot == NULL) {
2387 *p_name = NULL;
2388 len = strlen(name);
2389 }
2390 else {
2391 *p_name = dot+1;
2392 len = dot-name;
2393 }
2394 if (len == 0) {
2395 PyErr_SetString(PyExc_ValueError,
2396 "Empty module name");
2397 return NULL;
2398 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002399
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002400 p = buf + *p_buflen;
2401 if (p != buf)
2402 *p++ = '.';
2403 if (p+len-buf >= MAXPATHLEN) {
2404 PyErr_SetString(PyExc_ValueError,
2405 "Module name too long");
2406 return NULL;
2407 }
2408 strncpy(p, name, len);
2409 p[len] = '\0';
2410 *p_buflen = p+len-buf;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002411
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002412 result = import_submodule(mod, p, buf);
2413 if (result == Py_None && altmod != mod) {
2414 Py_DECREF(result);
2415 /* Here, altmod must be None and mod must not be None */
2416 result = import_submodule(altmod, p, p);
2417 if (result != NULL && result != Py_None) {
2418 if (mark_miss(buf) != 0) {
2419 Py_DECREF(result);
2420 return NULL;
2421 }
2422 strncpy(buf, name, len);
2423 buf[len] = '\0';
2424 *p_buflen = len;
2425 }
2426 }
2427 if (result == NULL)
2428 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002429
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002430 if (result == Py_None) {
2431 Py_DECREF(result);
2432 PyErr_Format(PyExc_ImportError,
2433 "No module named %.200s", name);
2434 return NULL;
2435 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002436
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002437 return result;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002438}
2439
2440static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002441mark_miss(char *name)
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00002442{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002443 PyObject *modules = PyImport_GetModuleDict();
2444 return PyDict_SetItemString(modules, name, Py_None);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00002445}
2446
2447static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002448ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, Py_ssize_t buflen,
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002449 int recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002450{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002451 int i;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002452
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002453 if (!PyObject_HasAttrString(mod, "__path__"))
2454 return 1;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002455
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002456 for (i = 0; ; i++) {
2457 PyObject *item = PySequence_GetItem(fromlist, i);
2458 int hasit;
2459 if (item == NULL) {
2460 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2461 PyErr_Clear();
2462 return 1;
2463 }
2464 return 0;
2465 }
2466 if (!PyString_Check(item)) {
2467 PyErr_SetString(PyExc_TypeError,
2468 "Item in ``from list'' not a string");
2469 Py_DECREF(item);
2470 return 0;
2471 }
2472 if (PyString_AS_STRING(item)[0] == '*') {
2473 PyObject *all;
2474 Py_DECREF(item);
2475 /* See if the package defines __all__ */
2476 if (recursive)
2477 continue; /* Avoid endless recursion */
2478 all = PyObject_GetAttrString(mod, "__all__");
2479 if (all == NULL)
2480 PyErr_Clear();
2481 else {
2482 int ret = ensure_fromlist(mod, all, buf, buflen, 1);
2483 Py_DECREF(all);
2484 if (!ret)
2485 return 0;
2486 }
2487 continue;
2488 }
2489 hasit = PyObject_HasAttr(mod, item);
2490 if (!hasit) {
2491 char *subname = PyString_AS_STRING(item);
2492 PyObject *submod;
2493 char *p;
2494 if (buflen + strlen(subname) >= MAXPATHLEN) {
2495 PyErr_SetString(PyExc_ValueError,
2496 "Module name too long");
2497 Py_DECREF(item);
2498 return 0;
2499 }
2500 p = buf + buflen;
2501 *p++ = '.';
2502 strcpy(p, subname);
2503 submod = import_submodule(mod, subname, buf);
2504 Py_XDECREF(submod);
2505 if (submod == NULL) {
2506 Py_DECREF(item);
2507 return 0;
2508 }
2509 }
2510 Py_DECREF(item);
2511 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002512
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002513 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002514}
2515
Neil Schemenauer00b09662003-06-16 21:03:07 +00002516static int
2517add_submodule(PyObject *mod, PyObject *submod, char *fullname, char *subname,
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002518 PyObject *modules)
Neil Schemenauer00b09662003-06-16 21:03:07 +00002519{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002520 if (mod == Py_None)
2521 return 1;
2522 /* Irrespective of the success of this load, make a
2523 reference to it in the parent package module. A copy gets
2524 saved in the modules dictionary under the full name, so get a
2525 reference from there, if need be. (The exception is when the
2526 load failed with a SyntaxError -- then there's no trace in
2527 sys.modules. In that case, of course, do nothing extra.) */
2528 if (submod == NULL) {
2529 submod = PyDict_GetItemString(modules, fullname);
2530 if (submod == NULL)
2531 return 1;
2532 }
2533 if (PyModule_Check(mod)) {
2534 /* We can't use setattr here since it can give a
2535 * spurious warning if the submodule name shadows a
2536 * builtin name */
2537 PyObject *dict = PyModule_GetDict(mod);
2538 if (!dict)
2539 return 0;
2540 if (PyDict_SetItemString(dict, subname, submod) < 0)
2541 return 0;
2542 }
2543 else {
2544 if (PyObject_SetAttrString(mod, subname, submod) < 0)
2545 return 0;
2546 }
2547 return 1;
Neil Schemenauer00b09662003-06-16 21:03:07 +00002548}
2549
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002550static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002551import_submodule(PyObject *mod, char *subname, char *fullname)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002552{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002553 PyObject *modules = PyImport_GetModuleDict();
2554 PyObject *m = NULL;
Guido van Rossum74e6a111994-08-29 12:54:38 +00002555
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002556 /* Require:
2557 if mod == None: subname == fullname
2558 else: mod.__name__ + "." + subname == fullname
2559 */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002560
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002561 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
2562 Py_INCREF(m);
2563 }
2564 else {
2565 PyObject *path, *loader = NULL;
2566 char buf[MAXPATHLEN+1];
2567 struct filedescr *fdp;
2568 FILE *fp = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002569
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002570 if (mod == Py_None)
2571 path = NULL;
2572 else {
2573 path = PyObject_GetAttrString(mod, "__path__");
2574 if (path == NULL) {
2575 PyErr_Clear();
2576 Py_INCREF(Py_None);
2577 return Py_None;
2578 }
2579 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002580
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002581 buf[0] = '\0';
2582 fdp = find_module(fullname, subname, path, buf, MAXPATHLEN+1,
2583 &fp, &loader);
2584 Py_XDECREF(path);
2585 if (fdp == NULL) {
2586 if (!PyErr_ExceptionMatches(PyExc_ImportError))
2587 return NULL;
2588 PyErr_Clear();
2589 Py_INCREF(Py_None);
2590 return Py_None;
2591 }
2592 m = load_module(fullname, fp, buf, fdp->type, loader);
2593 Py_XDECREF(loader);
2594 if (fp)
2595 fclose(fp);
2596 if (!add_submodule(mod, m, fullname, subname, modules)) {
2597 Py_XDECREF(m);
2598 m = NULL;
2599 }
2600 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002601
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002602 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00002603}
2604
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002605
2606/* Re-import a module of any kind and return its module object, WITH
2607 INCREMENTED REFERENCE COUNT */
2608
Guido van Rossum79f25d91997-04-29 20:08:16 +00002609PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002610PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002611{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002612 PyInterpreterState *interp = PyThreadState_Get()->interp;
2613 PyObject *modules_reloading = interp->modules_reloading;
2614 PyObject *modules = PyImport_GetModuleDict();
2615 PyObject *path = NULL, *loader = NULL, *existing_m = NULL;
2616 char *name, *subname;
2617 char buf[MAXPATHLEN+1];
2618 struct filedescr *fdp;
2619 FILE *fp = NULL;
2620 PyObject *newm;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002621
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002622 if (modules_reloading == NULL) {
2623 Py_FatalError("PyImport_ReloadModule: "
2624 "no modules_reloading dictionary!");
2625 return NULL;
2626 }
Collin Winter276887b2007-03-12 16:11:39 +00002627
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002628 if (m == NULL || !PyModule_Check(m)) {
2629 PyErr_SetString(PyExc_TypeError,
2630 "reload() argument must be module");
2631 return NULL;
2632 }
2633 name = PyModule_GetName(m);
2634 if (name == NULL)
2635 return NULL;
2636 if (m != PyDict_GetItemString(modules, name)) {
2637 PyErr_Format(PyExc_ImportError,
2638 "reload(): module %.200s not in sys.modules",
2639 name);
2640 return NULL;
2641 }
2642 existing_m = PyDict_GetItemString(modules_reloading, name);
2643 if (existing_m != NULL) {
2644 /* Due to a recursive reload, this module is already
2645 being reloaded. */
2646 Py_INCREF(existing_m);
2647 return existing_m;
2648 }
2649 if (PyDict_SetItemString(modules_reloading, name, m) < 0)
2650 return NULL;
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002651
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002652 subname = strrchr(name, '.');
2653 if (subname == NULL)
2654 subname = name;
2655 else {
2656 PyObject *parentname, *parent;
2657 parentname = PyString_FromStringAndSize(name, (subname-name));
2658 if (parentname == NULL) {
2659 imp_modules_reloading_clear();
2660 return NULL;
2661 }
2662 parent = PyDict_GetItem(modules, parentname);
2663 if (parent == NULL) {
2664 PyErr_Format(PyExc_ImportError,
2665 "reload(): parent %.200s not in sys.modules",
2666 PyString_AS_STRING(parentname));
2667 Py_DECREF(parentname);
2668 imp_modules_reloading_clear();
2669 return NULL;
2670 }
2671 Py_DECREF(parentname);
2672 subname++;
2673 path = PyObject_GetAttrString(parent, "__path__");
2674 if (path == NULL)
2675 PyErr_Clear();
2676 }
2677 buf[0] = '\0';
2678 fdp = find_module(name, subname, path, buf, MAXPATHLEN+1, &fp, &loader);
2679 Py_XDECREF(path);
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002680
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002681 if (fdp == NULL) {
2682 Py_XDECREF(loader);
2683 imp_modules_reloading_clear();
2684 return NULL;
2685 }
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002686
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002687 newm = load_module(name, fp, buf, fdp->type, loader);
2688 Py_XDECREF(loader);
2689
2690 if (fp)
2691 fclose(fp);
2692 if (newm == NULL) {
2693 /* load_module probably removed name from modules because of
2694 * the error. Put back the original module object. We're
2695 * going to return NULL in this case regardless of whether
2696 * replacing name succeeds, so the return value is ignored.
2697 */
2698 PyDict_SetItemString(modules, name, m);
2699 }
2700 imp_modules_reloading_clear();
2701 return newm;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002702}
2703
2704
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002705/* Higher-level import emulator which emulates the "import" statement
2706 more accurately -- it invokes the __import__() function from the
2707 builtins of the current globals. This means that the import is
2708 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00002709 environment, e.g. by "rexec".
2710 A dummy list ["__doc__"] is passed as the 4th argument so that
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002711 e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
Guido van Rossum6058eb41998-12-21 19:51:00 +00002712 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002713
2714PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002715PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002716{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002717 static PyObject *silly_list = NULL;
2718 static PyObject *builtins_str = NULL;
2719 static PyObject *import_str = NULL;
2720 PyObject *globals = NULL;
2721 PyObject *import = NULL;
2722 PyObject *builtins = NULL;
2723 PyObject *r = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002724
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002725 /* Initialize constant string objects */
2726 if (silly_list == NULL) {
2727 import_str = PyString_InternFromString("__import__");
2728 if (import_str == NULL)
2729 return NULL;
2730 builtins_str = PyString_InternFromString("__builtins__");
2731 if (builtins_str == NULL)
2732 return NULL;
2733 silly_list = Py_BuildValue("[s]", "__doc__");
2734 if (silly_list == NULL)
2735 return NULL;
2736 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002737
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002738 /* Get the builtins from current globals */
2739 globals = PyEval_GetGlobals();
2740 if (globals != NULL) {
2741 Py_INCREF(globals);
2742 builtins = PyObject_GetItem(globals, builtins_str);
2743 if (builtins == NULL)
2744 goto err;
2745 }
2746 else {
2747 /* No globals -- use standard builtins, and fake globals */
2748 builtins = PyImport_ImportModuleLevel("__builtin__",
2749 NULL, NULL, NULL, 0);
2750 if (builtins == NULL)
2751 return NULL;
2752 globals = Py_BuildValue("{OO}", builtins_str, builtins);
2753 if (globals == NULL)
2754 goto err;
2755 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002756
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002757 /* Get the __import__ function from the builtins */
2758 if (PyDict_Check(builtins)) {
2759 import = PyObject_GetItem(builtins, import_str);
2760 if (import == NULL)
2761 PyErr_SetObject(PyExc_KeyError, import_str);
2762 }
2763 else
2764 import = PyObject_GetAttr(builtins, import_str);
2765 if (import == NULL)
2766 goto err;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002767
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002768 /* Call the __import__ function with the proper argument list
2769 * Always use absolute import here. */
2770 r = PyObject_CallFunction(import, "OOOOi", module_name, globals,
2771 globals, silly_list, 0, NULL);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002772
2773 err:
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002774 Py_XDECREF(globals);
2775 Py_XDECREF(builtins);
2776 Py_XDECREF(import);
Tim Peters50d8d372001-02-28 05:34:27 +00002777
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002778 return r;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002779}
2780
2781
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002782/* Module 'imp' provides Python access to the primitives used for
2783 importing modules.
2784*/
2785
Guido van Rossum79f25d91997-04-29 20:08:16 +00002786static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +00002787imp_get_magic(PyObject *self, PyObject *noargs)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002788{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002789 char buf[4];
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002790
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002791 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
2792 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
2793 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
2794 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002795
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002796 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002797}
2798
Guido van Rossum79f25d91997-04-29 20:08:16 +00002799static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +00002800imp_get_suffixes(PyObject *self, PyObject *noargs)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002801{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002802 PyObject *list;
2803 struct filedescr *fdp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002804
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002805 list = PyList_New(0);
2806 if (list == NULL)
2807 return NULL;
2808 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
2809 PyObject *item = Py_BuildValue("ssi",
2810 fdp->suffix, fdp->mode, fdp->type);
2811 if (item == NULL) {
2812 Py_DECREF(list);
2813 return NULL;
2814 }
2815 if (PyList_Append(list, item) < 0) {
2816 Py_DECREF(list);
2817 Py_DECREF(item);
2818 return NULL;
2819 }
2820 Py_DECREF(item);
2821 }
2822 return list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002823}
2824
Guido van Rossum79f25d91997-04-29 20:08:16 +00002825static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002826call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002827{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002828 extern int fclose(FILE *);
2829 PyObject *fob, *ret;
2830 struct filedescr *fdp;
2831 char pathname[MAXPATHLEN+1];
2832 FILE *fp = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002833
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002834 pathname[0] = '\0';
2835 if (path == Py_None)
2836 path = NULL;
2837 fdp = find_module(NULL, name, path, pathname, MAXPATHLEN+1, &fp, NULL);
2838 if (fdp == NULL)
2839 return NULL;
2840 if (fp != NULL) {
2841 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
2842 if (fob == NULL) {
2843 fclose(fp);
2844 return NULL;
2845 }
2846 }
2847 else {
2848 fob = Py_None;
2849 Py_INCREF(fob);
2850 }
2851 ret = Py_BuildValue("Os(ssi)",
2852 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
2853 Py_DECREF(fob);
2854 return ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002855}
2856
Guido van Rossum79f25d91997-04-29 20:08:16 +00002857static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002858imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002859{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002860 char *name;
2861 PyObject *path = NULL;
2862 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
2863 return NULL;
2864 return call_find_module(name, path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002865}
2866
2867static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002868imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002869{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002870 char *name;
2871 int ret;
2872 PyObject *m;
2873 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
2874 return NULL;
2875 ret = init_builtin(name);
2876 if (ret < 0)
2877 return NULL;
2878 if (ret == 0) {
2879 Py_INCREF(Py_None);
2880 return Py_None;
2881 }
2882 m = PyImport_AddModule(name);
2883 Py_XINCREF(m);
2884 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002885}
2886
Guido van Rossum79f25d91997-04-29 20:08:16 +00002887static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002888imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002889{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002890 char *name;
2891 int ret;
2892 PyObject *m;
2893 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
2894 return NULL;
2895 ret = PyImport_ImportFrozenModule(name);
2896 if (ret < 0)
2897 return NULL;
2898 if (ret == 0) {
2899 Py_INCREF(Py_None);
2900 return Py_None;
2901 }
2902 m = PyImport_AddModule(name);
2903 Py_XINCREF(m);
2904 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002905}
2906
Guido van Rossum79f25d91997-04-29 20:08:16 +00002907static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002908imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002909{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002910 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002911
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002912 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
2913 return NULL;
2914 return get_frozen_object(name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002915}
2916
Guido van Rossum79f25d91997-04-29 20:08:16 +00002917static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002918imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002919{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002920 char *name;
2921 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
2922 return NULL;
2923 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002924}
2925
Guido van Rossum79f25d91997-04-29 20:08:16 +00002926static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002927imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002928{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002929 char *name;
2930 struct _frozen *p;
2931 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
2932 return NULL;
2933 p = find_frozen(name);
2934 return PyBool_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002935}
2936
2937static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002938get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002939{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002940 FILE *fp;
2941 if (fob == NULL) {
2942 if (mode[0] == 'U')
2943 mode = "r" PY_STDIOTEXTMODE;
2944 fp = fopen(pathname, mode);
2945 if (fp == NULL)
2946 PyErr_SetFromErrno(PyExc_IOError);
2947 }
2948 else {
2949 fp = PyFile_AsFile(fob);
2950 if (fp == NULL)
2951 PyErr_SetString(PyExc_ValueError,
2952 "bad/closed file object");
2953 }
2954 return fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002955}
2956
Guido van Rossum79f25d91997-04-29 20:08:16 +00002957static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002958imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002959{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002960 char *name;
2961 char *pathname;
2962 PyObject *fob = NULL;
2963 PyObject *m;
2964 FILE *fp;
2965 if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
2966 &PyFile_Type, &fob))
2967 return NULL;
2968 fp = get_file(pathname, fob, "rb");
2969 if (fp == NULL)
2970 return NULL;
2971 m = load_compiled_module(name, pathname, fp);
2972 if (fob == NULL)
2973 fclose(fp);
2974 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002975}
2976
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002977#ifdef HAVE_DYNAMIC_LOADING
2978
Guido van Rossum79f25d91997-04-29 20:08:16 +00002979static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002980imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002981{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002982 char *name;
2983 char *pathname;
2984 PyObject *fob = NULL;
2985 PyObject *m;
2986 FILE *fp = NULL;
2987 if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
2988 &PyFile_Type, &fob))
2989 return NULL;
2990 if (fob) {
2991 fp = get_file(pathname, fob, "r");
2992 if (fp == NULL)
2993 return NULL;
2994 }
2995 m = _PyImport_LoadDynamicModule(name, pathname, fp);
2996 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002997}
2998
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002999#endif /* HAVE_DYNAMIC_LOADING */
3000
Guido van Rossum79f25d91997-04-29 20:08:16 +00003001static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003002imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003003{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003004 char *name;
3005 char *pathname;
3006 PyObject *fob = NULL;
3007 PyObject *m;
3008 FILE *fp;
3009 if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
3010 &PyFile_Type, &fob))
3011 return NULL;
3012 fp = get_file(pathname, fob, "r");
3013 if (fp == NULL)
3014 return NULL;
3015 m = load_source_module(name, pathname, fp);
3016 if (fob == NULL)
3017 fclose(fp);
3018 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003019}
3020
Guido van Rossum79f25d91997-04-29 20:08:16 +00003021static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003022imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003023{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003024 char *name;
3025 PyObject *fob;
3026 char *pathname;
3027 char *suffix; /* Unused */
3028 char *mode;
3029 int type;
3030 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003031
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003032 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
3033 &name, &fob, &pathname,
3034 &suffix, &mode, &type))
3035 return NULL;
3036 if (*mode) {
3037 /* Mode must start with 'r' or 'U' and must not contain '+'.
3038 Implicit in this test is the assumption that the mode
3039 may contain other modifiers like 'b' or 't'. */
Guido van Rossum5e2c5fa2002-05-30 17:33:07 +00003040
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003041 if (!(*mode == 'r' || *mode == 'U') || strchr(mode, '+')) {
3042 PyErr_Format(PyExc_ValueError,
3043 "invalid file open mode %.200s", mode);
3044 return NULL;
3045 }
3046 }
3047 if (fob == Py_None)
3048 fp = NULL;
3049 else {
3050 if (!PyFile_Check(fob)) {
3051 PyErr_SetString(PyExc_ValueError,
3052 "load_module arg#2 should be a file or None");
3053 return NULL;
3054 }
3055 fp = get_file(pathname, fob, mode);
3056 if (fp == NULL)
3057 return NULL;
3058 }
3059 return load_module(name, fp, pathname, type, NULL);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003060}
3061
3062static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003063imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003064{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003065 char *name;
3066 char *pathname;
3067 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
3068 return NULL;
3069 return load_package(name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003070}
3071
3072static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003073imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003074{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003075 char *name;
3076 if (!PyArg_ParseTuple(args, "s:new_module", &name))
3077 return NULL;
3078 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003079}
3080
Brett Cannon3aa2a492008-08-06 22:28:09 +00003081static PyObject *
3082imp_reload(PyObject *self, PyObject *v)
3083{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003084 return PyImport_ReloadModule(v);
Brett Cannon3aa2a492008-08-06 22:28:09 +00003085}
3086
3087
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003088/* Doc strings */
3089
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003090PyDoc_STRVAR(doc_imp,
3091"This module provides the components needed to build your own\n\
3092__import__ function. Undocumented functions are obsolete.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003093
Brett Cannon3aa2a492008-08-06 22:28:09 +00003094PyDoc_STRVAR(doc_reload,
3095"reload(module) -> module\n\
3096\n\
3097Reload the module. The module must have been successfully imported before.");
3098
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003099PyDoc_STRVAR(doc_find_module,
3100"find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003101Search for a module. If path is omitted or None, search for a\n\
3102built-in, frozen or special module and continue search in sys.path.\n\
3103The module name cannot contain '.'; to search for a submodule of a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003104package, pass the submodule name and the package's __path__.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003105
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003106PyDoc_STRVAR(doc_load_module,
3107"load_module(name, file, filename, (suffix, mode, type)) -> module\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003108Load a module, given information returned by find_module().\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003109The module name must include the full package name, if any.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003110
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003111PyDoc_STRVAR(doc_get_magic,
3112"get_magic() -> string\n\
3113Return the magic number for .pyc or .pyo files.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003114
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003115PyDoc_STRVAR(doc_get_suffixes,
3116"get_suffixes() -> [(suffix, mode, type), ...]\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003117Return a list of (suffix, mode, type) tuples describing the files\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003118that find_module() looks for.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003119
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003120PyDoc_STRVAR(doc_new_module,
3121"new_module(name) -> module\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003122Create a new module. Do not enter it in sys.modules.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003123The module name must include the full package name, if any.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003124
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003125PyDoc_STRVAR(doc_lock_held,
Tim Petersa7c65092004-08-01 23:26:05 +00003126"lock_held() -> boolean\n\
3127Return True if the import lock is currently held, else False.\n\
3128On platforms without threads, return False.");
Tim Peters69232342001-08-30 05:16:13 +00003129
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00003130PyDoc_STRVAR(doc_acquire_lock,
3131"acquire_lock() -> None\n\
Neal Norwitz2294c0d2003-02-12 23:02:21 +00003132Acquires the interpreter's import lock for the current thread.\n\
3133This lock should be used by import hooks to ensure thread-safety\n\
3134when importing modules.\n\
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00003135On platforms without threads, this function does nothing.");
3136
3137PyDoc_STRVAR(doc_release_lock,
3138"release_lock() -> None\n\
3139Release the interpreter's import lock.\n\
3140On platforms without threads, this function does nothing.");
3141
Guido van Rossum79f25d91997-04-29 20:08:16 +00003142static PyMethodDef imp_methods[] = {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003143 {"reload", imp_reload, METH_O, doc_reload},
3144 {"find_module", imp_find_module, METH_VARARGS, doc_find_module},
3145 {"get_magic", imp_get_magic, METH_NOARGS, doc_get_magic},
3146 {"get_suffixes", imp_get_suffixes, METH_NOARGS, doc_get_suffixes},
3147 {"load_module", imp_load_module, METH_VARARGS, doc_load_module},
3148 {"new_module", imp_new_module, METH_VARARGS, doc_new_module},
3149 {"lock_held", imp_lock_held, METH_NOARGS, doc_lock_held},
3150 {"acquire_lock", imp_acquire_lock, METH_NOARGS, doc_acquire_lock},
3151 {"release_lock", imp_release_lock, METH_NOARGS, doc_release_lock},
3152 /* The rest are obsolete */
3153 {"get_frozen_object", imp_get_frozen_object, METH_VARARGS},
3154 {"init_builtin", imp_init_builtin, METH_VARARGS},
3155 {"init_frozen", imp_init_frozen, METH_VARARGS},
3156 {"is_builtin", imp_is_builtin, METH_VARARGS},
3157 {"is_frozen", imp_is_frozen, METH_VARARGS},
3158 {"load_compiled", imp_load_compiled, METH_VARARGS},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00003159#ifdef HAVE_DYNAMIC_LOADING
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003160 {"load_dynamic", imp_load_dynamic, METH_VARARGS},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00003161#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003162 {"load_package", imp_load_package, METH_VARARGS},
3163 {"load_source", imp_load_source, METH_VARARGS},
3164 {NULL, NULL} /* sentinel */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003165};
3166
Guido van Rossum1a8791e1998-08-04 22:46:29 +00003167static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003168setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003169{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003170 PyObject *v;
3171 int err;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003172
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003173 v = PyInt_FromLong((long)value);
3174 err = PyDict_SetItemString(d, name, v);
3175 Py_XDECREF(v);
3176 return err;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003177}
3178
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003179typedef struct {
3180 PyObject_HEAD
3181} NullImporter;
3182
3183static int
3184NullImporter_init(NullImporter *self, PyObject *args, PyObject *kwds)
3185{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003186 char *path;
3187 Py_ssize_t pathlen;
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003188
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003189 if (!_PyArg_NoKeywords("NullImporter()", kwds))
3190 return -1;
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003191
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003192 if (!PyArg_ParseTuple(args, "s:NullImporter",
3193 &path))
3194 return -1;
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003195
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003196 pathlen = strlen(path);
3197 if (pathlen == 0) {
3198 PyErr_SetString(PyExc_ImportError, "empty pathname");
3199 return -1;
3200 } else {
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003201#ifndef RISCOS
Georg Brandlc04c2892009-01-14 00:00:17 +00003202#ifndef MS_WINDOWS
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003203 struct stat statbuf;
3204 int rv;
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003205
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003206 rv = stat(path, &statbuf);
3207 if (rv == 0) {
3208 /* it exists */
3209 if (S_ISDIR(statbuf.st_mode)) {
3210 /* it's a directory */
3211 PyErr_SetString(PyExc_ImportError,
3212 "existing directory");
3213 return -1;
3214 }
3215 }
Georg Brandlc04c2892009-01-14 00:00:17 +00003216#else /* MS_WINDOWS */
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003217 DWORD rv;
3218 /* see issue1293 and issue3677:
3219 * stat() on Windows doesn't recognise paths like
3220 * "e:\\shared\\" and "\\\\whiterab-c2znlh\\shared" as dirs.
3221 */
3222 rv = GetFileAttributesA(path);
3223 if (rv != INVALID_FILE_ATTRIBUTES) {
3224 /* it exists */
3225 if (rv & FILE_ATTRIBUTE_DIRECTORY) {
3226 /* it's a directory */
3227 PyErr_SetString(PyExc_ImportError,
3228 "existing directory");
3229 return -1;
3230 }
3231 }
Georg Brandlc04c2892009-01-14 00:00:17 +00003232#endif
3233#else /* RISCOS */
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003234 if (object_exists(path)) {
3235 /* it exists */
3236 if (isdir(path)) {
3237 /* it's a directory */
3238 PyErr_SetString(PyExc_ImportError,
3239 "existing directory");
3240 return -1;
3241 }
3242 }
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003243#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003244 }
3245 return 0;
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003246}
3247
3248static PyObject *
3249NullImporter_find_module(NullImporter *self, PyObject *args)
3250{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003251 Py_RETURN_NONE;
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003252}
3253
3254static PyMethodDef NullImporter_methods[] = {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003255 {"find_module", (PyCFunction)NullImporter_find_module, METH_VARARGS,
3256 "Always return None"
3257 },
3258 {NULL} /* Sentinel */
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003259};
3260
3261
Nick Coghlan327a39b2007-11-18 11:56:28 +00003262PyTypeObject PyNullImporter_Type = {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003263 PyVarObject_HEAD_INIT(NULL, 0)
3264 "imp.NullImporter", /*tp_name*/
3265 sizeof(NullImporter), /*tp_basicsize*/
3266 0, /*tp_itemsize*/
3267 0, /*tp_dealloc*/
3268 0, /*tp_print*/
3269 0, /*tp_getattr*/
3270 0, /*tp_setattr*/
3271 0, /*tp_compare*/
3272 0, /*tp_repr*/
3273 0, /*tp_as_number*/
3274 0, /*tp_as_sequence*/
3275 0, /*tp_as_mapping*/
3276 0, /*tp_hash */
3277 0, /*tp_call*/
3278 0, /*tp_str*/
3279 0, /*tp_getattro*/
3280 0, /*tp_setattro*/
3281 0, /*tp_as_buffer*/
3282 Py_TPFLAGS_DEFAULT, /*tp_flags*/
3283 "Null importer object", /* tp_doc */
3284 0, /* tp_traverse */
3285 0, /* tp_clear */
3286 0, /* tp_richcompare */
3287 0, /* tp_weaklistoffset */
3288 0, /* tp_iter */
3289 0, /* tp_iternext */
3290 NullImporter_methods, /* tp_methods */
3291 0, /* tp_members */
3292 0, /* tp_getset */
3293 0, /* tp_base */
3294 0, /* tp_dict */
3295 0, /* tp_descr_get */
3296 0, /* tp_descr_set */
3297 0, /* tp_dictoffset */
3298 (initproc)NullImporter_init, /* tp_init */
3299 0, /* tp_alloc */
3300 PyType_GenericNew /* tp_new */
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003301};
3302
3303
Jason Tishler6bc06ec2003-09-04 11:59:50 +00003304PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003305initimp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003306{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003307 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003308
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003309 if (PyType_Ready(&PyNullImporter_Type) < 0)
3310 goto failure;
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003311
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003312 m = Py_InitModule4("imp", imp_methods, doc_imp,
3313 NULL, PYTHON_API_VERSION);
3314 if (m == NULL)
3315 goto failure;
3316 d = PyModule_GetDict(m);
3317 if (d == NULL)
3318 goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003319
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003320 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
3321 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
3322 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
3323 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
3324 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
3325 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
3326 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
3327 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
3328 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
3329 if (setint(d, "IMP_HOOK", IMP_HOOK) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003330
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003331 Py_INCREF(&PyNullImporter_Type);
3332 PyModule_AddObject(m, "NullImporter", (PyObject *)&PyNullImporter_Type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003333 failure:
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003334 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003335}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003336
3337
Guido van Rossumb18618d2000-05-03 23:44:39 +00003338/* API for embedding applications that want to add their own entries
3339 to the table of built-in modules. This should normally be called
3340 *before* Py_Initialize(). When the table resize fails, -1 is
3341 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003342
3343 After a similar function by Just van Rossum. */
3344
3345int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003346PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003347{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003348 static struct _inittab *our_copy = NULL;
3349 struct _inittab *p;
3350 int i, n;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003351
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003352 /* Count the number of entries in both tables */
3353 for (n = 0; newtab[n].name != NULL; n++)
3354 ;
3355 if (n == 0)
3356 return 0; /* Nothing to do */
3357 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
3358 ;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003359
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003360 /* Allocate new memory for the combined table */
3361 p = our_copy;
3362 PyMem_RESIZE(p, struct _inittab, i+n+1);
3363 if (p == NULL)
3364 return -1;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003365
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003366 /* Copy the tables into the new memory */
3367 if (our_copy != PyImport_Inittab)
3368 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
3369 PyImport_Inittab = our_copy = p;
3370 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003371
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003372 return 0;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003373}
3374
3375/* Shorthand to add a single entry given a name and a function */
3376
3377int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003378PyImport_AppendInittab(char *name, void (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003379{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003380 struct _inittab newtab[2];
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003381
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003382 memset(newtab, '\0', sizeof newtab);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003383
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003384 newtab[0].name = name;
3385 newtab[0].initfunc = initfunc;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003386
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003387 return PyImport_ExtendInittab(newtab);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003388}
Anthony Baxterac6bd462006-04-13 02:06:09 +00003389
3390#ifdef __cplusplus
3391}
3392#endif