blob: 4846e1091a80727b6921e12111987325d21419a6 [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
22extern "C" {
23#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 *);
31 /* 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
72 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[] = {
Jack Jansenc88da1f2002-05-28 10:58:19 +000098 {"/py", "U", PY_SOURCE},
Guido van Rossum48a680c2001-03-02 06:34:14 +000099 {"/pyc", "rb", PY_COMPILED},
100 {0, 0}
101};
102#else
Guido van Rossumed1170e1999-12-20 21:23:41 +0000103static const struct filedescr _PyImport_StandardFiletab[] = {
Jack Jansenc88da1f2002-05-28 10:58:19 +0000104 {".py", "U", PY_SOURCE},
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000105#ifdef MS_WINDOWS
Jack Jansenc88da1f2002-05-28 10:58:19 +0000106 {".pyw", "U", PY_SOURCE},
Tim Peters36515e22001-11-18 04:06:29 +0000107#endif
Guido van Rossumed1170e1999-12-20 21:23:41 +0000108 {".pyc", "rb", PY_COMPILED},
109 {0, 0}
110};
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{
Guido van Rossumed1170e1999-12-20 21:23:41 +0000119 const struct filedescr *scan;
120 struct filedescr *filetab;
121 int countD = 0;
122 int countS = 0;
123
124 /* 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
Guido van Rossumed1170e1999-12-20 21:23:41 +0000128 for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan)
129 ++countD;
Georg Brandladd36e52007-08-23 18:08:06 +0000130#endif
Guido van Rossumed1170e1999-12-20 21:23:41 +0000131 for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan)
132 ++countS;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000133 filetab = PyMem_NEW(struct filedescr, countD + countS + 1);
Neal Norwitze1fdb322006-07-21 05:32:28 +0000134 if (filetab == NULL)
Neal Norwitz33722ae2006-07-21 07:59:02 +0000135 Py_FatalError("Can't initialize import file table.");
Georg Brandladd36e52007-08-23 18:08:06 +0000136#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossumed1170e1999-12-20 21:23:41 +0000137 memcpy(filetab, _PyImport_DynLoadFiletab,
138 countD * sizeof(struct filedescr));
Georg Brandladd36e52007-08-23 18:08:06 +0000139#endif
Guido van Rossumed1170e1999-12-20 21:23:41 +0000140 memcpy(filetab + countD, _PyImport_StandardFiletab,
141 countS * sizeof(struct filedescr));
142 filetab[countD + countS].suffix = NULL;
143
144 _PyImport_Filetab = filetab;
145
Guido van Rossum0824f631997-03-11 18:37:35 +0000146 if (Py_OptimizeFlag) {
Guido van Rossumed1170e1999-12-20 21:23:41 +0000147 /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */
148 for (; filetab->suffix != NULL; filetab++) {
Guido van Rossum48a680c2001-03-02 06:34:14 +0000149#ifndef RISCOS
Guido van Rossumed1170e1999-12-20 21:23:41 +0000150 if (strcmp(filetab->suffix, ".pyc") == 0)
151 filetab->suffix = ".pyo";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000152#else
153 if (strcmp(filetab->suffix, "/pyc") == 0)
154 filetab->suffix = "/pyo";
155#endif
Guido van Rossum0824f631997-03-11 18:37:35 +0000156 }
157 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000158
159 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{
170 PyObject *v, *path_hooks = NULL, *zimpimport;
171 int err = 0;
172
173 /* adding sys.path_hooks and sys.path_importer_cache, setting up
174 zipimport */
Nick Coghlan327a39b2007-11-18 11:56:28 +0000175 if (PyType_Ready(&PyNullImporter_Type) < 0)
Phillip J. Ebyf7575d02006-07-28 21:12:07 +0000176 goto error;
Just van Rossum52e14d62002-12-30 22:08:05 +0000177
178 if (Py_VerboseFlag)
179 PySys_WriteStderr("# installing zipimport hook\n");
180
181 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) {
200 error:
201 PyErr_Print();
Phillip J. Ebyf7575d02006-07-28 21:12:07 +0000202 Py_FatalError("initializing sys.meta_path, sys.path_hooks, "
203 "path_importer_cache, or NullImporter failed"
204 );
Just van Rossum52e14d62002-12-30 22:08:05 +0000205 }
Phillip J. Ebyf7575d02006-07-28 21:12:07 +0000206
Just van Rossum52e14d62002-12-30 22:08:05 +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(
Fred Drake1e5fc552003-07-11 15:01:02 +0000221 "# can't import zipimport.zipimporter\n");
Just van Rossum52e14d62002-12-30 22:08:05 +0000222 }
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);
235}
236
237void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000238_PyImport_Fini(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000239{
240 Py_XDECREF(extensions);
241 extensions = NULL;
Barry Warsaw84294482000-10-03 16:02:05 +0000242 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
259static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000260lock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000261{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000262 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000263 if (me == -1)
264 return; /* Too bad */
Neal Norwitze1fdb322006-07-21 05:32:28 +0000265 if (import_lock == NULL) {
Guido van Rossum65d5b571998-12-21 19:32:43 +0000266 import_lock = PyThread_allocate_lock();
Neal Norwitze1fdb322006-07-21 05:32:28 +0000267 if (import_lock == NULL)
268 return; /* Nothing much we can do. */
269 }
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000270 if (import_lock_thread == me) {
271 import_lock_level++;
272 return;
273 }
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000274 if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0))
275 {
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000276 PyThreadState *tstate = PyEval_SaveThread();
Guido van Rossum65d5b571998-12-21 19:32:43 +0000277 PyThread_acquire_lock(import_lock, 1);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000278 PyEval_RestoreThread(tstate);
279 }
280 import_lock_thread = me;
281 import_lock_level = 1;
282}
283
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000284static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000285unlock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000286{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000287 long me = PyThread_get_thread_ident();
Neal Norwitze1fdb322006-07-21 05:32:28 +0000288 if (me == -1 || import_lock == NULL)
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000289 return 0; /* Too bad */
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000290 if (import_lock_thread != me)
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000291 return -1;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000292 import_lock_level--;
293 if (import_lock_level == 0) {
294 import_lock_thread = -1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000295 PyThread_release_lock(import_lock);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000296 }
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000297 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
301 created child processes do not share locks with the parent. */
302
303void
304_PyImport_ReInitLock(void)
305{
306#ifdef _AIX
307 if (import_lock != NULL)
308 import_lock = PyThread_allocate_lock();
309#endif
310}
311
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000312#else
313
314#define lock_import()
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000315#define unlock_import() 0
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000316
317#endif
318
Tim Peters69232342001-08-30 05:16:13 +0000319static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +0000320imp_lock_held(PyObject *self, PyObject *noargs)
Tim Peters69232342001-08-30 05:16:13 +0000321{
Tim Peters69232342001-08-30 05:16:13 +0000322#ifdef WITH_THREAD
Guido van Rossumb8bff3f2002-04-07 06:34:38 +0000323 return PyBool_FromLong(import_lock_thread != -1);
Tim Peters69232342001-08-30 05:16:13 +0000324#else
Guido van Rossumb8bff3f2002-04-07 06:34:38 +0000325 return PyBool_FromLong(0);
Tim Peters69232342001-08-30 05:16:13 +0000326#endif
327}
328
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000329static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +0000330imp_acquire_lock(PyObject *self, PyObject *noargs)
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000331{
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000332#ifdef WITH_THREAD
333 lock_import();
334#endif
Neal Norwitz2294c0d2003-02-12 23:02:21 +0000335 Py_INCREF(Py_None);
336 return Py_None;
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000337}
338
339static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +0000340imp_release_lock(PyObject *self, PyObject *noargs)
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000341{
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000342#ifdef WITH_THREAD
343 if (unlock_import() < 0) {
344 PyErr_SetString(PyExc_RuntimeError,
345 "not holding the import lock");
346 return NULL;
347 }
348#endif
Neal Norwitz2294c0d2003-02-12 23:02:21 +0000349 Py_INCREF(Py_None);
350 return Py_None;
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000351}
352
Collin Winter276887b2007-03-12 16:11:39 +0000353static void
Neal Norwitz75c7c802007-03-13 05:31:38 +0000354imp_modules_reloading_clear(void)
Collin Winter276887b2007-03-12 16:11:39 +0000355{
356 PyInterpreterState *interp = PyThreadState_Get()->interp;
Neal Norwitz75c7c802007-03-13 05:31:38 +0000357 if (interp->modules_reloading != NULL)
358 PyDict_Clear(interp->modules_reloading);
Collin Winter276887b2007-03-12 16:11:39 +0000359}
360
Guido van Rossum25ce5661997-08-02 03:10:38 +0000361/* Helper for sys */
362
363PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000364PyImport_GetModuleDict(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000365{
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000366 PyInterpreterState *interp = PyThreadState_GET()->interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000367 if (interp->modules == NULL)
368 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
369 return interp->modules;
370}
371
Guido van Rossum3f5da241990-12-20 15:06:42 +0000372
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000373/* List of names to clear in sys */
374static char* sys_deletes[] = {
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000375 "path", "argv", "ps1", "ps2", "exitfunc",
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000376 "exc_type", "exc_value", "exc_traceback",
377 "last_type", "last_value", "last_traceback",
Just van Rossum52e14d62002-12-30 22:08:05 +0000378 "path_hooks", "path_importer_cache", "meta_path",
Christian Heimes0d924432008-01-30 17:21:22 +0000379 /* misc stuff */
380 "flags", "float_info",
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000381 NULL
382};
383
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000384static char* sys_files[] = {
385 "stdin", "__stdin__",
386 "stdout", "__stdout__",
387 "stderr", "__stderr__",
388 NULL
389};
390
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000391
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000392/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000393
Guido van Rossum3f5da241990-12-20 15:06:42 +0000394void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000395PyImport_Cleanup(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000396{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000397 Py_ssize_t pos, ndone;
Guido van Rossum758eec01998-01-19 21:58:26 +0000398 char *name;
399 PyObject *key, *value, *dict;
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000400 PyInterpreterState *interp = PyThreadState_GET()->interp;
Guido van Rossum758eec01998-01-19 21:58:26 +0000401 PyObject *modules = interp->modules;
402
403 if (modules == NULL)
404 return; /* Already done */
405
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000406 /* Delete some special variables first. These are common
407 places where user values hide and people complain when their
408 destructors fail. Since the modules containing them are
409 deleted *last* of all, they would come too late in the normal
410 destruction order. Sigh. */
411
412 value = PyDict_GetItemString(modules, "__builtin__");
413 if (value != NULL && PyModule_Check(value)) {
414 dict = PyModule_GetDict(value);
415 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000416 PySys_WriteStderr("# clear __builtin__._\n");
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000417 PyDict_SetItemString(dict, "_", Py_None);
418 }
419 value = PyDict_GetItemString(modules, "sys");
420 if (value != NULL && PyModule_Check(value)) {
421 char **p;
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000422 PyObject *v;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000423 dict = PyModule_GetDict(value);
424 for (p = sys_deletes; *p != NULL; p++) {
425 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000426 PySys_WriteStderr("# clear sys.%s\n", *p);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000427 PyDict_SetItemString(dict, *p, Py_None);
428 }
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000429 for (p = sys_files; *p != NULL; p+=2) {
430 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000431 PySys_WriteStderr("# restore sys.%s\n", *p);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000432 v = PyDict_GetItemString(dict, *(p+1));
433 if (v == NULL)
434 v = Py_None;
435 PyDict_SetItemString(dict, *p, v);
436 }
437 }
438
439 /* First, delete __main__ */
440 value = PyDict_GetItemString(modules, "__main__");
441 if (value != NULL && PyModule_Check(value)) {
442 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000443 PySys_WriteStderr("# cleanup __main__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000444 _PyModule_Clear(value);
445 PyDict_SetItemString(modules, "__main__", Py_None);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000446 }
447
Guido van Rossum758eec01998-01-19 21:58:26 +0000448 /* The special treatment of __builtin__ here is because even
449 when it's not referenced as a module, its dictionary is
450 referenced by almost every module's __builtins__. Since
451 deleting a module clears its dictionary (even if there are
452 references left to it), we need to delete the __builtin__
453 module last. Likewise, we don't delete sys until the very
454 end because it is implicitly referenced (e.g. by print).
455
456 Also note that we 'delete' modules by replacing their entry
457 in the modules dict with None, rather than really deleting
458 them; this avoids a rehash of the modules dictionary and
459 also marks them as "non existent" so they won't be
460 re-imported. */
461
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000462 /* Next, repeatedly delete modules with a reference count of
Guido van Rossum758eec01998-01-19 21:58:26 +0000463 one (skipping __builtin__ and sys) and delete them */
464 do {
465 ndone = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000466 pos = 0;
Guido van Rossum758eec01998-01-19 21:58:26 +0000467 while (PyDict_Next(modules, &pos, &key, &value)) {
468 if (value->ob_refcnt != 1)
469 continue;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000470 if (PyString_Check(key) && PyModule_Check(value)) {
471 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000472 if (strcmp(name, "__builtin__") == 0)
473 continue;
474 if (strcmp(name, "sys") == 0)
475 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000476 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000477 PySys_WriteStderr(
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000478 "# cleanup[1] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000479 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000480 PyDict_SetItem(modules, key, Py_None);
481 ndone++;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000482 }
483 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000484 } while (ndone > 0);
485
Guido van Rossum758eec01998-01-19 21:58:26 +0000486 /* Next, delete all modules (still skipping __builtin__ and sys) */
487 pos = 0;
488 while (PyDict_Next(modules, &pos, &key, &value)) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000489 if (PyString_Check(key) && PyModule_Check(value)) {
490 name = PyString_AS_STRING(key);
Guido van Rossum758eec01998-01-19 21:58:26 +0000491 if (strcmp(name, "__builtin__") == 0)
492 continue;
493 if (strcmp(name, "sys") == 0)
494 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000495 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000496 PySys_WriteStderr("# cleanup[2] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000497 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000498 PyDict_SetItem(modules, key, Py_None);
499 }
500 }
501
502 /* Next, delete sys and __builtin__ (in that order) */
503 value = PyDict_GetItemString(modules, "sys");
504 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000505 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000506 PySys_WriteStderr("# cleanup sys\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000507 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000508 PyDict_SetItemString(modules, "sys", Py_None);
509 }
510 value = PyDict_GetItemString(modules, "__builtin__");
511 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000512 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000513 PySys_WriteStderr("# cleanup __builtin__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000514 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000515 PyDict_SetItemString(modules, "__builtin__", Py_None);
516 }
517
518 /* Finally, clear and delete the modules directory */
519 PyDict_Clear(modules);
520 interp->modules = NULL;
521 Py_DECREF(modules);
Collin Winter276887b2007-03-12 16:11:39 +0000522 Py_CLEAR(interp->modules_reloading);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000523}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000524
525
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000526/* Helper for pythonrun.c -- return magic number */
527
528long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000529PyImport_GetMagicNumber(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000530{
Guido van Rossum96774c12000-05-01 20:19:08 +0000531 return pyc_magic;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000532}
533
534
Guido van Rossum25ce5661997-08-02 03:10:38 +0000535/* Magic for extension modules (built-in as well as dynamically
536 loaded). To prevent initializing an extension module more than
537 once, we keep a static dictionary 'extensions' keyed by module name
538 (for built-in modules) or by filename (for dynamically loaded
Barry Warsaw92883382001-08-13 23:05:44 +0000539 modules), containing these modules. A copy of the module's
Guido van Rossum25ce5661997-08-02 03:10:38 +0000540 dictionary is stored by calling _PyImport_FixupExtension()
541 immediately after the module initialization function succeeds. A
542 copy can be retrieved from there by calling
543 _PyImport_FindExtension(). */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000544
Guido van Rossum79f25d91997-04-29 20:08:16 +0000545PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000546_PyImport_FixupExtension(char *name, char *filename)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000547{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000548 PyObject *modules, *mod, *dict, *copy;
549 if (extensions == NULL) {
550 extensions = PyDict_New();
551 if (extensions == NULL)
552 return NULL;
553 }
554 modules = PyImport_GetModuleDict();
555 mod = PyDict_GetItemString(modules, name);
556 if (mod == NULL || !PyModule_Check(mod)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000557 PyErr_Format(PyExc_SystemError,
558 "_PyImport_FixupExtension: module %.200s not loaded", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000559 return NULL;
560 }
561 dict = PyModule_GetDict(mod);
562 if (dict == NULL)
563 return NULL;
Fred Drake9cd0efc2001-10-25 21:38:59 +0000564 copy = PyDict_Copy(dict);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000565 if (copy == NULL)
566 return NULL;
567 PyDict_SetItemString(extensions, filename, copy);
568 Py_DECREF(copy);
569 return copy;
570}
571
572PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000573_PyImport_FindExtension(char *name, char *filename)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000574{
Fred Drake9cd0efc2001-10-25 21:38:59 +0000575 PyObject *dict, *mod, *mdict;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000576 if (extensions == NULL)
577 return NULL;
578 dict = PyDict_GetItemString(extensions, filename);
579 if (dict == NULL)
580 return NULL;
581 mod = PyImport_AddModule(name);
582 if (mod == NULL)
583 return NULL;
584 mdict = PyModule_GetDict(mod);
585 if (mdict == NULL)
586 return NULL;
Fred Drake9cd0efc2001-10-25 21:38:59 +0000587 if (PyDict_Update(mdict, dict))
Guido van Rossum25ce5661997-08-02 03:10:38 +0000588 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000589 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000590 PySys_WriteStderr("import %s # previously loaded (%s)\n",
Guido van Rossum25ce5661997-08-02 03:10:38 +0000591 name, filename);
592 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000593}
594
595
596/* Get the module object corresponding to a module name.
597 First check the modules dictionary if there's one there,
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000598 if not, create a new one and insert it in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000599 Because the former action is most common, THIS DOES NOT RETURN A
600 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000601
Guido van Rossum79f25d91997-04-29 20:08:16 +0000602PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000603PyImport_AddModule(const char *name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000604{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000605 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000606 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000607
Guido van Rossum25ce5661997-08-02 03:10:38 +0000608 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
Guido van Rossum79f25d91997-04-29 20:08:16 +0000609 PyModule_Check(m))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000610 return m;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000611 m = PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000612 if (m == NULL)
613 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000614 if (PyDict_SetItemString(modules, name, m) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000615 Py_DECREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000616 return NULL;
617 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000618 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000619
620 return m;
621}
622
Tim Peters1cd70172004-08-02 03:52:12 +0000623/* Remove name from sys.modules, if it's there. */
624static void
625_RemoveModule(const char *name)
626{
627 PyObject *modules = PyImport_GetModuleDict();
628 if (PyDict_GetItemString(modules, name) == NULL)
629 return;
630 if (PyDict_DelItemString(modules, name) < 0)
631 Py_FatalError("import: deleting existing key in"
632 "sys.modules failed");
633}
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000634
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000635/* Execute a code object in a module and return the module object
Tim Peters1cd70172004-08-02 03:52:12 +0000636 * WITH INCREMENTED REFERENCE COUNT. If an error occurs, name is
637 * removed from sys.modules, to avoid leaving damaged module objects
638 * in sys.modules. The caller may wish to restore the original
639 * module object (if any) in this case; PyImport_ReloadModule is an
640 * example.
641 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000642PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000643PyImport_ExecCodeModule(char *name, PyObject *co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000644{
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000645 return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
646}
647
648PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000649PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname)
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000650{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000651 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000652 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000653
Guido van Rossum79f25d91997-04-29 20:08:16 +0000654 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000655 if (m == NULL)
656 return NULL;
Jeremy Hyltonecd91292004-01-02 23:25:32 +0000657 /* If the module is being reloaded, we get the old module back
658 and re-use its dict to exec the new code. */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000659 d = PyModule_GetDict(m);
660 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
661 if (PyDict_SetItemString(d, "__builtins__",
662 PyEval_GetBuiltins()) != 0)
Tim Peters1cd70172004-08-02 03:52:12 +0000663 goto error;
Guido van Rossum6135a871995-01-09 17:53:26 +0000664 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000665 /* Remember the filename as the __file__ attribute */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000666 v = NULL;
667 if (pathname != NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000668 v = PyString_FromString(pathname);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000669 if (v == NULL)
670 PyErr_Clear();
671 }
672 if (v == NULL) {
673 v = ((PyCodeObject *)co)->co_filename;
674 Py_INCREF(v);
675 }
676 if (PyDict_SetItemString(d, "__file__", v) != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000677 PyErr_Clear(); /* Not important enough to report */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000678 Py_DECREF(v);
679
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000680 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000681 if (v == NULL)
Tim Peters1cd70172004-08-02 03:52:12 +0000682 goto error;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000683 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000684
Guido van Rossum25ce5661997-08-02 03:10:38 +0000685 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000686 PyErr_Format(PyExc_ImportError,
687 "Loaded module %.200s not found in sys.modules",
688 name);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000689 return NULL;
690 }
691
Guido van Rossum79f25d91997-04-29 20:08:16 +0000692 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000693
694 return m;
Tim Peters1cd70172004-08-02 03:52:12 +0000695
696 error:
697 _RemoveModule(name);
698 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000699}
700
701
702/* Given a pathname for a Python source file, fill a buffer with the
703 pathname for the corresponding compiled file. Return the pathname
704 for the compiled file, or NULL if there's no space in the buffer.
705 Doesn't set an exception. */
706
707static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000708make_compiled_pathname(char *pathname, char *buf, size_t buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000709{
Tim Petersc1731372001-08-04 08:12:36 +0000710 size_t len = strlen(pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000711 if (len+2 > buflen)
712 return NULL;
Tim Petersc1731372001-08-04 08:12:36 +0000713
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000714#ifdef MS_WINDOWS
Tim Petersc1731372001-08-04 08:12:36 +0000715 /* Treat .pyw as if it were .py. The case of ".pyw" must match
716 that used in _PyImport_StandardFiletab. */
717 if (len >= 4 && strcmp(&pathname[len-4], ".pyw") == 0)
718 --len; /* pretend 'w' isn't there */
719#endif
720 memcpy(buf, pathname, len);
721 buf[len] = Py_OptimizeFlag ? 'o' : 'c';
722 buf[len+1] = '\0';
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000723
724 return buf;
725}
726
727
728/* Given a pathname for a Python source file, its time of last
729 modification, and a pathname for a compiled file, check whether the
730 compiled file represents the same version of the source. If so,
731 return a FILE pointer for the compiled file, positioned just after
732 the header; if not, return NULL.
733 Doesn't set an exception. */
734
735static FILE *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000736check_compiled_module(char *pathname, time_t mtime, char *cpathname)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000737{
738 FILE *fp;
739 long magic;
740 long pyc_mtime;
741
742 fp = fopen(cpathname, "rb");
743 if (fp == NULL)
744 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000745 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000746 if (magic != pyc_magic) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000747 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000748 PySys_WriteStderr("# %s has bad magic\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000749 fclose(fp);
750 return NULL;
751 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000752 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000753 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000754 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000755 PySys_WriteStderr("# %s has bad mtime\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000756 fclose(fp);
757 return NULL;
758 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000759 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000760 PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000761 return fp;
762}
763
764
765/* Read a code object from a file and check it for validity */
766
Guido van Rossum79f25d91997-04-29 20:08:16 +0000767static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000768read_compiled_module(char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000769{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000770 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000771
Tim Petersd9b9ac82001-01-28 00:27:39 +0000772 co = PyMarshal_ReadLastObjectFromFile(fp);
Armin Rigo01ab2792004-03-26 15:09:27 +0000773 if (co == NULL)
774 return NULL;
775 if (!PyCode_Check(co)) {
776 PyErr_Format(PyExc_ImportError,
777 "Non-code object in %.200s", cpathname);
778 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000779 return NULL;
780 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000781 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000782}
783
784
785/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000786 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000787
Guido van Rossum79f25d91997-04-29 20:08:16 +0000788static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000789load_compiled_module(char *name, char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000790{
791 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000792 PyCodeObject *co;
793 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000794
Guido van Rossum79f25d91997-04-29 20:08:16 +0000795 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000796 if (magic != pyc_magic) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000797 PyErr_Format(PyExc_ImportError,
798 "Bad magic number in %.200s", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000799 return NULL;
800 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000801 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000802 co = read_compiled_module(cpathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000803 if (co == NULL)
804 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000805 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000806 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000807 name, cpathname);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000808 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000809 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000810
811 return m;
812}
813
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000814/* Parse a source file and return the corresponding code object */
815
Guido van Rossum79f25d91997-04-29 20:08:16 +0000816static PyCodeObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000817parse_source_module(const char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000818{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000819 PyCodeObject *co = NULL;
820 mod_ty mod;
Christian Heimes3c608332008-03-26 22:01:37 +0000821 PyCompilerFlags flags;
Neal Norwitz2a399b02006-09-11 04:28:16 +0000822 PyArena *arena = PyArena_New();
823 if (arena == NULL)
824 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000825
Christian Heimes7f23d862008-03-26 22:51:58 +0000826 flags.cf_flags = 0;
827
Christian Heimes3c608332008-03-26 22:01:37 +0000828 mod = PyParser_ASTFromFile(fp, pathname, Py_file_input, 0, 0, &flags,
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000829 NULL, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000830 if (mod) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000831 co = PyAST_Compile(mod, pathname, NULL, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000832 }
Neal Norwitz2a399b02006-09-11 04:28:16 +0000833 PyArena_Free(arena);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000834 return co;
835}
836
837
Guido van Rossum55a83382000-09-20 20:31:38 +0000838/* Helper to open a bytecode file for writing in exclusive mode */
839
840static FILE *
Christian Heimes40346852008-02-23 17:52:07 +0000841open_exclusive(char *filename, mode_t mode)
Guido van Rossum55a83382000-09-20 20:31:38 +0000842{
843#if defined(O_EXCL)&&defined(O_CREAT)&&defined(O_WRONLY)&&defined(O_TRUNC)
844 /* Use O_EXCL to avoid a race condition when another process tries to
845 write the same file. When that happens, our open() call fails,
846 which is just fine (since it's only a cache).
847 XXX If the file exists and is writable but the directory is not
848 writable, the file will never be written. Oh well.
849 */
850 int fd;
851 (void) unlink(filename);
Tim Peters42c83af2000-09-29 04:03:10 +0000852 fd = open(filename, O_EXCL|O_CREAT|O_WRONLY|O_TRUNC
853#ifdef O_BINARY
854 |O_BINARY /* necessary for Windows */
855#endif
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000856#ifdef __VMS
Christian Heimes40346852008-02-23 17:52:07 +0000857 , mode, "ctxt=bin", "shr=nil"
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000858#else
Christian Heimes40346852008-02-23 17:52:07 +0000859 , mode
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000860#endif
Martin v. Löwis18e16552006-02-15 17:27:45 +0000861 );
Guido van Rossum55a83382000-09-20 20:31:38 +0000862 if (fd < 0)
863 return NULL;
864 return fdopen(fd, "wb");
865#else
866 /* Best we can do -- on Windows this can't happen anyway */
867 return fopen(filename, "wb");
868#endif
869}
870
871
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000872/* Write a compiled module to a file, placing the time of last
873 modification of its source into the header.
874 Errors are ignored, if a write error occurs an attempt is made to
875 remove the file. */
876
877static void
Christian Heimes40346852008-02-23 17:52:07 +0000878write_compiled_module(PyCodeObject *co, char *cpathname, struct stat *srcstat)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000879{
880 FILE *fp;
Christian Heimes40346852008-02-23 17:52:07 +0000881 time_t mtime = srcstat->st_mtime;
R. David Murraye38b0a82009-07-19 01:44:23 +0000882#ifdef MS_WINDOWS /* since Windows uses different permissions */
883 mode_t mode = srcstat->st_mode & ~S_IEXEC;
884#else
885 mode_t mode = srcstat->st_mode & ~S_IXUSR & ~S_IXGRP & ~S_IXOTH;
886#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000887
Christian Heimes40346852008-02-23 17:52:07 +0000888 fp = open_exclusive(cpathname, mode);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000889 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000890 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000891 PySys_WriteStderr(
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000892 "# can't create %s\n", cpathname);
893 return;
894 }
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000895 PyMarshal_WriteLongToFile(pyc_magic, fp, Py_MARSHAL_VERSION);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000896 /* First write a 0 for mtime */
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000897 PyMarshal_WriteLongToFile(0L, fp, Py_MARSHAL_VERSION);
898 PyMarshal_WriteObjectToFile((PyObject *)co, fp, Py_MARSHAL_VERSION);
Armin Rigo01ab2792004-03-26 15:09:27 +0000899 if (fflush(fp) != 0 || ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000900 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000901 PySys_WriteStderr("# can't write %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000902 /* Don't keep partial file */
903 fclose(fp);
904 (void) unlink(cpathname);
905 return;
906 }
907 /* Now write the true mtime */
908 fseek(fp, 4L, 0);
Martin v. Löwis18e16552006-02-15 17:27:45 +0000909 assert(mtime < LONG_MAX);
Martin v. Löwis725507b2006-03-07 12:08:51 +0000910 PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000911 fflush(fp);
912 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000913 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000914 PySys_WriteStderr("# wrote %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000915}
916
Antoine Pitrou5b0767c2009-01-06 19:00:59 +0000917static void
918update_code_filenames(PyCodeObject *co, PyObject *oldname, PyObject *newname)
919{
920 PyObject *constants, *tmp;
921 Py_ssize_t i, n;
922
923 if (!_PyString_Eq(co->co_filename, oldname))
924 return;
925
926 tmp = co->co_filename;
927 co->co_filename = newname;
928 Py_INCREF(co->co_filename);
929 Py_DECREF(tmp);
930
931 constants = co->co_consts;
932 n = PyTuple_GET_SIZE(constants);
933 for (i = 0; i < n; i++) {
934 tmp = PyTuple_GET_ITEM(constants, i);
935 if (PyCode_Check(tmp))
936 update_code_filenames((PyCodeObject *)tmp,
937 oldname, newname);
938 }
939}
940
941static int
942update_compiled_module(PyCodeObject *co, char *pathname)
943{
944 PyObject *oldname, *newname;
945
946 if (strcmp(PyString_AsString(co->co_filename), pathname) == 0)
947 return 0;
948
949 newname = PyString_FromString(pathname);
950 if (newname == NULL)
951 return -1;
952
953 oldname = co->co_filename;
954 Py_INCREF(oldname);
955 update_code_filenames(co, oldname, newname);
956 Py_DECREF(oldname);
957 Py_DECREF(newname);
958 return 1;
959}
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000960
961/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000962 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
963 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000964
Guido van Rossum79f25d91997-04-29 20:08:16 +0000965static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000966load_source_module(char *name, char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000967{
Christian Heimes40346852008-02-23 17:52:07 +0000968 struct stat st;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000969 FILE *fpc;
970 char buf[MAXPATHLEN+1];
971 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000972 PyCodeObject *co;
973 PyObject *m;
Christian Heimes40346852008-02-23 17:52:07 +0000974
975 if (fstat(fileno(fp), &st) != 0) {
Neal Norwitz708e51a2005-10-03 04:48:15 +0000976 PyErr_Format(PyExc_RuntimeError,
Christian Heimes40346852008-02-23 17:52:07 +0000977 "unable to get file status from '%s'",
Neal Norwitz708e51a2005-10-03 04:48:15 +0000978 pathname);
Fred Drake4c82b232000-06-30 16:18:57 +0000979 return NULL;
Neal Norwitz708e51a2005-10-03 04:48:15 +0000980 }
Fred Drake4c82b232000-06-30 16:18:57 +0000981#if SIZEOF_TIME_T > 4
982 /* Python's .pyc timestamp handling presumes that the timestamp fits
983 in 4 bytes. This will be fine until sometime in the year 2038,
984 when a 4-byte signed time_t will overflow.
985 */
Christian Heimes40346852008-02-23 17:52:07 +0000986 if (st.st_mtime >> 32) {
Fred Drake4c82b232000-06-30 16:18:57 +0000987 PyErr_SetString(PyExc_OverflowError,
Fred Drakec63d3e92001-03-01 06:33:32 +0000988 "modification time overflows a 4 byte field");
Fred Drake4c82b232000-06-30 16:18:57 +0000989 return NULL;
990 }
991#endif
Tim Peters36515e22001-11-18 04:06:29 +0000992 cpathname = make_compiled_pathname(pathname, buf,
Jeremy Hylton37832f02001-04-13 17:50:20 +0000993 (size_t)MAXPATHLEN + 1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000994 if (cpathname != NULL &&
Christian Heimes40346852008-02-23 17:52:07 +0000995 (fpc = check_compiled_module(pathname, st.st_mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000996 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000997 fclose(fpc);
998 if (co == NULL)
999 return NULL;
Antoine Pitrou5b0767c2009-01-06 19:00:59 +00001000 if (update_compiled_module(co, pathname) < 0)
1001 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001002 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001003 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001004 name, cpathname);
Guido van Rossumafd3dae1998-08-25 18:44:34 +00001005 pathname = cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001006 }
1007 else {
1008 co = parse_source_module(pathname, fp);
1009 if (co == NULL)
1010 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001011 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001012 PySys_WriteStderr("import %s # from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001013 name, pathname);
Georg Brandl2da0fce2008-01-07 17:09:35 +00001014 if (cpathname) {
1015 PyObject *ro = PySys_GetObject("dont_write_bytecode");
1016 if (ro == NULL || !PyObject_IsTrue(ro))
Christian Heimes40346852008-02-23 17:52:07 +00001017 write_compiled_module(co, cpathname, &st);
Georg Brandl2da0fce2008-01-07 17:09:35 +00001018 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001019 }
Guido van Rossumafd3dae1998-08-25 18:44:34 +00001020 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001021 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001022
1023 return m;
1024}
1025
1026
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001027/* Forward */
Just van Rossum52e14d62002-12-30 22:08:05 +00001028static PyObject *load_module(char *, FILE *, char *, int, PyObject *);
1029static struct filedescr *find_module(char *, char *, PyObject *,
1030 char *, size_t, FILE **, PyObject **);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001031static struct _frozen *find_frozen(char *name);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001032
1033/* Load a package and return its module object WITH INCREMENTED
1034 REFERENCE COUNT */
1035
1036static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001037load_package(char *name, char *pathname)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001038{
Tim Peters1cd70172004-08-02 03:52:12 +00001039 PyObject *m, *d;
1040 PyObject *file = NULL;
1041 PyObject *path = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001042 int err;
1043 char buf[MAXPATHLEN+1];
1044 FILE *fp = NULL;
1045 struct filedescr *fdp;
1046
1047 m = PyImport_AddModule(name);
1048 if (m == NULL)
1049 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001050 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001051 PySys_WriteStderr("import %s # directory %s\n",
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001052 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001053 d = PyModule_GetDict(m);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001054 file = PyString_FromString(pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001055 if (file == NULL)
Tim Peters1cd70172004-08-02 03:52:12 +00001056 goto error;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001057 path = Py_BuildValue("[O]", file);
Tim Peters1cd70172004-08-02 03:52:12 +00001058 if (path == NULL)
1059 goto error;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001060 err = PyDict_SetItemString(d, "__file__", file);
1061 if (err == 0)
1062 err = PyDict_SetItemString(d, "__path__", path);
Tim Peters1cd70172004-08-02 03:52:12 +00001063 if (err != 0)
1064 goto error;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001065 buf[0] = '\0';
Just van Rossum52e14d62002-12-30 22:08:05 +00001066 fdp = find_module(name, "__init__", path, buf, sizeof(buf), &fp, NULL);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001067 if (fdp == NULL) {
1068 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
1069 PyErr_Clear();
Thomas Heller25653242004-06-07 15:04:10 +00001070 Py_INCREF(m);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001071 }
1072 else
1073 m = NULL;
1074 goto cleanup;
1075 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001076 m = load_module(name, fp, buf, fdp->type, NULL);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001077 if (fp != NULL)
1078 fclose(fp);
Tim Peters1cd70172004-08-02 03:52:12 +00001079 goto cleanup;
1080
1081 error:
1082 m = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001083 cleanup:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001084 Py_XDECREF(path);
1085 Py_XDECREF(file);
1086 return m;
1087}
1088
1089
1090/* Helper to test for built-in module */
1091
1092static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001093is_builtin(char *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001094{
1095 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +00001096 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
1097 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
1098 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001099 return -1;
1100 else
1101 return 1;
1102 }
1103 }
1104 return 0;
1105}
1106
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001107
Just van Rossum52e14d62002-12-30 22:08:05 +00001108/* Return an importer object for a sys.path/pkg.__path__ item 'p',
1109 possibly by fetching it from the path_importer_cache dict. If it
Brett Cannon94b69f62006-09-28 22:10:14 +00001110 wasn't yet cached, traverse path_hooks until a hook is found
Just van Rossum52e14d62002-12-30 22:08:05 +00001111 that can handle the path item. Return None if no hook could;
1112 this tells our caller it should fall back to the builtin
1113 import mechanism. Cache the result in path_importer_cache.
1114 Returns a borrowed reference. */
1115
1116static PyObject *
1117get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks,
1118 PyObject *p)
1119{
1120 PyObject *importer;
Martin v. Löwis725507b2006-03-07 12:08:51 +00001121 Py_ssize_t j, nhooks;
Just van Rossum52e14d62002-12-30 22:08:05 +00001122
1123 /* These conditions are the caller's responsibility: */
1124 assert(PyList_Check(path_hooks));
1125 assert(PyDict_Check(path_importer_cache));
1126
1127 nhooks = PyList_Size(path_hooks);
1128 if (nhooks < 0)
1129 return NULL; /* Shouldn't happen */
1130
1131 importer = PyDict_GetItem(path_importer_cache, p);
1132 if (importer != NULL)
1133 return importer;
1134
1135 /* set path_importer_cache[p] to None to avoid recursion */
1136 if (PyDict_SetItem(path_importer_cache, p, Py_None) != 0)
1137 return NULL;
1138
1139 for (j = 0; j < nhooks; j++) {
1140 PyObject *hook = PyList_GetItem(path_hooks, j);
1141 if (hook == NULL)
1142 return NULL;
Georg Brandl684fd0c2006-05-25 19:15:31 +00001143 importer = PyObject_CallFunctionObjArgs(hook, p, NULL);
Just van Rossum52e14d62002-12-30 22:08:05 +00001144 if (importer != NULL)
1145 break;
1146
1147 if (!PyErr_ExceptionMatches(PyExc_ImportError)) {
1148 return NULL;
1149 }
1150 PyErr_Clear();
1151 }
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00001152 if (importer == NULL) {
1153 importer = PyObject_CallFunctionObjArgs(
Nick Coghlan327a39b2007-11-18 11:56:28 +00001154 (PyObject *)&PyNullImporter_Type, p, NULL
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00001155 );
1156 if (importer == NULL) {
1157 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
1158 PyErr_Clear();
1159 return Py_None;
1160 }
1161 }
1162 }
1163 if (importer != NULL) {
Just van Rossum52e14d62002-12-30 22:08:05 +00001164 int err = PyDict_SetItem(path_importer_cache, p, importer);
1165 Py_DECREF(importer);
1166 if (err != 0)
1167 return NULL;
1168 }
1169 return importer;
1170}
1171
Nick Coghlan327a39b2007-11-18 11:56:28 +00001172PyAPI_FUNC(PyObject *)
1173PyImport_GetImporter(PyObject *path) {
1174 PyObject *importer=NULL, *path_importer_cache=NULL, *path_hooks=NULL;
1175
1176 if ((path_importer_cache = PySys_GetObject("path_importer_cache"))) {
1177 if ((path_hooks = PySys_GetObject("path_hooks"))) {
1178 importer = get_path_importer(path_importer_cache,
1179 path_hooks, path);
1180 }
1181 }
1182 Py_XINCREF(importer); /* get_path_importer returns a borrowed reference */
1183 return importer;
1184}
1185
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001186/* Search the path (default sys.path) for a module. Return the
1187 corresponding filedescr struct, and (via return arguments) the
1188 pathname and an open file. Return NULL if the module is not found. */
1189
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001190#ifdef MS_COREDLL
Thomas Woutersb4bd21c2000-07-22 23:38:01 +00001191extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **,
Martin v. Löwis18e16552006-02-15 17:27:45 +00001192 char *, Py_ssize_t);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001193#endif
1194
Martin v. Löwis18e16552006-02-15 17:27:45 +00001195static int case_ok(char *, Py_ssize_t, Py_ssize_t, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001196static int find_init_module(char *); /* Forward */
Just van Rossum52e14d62002-12-30 22:08:05 +00001197static struct filedescr importhookdescr = {"", "", IMP_HOOK};
Guido van Rossum197346f1997-10-31 18:38:52 +00001198
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001199static struct filedescr *
Just van Rossum52e14d62002-12-30 22:08:05 +00001200find_module(char *fullname, char *subname, PyObject *path, char *buf,
1201 size_t buflen, FILE **p_fp, PyObject **p_loader)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001202{
Martin v. Löwis725507b2006-03-07 12:08:51 +00001203 Py_ssize_t i, npath;
Fred Drake4c82b232000-06-30 16:18:57 +00001204 size_t len, namelen;
Guido van Rossum80bb9651996-12-05 23:27:02 +00001205 struct filedescr *fdp = NULL;
Jack Jansenc88da1f2002-05-28 10:58:19 +00001206 char *filemode;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001207 FILE *fp = NULL;
Just van Rossum52e14d62002-12-30 22:08:05 +00001208 PyObject *path_hooks, *path_importer_cache;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001209#ifndef RISCOS
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001210 struct stat statbuf;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001211#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +00001212 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
1213 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
1214 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossum0506a431998-08-11 15:07:39 +00001215 char name[MAXPATHLEN+1];
Andrew MacIntyred9400542002-02-26 11:41:34 +00001216#if defined(PYOS_OS2)
1217 size_t saved_len;
1218 size_t saved_namelen;
1219 char *saved_buf = NULL;
1220#endif
Just van Rossum52e14d62002-12-30 22:08:05 +00001221 if (p_loader != NULL)
1222 *p_loader = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001223
Just van Rossum52e14d62002-12-30 22:08:05 +00001224 if (strlen(subname) > MAXPATHLEN) {
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001225 PyErr_SetString(PyExc_OverflowError,
1226 "module name is too long");
Fred Drake4c82b232000-06-30 16:18:57 +00001227 return NULL;
1228 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001229 strcpy(name, subname);
1230
1231 /* sys.meta_path import hook */
1232 if (p_loader != NULL) {
1233 PyObject *meta_path;
1234
1235 meta_path = PySys_GetObject("meta_path");
1236 if (meta_path == NULL || !PyList_Check(meta_path)) {
1237 PyErr_SetString(PyExc_ImportError,
1238 "sys.meta_path must be a list of "
1239 "import hooks");
1240 return NULL;
1241 }
1242 Py_INCREF(meta_path); /* zap guard */
1243 npath = PyList_Size(meta_path);
1244 for (i = 0; i < npath; i++) {
1245 PyObject *loader;
1246 PyObject *hook = PyList_GetItem(meta_path, i);
1247 loader = PyObject_CallMethod(hook, "find_module",
1248 "sO", fullname,
1249 path != NULL ?
1250 path : Py_None);
1251 if (loader == NULL) {
1252 Py_DECREF(meta_path);
1253 return NULL; /* true error */
1254 }
1255 if (loader != Py_None) {
1256 /* a loader was found */
1257 *p_loader = loader;
1258 Py_DECREF(meta_path);
1259 return &importhookdescr;
1260 }
1261 Py_DECREF(loader);
1262 }
1263 Py_DECREF(meta_path);
1264 }
Guido van Rossum0506a431998-08-11 15:07:39 +00001265
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001266 if (path != NULL && PyString_Check(path)) {
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001267 /* The only type of submodule allowed inside a "frozen"
1268 package are other frozen modules or packages. */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001269 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
Guido van Rossum0506a431998-08-11 15:07:39 +00001270 PyErr_SetString(PyExc_ImportError,
1271 "full frozen module name too long");
1272 return NULL;
1273 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001274 strcpy(buf, PyString_AsString(path));
Guido van Rossum0506a431998-08-11 15:07:39 +00001275 strcat(buf, ".");
1276 strcat(buf, name);
1277 strcpy(name, buf);
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001278 if (find_frozen(name) != NULL) {
1279 strcpy(buf, name);
1280 return &fd_frozen;
1281 }
1282 PyErr_Format(PyExc_ImportError,
1283 "No frozen submodule named %.200s", name);
1284 return NULL;
Guido van Rossum0506a431998-08-11 15:07:39 +00001285 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001286 if (path == NULL) {
1287 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +00001288 strcpy(buf, name);
1289 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001290 }
Greg Ward201baee2001-10-04 14:52:06 +00001291 if ((find_frozen(name)) != NULL) {
Guido van Rossuma5568d31998-03-05 03:45:08 +00001292 strcpy(buf, name);
1293 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001294 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001295
Guido van Rossumac279101996-08-22 23:10:58 +00001296#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001297 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
1298 if (fp != NULL) {
1299 *p_fp = fp;
1300 return fdp;
1301 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +00001302#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +00001303 path = PySys_GetObject("path");
1304 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001305 if (path == NULL || !PyList_Check(path)) {
1306 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +00001307 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001308 return NULL;
1309 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001310
1311 path_hooks = PySys_GetObject("path_hooks");
1312 if (path_hooks == NULL || !PyList_Check(path_hooks)) {
1313 PyErr_SetString(PyExc_ImportError,
1314 "sys.path_hooks must be a list of "
1315 "import hooks");
1316 return NULL;
1317 }
1318 path_importer_cache = PySys_GetObject("path_importer_cache");
1319 if (path_importer_cache == NULL ||
1320 !PyDict_Check(path_importer_cache)) {
1321 PyErr_SetString(PyExc_ImportError,
1322 "sys.path_importer_cache must be a dict");
1323 return NULL;
1324 }
1325
Guido van Rossum79f25d91997-04-29 20:08:16 +00001326 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001327 namelen = strlen(name);
1328 for (i = 0; i < npath; i++) {
Walter Dörwald3430d702002-06-17 10:43:59 +00001329 PyObject *copy = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001330 PyObject *v = PyList_GetItem(path, i);
Neal Norwitz3cb31ac2006-08-13 18:10:47 +00001331 if (!v)
1332 return NULL;
Walter Dörwald3430d702002-06-17 10:43:59 +00001333#ifdef Py_USING_UNICODE
1334 if (PyUnicode_Check(v)) {
1335 copy = PyUnicode_Encode(PyUnicode_AS_UNICODE(v),
1336 PyUnicode_GET_SIZE(v), Py_FileSystemDefaultEncoding, NULL);
1337 if (copy == NULL)
1338 return NULL;
1339 v = copy;
1340 }
1341 else
1342#endif
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001343 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001344 continue;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001345 len = PyString_GET_SIZE(v);
Walter Dörwald3430d702002-06-17 10:43:59 +00001346 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen) {
1347 Py_XDECREF(copy);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001348 continue; /* Too long */
Walter Dörwald3430d702002-06-17 10:43:59 +00001349 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001350 strcpy(buf, PyString_AS_STRING(v));
Walter Dörwald3430d702002-06-17 10:43:59 +00001351 if (strlen(buf) != len) {
1352 Py_XDECREF(copy);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001353 continue; /* v contains '\0' */
Walter Dörwald3430d702002-06-17 10:43:59 +00001354 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001355
1356 /* sys.path_hooks import hook */
1357 if (p_loader != NULL) {
1358 PyObject *importer;
1359
1360 importer = get_path_importer(path_importer_cache,
1361 path_hooks, v);
Neal Norwitza4df11d2006-07-06 04:28:59 +00001362 if (importer == NULL) {
1363 Py_XDECREF(copy);
Just van Rossum52e14d62002-12-30 22:08:05 +00001364 return NULL;
Neal Norwitza4df11d2006-07-06 04:28:59 +00001365 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001366 /* Note: importer is a borrowed reference */
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00001367 if (importer != Py_None) {
Just van Rossum52e14d62002-12-30 22:08:05 +00001368 PyObject *loader;
1369 loader = PyObject_CallMethod(importer,
1370 "find_module",
1371 "s", fullname);
Neal Norwitza4df11d2006-07-06 04:28:59 +00001372 Py_XDECREF(copy);
Just van Rossum52e14d62002-12-30 22:08:05 +00001373 if (loader == NULL)
1374 return NULL; /* error */
1375 if (loader != Py_None) {
1376 /* a loader was found */
1377 *p_loader = loader;
1378 return &importhookdescr;
1379 }
1380 Py_DECREF(loader);
Georg Brandlf4ef1162006-05-26 18:03:31 +00001381 continue;
Just van Rossum52e14d62002-12-30 22:08:05 +00001382 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001383 }
Georg Brandlf4ef1162006-05-26 18:03:31 +00001384 /* no hook was found, use builtin import */
Just van Rossum52e14d62002-12-30 22:08:05 +00001385
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001386 if (len > 0 && buf[len-1] != SEP
1387#ifdef ALTSEP
1388 && buf[len-1] != ALTSEP
1389#endif
1390 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001391 buf[len++] = SEP;
Guido van Rossum215c3402000-11-13 17:26:32 +00001392 strcpy(buf+len, name);
1393 len += namelen;
Tim Peters50d8d372001-02-28 05:34:27 +00001394
1395 /* Check for package import (buf holds a directory name,
1396 and there's an __init__ module in that directory */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001397#ifdef HAVE_STAT
Walter Dörwald3430d702002-06-17 10:43:59 +00001398 if (stat(buf, &statbuf) == 0 && /* it exists */
1399 S_ISDIR(statbuf.st_mode) && /* it's a directory */
Thomas Wouters9df4e6f2006-04-27 23:13:20 +00001400 case_ok(buf, len, namelen, name)) { /* case matches */
1401 if (find_init_module(buf)) { /* and has __init__.py */
1402 Py_XDECREF(copy);
1403 return &fd_package;
1404 }
1405 else {
1406 char warnstr[MAXPATHLEN+80];
1407 sprintf(warnstr, "Not importing directory "
1408 "'%.*s': missing __init__.py",
1409 MAXPATHLEN, buf);
1410 if (PyErr_Warn(PyExc_ImportWarning,
1411 warnstr)) {
1412 Py_XDECREF(copy);
1413 return NULL;
1414 }
1415 }
Walter Dörwald3430d702002-06-17 10:43:59 +00001416 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001417#else
1418 /* XXX How are you going to test for directories? */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001419#ifdef RISCOS
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001420 if (isdir(buf) &&
Walter Dörwald3430d702002-06-17 10:43:59 +00001421 case_ok(buf, len, namelen, name)) {
Thomas Wouters9df4e6f2006-04-27 23:13:20 +00001422 if (find_init_module(buf)) {
1423 Py_XDECREF(copy);
1424 return &fd_package;
1425 }
1426 else {
1427 char warnstr[MAXPATHLEN+80];
1428 sprintf(warnstr, "Not importing directory "
1429 "'%.*s': missing __init__.py",
1430 MAXPATHLEN, buf);
1431 if (PyErr_Warn(PyExc_ImportWarning,
1432 warnstr)) {
1433 Py_XDECREF(copy);
1434 return NULL;
1435 }
Walter Dörwald3430d702002-06-17 10:43:59 +00001436 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001437#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001438#endif
Andrew MacIntyred9400542002-02-26 11:41:34 +00001439#if defined(PYOS_OS2)
1440 /* take a snapshot of the module spec for restoration
1441 * after the 8 character DLL hackery
1442 */
1443 saved_buf = strdup(buf);
1444 saved_len = len;
1445 saved_namelen = namelen;
1446#endif /* PYOS_OS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001447 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Georg Brandladd36e52007-08-23 18:08:06 +00001448#if defined(PYOS_OS2) && defined(HAVE_DYNAMIC_LOADING)
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001449 /* OS/2 limits DLLs to 8 character names (w/o
1450 extension)
Andrew MacIntyred9400542002-02-26 11:41:34 +00001451 * so if the name is longer than that and its a
1452 * dynamically loaded module we're going to try,
1453 * truncate the name before trying
1454 */
Just van Rossum52e14d62002-12-30 22:08:05 +00001455 if (strlen(subname) > 8) {
Andrew MacIntyred9400542002-02-26 11:41:34 +00001456 /* is this an attempt to load a C extension? */
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001457 const struct filedescr *scan;
1458 scan = _PyImport_DynLoadFiletab;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001459 while (scan->suffix != NULL) {
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001460 if (!strcmp(scan->suffix, fdp->suffix))
Andrew MacIntyred9400542002-02-26 11:41:34 +00001461 break;
1462 else
1463 scan++;
1464 }
1465 if (scan->suffix != NULL) {
1466 /* yes, so truncate the name */
1467 namelen = 8;
Just van Rossum52e14d62002-12-30 22:08:05 +00001468 len -= strlen(subname) - namelen;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001469 buf[len] = '\0';
1470 }
1471 }
1472#endif /* PYOS_OS2 */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001473 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001474 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001475 PySys_WriteStderr("# trying %s\n", buf);
Jack Jansenc88da1f2002-05-28 10:58:19 +00001476 filemode = fdp->mode;
Tim Peters86c7d2f2004-08-01 23:24:21 +00001477 if (filemode[0] == 'U')
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001478 filemode = "r" PY_STDIOTEXTMODE;
Jack Jansenc88da1f2002-05-28 10:58:19 +00001479 fp = fopen(buf, filemode);
Tim Peters50d8d372001-02-28 05:34:27 +00001480 if (fp != NULL) {
1481 if (case_ok(buf, len, namelen, name))
1482 break;
1483 else { /* continue search */
1484 fclose(fp);
1485 fp = NULL;
Barry Warsaw914a0b12001-02-02 19:12:16 +00001486 }
Barry Warsaw914a0b12001-02-02 19:12:16 +00001487 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001488#if defined(PYOS_OS2)
1489 /* restore the saved snapshot */
1490 strcpy(buf, saved_buf);
1491 len = saved_len;
1492 namelen = saved_namelen;
1493#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001494 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001495#if defined(PYOS_OS2)
1496 /* don't need/want the module name snapshot anymore */
1497 if (saved_buf)
1498 {
1499 free(saved_buf);
1500 saved_buf = NULL;
1501 }
1502#endif
Walter Dörwald3430d702002-06-17 10:43:59 +00001503 Py_XDECREF(copy);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001504 if (fp != NULL)
1505 break;
1506 }
1507 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001508 PyErr_Format(PyExc_ImportError,
1509 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001510 return NULL;
1511 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001512 *p_fp = fp;
1513 return fdp;
1514}
1515
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +00001516/* Helpers for main.c
1517 * Find the source file corresponding to a named module
1518 */
1519struct filedescr *
1520_PyImport_FindModule(const char *name, PyObject *path, char *buf,
1521 size_t buflen, FILE **p_fp, PyObject **p_loader)
1522{
1523 return find_module((char *) name, (char *) name, path,
1524 buf, buflen, p_fp, p_loader);
1525}
1526
1527PyAPI_FUNC(int) _PyImport_IsScript(struct filedescr * fd)
1528{
1529 return fd->type == PY_SOURCE || fd->type == PY_COMPILED;
1530}
1531
Martin v. Löwis18e16552006-02-15 17:27:45 +00001532/* case_ok(char* buf, Py_ssize_t len, Py_ssize_t namelen, char* name)
Tim Petersd1e87a82001-03-01 18:12:00 +00001533 * The arguments here are tricky, best shown by example:
1534 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1535 * ^ ^ ^ ^
1536 * |--------------------- buf ---------------------|
1537 * |------------------- len ------------------|
1538 * |------ name -------|
1539 * |----- namelen -----|
1540 * buf is the full path, but len only counts up to (& exclusive of) the
1541 * extension. name is the module name, also exclusive of extension.
1542 *
1543 * We've already done a successful stat() or fopen() on buf, so know that
1544 * there's some match, possibly case-insensitive.
1545 *
Tim Peters50d8d372001-02-28 05:34:27 +00001546 * case_ok() is to return 1 if there's a case-sensitive match for
1547 * name, else 0. case_ok() is also to return 1 if envar PYTHONCASEOK
1548 * exists.
Tim Petersd1e87a82001-03-01 18:12:00 +00001549 *
Tim Peters50d8d372001-02-28 05:34:27 +00001550 * case_ok() is used to implement case-sensitive import semantics even
1551 * on platforms with case-insensitive filesystems. It's trivial to implement
1552 * for case-sensitive filesystems. It's pretty much a cross-platform
1553 * nightmare for systems with case-insensitive filesystems.
1554 */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001555
Tim Peters50d8d372001-02-28 05:34:27 +00001556/* First we may need a pile of platform-specific header files; the sequence
1557 * of #if's here should match the sequence in the body of case_ok().
1558 */
Jason Tishler7961aa62005-05-20 00:56:54 +00001559#if defined(MS_WINDOWS)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001560#include <windows.h>
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001561
Tim Peters50d8d372001-02-28 05:34:27 +00001562#elif defined(DJGPP)
1563#include <dir.h>
1564
Jason Tishler7961aa62005-05-20 00:56:54 +00001565#elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001566#include <sys/types.h>
1567#include <dirent.h>
1568
Andrew MacIntyred9400542002-02-26 11:41:34 +00001569#elif defined(PYOS_OS2)
1570#define INCL_DOS
1571#define INCL_DOSERRORS
1572#define INCL_NOPMAPI
1573#include <os2.h>
1574
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001575#elif defined(RISCOS)
1576#include "oslib/osfscontrol.h"
Tim Peters50d8d372001-02-28 05:34:27 +00001577#endif
1578
Guido van Rossum0980bd91998-02-13 17:18:36 +00001579static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001580case_ok(char *buf, Py_ssize_t len, Py_ssize_t namelen, char *name)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001581{
Tim Peters50d8d372001-02-28 05:34:27 +00001582/* Pick a platform-specific implementation; the sequence of #if's here should
1583 * match the sequence just above.
1584 */
1585
Jason Tishler7961aa62005-05-20 00:56:54 +00001586/* MS_WINDOWS */
1587#if defined(MS_WINDOWS)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001588 WIN32_FIND_DATA data;
1589 HANDLE h;
Tim Peters50d8d372001-02-28 05:34:27 +00001590
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001591 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001592 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001593
Guido van Rossum0980bd91998-02-13 17:18:36 +00001594 h = FindFirstFile(buf, &data);
1595 if (h == INVALID_HANDLE_VALUE) {
1596 PyErr_Format(PyExc_NameError,
1597 "Can't find file for module %.100s\n(filename %.300s)",
1598 name, buf);
1599 return 0;
1600 }
1601 FindClose(h);
Tim Peters50d8d372001-02-28 05:34:27 +00001602 return strncmp(data.cFileName, name, namelen) == 0;
1603
1604/* DJGPP */
1605#elif defined(DJGPP)
1606 struct ffblk ffblk;
1607 int done;
1608
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001609 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001610 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001611
1612 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
1613 if (done) {
Guido van Rossum0980bd91998-02-13 17:18:36 +00001614 PyErr_Format(PyExc_NameError,
Tim Peters50d8d372001-02-28 05:34:27 +00001615 "Can't find file for module %.100s\n(filename %.300s)",
Guido van Rossum0980bd91998-02-13 17:18:36 +00001616 name, buf);
1617 return 0;
1618 }
Tim Peters50d8d372001-02-28 05:34:27 +00001619 return strncmp(ffblk.ff_name, name, namelen) == 0;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001620
Jason Tishler7961aa62005-05-20 00:56:54 +00001621/* new-fangled macintosh (macosx) or Cygwin */
1622#elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001623 DIR *dirp;
1624 struct dirent *dp;
Tim Petersd1e87a82001-03-01 18:12:00 +00001625 char dirname[MAXPATHLEN + 1];
1626 const int dirlen = len - namelen - 1; /* don't want trailing SEP */
Tim Peters430f5d42001-03-01 01:30:56 +00001627
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001628 if (Py_GETENV("PYTHONCASEOK") != NULL)
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001629 return 1;
1630
Tim Petersd1e87a82001-03-01 18:12:00 +00001631 /* Copy the dir component into dirname; substitute "." if empty */
1632 if (dirlen <= 0) {
1633 dirname[0] = '.';
1634 dirname[1] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001635 }
1636 else {
Tim Petersd1e87a82001-03-01 18:12:00 +00001637 assert(dirlen <= MAXPATHLEN);
1638 memcpy(dirname, buf, dirlen);
1639 dirname[dirlen] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001640 }
1641 /* Open the directory and search the entries for an exact match. */
Tim Petersd1e87a82001-03-01 18:12:00 +00001642 dirp = opendir(dirname);
Tim Peters430f5d42001-03-01 01:30:56 +00001643 if (dirp) {
Tim Peters677898a2001-03-02 03:28:03 +00001644 char *nameWithExt = buf + len - namelen;
Tim Peters430f5d42001-03-01 01:30:56 +00001645 while ((dp = readdir(dirp)) != NULL) {
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001646 const int thislen =
Tim Peters430f5d42001-03-01 01:30:56 +00001647#ifdef _DIRENT_HAVE_D_NAMELEN
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001648 dp->d_namlen;
Tim Peters430f5d42001-03-01 01:30:56 +00001649#else
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001650 strlen(dp->d_name);
Tim Peters430f5d42001-03-01 01:30:56 +00001651#endif
Tim Petersd1e87a82001-03-01 18:12:00 +00001652 if (thislen >= namelen &&
Tim Peters677898a2001-03-02 03:28:03 +00001653 strcmp(dp->d_name, nameWithExt) == 0) {
Tim Peters430f5d42001-03-01 01:30:56 +00001654 (void)closedir(dirp);
1655 return 1; /* Found */
1656 }
1657 }
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001658 (void)closedir(dirp);
Tim Peters430f5d42001-03-01 01:30:56 +00001659 }
Tim Peters430f5d42001-03-01 01:30:56 +00001660 return 0 ; /* Not found */
Tim Peters430f5d42001-03-01 01:30:56 +00001661
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001662/* RISC OS */
1663#elif defined(RISCOS)
1664 char canon[MAXPATHLEN+1]; /* buffer for the canonical form of the path */
1665 char buf2[MAXPATHLEN+2];
1666 char *nameWithExt = buf+len-namelen;
1667 int canonlen;
1668 os_error *e;
1669
1670 if (Py_GETENV("PYTHONCASEOK") != NULL)
1671 return 1;
1672
1673 /* workaround:
1674 append wildcard, otherwise case of filename wouldn't be touched */
1675 strcpy(buf2, buf);
1676 strcat(buf2, "*");
1677
1678 e = xosfscontrol_canonicalise_path(buf2,canon,0,0,MAXPATHLEN+1,&canonlen);
1679 canonlen = MAXPATHLEN+1-canonlen;
1680 if (e || canonlen<=0 || canonlen>(MAXPATHLEN+1) )
1681 return 0;
1682 if (strcmp(nameWithExt, canon+canonlen-strlen(nameWithExt))==0)
1683 return 1; /* match */
1684
1685 return 0;
1686
Andrew MacIntyred9400542002-02-26 11:41:34 +00001687/* OS/2 */
1688#elif defined(PYOS_OS2)
1689 HDIR hdir = 1;
1690 ULONG srchcnt = 1;
1691 FILEFINDBUF3 ffbuf;
1692 APIRET rc;
1693
Georg Brandlaed6c662008-01-07 17:25:53 +00001694 if (Py_GETENV("PYTHONCASEOK") != NULL)
Andrew MacIntyred9400542002-02-26 11:41:34 +00001695 return 1;
1696
1697 rc = DosFindFirst(buf,
1698 &hdir,
1699 FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY,
1700 &ffbuf, sizeof(ffbuf),
1701 &srchcnt,
1702 FIL_STANDARD);
1703 if (rc != NO_ERROR)
1704 return 0;
1705 return strncmp(ffbuf.achName, name, namelen) == 0;
1706
Tim Peters50d8d372001-02-28 05:34:27 +00001707/* assuming it's a case-sensitive filesystem, so there's nothing to do! */
1708#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001709 return 1;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001710
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001711#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001712}
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001713
Guido van Rossum0980bd91998-02-13 17:18:36 +00001714
Guido van Rossum197346f1997-10-31 18:38:52 +00001715#ifdef HAVE_STAT
1716/* Helper to look for __init__.py or __init__.py[co] in potential package */
1717static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001718find_init_module(char *buf)
Guido van Rossum197346f1997-10-31 18:38:52 +00001719{
Tim Peters0f9431f2001-07-05 03:47:53 +00001720 const size_t save_len = strlen(buf);
Fred Drake4c82b232000-06-30 16:18:57 +00001721 size_t i = save_len;
Tim Peters0f9431f2001-07-05 03:47:53 +00001722 char *pname; /* pointer to start of __init__ */
Guido van Rossum197346f1997-10-31 18:38:52 +00001723 struct stat statbuf;
1724
Tim Peters0f9431f2001-07-05 03:47:53 +00001725/* For calling case_ok(buf, len, namelen, name):
1726 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1727 * ^ ^ ^ ^
1728 * |--------------------- buf ---------------------|
1729 * |------------------- len ------------------|
1730 * |------ name -------|
1731 * |----- namelen -----|
1732 */
Guido van Rossum197346f1997-10-31 18:38:52 +00001733 if (save_len + 13 >= MAXPATHLEN)
1734 return 0;
1735 buf[i++] = SEP;
Tim Peters0f9431f2001-07-05 03:47:53 +00001736 pname = buf + i;
1737 strcpy(pname, "__init__.py");
Guido van Rossum197346f1997-10-31 18:38:52 +00001738 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001739 if (case_ok(buf,
1740 save_len + 9, /* len("/__init__") */
1741 8, /* len("__init__") */
1742 pname)) {
1743 buf[save_len] = '\0';
1744 return 1;
1745 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001746 }
Tim Peters0f9431f2001-07-05 03:47:53 +00001747 i += strlen(pname);
1748 strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum197346f1997-10-31 18:38:52 +00001749 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001750 if (case_ok(buf,
1751 save_len + 9, /* len("/__init__") */
1752 8, /* len("__init__") */
1753 pname)) {
1754 buf[save_len] = '\0';
1755 return 1;
1756 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001757 }
1758 buf[save_len] = '\0';
1759 return 0;
1760}
Guido van Rossum48a680c2001-03-02 06:34:14 +00001761
1762#else
1763
1764#ifdef RISCOS
1765static int
1766find_init_module(buf)
1767 char *buf;
1768{
1769 int save_len = strlen(buf);
1770 int i = save_len;
1771
1772 if (save_len + 13 >= MAXPATHLEN)
1773 return 0;
1774 buf[i++] = SEP;
1775 strcpy(buf+i, "__init__/py");
1776 if (isfile(buf)) {
1777 buf[save_len] = '\0';
1778 return 1;
1779 }
1780
1781 if (Py_OptimizeFlag)
1782 strcpy(buf+i, "o");
1783 else
1784 strcpy(buf+i, "c");
1785 if (isfile(buf)) {
1786 buf[save_len] = '\0';
1787 return 1;
1788 }
1789 buf[save_len] = '\0';
1790 return 0;
1791}
1792#endif /*RISCOS*/
1793
Guido van Rossum197346f1997-10-31 18:38:52 +00001794#endif /* HAVE_STAT */
1795
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001796
Tim Petersdbd9ba62000-07-09 03:09:57 +00001797static int init_builtin(char *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001798
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001799/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001800 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001801
Guido van Rossum79f25d91997-04-29 20:08:16 +00001802static PyObject *
Just van Rossum52e14d62002-12-30 22:08:05 +00001803load_module(char *name, FILE *fp, char *buf, int type, PyObject *loader)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001804{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001805 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001806 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001807 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001808
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001809 /* First check that there's an open file (if we need one) */
1810 switch (type) {
1811 case PY_SOURCE:
1812 case PY_COMPILED:
1813 if (fp == NULL) {
1814 PyErr_Format(PyExc_ValueError,
1815 "file object required for import (type code %d)",
1816 type);
1817 return NULL;
1818 }
1819 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001820
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001821 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001822
1823 case PY_SOURCE:
1824 m = load_source_module(name, buf, fp);
1825 break;
1826
1827 case PY_COMPILED:
1828 m = load_compiled_module(name, buf, fp);
1829 break;
1830
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001831#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001832 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001833 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001834 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001835#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001836
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001837 case PKG_DIRECTORY:
1838 m = load_package(name, buf);
1839 break;
1840
1841 case C_BUILTIN:
1842 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001843 if (buf != NULL && buf[0] != '\0')
1844 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001845 if (type == C_BUILTIN)
1846 err = init_builtin(name);
1847 else
1848 err = PyImport_ImportFrozenModule(name);
1849 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001850 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001851 if (err == 0) {
1852 PyErr_Format(PyExc_ImportError,
1853 "Purported %s module %.200s not found",
1854 type == C_BUILTIN ?
1855 "builtin" : "frozen",
1856 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001857 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001858 }
1859 modules = PyImport_GetModuleDict();
1860 m = PyDict_GetItemString(modules, name);
1861 if (m == NULL) {
1862 PyErr_Format(
1863 PyExc_ImportError,
1864 "%s module %.200s not properly initialized",
1865 type == C_BUILTIN ?
1866 "builtin" : "frozen",
1867 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001868 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001869 }
1870 Py_INCREF(m);
1871 break;
1872
Just van Rossum52e14d62002-12-30 22:08:05 +00001873 case IMP_HOOK: {
1874 if (loader == NULL) {
1875 PyErr_SetString(PyExc_ImportError,
1876 "import hook without loader");
1877 return NULL;
1878 }
1879 m = PyObject_CallMethod(loader, "load_module", "s", name);
1880 break;
1881 }
1882
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001883 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001884 PyErr_Format(PyExc_ImportError,
1885 "Don't know how to import %.200s (type code %d)",
1886 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001887 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001888
1889 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001890
1891 return m;
1892}
1893
1894
1895/* Initialize a built-in module.
Brett Cannon5a9aa4f2006-10-03 21:58:55 +00001896 Return 1 for success, 0 if the module is not found, and -1 with
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001897 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001898
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001899static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001900init_builtin(char *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001901{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001902 struct _inittab *p;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001903
Greg Ward201baee2001-10-04 14:52:06 +00001904 if (_PyImport_FindExtension(name, name) != NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00001905 return 1;
1906
Guido van Rossum771c6c81997-10-31 18:37:24 +00001907 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001908 if (strcmp(name, p->name) == 0) {
1909 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001910 PyErr_Format(PyExc_ImportError,
1911 "Cannot re-init internal module %.200s",
1912 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001913 return -1;
1914 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001915 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001916 PySys_WriteStderr("import %s # builtin\n", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001917 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001918 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001919 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001920 if (_PyImport_FixupExtension(name, name) == NULL)
1921 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001922 return 1;
1923 }
1924 }
1925 return 0;
1926}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001927
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001928
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001929/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001930
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001931static struct _frozen *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001932find_frozen(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001933{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001934 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001935
Guido van Rossum79f25d91997-04-29 20:08:16 +00001936 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001937 if (p->name == NULL)
1938 return NULL;
1939 if (strcmp(p->name, name) == 0)
1940 break;
1941 }
1942 return p;
1943}
1944
Guido van Rossum79f25d91997-04-29 20:08:16 +00001945static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001946get_frozen_object(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001947{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001948 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001949 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001950
1951 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001952 PyErr_Format(PyExc_ImportError,
1953 "No such frozen object named %.200s",
1954 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001955 return NULL;
1956 }
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001957 if (p->code == NULL) {
1958 PyErr_Format(PyExc_ImportError,
1959 "Excluded frozen object named %.200s",
1960 name);
1961 return NULL;
1962 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001963 size = p->size;
1964 if (size < 0)
1965 size = -size;
1966 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001967}
1968
1969/* Initialize a frozen module.
1970 Return 1 for succes, 0 if the module is not found, and -1 with
1971 an exception set if the initialization failed.
1972 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001973
1974int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001975PyImport_ImportFrozenModule(char *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001976{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001977 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001978 PyObject *co;
1979 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001980 int ispackage;
1981 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001982
1983 if (p == NULL)
1984 return 0;
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001985 if (p->code == NULL) {
1986 PyErr_Format(PyExc_ImportError,
1987 "Excluded frozen object named %.200s",
1988 name);
1989 return -1;
1990 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001991 size = p->size;
1992 ispackage = (size < 0);
1993 if (ispackage)
1994 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001995 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001996 PySys_WriteStderr("import %s # frozen%s\n",
Guido van Rossuma5568d31998-03-05 03:45:08 +00001997 name, ispackage ? " package" : "");
1998 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001999 if (co == NULL)
2000 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002001 if (!PyCode_Check(co)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002002 PyErr_Format(PyExc_TypeError,
2003 "frozen object %.200s is not a code object",
2004 name);
Neal Norwitzc0cde4d2006-07-16 02:17:36 +00002005 goto err_return;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00002006 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00002007 if (ispackage) {
2008 /* Set __path__ to the package name */
2009 PyObject *d, *s;
2010 int err;
2011 m = PyImport_AddModule(name);
2012 if (m == NULL)
Neal Norwitzc0cde4d2006-07-16 02:17:36 +00002013 goto err_return;
Guido van Rossuma5568d31998-03-05 03:45:08 +00002014 d = PyModule_GetDict(m);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002015 s = PyString_InternFromString(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00002016 if (s == NULL)
Neal Norwitzc0cde4d2006-07-16 02:17:36 +00002017 goto err_return;
Guido van Rossuma5568d31998-03-05 03:45:08 +00002018 err = PyDict_SetItemString(d, "__path__", s);
2019 Py_DECREF(s);
2020 if (err != 0)
Neal Norwitzc0cde4d2006-07-16 02:17:36 +00002021 goto err_return;
Guido van Rossuma5568d31998-03-05 03:45:08 +00002022 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00002023 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum7f9fa971995-01-20 16:53:12 +00002024 if (m == NULL)
Neal Norwitzc0cde4d2006-07-16 02:17:36 +00002025 goto err_return;
2026 Py_DECREF(co);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002027 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00002028 return 1;
Neal Norwitzc0cde4d2006-07-16 02:17:36 +00002029err_return:
2030 Py_DECREF(co);
2031 return -1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00002032}
Guido van Rossum74e6a111994-08-29 12:54:38 +00002033
2034
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002035/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00002036 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00002037
Guido van Rossum79f25d91997-04-29 20:08:16 +00002038PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00002039PyImport_ImportModule(const char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00002040{
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00002041 PyObject *pname;
2042 PyObject *result;
2043
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002044 pname = PyString_FromString(name);
Neal Norwitza11e4c12003-03-23 14:31:01 +00002045 if (pname == NULL)
2046 return NULL;
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00002047 result = PyImport_Import(pname);
2048 Py_DECREF(pname);
2049 return result;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002050}
2051
Christian Heimes000a0742008-01-03 22:16:32 +00002052/* Import a module without blocking
2053 *
2054 * At first it tries to fetch the module from sys.modules. If the module was
2055 * never loaded before it loads it with PyImport_ImportModule() unless another
2056 * thread holds the import lock. In the latter case the function raises an
2057 * ImportError instead of blocking.
2058 *
2059 * Returns the module object with incremented ref count.
2060 */
2061PyObject *
2062PyImport_ImportModuleNoBlock(const char *name)
2063{
2064 PyObject *result;
2065 PyObject *modules;
2066 long me;
2067
2068 /* Try to get the module from sys.modules[name] */
2069 modules = PyImport_GetModuleDict();
2070 if (modules == NULL)
2071 return NULL;
2072
2073 result = PyDict_GetItemString(modules, name);
2074 if (result != NULL) {
2075 Py_INCREF(result);
2076 return result;
2077 }
2078 else {
2079 PyErr_Clear();
2080 }
Benjamin Peterson17f03ca2008-09-01 14:18:30 +00002081#ifdef WITH_THREAD
Christian Heimes000a0742008-01-03 22:16:32 +00002082 /* check the import lock
2083 * me might be -1 but I ignore the error here, the lock function
2084 * takes care of the problem */
2085 me = PyThread_get_thread_ident();
2086 if (import_lock_thread == -1 || import_lock_thread == me) {
2087 /* no thread or me is holding the lock */
2088 return PyImport_ImportModule(name);
2089 }
2090 else {
2091 PyErr_Format(PyExc_ImportError,
2092 "Failed to import %.200s because the import lock"
2093 "is held by another thread.",
2094 name);
2095 return NULL;
2096 }
Benjamin Peterson17f03ca2008-09-01 14:18:30 +00002097#else
2098 return PyImport_ImportModule(name);
2099#endif
Christian Heimes000a0742008-01-03 22:16:32 +00002100}
2101
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002102/* Forward declarations for helper routines */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002103static PyObject *get_parent(PyObject *globals, char *buf,
2104 Py_ssize_t *p_buflen, int level);
Tim Petersdbd9ba62000-07-09 03:09:57 +00002105static PyObject *load_next(PyObject *mod, PyObject *altmod,
Martin v. Löwis18e16552006-02-15 17:27:45 +00002106 char **p_name, char *buf, Py_ssize_t *p_buflen);
Tim Petersdbd9ba62000-07-09 03:09:57 +00002107static int mark_miss(char *name);
2108static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
Martin v. Löwis18e16552006-02-15 17:27:45 +00002109 char *buf, Py_ssize_t buflen, int recursive);
Tim Petersdbd9ba62000-07-09 03:09:57 +00002110static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002111
2112/* The Magnum Opus of dotted-name import :-) */
2113
Guido van Rossum75acc9c1998-03-03 22:26:50 +00002114static PyObject *
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002115import_module_level(char *name, PyObject *globals, PyObject *locals,
2116 PyObject *fromlist, int level)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002117{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002118 char buf[MAXPATHLEN+1];
Martin v. Löwis18e16552006-02-15 17:27:45 +00002119 Py_ssize_t buflen = 0;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002120 PyObject *parent, *head, *next, *tail;
2121
Christian Heimes3403f152008-01-09 19:56:33 +00002122 if (strchr(name, '/') != NULL
2123#ifdef MS_WINDOWS
2124 || strchr(name, '\\') != NULL
2125#endif
2126 ) {
2127 PyErr_SetString(PyExc_ImportError,
2128 "Import by filename is not supported.");
2129 return NULL;
2130 }
2131
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002132 parent = get_parent(globals, buf, &buflen, level);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002133 if (parent == NULL)
2134 return NULL;
2135
2136 head = load_next(parent, Py_None, &name, buf, &buflen);
2137 if (head == NULL)
2138 return NULL;
2139
2140 tail = head;
2141 Py_INCREF(tail);
2142 while (name) {
2143 next = load_next(tail, tail, &name, buf, &buflen);
2144 Py_DECREF(tail);
2145 if (next == NULL) {
2146 Py_DECREF(head);
2147 return NULL;
2148 }
2149 tail = next;
2150 }
Thomas Wouters8ddab272006-04-04 16:17:02 +00002151 if (tail == Py_None) {
2152 /* If tail is Py_None, both get_parent and load_next found
2153 an empty module name: someone called __import__("") or
2154 doctored faulty bytecode */
Thomas Wouters4bdaa272006-04-05 13:39:37 +00002155 Py_DECREF(tail);
2156 Py_DECREF(head);
Thomas Wouters8ddab272006-04-04 16:17:02 +00002157 PyErr_SetString(PyExc_ValueError,
2158 "Empty module name");
2159 return NULL;
2160 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002161
2162 if (fromlist != NULL) {
2163 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
2164 fromlist = NULL;
2165 }
2166
2167 if (fromlist == NULL) {
2168 Py_DECREF(tail);
2169 return head;
2170 }
2171
2172 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00002173 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002174 Py_DECREF(tail);
2175 return NULL;
2176 }
2177
2178 return tail;
2179}
2180
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002181PyObject *
2182PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals,
2183 PyObject *fromlist, int level)
2184{
2185 PyObject *result;
2186 lock_import();
2187 result = import_module_level(name, globals, locals, fromlist, level);
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00002188 if (unlock_import() < 0) {
2189 Py_XDECREF(result);
2190 PyErr_SetString(PyExc_RuntimeError,
2191 "not holding the import lock");
2192 return NULL;
2193 }
Guido van Rossum75acc9c1998-03-03 22:26:50 +00002194 return result;
2195}
2196
Fred Drake87590902004-05-28 20:21:36 +00002197/* Return the package that an import is being performed in. If globals comes
2198 from the module foo.bar.bat (not itself a package), this returns the
2199 sys.modules entry for foo.bar. If globals is from a package's __init__.py,
Georg Brandl5f6861d2006-05-28 21:57:35 +00002200 the package's entry in sys.modules is returned, as a borrowed reference.
Fred Drake87590902004-05-28 20:21:36 +00002201
2202 The *name* of the returned package is returned in buf, with the length of
2203 the name in *p_buflen.
2204
2205 If globals doesn't come from a package or a module in a package, or a
2206 corresponding entry is not found in sys.modules, Py_None is returned.
2207*/
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002208static PyObject *
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002209get_parent(PyObject *globals, char *buf, Py_ssize_t *p_buflen, int level)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002210{
2211 static PyObject *namestr = NULL;
2212 static PyObject *pathstr = NULL;
Nick Coghlanef01d822007-12-03 12:55:17 +00002213 static PyObject *pkgstr = NULL;
2214 PyObject *pkgname, *modname, *modpath, *modules, *parent;
Nick Coghlanb028f502008-07-13 14:52:36 +00002215 int orig_level = level;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002216
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002217 if (globals == NULL || !PyDict_Check(globals) || !level)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002218 return Py_None;
2219
2220 if (namestr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002221 namestr = PyString_InternFromString("__name__");
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002222 if (namestr == NULL)
2223 return NULL;
2224 }
2225 if (pathstr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002226 pathstr = PyString_InternFromString("__path__");
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002227 if (pathstr == NULL)
2228 return NULL;
2229 }
Nick Coghlanef01d822007-12-03 12:55:17 +00002230 if (pkgstr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002231 pkgstr = PyString_InternFromString("__package__");
Nick Coghlanef01d822007-12-03 12:55:17 +00002232 if (pkgstr == NULL)
2233 return NULL;
2234 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002235
2236 *buf = '\0';
2237 *p_buflen = 0;
Nick Coghlanef01d822007-12-03 12:55:17 +00002238 pkgname = PyDict_GetItem(globals, pkgstr);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002239
Nick Coghlanef01d822007-12-03 12:55:17 +00002240 if ((pkgname != NULL) && (pkgname != Py_None)) {
2241 /* __package__ is set, so use it */
2242 Py_ssize_t len;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002243 if (!PyString_Check(pkgname)) {
Nick Coghlanef01d822007-12-03 12:55:17 +00002244 PyErr_SetString(PyExc_ValueError,
2245 "__package__ set to non-string");
2246 return NULL;
2247 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002248 len = PyString_GET_SIZE(pkgname);
Nick Coghlanef01d822007-12-03 12:55:17 +00002249 if (len == 0) {
2250 if (level > 0) {
2251 PyErr_SetString(PyExc_ValueError,
2252 "Attempted relative import in non-package");
2253 return NULL;
2254 }
2255 return Py_None;
2256 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002257 if (len > MAXPATHLEN) {
2258 PyErr_SetString(PyExc_ValueError,
Nick Coghlanef01d822007-12-03 12:55:17 +00002259 "Package name too long");
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002260 return NULL;
2261 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002262 strcpy(buf, PyString_AS_STRING(pkgname));
Nick Coghlanef01d822007-12-03 12:55:17 +00002263 } else {
2264 /* __package__ not set, so figure it out and set it */
2265 modname = PyDict_GetItem(globals, namestr);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002266 if (modname == NULL || !PyString_Check(modname))
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002267 return Py_None;
Nick Coghlanef01d822007-12-03 12:55:17 +00002268
2269 modpath = PyDict_GetItem(globals, pathstr);
2270 if (modpath != NULL) {
2271 /* __path__ is set, so modname is already the package name */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002272 Py_ssize_t len = PyString_GET_SIZE(modname);
Nick Coghlanef01d822007-12-03 12:55:17 +00002273 int error;
2274 if (len > MAXPATHLEN) {
2275 PyErr_SetString(PyExc_ValueError,
2276 "Module name too long");
2277 return NULL;
2278 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002279 strcpy(buf, PyString_AS_STRING(modname));
Nick Coghlanef01d822007-12-03 12:55:17 +00002280 error = PyDict_SetItem(globals, pkgstr, modname);
2281 if (error) {
2282 PyErr_SetString(PyExc_ValueError,
2283 "Could not set __package__");
2284 return NULL;
2285 }
2286 } else {
2287 /* Normal module, so work out the package name if any */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002288 char *start = PyString_AS_STRING(modname);
Nick Coghlanef01d822007-12-03 12:55:17 +00002289 char *lastdot = strrchr(start, '.');
2290 size_t len;
2291 int error;
2292 if (lastdot == NULL && level > 0) {
2293 PyErr_SetString(PyExc_ValueError,
2294 "Attempted relative import in non-package");
2295 return NULL;
2296 }
2297 if (lastdot == NULL) {
2298 error = PyDict_SetItem(globals, pkgstr, Py_None);
2299 if (error) {
2300 PyErr_SetString(PyExc_ValueError,
2301 "Could not set __package__");
2302 return NULL;
2303 }
2304 return Py_None;
2305 }
2306 len = lastdot - start;
2307 if (len >= MAXPATHLEN) {
2308 PyErr_SetString(PyExc_ValueError,
2309 "Module name too long");
2310 return NULL;
2311 }
2312 strncpy(buf, start, len);
2313 buf[len] = '\0';
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002314 pkgname = PyString_FromString(buf);
Nick Coghlanef01d822007-12-03 12:55:17 +00002315 if (pkgname == NULL) {
2316 return NULL;
2317 }
2318 error = PyDict_SetItem(globals, pkgstr, pkgname);
2319 Py_DECREF(pkgname);
2320 if (error) {
2321 PyErr_SetString(PyExc_ValueError,
2322 "Could not set __package__");
2323 return NULL;
2324 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002325 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002326 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002327 while (--level > 0) {
2328 char *dot = strrchr(buf, '.');
2329 if (dot == NULL) {
2330 PyErr_SetString(PyExc_ValueError,
Georg Brandl98775df2006-09-06 06:09:31 +00002331 "Attempted relative import beyond "
2332 "toplevel package");
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002333 return NULL;
2334 }
2335 *dot = '\0';
2336 }
2337 *p_buflen = strlen(buf);
2338
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002339 modules = PyImport_GetModuleDict();
2340 parent = PyDict_GetItemString(modules, buf);
Nick Coghlanb028f502008-07-13 14:52:36 +00002341 if (parent == NULL) {
2342 if (orig_level < 1) {
2343 PyObject *err_msg = PyString_FromFormat(
2344 "Parent module '%.200s' not found "
2345 "while handling absolute import", buf);
2346 if (err_msg == NULL) {
2347 return NULL;
2348 }
2349 if (!PyErr_WarnEx(PyExc_RuntimeWarning,
2350 PyString_AsString(err_msg), 1)) {
2351 *buf = '\0';
2352 *p_buflen = 0;
2353 parent = Py_None;
2354 }
2355 Py_DECREF(err_msg);
2356 } else {
2357 PyErr_Format(PyExc_SystemError,
2358 "Parent module '%.200s' not loaded, "
2359 "cannot perform relative import", buf);
2360 }
2361 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002362 return parent;
2363 /* We expect, but can't guarantee, if parent != None, that:
2364 - parent.__name__ == buf
2365 - parent.__dict__ is globals
2366 If this is violated... Who cares? */
2367}
2368
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002369/* altmod is either None or same as mod */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002370static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002371load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
Martin v. Löwis18e16552006-02-15 17:27:45 +00002372 Py_ssize_t *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002373{
2374 char *name = *p_name;
2375 char *dot = strchr(name, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00002376 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002377 char *p;
2378 PyObject *result;
2379
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002380 if (strlen(name) == 0) {
Thomas Wouters8ddab272006-04-04 16:17:02 +00002381 /* completely empty module name should only happen in
2382 'from . import' (or '__import__("")')*/
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002383 Py_INCREF(mod);
2384 *p_name = NULL;
2385 return mod;
2386 }
2387
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002388 if (dot == NULL) {
2389 *p_name = NULL;
2390 len = strlen(name);
2391 }
2392 else {
2393 *p_name = dot+1;
2394 len = dot-name;
2395 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00002396 if (len == 0) {
2397 PyErr_SetString(PyExc_ValueError,
2398 "Empty module name");
2399 return NULL;
2400 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002401
2402 p = buf + *p_buflen;
2403 if (p != buf)
2404 *p++ = '.';
2405 if (p+len-buf >= MAXPATHLEN) {
2406 PyErr_SetString(PyExc_ValueError,
2407 "Module name too long");
2408 return NULL;
2409 }
2410 strncpy(p, name, len);
2411 p[len] = '\0';
2412 *p_buflen = p+len-buf;
2413
2414 result = import_submodule(mod, p, buf);
2415 if (result == Py_None && altmod != mod) {
2416 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00002417 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00002418 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00002419 if (result != NULL && result != Py_None) {
2420 if (mark_miss(buf) != 0) {
2421 Py_DECREF(result);
2422 return NULL;
2423 }
2424 strncpy(buf, name, len);
2425 buf[len] = '\0';
2426 *p_buflen = len;
2427 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002428 }
2429 if (result == NULL)
2430 return NULL;
2431
2432 if (result == Py_None) {
2433 Py_DECREF(result);
2434 PyErr_Format(PyExc_ImportError,
2435 "No module named %.200s", name);
2436 return NULL;
2437 }
2438
2439 return result;
2440}
2441
2442static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002443mark_miss(char *name)
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00002444{
2445 PyObject *modules = PyImport_GetModuleDict();
2446 return PyDict_SetItemString(modules, name, Py_None);
2447}
2448
2449static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002450ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, Py_ssize_t buflen,
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002451 int recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002452{
2453 int i;
2454
2455 if (!PyObject_HasAttrString(mod, "__path__"))
2456 return 1;
2457
2458 for (i = 0; ; i++) {
2459 PyObject *item = PySequence_GetItem(fromlist, i);
2460 int hasit;
2461 if (item == NULL) {
2462 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2463 PyErr_Clear();
2464 return 1;
2465 }
2466 return 0;
2467 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002468 if (!PyString_Check(item)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002469 PyErr_SetString(PyExc_TypeError,
2470 "Item in ``from list'' not a string");
2471 Py_DECREF(item);
2472 return 0;
2473 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002474 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00002475 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002476 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00002477 /* See if the package defines __all__ */
2478 if (recursive)
2479 continue; /* Avoid endless recursion */
2480 all = PyObject_GetAttrString(mod, "__all__");
2481 if (all == NULL)
2482 PyErr_Clear();
2483 else {
Martin v. Löwis83969ee2004-03-23 16:28:13 +00002484 int ret = ensure_fromlist(mod, all, buf, buflen, 1);
Guido van Rossum9905ef91997-09-08 16:07:11 +00002485 Py_DECREF(all);
Martin v. Löwis83969ee2004-03-23 16:28:13 +00002486 if (!ret)
2487 return 0;
Guido van Rossum9905ef91997-09-08 16:07:11 +00002488 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002489 continue;
2490 }
2491 hasit = PyObject_HasAttr(mod, item);
2492 if (!hasit) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002493 char *subname = PyString_AS_STRING(item);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002494 PyObject *submod;
2495 char *p;
2496 if (buflen + strlen(subname) >= MAXPATHLEN) {
2497 PyErr_SetString(PyExc_ValueError,
2498 "Module name too long");
2499 Py_DECREF(item);
2500 return 0;
2501 }
2502 p = buf + buflen;
2503 *p++ = '.';
2504 strcpy(p, subname);
2505 submod = import_submodule(mod, subname, buf);
2506 Py_XDECREF(submod);
2507 if (submod == NULL) {
2508 Py_DECREF(item);
2509 return 0;
2510 }
2511 }
2512 Py_DECREF(item);
2513 }
2514
Guido van Rossuma7f2e811997-10-03 15:33:32 +00002515 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002516}
2517
Neil Schemenauer00b09662003-06-16 21:03:07 +00002518static int
2519add_submodule(PyObject *mod, PyObject *submod, char *fullname, char *subname,
2520 PyObject *modules)
2521{
2522 if (mod == Py_None)
2523 return 1;
2524 /* Irrespective of the success of this load, make a
2525 reference to it in the parent package module. A copy gets
2526 saved in the modules dictionary under the full name, so get a
2527 reference from there, if need be. (The exception is when the
2528 load failed with a SyntaxError -- then there's no trace in
2529 sys.modules. In that case, of course, do nothing extra.) */
2530 if (submod == NULL) {
2531 submod = PyDict_GetItemString(modules, fullname);
2532 if (submod == NULL)
2533 return 1;
2534 }
2535 if (PyModule_Check(mod)) {
2536 /* We can't use setattr here since it can give a
2537 * spurious warning if the submodule name shadows a
2538 * builtin name */
2539 PyObject *dict = PyModule_GetDict(mod);
2540 if (!dict)
2541 return 0;
2542 if (PyDict_SetItemString(dict, subname, submod) < 0)
2543 return 0;
2544 }
2545 else {
2546 if (PyObject_SetAttrString(mod, subname, submod) < 0)
2547 return 0;
2548 }
2549 return 1;
2550}
2551
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002552static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002553import_submodule(PyObject *mod, char *subname, char *fullname)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002554{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002555 PyObject *modules = PyImport_GetModuleDict();
Neil Schemenauer00b09662003-06-16 21:03:07 +00002556 PyObject *m = NULL;
Guido van Rossum74e6a111994-08-29 12:54:38 +00002557
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002558 /* Require:
2559 if mod == None: subname == fullname
2560 else: mod.__name__ + "." + subname == fullname
2561 */
2562
Tim Peters50d8d372001-02-28 05:34:27 +00002563 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002564 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00002565 }
2566 else {
Just van Rossum52e14d62002-12-30 22:08:05 +00002567 PyObject *path, *loader = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002568 char buf[MAXPATHLEN+1];
2569 struct filedescr *fdp;
2570 FILE *fp = NULL;
2571
Guido van Rossum9c0afe51998-05-19 15:09:05 +00002572 if (mod == Py_None)
2573 path = NULL;
2574 else {
2575 path = PyObject_GetAttrString(mod, "__path__");
2576 if (path == NULL) {
2577 PyErr_Clear();
2578 Py_INCREF(Py_None);
2579 return Py_None;
2580 }
2581 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002582
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002583 buf[0] = '\0';
Just van Rossum52e14d62002-12-30 22:08:05 +00002584 fdp = find_module(fullname, subname, path, buf, MAXPATHLEN+1,
2585 &fp, &loader);
Guido van Rossumb68cd421998-07-01 17:36:26 +00002586 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002587 if (fdp == NULL) {
2588 if (!PyErr_ExceptionMatches(PyExc_ImportError))
2589 return NULL;
2590 PyErr_Clear();
2591 Py_INCREF(Py_None);
2592 return Py_None;
2593 }
Just van Rossum52e14d62002-12-30 22:08:05 +00002594 m = load_module(fullname, fp, buf, fdp->type, loader);
2595 Py_XDECREF(loader);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002596 if (fp)
2597 fclose(fp);
Neil Schemenauer00b09662003-06-16 21:03:07 +00002598 if (!add_submodule(mod, m, fullname, subname, modules)) {
2599 Py_XDECREF(m);
2600 m = NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002601 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00002602 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002603
2604 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00002605}
2606
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002607
2608/* Re-import a module of any kind and return its module object, WITH
2609 INCREMENTED REFERENCE COUNT */
2610
Guido van Rossum79f25d91997-04-29 20:08:16 +00002611PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002612PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002613{
Collin Winter47c52a82007-03-13 23:02:15 +00002614 PyInterpreterState *interp = PyThreadState_Get()->interp;
2615 PyObject *modules_reloading = interp->modules_reloading;
Guido van Rossum25ce5661997-08-02 03:10:38 +00002616 PyObject *modules = PyImport_GetModuleDict();
Collin Winter276887b2007-03-12 16:11:39 +00002617 PyObject *path = NULL, *loader = NULL, *existing_m = NULL;
Guido van Rossum222ef561997-09-06 19:41:09 +00002618 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002619 char buf[MAXPATHLEN+1];
2620 struct filedescr *fdp;
2621 FILE *fp = NULL;
Tim Peters1cd70172004-08-02 03:52:12 +00002622 PyObject *newm;
Collin Winter47c52a82007-03-13 23:02:15 +00002623
2624 if (modules_reloading == NULL) {
2625 Py_FatalError("PyImport_ReloadModule: "
Neal Norwitz2fca81c2007-05-30 04:53:41 +00002626 "no modules_reloading dictionary!");
Collin Winter47c52a82007-03-13 23:02:15 +00002627 return NULL;
2628 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002629
Guido van Rossum79f25d91997-04-29 20:08:16 +00002630 if (m == NULL || !PyModule_Check(m)) {
2631 PyErr_SetString(PyExc_TypeError,
2632 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002633 return NULL;
2634 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002635 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002636 if (name == NULL)
2637 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00002638 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002639 PyErr_Format(PyExc_ImportError,
2640 "reload(): module %.200s not in sys.modules",
2641 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002642 return NULL;
2643 }
Neal Norwitz75c7c802007-03-13 05:31:38 +00002644 existing_m = PyDict_GetItemString(modules_reloading, name);
2645 if (existing_m != NULL) {
2646 /* Due to a recursive reload, this module is already
2647 being reloaded. */
2648 Py_INCREF(existing_m);
2649 return existing_m;
Collin Winter276887b2007-03-12 16:11:39 +00002650 }
Neal Norwitz75c7c802007-03-13 05:31:38 +00002651 if (PyDict_SetItemString(modules_reloading, name, m) < 0)
2652 return NULL;
Collin Winter276887b2007-03-12 16:11:39 +00002653
Guido van Rossum222ef561997-09-06 19:41:09 +00002654 subname = strrchr(name, '.');
2655 if (subname == NULL)
2656 subname = name;
2657 else {
2658 PyObject *parentname, *parent;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002659 parentname = PyString_FromStringAndSize(name, (subname-name));
Collin Winter276887b2007-03-12 16:11:39 +00002660 if (parentname == NULL) {
2661 imp_modules_reloading_clear();
Guido van Rossum222ef561997-09-06 19:41:09 +00002662 return NULL;
Neal Norwitz75c7c802007-03-13 05:31:38 +00002663 }
Guido van Rossum222ef561997-09-06 19:41:09 +00002664 parent = PyDict_GetItem(modules, parentname);
2665 if (parent == NULL) {
2666 PyErr_Format(PyExc_ImportError,
2667 "reload(): parent %.200s not in sys.modules",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002668 PyString_AS_STRING(parentname));
Georg Brandl0c55f292005-09-14 06:56:20 +00002669 Py_DECREF(parentname);
Neal Norwitz2fca81c2007-05-30 04:53:41 +00002670 imp_modules_reloading_clear();
Guido van Rossum222ef561997-09-06 19:41:09 +00002671 return NULL;
2672 }
Georg Brandl0c55f292005-09-14 06:56:20 +00002673 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00002674 subname++;
2675 path = PyObject_GetAttrString(parent, "__path__");
2676 if (path == NULL)
2677 PyErr_Clear();
2678 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002679 buf[0] = '\0';
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002680 fdp = find_module(name, subname, path, buf, MAXPATHLEN+1, &fp, &loader);
Guido van Rossum222ef561997-09-06 19:41:09 +00002681 Py_XDECREF(path);
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002682
2683 if (fdp == NULL) {
2684 Py_XDECREF(loader);
Collin Winter276887b2007-03-12 16:11:39 +00002685 imp_modules_reloading_clear();
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002686 return NULL;
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002687 }
2688
2689 newm = load_module(name, fp, buf, fdp->type, loader);
2690 Py_XDECREF(loader);
2691
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002692 if (fp)
2693 fclose(fp);
Tim Peters1cd70172004-08-02 03:52:12 +00002694 if (newm == NULL) {
2695 /* load_module probably removed name from modules because of
2696 * the error. Put back the original module object. We're
2697 * going to return NULL in this case regardless of whether
2698 * replacing name succeeds, so the return value is ignored.
2699 */
2700 PyDict_SetItemString(modules, name, m);
2701 }
Neal Norwitz75c7c802007-03-13 05:31:38 +00002702 imp_modules_reloading_clear();
Tim Peters1cd70172004-08-02 03:52:12 +00002703 return newm;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002704}
2705
2706
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002707/* Higher-level import emulator which emulates the "import" statement
2708 more accurately -- it invokes the __import__() function from the
2709 builtins of the current globals. This means that the import is
2710 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00002711 environment, e.g. by "rexec".
2712 A dummy list ["__doc__"] is passed as the 4th argument so that
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002713 e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
Guido van Rossum6058eb41998-12-21 19:51:00 +00002714 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002715
2716PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002717PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002718{
2719 static PyObject *silly_list = NULL;
2720 static PyObject *builtins_str = NULL;
2721 static PyObject *import_str = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002722 PyObject *globals = NULL;
2723 PyObject *import = NULL;
2724 PyObject *builtins = NULL;
2725 PyObject *r = NULL;
2726
2727 /* Initialize constant string objects */
2728 if (silly_list == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002729 import_str = PyString_InternFromString("__import__");
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002730 if (import_str == NULL)
2731 return NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002732 builtins_str = PyString_InternFromString("__builtins__");
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002733 if (builtins_str == NULL)
2734 return NULL;
2735 silly_list = Py_BuildValue("[s]", "__doc__");
2736 if (silly_list == NULL)
2737 return NULL;
2738 }
2739
2740 /* Get the builtins from current globals */
2741 globals = PyEval_GetGlobals();
Guido van Rossum85cd1d62001-02-20 21:43:24 +00002742 if (globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00002743 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002744 builtins = PyObject_GetItem(globals, builtins_str);
2745 if (builtins == NULL)
2746 goto err;
2747 }
2748 else {
2749 /* No globals -- use standard builtins, and fake globals */
2750 PyErr_Clear();
2751
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002752 builtins = PyImport_ImportModuleLevel("__builtin__",
2753 NULL, NULL, NULL, 0);
Guido van Rossum85cd1d62001-02-20 21:43:24 +00002754 if (builtins == NULL)
2755 return NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002756 globals = Py_BuildValue("{OO}", builtins_str, builtins);
2757 if (globals == NULL)
2758 goto err;
2759 }
2760
2761 /* Get the __import__ function from the builtins */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002762 if (PyDict_Check(builtins)) {
Fred Drakea76ba6e2001-03-06 06:31:15 +00002763 import = PyObject_GetItem(builtins, import_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002764 if (import == NULL)
2765 PyErr_SetObject(PyExc_KeyError, import_str);
2766 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002767 else
Fred Drakea76ba6e2001-03-06 06:31:15 +00002768 import = PyObject_GetAttr(builtins, import_str);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002769 if (import == NULL)
2770 goto err;
2771
Christian Heimes000a0742008-01-03 22:16:32 +00002772 /* Call the __import__ function with the proper argument list
2773 * Always use absolute import here. */
2774 r = PyObject_CallFunction(import, "OOOOi", module_name, globals,
2775 globals, silly_list, 0, NULL);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002776
2777 err:
2778 Py_XDECREF(globals);
2779 Py_XDECREF(builtins);
2780 Py_XDECREF(import);
Tim Peters50d8d372001-02-28 05:34:27 +00002781
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002782 return r;
2783}
2784
2785
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002786/* Module 'imp' provides Python access to the primitives used for
2787 importing modules.
2788*/
2789
Guido van Rossum79f25d91997-04-29 20:08:16 +00002790static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +00002791imp_get_magic(PyObject *self, PyObject *noargs)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002792{
2793 char buf[4];
2794
Guido van Rossum96774c12000-05-01 20:19:08 +00002795 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
2796 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
2797 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
2798 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002799
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002800 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002801}
2802
Guido van Rossum79f25d91997-04-29 20:08:16 +00002803static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +00002804imp_get_suffixes(PyObject *self, PyObject *noargs)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002805{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002806 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002807 struct filedescr *fdp;
2808
Guido van Rossum79f25d91997-04-29 20:08:16 +00002809 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002810 if (list == NULL)
2811 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002812 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
2813 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002814 fdp->suffix, fdp->mode, fdp->type);
2815 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002816 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002817 return NULL;
2818 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002819 if (PyList_Append(list, item) < 0) {
2820 Py_DECREF(list);
2821 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002822 return NULL;
2823 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002824 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002825 }
2826 return list;
2827}
2828
Guido van Rossum79f25d91997-04-29 20:08:16 +00002829static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002830call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002831{
Tim Petersdbd9ba62000-07-09 03:09:57 +00002832 extern int fclose(FILE *);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002833 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002834 struct filedescr *fdp;
2835 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002836 FILE *fp = NULL;
2837
2838 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002839 if (path == Py_None)
2840 path = NULL;
Just van Rossum52e14d62002-12-30 22:08:05 +00002841 fdp = find_module(NULL, name, path, pathname, MAXPATHLEN+1, &fp, NULL);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002842 if (fdp == NULL)
2843 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002844 if (fp != NULL) {
2845 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
2846 if (fob == NULL) {
2847 fclose(fp);
2848 return NULL;
2849 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002850 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002851 else {
2852 fob = Py_None;
2853 Py_INCREF(fob);
Tim Peters50d8d372001-02-28 05:34:27 +00002854 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002855 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002856 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002857 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002858 return ret;
2859}
2860
Guido van Rossum79f25d91997-04-29 20:08:16 +00002861static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002862imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002863{
2864 char *name;
2865 PyObject *path = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002866 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002867 return NULL;
2868 return call_find_module(name, path);
2869}
2870
2871static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002872imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002873{
2874 char *name;
2875 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002876 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002877 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002878 return NULL;
2879 ret = init_builtin(name);
2880 if (ret < 0)
2881 return NULL;
2882 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002883 Py_INCREF(Py_None);
2884 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002885 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002886 m = PyImport_AddModule(name);
2887 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002888 return m;
2889}
2890
Guido van Rossum79f25d91997-04-29 20:08:16 +00002891static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002892imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002893{
2894 char *name;
2895 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002896 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002897 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002898 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002899 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002900 if (ret < 0)
2901 return NULL;
2902 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002903 Py_INCREF(Py_None);
2904 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002905 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002906 m = PyImport_AddModule(name);
2907 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002908 return m;
2909}
2910
Guido van Rossum79f25d91997-04-29 20:08:16 +00002911static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002912imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002913{
2914 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002915
Guido van Rossum43713e52000-02-29 13:59:29 +00002916 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002917 return NULL;
2918 return get_frozen_object(name);
2919}
2920
Guido van Rossum79f25d91997-04-29 20:08:16 +00002921static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002922imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002923{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002924 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002925 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002926 return NULL;
Guido van Rossum50ee94f2002-04-09 18:00:58 +00002927 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002928}
2929
Guido van Rossum79f25d91997-04-29 20:08:16 +00002930static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002931imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002932{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002933 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002934 struct _frozen *p;
Guido van Rossum43713e52000-02-29 13:59:29 +00002935 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002936 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002937 p = find_frozen(name);
Guido van Rossumb8bff3f2002-04-07 06:34:38 +00002938 return PyBool_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002939}
2940
2941static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002942get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002943{
2944 FILE *fp;
2945 if (fob == NULL) {
Tim Peters86c7d2f2004-08-01 23:24:21 +00002946 if (mode[0] == 'U')
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00002947 mode = "r" PY_STDIOTEXTMODE;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002948 fp = fopen(pathname, mode);
2949 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002950 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002951 }
2952 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002953 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002954 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002955 PyErr_SetString(PyExc_ValueError,
2956 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002957 }
2958 return fp;
2959}
2960
Guido van Rossum79f25d91997-04-29 20:08:16 +00002961static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002962imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002963{
2964 char *name;
2965 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002966 PyObject *fob = NULL;
2967 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002968 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002969 if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002970 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002971 return NULL;
2972 fp = get_file(pathname, fob, "rb");
2973 if (fp == NULL)
2974 return NULL;
2975 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002976 if (fob == NULL)
2977 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002978 return m;
2979}
2980
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002981#ifdef HAVE_DYNAMIC_LOADING
2982
Guido van Rossum79f25d91997-04-29 20:08:16 +00002983static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002984imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002985{
2986 char *name;
2987 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002988 PyObject *fob = NULL;
2989 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002990 FILE *fp = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002991 if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002992 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002993 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002994 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002995 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002996 if (fp == NULL)
2997 return NULL;
2998 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002999 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00003000 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003001}
3002
Guido van Rossum96a8fb71999-12-22 14:09:35 +00003003#endif /* HAVE_DYNAMIC_LOADING */
3004
Guido van Rossum79f25d91997-04-29 20:08:16 +00003005static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003006imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003007{
3008 char *name;
3009 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003010 PyObject *fob = NULL;
3011 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003012 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00003013 if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00003014 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003015 return NULL;
3016 fp = get_file(pathname, fob, "r");
3017 if (fp == NULL)
3018 return NULL;
3019 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003020 if (fob == NULL)
3021 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003022 return m;
3023}
3024
Guido van Rossum79f25d91997-04-29 20:08:16 +00003025static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003026imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003027{
3028 char *name;
3029 PyObject *fob;
3030 char *pathname;
3031 char *suffix; /* Unused */
3032 char *mode;
3033 int type;
3034 FILE *fp;
3035
Guido van Rossum43713e52000-02-29 13:59:29 +00003036 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003037 &name, &fob, &pathname,
3038 &suffix, &mode, &type))
3039 return NULL;
Guido van Rossum5e2c5fa2002-05-30 17:33:07 +00003040 if (*mode) {
3041 /* Mode must start with 'r' or 'U' and must not contain '+'.
3042 Implicit in this test is the assumption that the mode
3043 may contain other modifiers like 'b' or 't'. */
3044
3045 if (!(*mode == 'r' || *mode == 'U') || strchr(mode, '+')) {
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00003046 PyErr_Format(PyExc_ValueError,
3047 "invalid file open mode %.200s", mode);
3048 return NULL;
Guido van Rossum5e2c5fa2002-05-30 17:33:07 +00003049 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003050 }
3051 if (fob == Py_None)
3052 fp = NULL;
3053 else {
3054 if (!PyFile_Check(fob)) {
3055 PyErr_SetString(PyExc_ValueError,
3056 "load_module arg#2 should be a file or None");
3057 return NULL;
3058 }
3059 fp = get_file(pathname, fob, mode);
3060 if (fp == NULL)
3061 return NULL;
3062 }
Just van Rossum52e14d62002-12-30 22:08:05 +00003063 return load_module(name, fp, pathname, type, NULL);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003064}
3065
3066static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003067imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003068{
3069 char *name;
3070 char *pathname;
Guido van Rossum43713e52000-02-29 13:59:29 +00003071 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003072 return NULL;
3073 return load_package(name, pathname);
3074}
3075
3076static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003077imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003078{
3079 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00003080 if (!PyArg_ParseTuple(args, "s:new_module", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003081 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003082 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003083}
3084
Brett Cannon3aa2a492008-08-06 22:28:09 +00003085static PyObject *
3086imp_reload(PyObject *self, PyObject *v)
3087{
3088 return PyImport_ReloadModule(v);
3089}
3090
3091
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003092/* Doc strings */
3093
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003094PyDoc_STRVAR(doc_imp,
3095"This module provides the components needed to build your own\n\
3096__import__ function. Undocumented functions are obsolete.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003097
Brett Cannon3aa2a492008-08-06 22:28:09 +00003098PyDoc_STRVAR(doc_reload,
3099"reload(module) -> module\n\
3100\n\
3101Reload the module. The module must have been successfully imported before.");
3102
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003103PyDoc_STRVAR(doc_find_module,
3104"find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003105Search for a module. If path is omitted or None, search for a\n\
3106built-in, frozen or special module and continue search in sys.path.\n\
3107The module name cannot contain '.'; to search for a submodule of a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003108package, pass the submodule name and the package's __path__.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003109
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003110PyDoc_STRVAR(doc_load_module,
3111"load_module(name, file, filename, (suffix, mode, type)) -> module\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003112Load a module, given information returned by find_module().\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003113The module name must include the full package name, if any.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003114
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003115PyDoc_STRVAR(doc_get_magic,
3116"get_magic() -> string\n\
3117Return the magic number for .pyc or .pyo files.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003118
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003119PyDoc_STRVAR(doc_get_suffixes,
3120"get_suffixes() -> [(suffix, mode, type), ...]\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003121Return a list of (suffix, mode, type) tuples describing the files\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003122that find_module() looks for.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003123
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003124PyDoc_STRVAR(doc_new_module,
3125"new_module(name) -> module\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003126Create a new module. Do not enter it in sys.modules.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003127The module name must include the full package name, if any.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003128
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003129PyDoc_STRVAR(doc_lock_held,
Tim Petersa7c65092004-08-01 23:26:05 +00003130"lock_held() -> boolean\n\
3131Return True if the import lock is currently held, else False.\n\
3132On platforms without threads, return False.");
Tim Peters69232342001-08-30 05:16:13 +00003133
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00003134PyDoc_STRVAR(doc_acquire_lock,
3135"acquire_lock() -> None\n\
Neal Norwitz2294c0d2003-02-12 23:02:21 +00003136Acquires the interpreter's import lock for the current thread.\n\
3137This lock should be used by import hooks to ensure thread-safety\n\
3138when importing modules.\n\
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00003139On platforms without threads, this function does nothing.");
3140
3141PyDoc_STRVAR(doc_release_lock,
3142"release_lock() -> None\n\
3143Release the interpreter's import lock.\n\
3144On platforms without threads, this function does nothing.");
3145
Guido van Rossum79f25d91997-04-29 20:08:16 +00003146static PyMethodDef imp_methods[] = {
Brett Cannon3aa2a492008-08-06 22:28:09 +00003147 {"reload", imp_reload, METH_O, doc_reload},
Neal Norwitz08ea61a2003-02-17 18:18:00 +00003148 {"find_module", imp_find_module, METH_VARARGS, doc_find_module},
3149 {"get_magic", imp_get_magic, METH_NOARGS, doc_get_magic},
3150 {"get_suffixes", imp_get_suffixes, METH_NOARGS, doc_get_suffixes},
3151 {"load_module", imp_load_module, METH_VARARGS, doc_load_module},
3152 {"new_module", imp_new_module, METH_VARARGS, doc_new_module},
3153 {"lock_held", imp_lock_held, METH_NOARGS, doc_lock_held},
3154 {"acquire_lock", imp_acquire_lock, METH_NOARGS, doc_acquire_lock},
3155 {"release_lock", imp_release_lock, METH_NOARGS, doc_release_lock},
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003156 /* The rest are obsolete */
Neal Norwitz031829d2002-03-31 14:37:44 +00003157 {"get_frozen_object", imp_get_frozen_object, METH_VARARGS},
3158 {"init_builtin", imp_init_builtin, METH_VARARGS},
3159 {"init_frozen", imp_init_frozen, METH_VARARGS},
3160 {"is_builtin", imp_is_builtin, METH_VARARGS},
3161 {"is_frozen", imp_is_frozen, METH_VARARGS},
3162 {"load_compiled", imp_load_compiled, METH_VARARGS},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00003163#ifdef HAVE_DYNAMIC_LOADING
Neal Norwitz031829d2002-03-31 14:37:44 +00003164 {"load_dynamic", imp_load_dynamic, METH_VARARGS},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00003165#endif
Neal Norwitz031829d2002-03-31 14:37:44 +00003166 {"load_package", imp_load_package, METH_VARARGS},
Neal Norwitz031829d2002-03-31 14:37:44 +00003167 {"load_source", imp_load_source, METH_VARARGS},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003168 {NULL, NULL} /* sentinel */
3169};
3170
Guido van Rossum1a8791e1998-08-04 22:46:29 +00003171static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003172setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003173{
3174 PyObject *v;
3175 int err;
3176
3177 v = PyInt_FromLong((long)value);
3178 err = PyDict_SetItemString(d, name, v);
3179 Py_XDECREF(v);
3180 return err;
3181}
3182
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003183typedef struct {
3184 PyObject_HEAD
3185} NullImporter;
3186
3187static int
3188NullImporter_init(NullImporter *self, PyObject *args, PyObject *kwds)
3189{
3190 char *path;
Christian Heimescea681b2007-11-07 17:50:54 +00003191 Py_ssize_t pathlen;
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003192
3193 if (!_PyArg_NoKeywords("NullImporter()", kwds))
3194 return -1;
3195
3196 if (!PyArg_ParseTuple(args, "s:NullImporter",
3197 &path))
3198 return -1;
3199
Christian Heimescea681b2007-11-07 17:50:54 +00003200 pathlen = strlen(path);
3201 if (pathlen == 0) {
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003202 PyErr_SetString(PyExc_ImportError, "empty pathname");
3203 return -1;
3204 } else {
3205#ifndef RISCOS
Georg Brandlc04c2892009-01-14 00:00:17 +00003206#ifndef MS_WINDOWS
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003207 struct stat statbuf;
3208 int rv;
3209
3210 rv = stat(path, &statbuf);
3211 if (rv == 0) {
3212 /* it exists */
3213 if (S_ISDIR(statbuf.st_mode)) {
3214 /* it's a directory */
3215 PyErr_SetString(PyExc_ImportError,
3216 "existing directory");
3217 return -1;
3218 }
3219 }
Georg Brandlc04c2892009-01-14 00:00:17 +00003220#else /* MS_WINDOWS */
3221 DWORD rv;
3222 /* see issue1293 and issue3677:
3223 * stat() on Windows doesn't recognise paths like
3224 * "e:\\shared\\" and "\\\\whiterab-c2znlh\\shared" as dirs.
3225 */
3226 rv = GetFileAttributesA(path);
3227 if (rv != INVALID_FILE_ATTRIBUTES) {
3228 /* it exists */
3229 if (rv & FILE_ATTRIBUTE_DIRECTORY) {
3230 /* it's a directory */
3231 PyErr_SetString(PyExc_ImportError,
3232 "existing directory");
3233 return -1;
3234 }
3235 }
3236#endif
3237#else /* RISCOS */
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003238 if (object_exists(path)) {
3239 /* it exists */
3240 if (isdir(path)) {
3241 /* it's a directory */
3242 PyErr_SetString(PyExc_ImportError,
3243 "existing directory");
3244 return -1;
3245 }
3246 }
3247#endif
3248 }
3249 return 0;
3250}
3251
3252static PyObject *
3253NullImporter_find_module(NullImporter *self, PyObject *args)
3254{
3255 Py_RETURN_NONE;
3256}
3257
3258static PyMethodDef NullImporter_methods[] = {
3259 {"find_module", (PyCFunction)NullImporter_find_module, METH_VARARGS,
3260 "Always return None"
3261 },
3262 {NULL} /* Sentinel */
3263};
3264
3265
Nick Coghlan327a39b2007-11-18 11:56:28 +00003266PyTypeObject PyNullImporter_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00003267 PyVarObject_HEAD_INIT(NULL, 0)
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003268 "imp.NullImporter", /*tp_name*/
3269 sizeof(NullImporter), /*tp_basicsize*/
3270 0, /*tp_itemsize*/
3271 0, /*tp_dealloc*/
3272 0, /*tp_print*/
3273 0, /*tp_getattr*/
3274 0, /*tp_setattr*/
3275 0, /*tp_compare*/
3276 0, /*tp_repr*/
3277 0, /*tp_as_number*/
3278 0, /*tp_as_sequence*/
3279 0, /*tp_as_mapping*/
3280 0, /*tp_hash */
3281 0, /*tp_call*/
3282 0, /*tp_str*/
3283 0, /*tp_getattro*/
3284 0, /*tp_setattro*/
3285 0, /*tp_as_buffer*/
3286 Py_TPFLAGS_DEFAULT, /*tp_flags*/
3287 "Null importer object", /* tp_doc */
3288 0, /* tp_traverse */
3289 0, /* tp_clear */
3290 0, /* tp_richcompare */
3291 0, /* tp_weaklistoffset */
3292 0, /* tp_iter */
3293 0, /* tp_iternext */
3294 NullImporter_methods, /* tp_methods */
3295 0, /* tp_members */
3296 0, /* tp_getset */
3297 0, /* tp_base */
3298 0, /* tp_dict */
3299 0, /* tp_descr_get */
3300 0, /* tp_descr_set */
3301 0, /* tp_dictoffset */
3302 (initproc)NullImporter_init, /* tp_init */
3303 0, /* tp_alloc */
3304 PyType_GenericNew /* tp_new */
3305};
3306
3307
Jason Tishler6bc06ec2003-09-04 11:59:50 +00003308PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003309initimp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003310{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003311 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003312
Nick Coghlan327a39b2007-11-18 11:56:28 +00003313 if (PyType_Ready(&PyNullImporter_Type) < 0)
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003314 goto failure;
3315
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003316 m = Py_InitModule4("imp", imp_methods, doc_imp,
3317 NULL, PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00003318 if (m == NULL)
3319 goto failure;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003320 d = PyModule_GetDict(m);
Neal Norwitz3cb31ac2006-08-13 18:10:47 +00003321 if (d == NULL)
3322 goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003323
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003324 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
3325 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
3326 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
3327 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
3328 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
3329 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
3330 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
3331 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00003332 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Just van Rossum52e14d62002-12-30 22:08:05 +00003333 if (setint(d, "IMP_HOOK", IMP_HOOK) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003334
Nick Coghlan327a39b2007-11-18 11:56:28 +00003335 Py_INCREF(&PyNullImporter_Type);
3336 PyModule_AddObject(m, "NullImporter", (PyObject *)&PyNullImporter_Type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003337 failure:
3338 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003339}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003340
3341
Guido van Rossumb18618d2000-05-03 23:44:39 +00003342/* API for embedding applications that want to add their own entries
3343 to the table of built-in modules. This should normally be called
3344 *before* Py_Initialize(). When the table resize fails, -1 is
3345 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003346
3347 After a similar function by Just van Rossum. */
3348
3349int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003350PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003351{
3352 static struct _inittab *our_copy = NULL;
3353 struct _inittab *p;
3354 int i, n;
3355
3356 /* Count the number of entries in both tables */
3357 for (n = 0; newtab[n].name != NULL; n++)
3358 ;
3359 if (n == 0)
3360 return 0; /* Nothing to do */
3361 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
3362 ;
3363
3364 /* Allocate new memory for the combined table */
Guido van Rossumb18618d2000-05-03 23:44:39 +00003365 p = our_copy;
3366 PyMem_RESIZE(p, struct _inittab, i+n+1);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003367 if (p == NULL)
3368 return -1;
3369
3370 /* Copy the tables into the new memory */
3371 if (our_copy != PyImport_Inittab)
3372 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
3373 PyImport_Inittab = our_copy = p;
3374 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
3375
3376 return 0;
3377}
3378
3379/* Shorthand to add a single entry given a name and a function */
3380
3381int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003382PyImport_AppendInittab(char *name, void (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003383{
3384 struct _inittab newtab[2];
3385
3386 memset(newtab, '\0', sizeof newtab);
3387
3388 newtab[0].name = name;
3389 newtab[0].initfunc = initfunc;
3390
3391 return PyImport_ExtendInittab(newtab);
3392}
Anthony Baxterac6bd462006-04-13 02:06:09 +00003393
3394#ifdef __cplusplus
3395}
3396#endif