blob: 5c21e0bc3c078d018dcfdb42e3bf990a8d704222 [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;
882 mode_t mode = srcstat->st_mode;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000883
Christian Heimes40346852008-02-23 17:52:07 +0000884 fp = open_exclusive(cpathname, mode);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000885 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000886 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000887 PySys_WriteStderr(
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000888 "# can't create %s\n", cpathname);
889 return;
890 }
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000891 PyMarshal_WriteLongToFile(pyc_magic, fp, Py_MARSHAL_VERSION);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000892 /* First write a 0 for mtime */
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000893 PyMarshal_WriteLongToFile(0L, fp, Py_MARSHAL_VERSION);
894 PyMarshal_WriteObjectToFile((PyObject *)co, fp, Py_MARSHAL_VERSION);
Armin Rigo01ab2792004-03-26 15:09:27 +0000895 if (fflush(fp) != 0 || ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000896 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000897 PySys_WriteStderr("# can't write %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000898 /* Don't keep partial file */
899 fclose(fp);
900 (void) unlink(cpathname);
901 return;
902 }
903 /* Now write the true mtime */
904 fseek(fp, 4L, 0);
Martin v. Löwis18e16552006-02-15 17:27:45 +0000905 assert(mtime < LONG_MAX);
Martin v. Löwis725507b2006-03-07 12:08:51 +0000906 PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000907 fflush(fp);
908 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000909 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000910 PySys_WriteStderr("# wrote %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000911}
912
Antoine Pitrou5b0767c2009-01-06 19:00:59 +0000913static void
914update_code_filenames(PyCodeObject *co, PyObject *oldname, PyObject *newname)
915{
916 PyObject *constants, *tmp;
917 Py_ssize_t i, n;
918
919 if (!_PyString_Eq(co->co_filename, oldname))
920 return;
921
922 tmp = co->co_filename;
923 co->co_filename = newname;
924 Py_INCREF(co->co_filename);
925 Py_DECREF(tmp);
926
927 constants = co->co_consts;
928 n = PyTuple_GET_SIZE(constants);
929 for (i = 0; i < n; i++) {
930 tmp = PyTuple_GET_ITEM(constants, i);
931 if (PyCode_Check(tmp))
932 update_code_filenames((PyCodeObject *)tmp,
933 oldname, newname);
934 }
935}
936
937static int
938update_compiled_module(PyCodeObject *co, char *pathname)
939{
940 PyObject *oldname, *newname;
941
942 if (strcmp(PyString_AsString(co->co_filename), pathname) == 0)
943 return 0;
944
945 newname = PyString_FromString(pathname);
946 if (newname == NULL)
947 return -1;
948
949 oldname = co->co_filename;
950 Py_INCREF(oldname);
951 update_code_filenames(co, oldname, newname);
952 Py_DECREF(oldname);
953 Py_DECREF(newname);
954 return 1;
955}
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000956
957/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000958 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
959 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000960
Guido van Rossum79f25d91997-04-29 20:08:16 +0000961static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000962load_source_module(char *name, char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000963{
Christian Heimes40346852008-02-23 17:52:07 +0000964 struct stat st;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000965 FILE *fpc;
966 char buf[MAXPATHLEN+1];
967 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000968 PyCodeObject *co;
969 PyObject *m;
Christian Heimes40346852008-02-23 17:52:07 +0000970
971 if (fstat(fileno(fp), &st) != 0) {
Neal Norwitz708e51a2005-10-03 04:48:15 +0000972 PyErr_Format(PyExc_RuntimeError,
Christian Heimes40346852008-02-23 17:52:07 +0000973 "unable to get file status from '%s'",
Neal Norwitz708e51a2005-10-03 04:48:15 +0000974 pathname);
Fred Drake4c82b232000-06-30 16:18:57 +0000975 return NULL;
Neal Norwitz708e51a2005-10-03 04:48:15 +0000976 }
Fred Drake4c82b232000-06-30 16:18:57 +0000977#if SIZEOF_TIME_T > 4
978 /* Python's .pyc timestamp handling presumes that the timestamp fits
979 in 4 bytes. This will be fine until sometime in the year 2038,
980 when a 4-byte signed time_t will overflow.
981 */
Christian Heimes40346852008-02-23 17:52:07 +0000982 if (st.st_mtime >> 32) {
Fred Drake4c82b232000-06-30 16:18:57 +0000983 PyErr_SetString(PyExc_OverflowError,
Fred Drakec63d3e92001-03-01 06:33:32 +0000984 "modification time overflows a 4 byte field");
Fred Drake4c82b232000-06-30 16:18:57 +0000985 return NULL;
986 }
987#endif
Tim Peters36515e22001-11-18 04:06:29 +0000988 cpathname = make_compiled_pathname(pathname, buf,
Jeremy Hylton37832f02001-04-13 17:50:20 +0000989 (size_t)MAXPATHLEN + 1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000990 if (cpathname != NULL &&
Christian Heimes40346852008-02-23 17:52:07 +0000991 (fpc = check_compiled_module(pathname, st.st_mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000992 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000993 fclose(fpc);
994 if (co == NULL)
995 return NULL;
Antoine Pitrou5b0767c2009-01-06 19:00:59 +0000996 if (update_compiled_module(co, pathname) < 0)
997 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000998 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000999 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001000 name, cpathname);
Guido van Rossumafd3dae1998-08-25 18:44:34 +00001001 pathname = cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001002 }
1003 else {
1004 co = parse_source_module(pathname, fp);
1005 if (co == NULL)
1006 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001007 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001008 PySys_WriteStderr("import %s # from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001009 name, pathname);
Georg Brandl2da0fce2008-01-07 17:09:35 +00001010 if (cpathname) {
1011 PyObject *ro = PySys_GetObject("dont_write_bytecode");
1012 if (ro == NULL || !PyObject_IsTrue(ro))
Christian Heimes40346852008-02-23 17:52:07 +00001013 write_compiled_module(co, cpathname, &st);
Georg Brandl2da0fce2008-01-07 17:09:35 +00001014 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001015 }
Guido van Rossumafd3dae1998-08-25 18:44:34 +00001016 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001017 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001018
1019 return m;
1020}
1021
1022
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001023/* Forward */
Just van Rossum52e14d62002-12-30 22:08:05 +00001024static PyObject *load_module(char *, FILE *, char *, int, PyObject *);
1025static struct filedescr *find_module(char *, char *, PyObject *,
1026 char *, size_t, FILE **, PyObject **);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001027static struct _frozen *find_frozen(char *name);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001028
1029/* Load a package and return its module object WITH INCREMENTED
1030 REFERENCE COUNT */
1031
1032static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001033load_package(char *name, char *pathname)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001034{
Tim Peters1cd70172004-08-02 03:52:12 +00001035 PyObject *m, *d;
1036 PyObject *file = NULL;
1037 PyObject *path = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001038 int err;
1039 char buf[MAXPATHLEN+1];
1040 FILE *fp = NULL;
1041 struct filedescr *fdp;
1042
1043 m = PyImport_AddModule(name);
1044 if (m == NULL)
1045 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001046 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001047 PySys_WriteStderr("import %s # directory %s\n",
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001048 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001049 d = PyModule_GetDict(m);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001050 file = PyString_FromString(pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001051 if (file == NULL)
Tim Peters1cd70172004-08-02 03:52:12 +00001052 goto error;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001053 path = Py_BuildValue("[O]", file);
Tim Peters1cd70172004-08-02 03:52:12 +00001054 if (path == NULL)
1055 goto error;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001056 err = PyDict_SetItemString(d, "__file__", file);
1057 if (err == 0)
1058 err = PyDict_SetItemString(d, "__path__", path);
Tim Peters1cd70172004-08-02 03:52:12 +00001059 if (err != 0)
1060 goto error;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001061 buf[0] = '\0';
Just van Rossum52e14d62002-12-30 22:08:05 +00001062 fdp = find_module(name, "__init__", path, buf, sizeof(buf), &fp, NULL);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001063 if (fdp == NULL) {
1064 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
1065 PyErr_Clear();
Thomas Heller25653242004-06-07 15:04:10 +00001066 Py_INCREF(m);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001067 }
1068 else
1069 m = NULL;
1070 goto cleanup;
1071 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001072 m = load_module(name, fp, buf, fdp->type, NULL);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001073 if (fp != NULL)
1074 fclose(fp);
Tim Peters1cd70172004-08-02 03:52:12 +00001075 goto cleanup;
1076
1077 error:
1078 m = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001079 cleanup:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001080 Py_XDECREF(path);
1081 Py_XDECREF(file);
1082 return m;
1083}
1084
1085
1086/* Helper to test for built-in module */
1087
1088static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001089is_builtin(char *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001090{
1091 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +00001092 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
1093 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
1094 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001095 return -1;
1096 else
1097 return 1;
1098 }
1099 }
1100 return 0;
1101}
1102
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001103
Just van Rossum52e14d62002-12-30 22:08:05 +00001104/* Return an importer object for a sys.path/pkg.__path__ item 'p',
1105 possibly by fetching it from the path_importer_cache dict. If it
Brett Cannon94b69f62006-09-28 22:10:14 +00001106 wasn't yet cached, traverse path_hooks until a hook is found
Just van Rossum52e14d62002-12-30 22:08:05 +00001107 that can handle the path item. Return None if no hook could;
1108 this tells our caller it should fall back to the builtin
1109 import mechanism. Cache the result in path_importer_cache.
1110 Returns a borrowed reference. */
1111
1112static PyObject *
1113get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks,
1114 PyObject *p)
1115{
1116 PyObject *importer;
Martin v. Löwis725507b2006-03-07 12:08:51 +00001117 Py_ssize_t j, nhooks;
Just van Rossum52e14d62002-12-30 22:08:05 +00001118
1119 /* These conditions are the caller's responsibility: */
1120 assert(PyList_Check(path_hooks));
1121 assert(PyDict_Check(path_importer_cache));
1122
1123 nhooks = PyList_Size(path_hooks);
1124 if (nhooks < 0)
1125 return NULL; /* Shouldn't happen */
1126
1127 importer = PyDict_GetItem(path_importer_cache, p);
1128 if (importer != NULL)
1129 return importer;
1130
1131 /* set path_importer_cache[p] to None to avoid recursion */
1132 if (PyDict_SetItem(path_importer_cache, p, Py_None) != 0)
1133 return NULL;
1134
1135 for (j = 0; j < nhooks; j++) {
1136 PyObject *hook = PyList_GetItem(path_hooks, j);
1137 if (hook == NULL)
1138 return NULL;
Georg Brandl684fd0c2006-05-25 19:15:31 +00001139 importer = PyObject_CallFunctionObjArgs(hook, p, NULL);
Just van Rossum52e14d62002-12-30 22:08:05 +00001140 if (importer != NULL)
1141 break;
1142
1143 if (!PyErr_ExceptionMatches(PyExc_ImportError)) {
1144 return NULL;
1145 }
1146 PyErr_Clear();
1147 }
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00001148 if (importer == NULL) {
1149 importer = PyObject_CallFunctionObjArgs(
Nick Coghlan327a39b2007-11-18 11:56:28 +00001150 (PyObject *)&PyNullImporter_Type, p, NULL
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00001151 );
1152 if (importer == NULL) {
1153 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
1154 PyErr_Clear();
1155 return Py_None;
1156 }
1157 }
1158 }
1159 if (importer != NULL) {
Just van Rossum52e14d62002-12-30 22:08:05 +00001160 int err = PyDict_SetItem(path_importer_cache, p, importer);
1161 Py_DECREF(importer);
1162 if (err != 0)
1163 return NULL;
1164 }
1165 return importer;
1166}
1167
Nick Coghlan327a39b2007-11-18 11:56:28 +00001168PyAPI_FUNC(PyObject *)
1169PyImport_GetImporter(PyObject *path) {
1170 PyObject *importer=NULL, *path_importer_cache=NULL, *path_hooks=NULL;
1171
1172 if ((path_importer_cache = PySys_GetObject("path_importer_cache"))) {
1173 if ((path_hooks = PySys_GetObject("path_hooks"))) {
1174 importer = get_path_importer(path_importer_cache,
1175 path_hooks, path);
1176 }
1177 }
1178 Py_XINCREF(importer); /* get_path_importer returns a borrowed reference */
1179 return importer;
1180}
1181
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001182/* Search the path (default sys.path) for a module. Return the
1183 corresponding filedescr struct, and (via return arguments) the
1184 pathname and an open file. Return NULL if the module is not found. */
1185
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001186#ifdef MS_COREDLL
Thomas Woutersb4bd21c2000-07-22 23:38:01 +00001187extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **,
Martin v. Löwis18e16552006-02-15 17:27:45 +00001188 char *, Py_ssize_t);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001189#endif
1190
Martin v. Löwis18e16552006-02-15 17:27:45 +00001191static int case_ok(char *, Py_ssize_t, Py_ssize_t, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001192static int find_init_module(char *); /* Forward */
Just van Rossum52e14d62002-12-30 22:08:05 +00001193static struct filedescr importhookdescr = {"", "", IMP_HOOK};
Guido van Rossum197346f1997-10-31 18:38:52 +00001194
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001195static struct filedescr *
Just van Rossum52e14d62002-12-30 22:08:05 +00001196find_module(char *fullname, char *subname, PyObject *path, char *buf,
1197 size_t buflen, FILE **p_fp, PyObject **p_loader)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001198{
Martin v. Löwis725507b2006-03-07 12:08:51 +00001199 Py_ssize_t i, npath;
Fred Drake4c82b232000-06-30 16:18:57 +00001200 size_t len, namelen;
Guido van Rossum80bb9651996-12-05 23:27:02 +00001201 struct filedescr *fdp = NULL;
Jack Jansenc88da1f2002-05-28 10:58:19 +00001202 char *filemode;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001203 FILE *fp = NULL;
Just van Rossum52e14d62002-12-30 22:08:05 +00001204 PyObject *path_hooks, *path_importer_cache;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001205#ifndef RISCOS
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001206 struct stat statbuf;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001207#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +00001208 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
1209 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
1210 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossum0506a431998-08-11 15:07:39 +00001211 char name[MAXPATHLEN+1];
Andrew MacIntyred9400542002-02-26 11:41:34 +00001212#if defined(PYOS_OS2)
1213 size_t saved_len;
1214 size_t saved_namelen;
1215 char *saved_buf = NULL;
1216#endif
Just van Rossum52e14d62002-12-30 22:08:05 +00001217 if (p_loader != NULL)
1218 *p_loader = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001219
Just van Rossum52e14d62002-12-30 22:08:05 +00001220 if (strlen(subname) > MAXPATHLEN) {
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001221 PyErr_SetString(PyExc_OverflowError,
1222 "module name is too long");
Fred Drake4c82b232000-06-30 16:18:57 +00001223 return NULL;
1224 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001225 strcpy(name, subname);
1226
1227 /* sys.meta_path import hook */
1228 if (p_loader != NULL) {
1229 PyObject *meta_path;
1230
1231 meta_path = PySys_GetObject("meta_path");
1232 if (meta_path == NULL || !PyList_Check(meta_path)) {
1233 PyErr_SetString(PyExc_ImportError,
1234 "sys.meta_path must be a list of "
1235 "import hooks");
1236 return NULL;
1237 }
1238 Py_INCREF(meta_path); /* zap guard */
1239 npath = PyList_Size(meta_path);
1240 for (i = 0; i < npath; i++) {
1241 PyObject *loader;
1242 PyObject *hook = PyList_GetItem(meta_path, i);
1243 loader = PyObject_CallMethod(hook, "find_module",
1244 "sO", fullname,
1245 path != NULL ?
1246 path : Py_None);
1247 if (loader == NULL) {
1248 Py_DECREF(meta_path);
1249 return NULL; /* true error */
1250 }
1251 if (loader != Py_None) {
1252 /* a loader was found */
1253 *p_loader = loader;
1254 Py_DECREF(meta_path);
1255 return &importhookdescr;
1256 }
1257 Py_DECREF(loader);
1258 }
1259 Py_DECREF(meta_path);
1260 }
Guido van Rossum0506a431998-08-11 15:07:39 +00001261
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001262 if (path != NULL && PyString_Check(path)) {
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001263 /* The only type of submodule allowed inside a "frozen"
1264 package are other frozen modules or packages. */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001265 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
Guido van Rossum0506a431998-08-11 15:07:39 +00001266 PyErr_SetString(PyExc_ImportError,
1267 "full frozen module name too long");
1268 return NULL;
1269 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001270 strcpy(buf, PyString_AsString(path));
Guido van Rossum0506a431998-08-11 15:07:39 +00001271 strcat(buf, ".");
1272 strcat(buf, name);
1273 strcpy(name, buf);
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001274 if (find_frozen(name) != NULL) {
1275 strcpy(buf, name);
1276 return &fd_frozen;
1277 }
1278 PyErr_Format(PyExc_ImportError,
1279 "No frozen submodule named %.200s", name);
1280 return NULL;
Guido van Rossum0506a431998-08-11 15:07:39 +00001281 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001282 if (path == NULL) {
1283 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +00001284 strcpy(buf, name);
1285 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001286 }
Greg Ward201baee2001-10-04 14:52:06 +00001287 if ((find_frozen(name)) != NULL) {
Guido van Rossuma5568d31998-03-05 03:45:08 +00001288 strcpy(buf, name);
1289 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001290 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001291
Guido van Rossumac279101996-08-22 23:10:58 +00001292#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001293 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
1294 if (fp != NULL) {
1295 *p_fp = fp;
1296 return fdp;
1297 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +00001298#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +00001299 path = PySys_GetObject("path");
1300 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001301 if (path == NULL || !PyList_Check(path)) {
1302 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +00001303 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001304 return NULL;
1305 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001306
1307 path_hooks = PySys_GetObject("path_hooks");
1308 if (path_hooks == NULL || !PyList_Check(path_hooks)) {
1309 PyErr_SetString(PyExc_ImportError,
1310 "sys.path_hooks must be a list of "
1311 "import hooks");
1312 return NULL;
1313 }
1314 path_importer_cache = PySys_GetObject("path_importer_cache");
1315 if (path_importer_cache == NULL ||
1316 !PyDict_Check(path_importer_cache)) {
1317 PyErr_SetString(PyExc_ImportError,
1318 "sys.path_importer_cache must be a dict");
1319 return NULL;
1320 }
1321
Guido van Rossum79f25d91997-04-29 20:08:16 +00001322 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001323 namelen = strlen(name);
1324 for (i = 0; i < npath; i++) {
Walter Dörwald3430d702002-06-17 10:43:59 +00001325 PyObject *copy = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001326 PyObject *v = PyList_GetItem(path, i);
Neal Norwitz3cb31ac2006-08-13 18:10:47 +00001327 if (!v)
1328 return NULL;
Walter Dörwald3430d702002-06-17 10:43:59 +00001329#ifdef Py_USING_UNICODE
1330 if (PyUnicode_Check(v)) {
1331 copy = PyUnicode_Encode(PyUnicode_AS_UNICODE(v),
1332 PyUnicode_GET_SIZE(v), Py_FileSystemDefaultEncoding, NULL);
1333 if (copy == NULL)
1334 return NULL;
1335 v = copy;
1336 }
1337 else
1338#endif
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001339 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001340 continue;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001341 len = PyString_GET_SIZE(v);
Walter Dörwald3430d702002-06-17 10:43:59 +00001342 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen) {
1343 Py_XDECREF(copy);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001344 continue; /* Too long */
Walter Dörwald3430d702002-06-17 10:43:59 +00001345 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001346 strcpy(buf, PyString_AS_STRING(v));
Walter Dörwald3430d702002-06-17 10:43:59 +00001347 if (strlen(buf) != len) {
1348 Py_XDECREF(copy);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001349 continue; /* v contains '\0' */
Walter Dörwald3430d702002-06-17 10:43:59 +00001350 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001351
1352 /* sys.path_hooks import hook */
1353 if (p_loader != NULL) {
1354 PyObject *importer;
1355
1356 importer = get_path_importer(path_importer_cache,
1357 path_hooks, v);
Neal Norwitza4df11d2006-07-06 04:28:59 +00001358 if (importer == NULL) {
1359 Py_XDECREF(copy);
Just van Rossum52e14d62002-12-30 22:08:05 +00001360 return NULL;
Neal Norwitza4df11d2006-07-06 04:28:59 +00001361 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001362 /* Note: importer is a borrowed reference */
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00001363 if (importer != Py_None) {
Just van Rossum52e14d62002-12-30 22:08:05 +00001364 PyObject *loader;
1365 loader = PyObject_CallMethod(importer,
1366 "find_module",
1367 "s", fullname);
Neal Norwitza4df11d2006-07-06 04:28:59 +00001368 Py_XDECREF(copy);
Just van Rossum52e14d62002-12-30 22:08:05 +00001369 if (loader == NULL)
1370 return NULL; /* error */
1371 if (loader != Py_None) {
1372 /* a loader was found */
1373 *p_loader = loader;
1374 return &importhookdescr;
1375 }
1376 Py_DECREF(loader);
Georg Brandlf4ef1162006-05-26 18:03:31 +00001377 continue;
Just van Rossum52e14d62002-12-30 22:08:05 +00001378 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001379 }
Georg Brandlf4ef1162006-05-26 18:03:31 +00001380 /* no hook was found, use builtin import */
Just van Rossum52e14d62002-12-30 22:08:05 +00001381
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001382 if (len > 0 && buf[len-1] != SEP
1383#ifdef ALTSEP
1384 && buf[len-1] != ALTSEP
1385#endif
1386 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001387 buf[len++] = SEP;
Guido van Rossum215c3402000-11-13 17:26:32 +00001388 strcpy(buf+len, name);
1389 len += namelen;
Tim Peters50d8d372001-02-28 05:34:27 +00001390
1391 /* Check for package import (buf holds a directory name,
1392 and there's an __init__ module in that directory */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001393#ifdef HAVE_STAT
Walter Dörwald3430d702002-06-17 10:43:59 +00001394 if (stat(buf, &statbuf) == 0 && /* it exists */
1395 S_ISDIR(statbuf.st_mode) && /* it's a directory */
Thomas Wouters9df4e6f2006-04-27 23:13:20 +00001396 case_ok(buf, len, namelen, name)) { /* case matches */
1397 if (find_init_module(buf)) { /* and has __init__.py */
1398 Py_XDECREF(copy);
1399 return &fd_package;
1400 }
1401 else {
1402 char warnstr[MAXPATHLEN+80];
1403 sprintf(warnstr, "Not importing directory "
1404 "'%.*s': missing __init__.py",
1405 MAXPATHLEN, buf);
1406 if (PyErr_Warn(PyExc_ImportWarning,
1407 warnstr)) {
1408 Py_XDECREF(copy);
1409 return NULL;
1410 }
1411 }
Walter Dörwald3430d702002-06-17 10:43:59 +00001412 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001413#else
1414 /* XXX How are you going to test for directories? */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001415#ifdef RISCOS
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001416 if (isdir(buf) &&
Walter Dörwald3430d702002-06-17 10:43:59 +00001417 case_ok(buf, len, namelen, name)) {
Thomas Wouters9df4e6f2006-04-27 23:13:20 +00001418 if (find_init_module(buf)) {
1419 Py_XDECREF(copy);
1420 return &fd_package;
1421 }
1422 else {
1423 char warnstr[MAXPATHLEN+80];
1424 sprintf(warnstr, "Not importing directory "
1425 "'%.*s': missing __init__.py",
1426 MAXPATHLEN, buf);
1427 if (PyErr_Warn(PyExc_ImportWarning,
1428 warnstr)) {
1429 Py_XDECREF(copy);
1430 return NULL;
1431 }
Walter Dörwald3430d702002-06-17 10:43:59 +00001432 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001433#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001434#endif
Andrew MacIntyred9400542002-02-26 11:41:34 +00001435#if defined(PYOS_OS2)
1436 /* take a snapshot of the module spec for restoration
1437 * after the 8 character DLL hackery
1438 */
1439 saved_buf = strdup(buf);
1440 saved_len = len;
1441 saved_namelen = namelen;
1442#endif /* PYOS_OS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001443 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Georg Brandladd36e52007-08-23 18:08:06 +00001444#if defined(PYOS_OS2) && defined(HAVE_DYNAMIC_LOADING)
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001445 /* OS/2 limits DLLs to 8 character names (w/o
1446 extension)
Andrew MacIntyred9400542002-02-26 11:41:34 +00001447 * so if the name is longer than that and its a
1448 * dynamically loaded module we're going to try,
1449 * truncate the name before trying
1450 */
Just van Rossum52e14d62002-12-30 22:08:05 +00001451 if (strlen(subname) > 8) {
Andrew MacIntyred9400542002-02-26 11:41:34 +00001452 /* is this an attempt to load a C extension? */
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001453 const struct filedescr *scan;
1454 scan = _PyImport_DynLoadFiletab;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001455 while (scan->suffix != NULL) {
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001456 if (!strcmp(scan->suffix, fdp->suffix))
Andrew MacIntyred9400542002-02-26 11:41:34 +00001457 break;
1458 else
1459 scan++;
1460 }
1461 if (scan->suffix != NULL) {
1462 /* yes, so truncate the name */
1463 namelen = 8;
Just van Rossum52e14d62002-12-30 22:08:05 +00001464 len -= strlen(subname) - namelen;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001465 buf[len] = '\0';
1466 }
1467 }
1468#endif /* PYOS_OS2 */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001469 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001470 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001471 PySys_WriteStderr("# trying %s\n", buf);
Jack Jansenc88da1f2002-05-28 10:58:19 +00001472 filemode = fdp->mode;
Tim Peters86c7d2f2004-08-01 23:24:21 +00001473 if (filemode[0] == 'U')
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001474 filemode = "r" PY_STDIOTEXTMODE;
Jack Jansenc88da1f2002-05-28 10:58:19 +00001475 fp = fopen(buf, filemode);
Tim Peters50d8d372001-02-28 05:34:27 +00001476 if (fp != NULL) {
1477 if (case_ok(buf, len, namelen, name))
1478 break;
1479 else { /* continue search */
1480 fclose(fp);
1481 fp = NULL;
Barry Warsaw914a0b12001-02-02 19:12:16 +00001482 }
Barry Warsaw914a0b12001-02-02 19:12:16 +00001483 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001484#if defined(PYOS_OS2)
1485 /* restore the saved snapshot */
1486 strcpy(buf, saved_buf);
1487 len = saved_len;
1488 namelen = saved_namelen;
1489#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001490 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001491#if defined(PYOS_OS2)
1492 /* don't need/want the module name snapshot anymore */
1493 if (saved_buf)
1494 {
1495 free(saved_buf);
1496 saved_buf = NULL;
1497 }
1498#endif
Walter Dörwald3430d702002-06-17 10:43:59 +00001499 Py_XDECREF(copy);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001500 if (fp != NULL)
1501 break;
1502 }
1503 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001504 PyErr_Format(PyExc_ImportError,
1505 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001506 return NULL;
1507 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001508 *p_fp = fp;
1509 return fdp;
1510}
1511
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +00001512/* Helpers for main.c
1513 * Find the source file corresponding to a named module
1514 */
1515struct filedescr *
1516_PyImport_FindModule(const char *name, PyObject *path, char *buf,
1517 size_t buflen, FILE **p_fp, PyObject **p_loader)
1518{
1519 return find_module((char *) name, (char *) name, path,
1520 buf, buflen, p_fp, p_loader);
1521}
1522
1523PyAPI_FUNC(int) _PyImport_IsScript(struct filedescr * fd)
1524{
1525 return fd->type == PY_SOURCE || fd->type == PY_COMPILED;
1526}
1527
Martin v. Löwis18e16552006-02-15 17:27:45 +00001528/* case_ok(char* buf, Py_ssize_t len, Py_ssize_t namelen, char* name)
Tim Petersd1e87a82001-03-01 18:12:00 +00001529 * The arguments here are tricky, best shown by example:
1530 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1531 * ^ ^ ^ ^
1532 * |--------------------- buf ---------------------|
1533 * |------------------- len ------------------|
1534 * |------ name -------|
1535 * |----- namelen -----|
1536 * buf is the full path, but len only counts up to (& exclusive of) the
1537 * extension. name is the module name, also exclusive of extension.
1538 *
1539 * We've already done a successful stat() or fopen() on buf, so know that
1540 * there's some match, possibly case-insensitive.
1541 *
Tim Peters50d8d372001-02-28 05:34:27 +00001542 * case_ok() is to return 1 if there's a case-sensitive match for
1543 * name, else 0. case_ok() is also to return 1 if envar PYTHONCASEOK
1544 * exists.
Tim Petersd1e87a82001-03-01 18:12:00 +00001545 *
Tim Peters50d8d372001-02-28 05:34:27 +00001546 * case_ok() is used to implement case-sensitive import semantics even
1547 * on platforms with case-insensitive filesystems. It's trivial to implement
1548 * for case-sensitive filesystems. It's pretty much a cross-platform
1549 * nightmare for systems with case-insensitive filesystems.
1550 */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001551
Tim Peters50d8d372001-02-28 05:34:27 +00001552/* First we may need a pile of platform-specific header files; the sequence
1553 * of #if's here should match the sequence in the body of case_ok().
1554 */
Jason Tishler7961aa62005-05-20 00:56:54 +00001555#if defined(MS_WINDOWS)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001556#include <windows.h>
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001557
Tim Peters50d8d372001-02-28 05:34:27 +00001558#elif defined(DJGPP)
1559#include <dir.h>
1560
Jason Tishler7961aa62005-05-20 00:56:54 +00001561#elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001562#include <sys/types.h>
1563#include <dirent.h>
1564
Andrew MacIntyred9400542002-02-26 11:41:34 +00001565#elif defined(PYOS_OS2)
1566#define INCL_DOS
1567#define INCL_DOSERRORS
1568#define INCL_NOPMAPI
1569#include <os2.h>
1570
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001571#elif defined(RISCOS)
1572#include "oslib/osfscontrol.h"
Tim Peters50d8d372001-02-28 05:34:27 +00001573#endif
1574
Guido van Rossum0980bd91998-02-13 17:18:36 +00001575static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001576case_ok(char *buf, Py_ssize_t len, Py_ssize_t namelen, char *name)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001577{
Tim Peters50d8d372001-02-28 05:34:27 +00001578/* Pick a platform-specific implementation; the sequence of #if's here should
1579 * match the sequence just above.
1580 */
1581
Jason Tishler7961aa62005-05-20 00:56:54 +00001582/* MS_WINDOWS */
1583#if defined(MS_WINDOWS)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001584 WIN32_FIND_DATA data;
1585 HANDLE h;
Tim Peters50d8d372001-02-28 05:34:27 +00001586
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001587 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001588 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001589
Guido van Rossum0980bd91998-02-13 17:18:36 +00001590 h = FindFirstFile(buf, &data);
1591 if (h == INVALID_HANDLE_VALUE) {
1592 PyErr_Format(PyExc_NameError,
1593 "Can't find file for module %.100s\n(filename %.300s)",
1594 name, buf);
1595 return 0;
1596 }
1597 FindClose(h);
Tim Peters50d8d372001-02-28 05:34:27 +00001598 return strncmp(data.cFileName, name, namelen) == 0;
1599
1600/* DJGPP */
1601#elif defined(DJGPP)
1602 struct ffblk ffblk;
1603 int done;
1604
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001605 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001606 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001607
1608 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
1609 if (done) {
Guido van Rossum0980bd91998-02-13 17:18:36 +00001610 PyErr_Format(PyExc_NameError,
Tim Peters50d8d372001-02-28 05:34:27 +00001611 "Can't find file for module %.100s\n(filename %.300s)",
Guido van Rossum0980bd91998-02-13 17:18:36 +00001612 name, buf);
1613 return 0;
1614 }
Tim Peters50d8d372001-02-28 05:34:27 +00001615 return strncmp(ffblk.ff_name, name, namelen) == 0;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001616
Jason Tishler7961aa62005-05-20 00:56:54 +00001617/* new-fangled macintosh (macosx) or Cygwin */
1618#elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001619 DIR *dirp;
1620 struct dirent *dp;
Tim Petersd1e87a82001-03-01 18:12:00 +00001621 char dirname[MAXPATHLEN + 1];
1622 const int dirlen = len - namelen - 1; /* don't want trailing SEP */
Tim Peters430f5d42001-03-01 01:30:56 +00001623
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001624 if (Py_GETENV("PYTHONCASEOK") != NULL)
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001625 return 1;
1626
Tim Petersd1e87a82001-03-01 18:12:00 +00001627 /* Copy the dir component into dirname; substitute "." if empty */
1628 if (dirlen <= 0) {
1629 dirname[0] = '.';
1630 dirname[1] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001631 }
1632 else {
Tim Petersd1e87a82001-03-01 18:12:00 +00001633 assert(dirlen <= MAXPATHLEN);
1634 memcpy(dirname, buf, dirlen);
1635 dirname[dirlen] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001636 }
1637 /* Open the directory and search the entries for an exact match. */
Tim Petersd1e87a82001-03-01 18:12:00 +00001638 dirp = opendir(dirname);
Tim Peters430f5d42001-03-01 01:30:56 +00001639 if (dirp) {
Tim Peters677898a2001-03-02 03:28:03 +00001640 char *nameWithExt = buf + len - namelen;
Tim Peters430f5d42001-03-01 01:30:56 +00001641 while ((dp = readdir(dirp)) != NULL) {
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001642 const int thislen =
Tim Peters430f5d42001-03-01 01:30:56 +00001643#ifdef _DIRENT_HAVE_D_NAMELEN
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001644 dp->d_namlen;
Tim Peters430f5d42001-03-01 01:30:56 +00001645#else
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001646 strlen(dp->d_name);
Tim Peters430f5d42001-03-01 01:30:56 +00001647#endif
Tim Petersd1e87a82001-03-01 18:12:00 +00001648 if (thislen >= namelen &&
Tim Peters677898a2001-03-02 03:28:03 +00001649 strcmp(dp->d_name, nameWithExt) == 0) {
Tim Peters430f5d42001-03-01 01:30:56 +00001650 (void)closedir(dirp);
1651 return 1; /* Found */
1652 }
1653 }
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001654 (void)closedir(dirp);
Tim Peters430f5d42001-03-01 01:30:56 +00001655 }
Tim Peters430f5d42001-03-01 01:30:56 +00001656 return 0 ; /* Not found */
Tim Peters430f5d42001-03-01 01:30:56 +00001657
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001658/* RISC OS */
1659#elif defined(RISCOS)
1660 char canon[MAXPATHLEN+1]; /* buffer for the canonical form of the path */
1661 char buf2[MAXPATHLEN+2];
1662 char *nameWithExt = buf+len-namelen;
1663 int canonlen;
1664 os_error *e;
1665
1666 if (Py_GETENV("PYTHONCASEOK") != NULL)
1667 return 1;
1668
1669 /* workaround:
1670 append wildcard, otherwise case of filename wouldn't be touched */
1671 strcpy(buf2, buf);
1672 strcat(buf2, "*");
1673
1674 e = xosfscontrol_canonicalise_path(buf2,canon,0,0,MAXPATHLEN+1,&canonlen);
1675 canonlen = MAXPATHLEN+1-canonlen;
1676 if (e || canonlen<=0 || canonlen>(MAXPATHLEN+1) )
1677 return 0;
1678 if (strcmp(nameWithExt, canon+canonlen-strlen(nameWithExt))==0)
1679 return 1; /* match */
1680
1681 return 0;
1682
Andrew MacIntyred9400542002-02-26 11:41:34 +00001683/* OS/2 */
1684#elif defined(PYOS_OS2)
1685 HDIR hdir = 1;
1686 ULONG srchcnt = 1;
1687 FILEFINDBUF3 ffbuf;
1688 APIRET rc;
1689
Georg Brandlaed6c662008-01-07 17:25:53 +00001690 if (Py_GETENV("PYTHONCASEOK") != NULL)
Andrew MacIntyred9400542002-02-26 11:41:34 +00001691 return 1;
1692
1693 rc = DosFindFirst(buf,
1694 &hdir,
1695 FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY,
1696 &ffbuf, sizeof(ffbuf),
1697 &srchcnt,
1698 FIL_STANDARD);
1699 if (rc != NO_ERROR)
1700 return 0;
1701 return strncmp(ffbuf.achName, name, namelen) == 0;
1702
Tim Peters50d8d372001-02-28 05:34:27 +00001703/* assuming it's a case-sensitive filesystem, so there's nothing to do! */
1704#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001705 return 1;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001706
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001707#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001708}
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001709
Guido van Rossum0980bd91998-02-13 17:18:36 +00001710
Guido van Rossum197346f1997-10-31 18:38:52 +00001711#ifdef HAVE_STAT
1712/* Helper to look for __init__.py or __init__.py[co] in potential package */
1713static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001714find_init_module(char *buf)
Guido van Rossum197346f1997-10-31 18:38:52 +00001715{
Tim Peters0f9431f2001-07-05 03:47:53 +00001716 const size_t save_len = strlen(buf);
Fred Drake4c82b232000-06-30 16:18:57 +00001717 size_t i = save_len;
Tim Peters0f9431f2001-07-05 03:47:53 +00001718 char *pname; /* pointer to start of __init__ */
Guido van Rossum197346f1997-10-31 18:38:52 +00001719 struct stat statbuf;
1720
Tim Peters0f9431f2001-07-05 03:47:53 +00001721/* For calling case_ok(buf, len, namelen, name):
1722 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1723 * ^ ^ ^ ^
1724 * |--------------------- buf ---------------------|
1725 * |------------------- len ------------------|
1726 * |------ name -------|
1727 * |----- namelen -----|
1728 */
Guido van Rossum197346f1997-10-31 18:38:52 +00001729 if (save_len + 13 >= MAXPATHLEN)
1730 return 0;
1731 buf[i++] = SEP;
Tim Peters0f9431f2001-07-05 03:47:53 +00001732 pname = buf + i;
1733 strcpy(pname, "__init__.py");
Guido van Rossum197346f1997-10-31 18:38:52 +00001734 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001735 if (case_ok(buf,
1736 save_len + 9, /* len("/__init__") */
1737 8, /* len("__init__") */
1738 pname)) {
1739 buf[save_len] = '\0';
1740 return 1;
1741 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001742 }
Tim Peters0f9431f2001-07-05 03:47:53 +00001743 i += strlen(pname);
1744 strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum197346f1997-10-31 18:38:52 +00001745 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001746 if (case_ok(buf,
1747 save_len + 9, /* len("/__init__") */
1748 8, /* len("__init__") */
1749 pname)) {
1750 buf[save_len] = '\0';
1751 return 1;
1752 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001753 }
1754 buf[save_len] = '\0';
1755 return 0;
1756}
Guido van Rossum48a680c2001-03-02 06:34:14 +00001757
1758#else
1759
1760#ifdef RISCOS
1761static int
1762find_init_module(buf)
1763 char *buf;
1764{
1765 int save_len = strlen(buf);
1766 int i = save_len;
1767
1768 if (save_len + 13 >= MAXPATHLEN)
1769 return 0;
1770 buf[i++] = SEP;
1771 strcpy(buf+i, "__init__/py");
1772 if (isfile(buf)) {
1773 buf[save_len] = '\0';
1774 return 1;
1775 }
1776
1777 if (Py_OptimizeFlag)
1778 strcpy(buf+i, "o");
1779 else
1780 strcpy(buf+i, "c");
1781 if (isfile(buf)) {
1782 buf[save_len] = '\0';
1783 return 1;
1784 }
1785 buf[save_len] = '\0';
1786 return 0;
1787}
1788#endif /*RISCOS*/
1789
Guido van Rossum197346f1997-10-31 18:38:52 +00001790#endif /* HAVE_STAT */
1791
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001792
Tim Petersdbd9ba62000-07-09 03:09:57 +00001793static int init_builtin(char *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001794
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001795/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001796 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001797
Guido van Rossum79f25d91997-04-29 20:08:16 +00001798static PyObject *
Just van Rossum52e14d62002-12-30 22:08:05 +00001799load_module(char *name, FILE *fp, char *buf, int type, PyObject *loader)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001800{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001801 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001802 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001803 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001804
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001805 /* First check that there's an open file (if we need one) */
1806 switch (type) {
1807 case PY_SOURCE:
1808 case PY_COMPILED:
1809 if (fp == NULL) {
1810 PyErr_Format(PyExc_ValueError,
1811 "file object required for import (type code %d)",
1812 type);
1813 return NULL;
1814 }
1815 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001816
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001817 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001818
1819 case PY_SOURCE:
1820 m = load_source_module(name, buf, fp);
1821 break;
1822
1823 case PY_COMPILED:
1824 m = load_compiled_module(name, buf, fp);
1825 break;
1826
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001827#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001828 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001829 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001830 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001831#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001832
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001833 case PKG_DIRECTORY:
1834 m = load_package(name, buf);
1835 break;
1836
1837 case C_BUILTIN:
1838 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001839 if (buf != NULL && buf[0] != '\0')
1840 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001841 if (type == C_BUILTIN)
1842 err = init_builtin(name);
1843 else
1844 err = PyImport_ImportFrozenModule(name);
1845 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001846 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001847 if (err == 0) {
1848 PyErr_Format(PyExc_ImportError,
1849 "Purported %s module %.200s not found",
1850 type == C_BUILTIN ?
1851 "builtin" : "frozen",
1852 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001853 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001854 }
1855 modules = PyImport_GetModuleDict();
1856 m = PyDict_GetItemString(modules, name);
1857 if (m == NULL) {
1858 PyErr_Format(
1859 PyExc_ImportError,
1860 "%s module %.200s not properly initialized",
1861 type == C_BUILTIN ?
1862 "builtin" : "frozen",
1863 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001864 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001865 }
1866 Py_INCREF(m);
1867 break;
1868
Just van Rossum52e14d62002-12-30 22:08:05 +00001869 case IMP_HOOK: {
1870 if (loader == NULL) {
1871 PyErr_SetString(PyExc_ImportError,
1872 "import hook without loader");
1873 return NULL;
1874 }
1875 m = PyObject_CallMethod(loader, "load_module", "s", name);
1876 break;
1877 }
1878
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001879 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001880 PyErr_Format(PyExc_ImportError,
1881 "Don't know how to import %.200s (type code %d)",
1882 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001883 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001884
1885 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001886
1887 return m;
1888}
1889
1890
1891/* Initialize a built-in module.
Brett Cannon5a9aa4f2006-10-03 21:58:55 +00001892 Return 1 for success, 0 if the module is not found, and -1 with
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001893 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001894
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001895static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001896init_builtin(char *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001897{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001898 struct _inittab *p;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001899
Greg Ward201baee2001-10-04 14:52:06 +00001900 if (_PyImport_FindExtension(name, name) != NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00001901 return 1;
1902
Guido van Rossum771c6c81997-10-31 18:37:24 +00001903 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001904 if (strcmp(name, p->name) == 0) {
1905 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001906 PyErr_Format(PyExc_ImportError,
1907 "Cannot re-init internal module %.200s",
1908 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001909 return -1;
1910 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001911 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001912 PySys_WriteStderr("import %s # builtin\n", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001913 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001914 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001915 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001916 if (_PyImport_FixupExtension(name, name) == NULL)
1917 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001918 return 1;
1919 }
1920 }
1921 return 0;
1922}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001923
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001924
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001925/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001926
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001927static struct _frozen *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001928find_frozen(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001929{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001930 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001931
Guido van Rossum79f25d91997-04-29 20:08:16 +00001932 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001933 if (p->name == NULL)
1934 return NULL;
1935 if (strcmp(p->name, name) == 0)
1936 break;
1937 }
1938 return p;
1939}
1940
Guido van Rossum79f25d91997-04-29 20:08:16 +00001941static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001942get_frozen_object(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001943{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001944 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001945 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001946
1947 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001948 PyErr_Format(PyExc_ImportError,
1949 "No such frozen object named %.200s",
1950 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001951 return NULL;
1952 }
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001953 if (p->code == NULL) {
1954 PyErr_Format(PyExc_ImportError,
1955 "Excluded frozen object named %.200s",
1956 name);
1957 return NULL;
1958 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001959 size = p->size;
1960 if (size < 0)
1961 size = -size;
1962 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001963}
1964
1965/* Initialize a frozen module.
1966 Return 1 for succes, 0 if the module is not found, and -1 with
1967 an exception set if the initialization failed.
1968 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001969
1970int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001971PyImport_ImportFrozenModule(char *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001972{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001973 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001974 PyObject *co;
1975 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001976 int ispackage;
1977 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001978
1979 if (p == NULL)
1980 return 0;
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001981 if (p->code == NULL) {
1982 PyErr_Format(PyExc_ImportError,
1983 "Excluded frozen object named %.200s",
1984 name);
1985 return -1;
1986 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001987 size = p->size;
1988 ispackage = (size < 0);
1989 if (ispackage)
1990 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001991 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001992 PySys_WriteStderr("import %s # frozen%s\n",
Guido van Rossuma5568d31998-03-05 03:45:08 +00001993 name, ispackage ? " package" : "");
1994 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001995 if (co == NULL)
1996 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001997 if (!PyCode_Check(co)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001998 PyErr_Format(PyExc_TypeError,
1999 "frozen object %.200s is not a code object",
2000 name);
Neal Norwitzc0cde4d2006-07-16 02:17:36 +00002001 goto err_return;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00002002 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00002003 if (ispackage) {
2004 /* Set __path__ to the package name */
2005 PyObject *d, *s;
2006 int err;
2007 m = PyImport_AddModule(name);
2008 if (m == NULL)
Neal Norwitzc0cde4d2006-07-16 02:17:36 +00002009 goto err_return;
Guido van Rossuma5568d31998-03-05 03:45:08 +00002010 d = PyModule_GetDict(m);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002011 s = PyString_InternFromString(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00002012 if (s == NULL)
Neal Norwitzc0cde4d2006-07-16 02:17:36 +00002013 goto err_return;
Guido van Rossuma5568d31998-03-05 03:45:08 +00002014 err = PyDict_SetItemString(d, "__path__", s);
2015 Py_DECREF(s);
2016 if (err != 0)
Neal Norwitzc0cde4d2006-07-16 02:17:36 +00002017 goto err_return;
Guido van Rossuma5568d31998-03-05 03:45:08 +00002018 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00002019 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum7f9fa971995-01-20 16:53:12 +00002020 if (m == NULL)
Neal Norwitzc0cde4d2006-07-16 02:17:36 +00002021 goto err_return;
2022 Py_DECREF(co);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002023 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00002024 return 1;
Neal Norwitzc0cde4d2006-07-16 02:17:36 +00002025err_return:
2026 Py_DECREF(co);
2027 return -1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00002028}
Guido van Rossum74e6a111994-08-29 12:54:38 +00002029
2030
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002031/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00002032 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00002033
Guido van Rossum79f25d91997-04-29 20:08:16 +00002034PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00002035PyImport_ImportModule(const char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00002036{
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00002037 PyObject *pname;
2038 PyObject *result;
2039
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002040 pname = PyString_FromString(name);
Neal Norwitza11e4c12003-03-23 14:31:01 +00002041 if (pname == NULL)
2042 return NULL;
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00002043 result = PyImport_Import(pname);
2044 Py_DECREF(pname);
2045 return result;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002046}
2047
Christian Heimes000a0742008-01-03 22:16:32 +00002048/* Import a module without blocking
2049 *
2050 * At first it tries to fetch the module from sys.modules. If the module was
2051 * never loaded before it loads it with PyImport_ImportModule() unless another
2052 * thread holds the import lock. In the latter case the function raises an
2053 * ImportError instead of blocking.
2054 *
2055 * Returns the module object with incremented ref count.
2056 */
2057PyObject *
2058PyImport_ImportModuleNoBlock(const char *name)
2059{
2060 PyObject *result;
2061 PyObject *modules;
2062 long me;
2063
2064 /* Try to get the module from sys.modules[name] */
2065 modules = PyImport_GetModuleDict();
2066 if (modules == NULL)
2067 return NULL;
2068
2069 result = PyDict_GetItemString(modules, name);
2070 if (result != NULL) {
2071 Py_INCREF(result);
2072 return result;
2073 }
2074 else {
2075 PyErr_Clear();
2076 }
Benjamin Peterson17f03ca2008-09-01 14:18:30 +00002077#ifdef WITH_THREAD
Christian Heimes000a0742008-01-03 22:16:32 +00002078 /* check the import lock
2079 * me might be -1 but I ignore the error here, the lock function
2080 * takes care of the problem */
2081 me = PyThread_get_thread_ident();
2082 if (import_lock_thread == -1 || import_lock_thread == me) {
2083 /* no thread or me is holding the lock */
2084 return PyImport_ImportModule(name);
2085 }
2086 else {
2087 PyErr_Format(PyExc_ImportError,
2088 "Failed to import %.200s because the import lock"
2089 "is held by another thread.",
2090 name);
2091 return NULL;
2092 }
Benjamin Peterson17f03ca2008-09-01 14:18:30 +00002093#else
2094 return PyImport_ImportModule(name);
2095#endif
Christian Heimes000a0742008-01-03 22:16:32 +00002096}
2097
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002098/* Forward declarations for helper routines */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002099static PyObject *get_parent(PyObject *globals, char *buf,
2100 Py_ssize_t *p_buflen, int level);
Tim Petersdbd9ba62000-07-09 03:09:57 +00002101static PyObject *load_next(PyObject *mod, PyObject *altmod,
Martin v. Löwis18e16552006-02-15 17:27:45 +00002102 char **p_name, char *buf, Py_ssize_t *p_buflen);
Tim Petersdbd9ba62000-07-09 03:09:57 +00002103static int mark_miss(char *name);
2104static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
Martin v. Löwis18e16552006-02-15 17:27:45 +00002105 char *buf, Py_ssize_t buflen, int recursive);
Tim Petersdbd9ba62000-07-09 03:09:57 +00002106static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002107
2108/* The Magnum Opus of dotted-name import :-) */
2109
Guido van Rossum75acc9c1998-03-03 22:26:50 +00002110static PyObject *
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002111import_module_level(char *name, PyObject *globals, PyObject *locals,
2112 PyObject *fromlist, int level)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002113{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002114 char buf[MAXPATHLEN+1];
Martin v. Löwis18e16552006-02-15 17:27:45 +00002115 Py_ssize_t buflen = 0;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002116 PyObject *parent, *head, *next, *tail;
2117
Christian Heimes3403f152008-01-09 19:56:33 +00002118 if (strchr(name, '/') != NULL
2119#ifdef MS_WINDOWS
2120 || strchr(name, '\\') != NULL
2121#endif
2122 ) {
2123 PyErr_SetString(PyExc_ImportError,
2124 "Import by filename is not supported.");
2125 return NULL;
2126 }
2127
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002128 parent = get_parent(globals, buf, &buflen, level);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002129 if (parent == NULL)
2130 return NULL;
2131
2132 head = load_next(parent, Py_None, &name, buf, &buflen);
2133 if (head == NULL)
2134 return NULL;
2135
2136 tail = head;
2137 Py_INCREF(tail);
2138 while (name) {
2139 next = load_next(tail, tail, &name, buf, &buflen);
2140 Py_DECREF(tail);
2141 if (next == NULL) {
2142 Py_DECREF(head);
2143 return NULL;
2144 }
2145 tail = next;
2146 }
Thomas Wouters8ddab272006-04-04 16:17:02 +00002147 if (tail == Py_None) {
2148 /* If tail is Py_None, both get_parent and load_next found
2149 an empty module name: someone called __import__("") or
2150 doctored faulty bytecode */
Thomas Wouters4bdaa272006-04-05 13:39:37 +00002151 Py_DECREF(tail);
2152 Py_DECREF(head);
Thomas Wouters8ddab272006-04-04 16:17:02 +00002153 PyErr_SetString(PyExc_ValueError,
2154 "Empty module name");
2155 return NULL;
2156 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002157
2158 if (fromlist != NULL) {
2159 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
2160 fromlist = NULL;
2161 }
2162
2163 if (fromlist == NULL) {
2164 Py_DECREF(tail);
2165 return head;
2166 }
2167
2168 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00002169 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002170 Py_DECREF(tail);
2171 return NULL;
2172 }
2173
2174 return tail;
2175}
2176
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002177PyObject *
2178PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals,
2179 PyObject *fromlist, int level)
2180{
2181 PyObject *result;
2182 lock_import();
2183 result = import_module_level(name, globals, locals, fromlist, level);
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00002184 if (unlock_import() < 0) {
2185 Py_XDECREF(result);
2186 PyErr_SetString(PyExc_RuntimeError,
2187 "not holding the import lock");
2188 return NULL;
2189 }
Guido van Rossum75acc9c1998-03-03 22:26:50 +00002190 return result;
2191}
2192
Fred Drake87590902004-05-28 20:21:36 +00002193/* Return the package that an import is being performed in. If globals comes
2194 from the module foo.bar.bat (not itself a package), this returns the
2195 sys.modules entry for foo.bar. If globals is from a package's __init__.py,
Georg Brandl5f6861d2006-05-28 21:57:35 +00002196 the package's entry in sys.modules is returned, as a borrowed reference.
Fred Drake87590902004-05-28 20:21:36 +00002197
2198 The *name* of the returned package is returned in buf, with the length of
2199 the name in *p_buflen.
2200
2201 If globals doesn't come from a package or a module in a package, or a
2202 corresponding entry is not found in sys.modules, Py_None is returned.
2203*/
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002204static PyObject *
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002205get_parent(PyObject *globals, char *buf, Py_ssize_t *p_buflen, int level)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002206{
2207 static PyObject *namestr = NULL;
2208 static PyObject *pathstr = NULL;
Nick Coghlanef01d822007-12-03 12:55:17 +00002209 static PyObject *pkgstr = NULL;
2210 PyObject *pkgname, *modname, *modpath, *modules, *parent;
Nick Coghlanb028f502008-07-13 14:52:36 +00002211 int orig_level = level;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002212
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002213 if (globals == NULL || !PyDict_Check(globals) || !level)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002214 return Py_None;
2215
2216 if (namestr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002217 namestr = PyString_InternFromString("__name__");
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002218 if (namestr == NULL)
2219 return NULL;
2220 }
2221 if (pathstr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002222 pathstr = PyString_InternFromString("__path__");
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002223 if (pathstr == NULL)
2224 return NULL;
2225 }
Nick Coghlanef01d822007-12-03 12:55:17 +00002226 if (pkgstr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002227 pkgstr = PyString_InternFromString("__package__");
Nick Coghlanef01d822007-12-03 12:55:17 +00002228 if (pkgstr == NULL)
2229 return NULL;
2230 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002231
2232 *buf = '\0';
2233 *p_buflen = 0;
Nick Coghlanef01d822007-12-03 12:55:17 +00002234 pkgname = PyDict_GetItem(globals, pkgstr);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002235
Nick Coghlanef01d822007-12-03 12:55:17 +00002236 if ((pkgname != NULL) && (pkgname != Py_None)) {
2237 /* __package__ is set, so use it */
2238 Py_ssize_t len;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002239 if (!PyString_Check(pkgname)) {
Nick Coghlanef01d822007-12-03 12:55:17 +00002240 PyErr_SetString(PyExc_ValueError,
2241 "__package__ set to non-string");
2242 return NULL;
2243 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002244 len = PyString_GET_SIZE(pkgname);
Nick Coghlanef01d822007-12-03 12:55:17 +00002245 if (len == 0) {
2246 if (level > 0) {
2247 PyErr_SetString(PyExc_ValueError,
2248 "Attempted relative import in non-package");
2249 return NULL;
2250 }
2251 return Py_None;
2252 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002253 if (len > MAXPATHLEN) {
2254 PyErr_SetString(PyExc_ValueError,
Nick Coghlanef01d822007-12-03 12:55:17 +00002255 "Package name too long");
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002256 return NULL;
2257 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002258 strcpy(buf, PyString_AS_STRING(pkgname));
Nick Coghlanef01d822007-12-03 12:55:17 +00002259 } else {
2260 /* __package__ not set, so figure it out and set it */
2261 modname = PyDict_GetItem(globals, namestr);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002262 if (modname == NULL || !PyString_Check(modname))
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002263 return Py_None;
Nick Coghlanef01d822007-12-03 12:55:17 +00002264
2265 modpath = PyDict_GetItem(globals, pathstr);
2266 if (modpath != NULL) {
2267 /* __path__ is set, so modname is already the package name */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002268 Py_ssize_t len = PyString_GET_SIZE(modname);
Nick Coghlanef01d822007-12-03 12:55:17 +00002269 int error;
2270 if (len > MAXPATHLEN) {
2271 PyErr_SetString(PyExc_ValueError,
2272 "Module name too long");
2273 return NULL;
2274 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002275 strcpy(buf, PyString_AS_STRING(modname));
Nick Coghlanef01d822007-12-03 12:55:17 +00002276 error = PyDict_SetItem(globals, pkgstr, modname);
2277 if (error) {
2278 PyErr_SetString(PyExc_ValueError,
2279 "Could not set __package__");
2280 return NULL;
2281 }
2282 } else {
2283 /* Normal module, so work out the package name if any */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002284 char *start = PyString_AS_STRING(modname);
Nick Coghlanef01d822007-12-03 12:55:17 +00002285 char *lastdot = strrchr(start, '.');
2286 size_t len;
2287 int error;
2288 if (lastdot == NULL && level > 0) {
2289 PyErr_SetString(PyExc_ValueError,
2290 "Attempted relative import in non-package");
2291 return NULL;
2292 }
2293 if (lastdot == NULL) {
2294 error = PyDict_SetItem(globals, pkgstr, Py_None);
2295 if (error) {
2296 PyErr_SetString(PyExc_ValueError,
2297 "Could not set __package__");
2298 return NULL;
2299 }
2300 return Py_None;
2301 }
2302 len = lastdot - start;
2303 if (len >= MAXPATHLEN) {
2304 PyErr_SetString(PyExc_ValueError,
2305 "Module name too long");
2306 return NULL;
2307 }
2308 strncpy(buf, start, len);
2309 buf[len] = '\0';
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002310 pkgname = PyString_FromString(buf);
Nick Coghlanef01d822007-12-03 12:55:17 +00002311 if (pkgname == NULL) {
2312 return NULL;
2313 }
2314 error = PyDict_SetItem(globals, pkgstr, pkgname);
2315 Py_DECREF(pkgname);
2316 if (error) {
2317 PyErr_SetString(PyExc_ValueError,
2318 "Could not set __package__");
2319 return NULL;
2320 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002321 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002322 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002323 while (--level > 0) {
2324 char *dot = strrchr(buf, '.');
2325 if (dot == NULL) {
2326 PyErr_SetString(PyExc_ValueError,
Georg Brandl98775df2006-09-06 06:09:31 +00002327 "Attempted relative import beyond "
2328 "toplevel package");
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002329 return NULL;
2330 }
2331 *dot = '\0';
2332 }
2333 *p_buflen = strlen(buf);
2334
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002335 modules = PyImport_GetModuleDict();
2336 parent = PyDict_GetItemString(modules, buf);
Nick Coghlanb028f502008-07-13 14:52:36 +00002337 if (parent == NULL) {
2338 if (orig_level < 1) {
2339 PyObject *err_msg = PyString_FromFormat(
2340 "Parent module '%.200s' not found "
2341 "while handling absolute import", buf);
2342 if (err_msg == NULL) {
2343 return NULL;
2344 }
2345 if (!PyErr_WarnEx(PyExc_RuntimeWarning,
2346 PyString_AsString(err_msg), 1)) {
2347 *buf = '\0';
2348 *p_buflen = 0;
2349 parent = Py_None;
2350 }
2351 Py_DECREF(err_msg);
2352 } else {
2353 PyErr_Format(PyExc_SystemError,
2354 "Parent module '%.200s' not loaded, "
2355 "cannot perform relative import", buf);
2356 }
2357 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002358 return parent;
2359 /* We expect, but can't guarantee, if parent != None, that:
2360 - parent.__name__ == buf
2361 - parent.__dict__ is globals
2362 If this is violated... Who cares? */
2363}
2364
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002365/* altmod is either None or same as mod */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002366static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002367load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
Martin v. Löwis18e16552006-02-15 17:27:45 +00002368 Py_ssize_t *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002369{
2370 char *name = *p_name;
2371 char *dot = strchr(name, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00002372 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002373 char *p;
2374 PyObject *result;
2375
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002376 if (strlen(name) == 0) {
Thomas Wouters8ddab272006-04-04 16:17:02 +00002377 /* completely empty module name should only happen in
2378 'from . import' (or '__import__("")')*/
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002379 Py_INCREF(mod);
2380 *p_name = NULL;
2381 return mod;
2382 }
2383
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002384 if (dot == NULL) {
2385 *p_name = NULL;
2386 len = strlen(name);
2387 }
2388 else {
2389 *p_name = dot+1;
2390 len = dot-name;
2391 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00002392 if (len == 0) {
2393 PyErr_SetString(PyExc_ValueError,
2394 "Empty module name");
2395 return NULL;
2396 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002397
2398 p = buf + *p_buflen;
2399 if (p != buf)
2400 *p++ = '.';
2401 if (p+len-buf >= MAXPATHLEN) {
2402 PyErr_SetString(PyExc_ValueError,
2403 "Module name too long");
2404 return NULL;
2405 }
2406 strncpy(p, name, len);
2407 p[len] = '\0';
2408 *p_buflen = p+len-buf;
2409
2410 result = import_submodule(mod, p, buf);
2411 if (result == Py_None && altmod != mod) {
2412 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00002413 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00002414 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00002415 if (result != NULL && result != Py_None) {
2416 if (mark_miss(buf) != 0) {
2417 Py_DECREF(result);
2418 return NULL;
2419 }
2420 strncpy(buf, name, len);
2421 buf[len] = '\0';
2422 *p_buflen = len;
2423 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002424 }
2425 if (result == NULL)
2426 return NULL;
2427
2428 if (result == Py_None) {
2429 Py_DECREF(result);
2430 PyErr_Format(PyExc_ImportError,
2431 "No module named %.200s", name);
2432 return NULL;
2433 }
2434
2435 return result;
2436}
2437
2438static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002439mark_miss(char *name)
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00002440{
2441 PyObject *modules = PyImport_GetModuleDict();
2442 return PyDict_SetItemString(modules, name, Py_None);
2443}
2444
2445static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002446ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, Py_ssize_t buflen,
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002447 int recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002448{
2449 int i;
2450
2451 if (!PyObject_HasAttrString(mod, "__path__"))
2452 return 1;
2453
2454 for (i = 0; ; i++) {
2455 PyObject *item = PySequence_GetItem(fromlist, i);
2456 int hasit;
2457 if (item == NULL) {
2458 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2459 PyErr_Clear();
2460 return 1;
2461 }
2462 return 0;
2463 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002464 if (!PyString_Check(item)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002465 PyErr_SetString(PyExc_TypeError,
2466 "Item in ``from list'' not a string");
2467 Py_DECREF(item);
2468 return 0;
2469 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002470 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00002471 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002472 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00002473 /* See if the package defines __all__ */
2474 if (recursive)
2475 continue; /* Avoid endless recursion */
2476 all = PyObject_GetAttrString(mod, "__all__");
2477 if (all == NULL)
2478 PyErr_Clear();
2479 else {
Martin v. Löwis83969ee2004-03-23 16:28:13 +00002480 int ret = ensure_fromlist(mod, all, buf, buflen, 1);
Guido van Rossum9905ef91997-09-08 16:07:11 +00002481 Py_DECREF(all);
Martin v. Löwis83969ee2004-03-23 16:28:13 +00002482 if (!ret)
2483 return 0;
Guido van Rossum9905ef91997-09-08 16:07:11 +00002484 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002485 continue;
2486 }
2487 hasit = PyObject_HasAttr(mod, item);
2488 if (!hasit) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002489 char *subname = PyString_AS_STRING(item);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002490 PyObject *submod;
2491 char *p;
2492 if (buflen + strlen(subname) >= MAXPATHLEN) {
2493 PyErr_SetString(PyExc_ValueError,
2494 "Module name too long");
2495 Py_DECREF(item);
2496 return 0;
2497 }
2498 p = buf + buflen;
2499 *p++ = '.';
2500 strcpy(p, subname);
2501 submod = import_submodule(mod, subname, buf);
2502 Py_XDECREF(submod);
2503 if (submod == NULL) {
2504 Py_DECREF(item);
2505 return 0;
2506 }
2507 }
2508 Py_DECREF(item);
2509 }
2510
Guido van Rossuma7f2e811997-10-03 15:33:32 +00002511 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002512}
2513
Neil Schemenauer00b09662003-06-16 21:03:07 +00002514static int
2515add_submodule(PyObject *mod, PyObject *submod, char *fullname, char *subname,
2516 PyObject *modules)
2517{
2518 if (mod == Py_None)
2519 return 1;
2520 /* Irrespective of the success of this load, make a
2521 reference to it in the parent package module. A copy gets
2522 saved in the modules dictionary under the full name, so get a
2523 reference from there, if need be. (The exception is when the
2524 load failed with a SyntaxError -- then there's no trace in
2525 sys.modules. In that case, of course, do nothing extra.) */
2526 if (submod == NULL) {
2527 submod = PyDict_GetItemString(modules, fullname);
2528 if (submod == NULL)
2529 return 1;
2530 }
2531 if (PyModule_Check(mod)) {
2532 /* We can't use setattr here since it can give a
2533 * spurious warning if the submodule name shadows a
2534 * builtin name */
2535 PyObject *dict = PyModule_GetDict(mod);
2536 if (!dict)
2537 return 0;
2538 if (PyDict_SetItemString(dict, subname, submod) < 0)
2539 return 0;
2540 }
2541 else {
2542 if (PyObject_SetAttrString(mod, subname, submod) < 0)
2543 return 0;
2544 }
2545 return 1;
2546}
2547
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002548static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002549import_submodule(PyObject *mod, char *subname, char *fullname)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002550{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002551 PyObject *modules = PyImport_GetModuleDict();
Neil Schemenauer00b09662003-06-16 21:03:07 +00002552 PyObject *m = NULL;
Guido van Rossum74e6a111994-08-29 12:54:38 +00002553
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002554 /* Require:
2555 if mod == None: subname == fullname
2556 else: mod.__name__ + "." + subname == fullname
2557 */
2558
Tim Peters50d8d372001-02-28 05:34:27 +00002559 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002560 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00002561 }
2562 else {
Just van Rossum52e14d62002-12-30 22:08:05 +00002563 PyObject *path, *loader = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002564 char buf[MAXPATHLEN+1];
2565 struct filedescr *fdp;
2566 FILE *fp = NULL;
2567
Guido van Rossum9c0afe51998-05-19 15:09:05 +00002568 if (mod == Py_None)
2569 path = NULL;
2570 else {
2571 path = PyObject_GetAttrString(mod, "__path__");
2572 if (path == NULL) {
2573 PyErr_Clear();
2574 Py_INCREF(Py_None);
2575 return Py_None;
2576 }
2577 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002578
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002579 buf[0] = '\0';
Just van Rossum52e14d62002-12-30 22:08:05 +00002580 fdp = find_module(fullname, subname, path, buf, MAXPATHLEN+1,
2581 &fp, &loader);
Guido van Rossumb68cd421998-07-01 17:36:26 +00002582 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002583 if (fdp == NULL) {
2584 if (!PyErr_ExceptionMatches(PyExc_ImportError))
2585 return NULL;
2586 PyErr_Clear();
2587 Py_INCREF(Py_None);
2588 return Py_None;
2589 }
Just van Rossum52e14d62002-12-30 22:08:05 +00002590 m = load_module(fullname, fp, buf, fdp->type, loader);
2591 Py_XDECREF(loader);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002592 if (fp)
2593 fclose(fp);
Neil Schemenauer00b09662003-06-16 21:03:07 +00002594 if (!add_submodule(mod, m, fullname, subname, modules)) {
2595 Py_XDECREF(m);
2596 m = NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002597 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00002598 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002599
2600 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00002601}
2602
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002603
2604/* Re-import a module of any kind and return its module object, WITH
2605 INCREMENTED REFERENCE COUNT */
2606
Guido van Rossum79f25d91997-04-29 20:08:16 +00002607PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002608PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002609{
Collin Winter47c52a82007-03-13 23:02:15 +00002610 PyInterpreterState *interp = PyThreadState_Get()->interp;
2611 PyObject *modules_reloading = interp->modules_reloading;
Guido van Rossum25ce5661997-08-02 03:10:38 +00002612 PyObject *modules = PyImport_GetModuleDict();
Collin Winter276887b2007-03-12 16:11:39 +00002613 PyObject *path = NULL, *loader = NULL, *existing_m = NULL;
Guido van Rossum222ef561997-09-06 19:41:09 +00002614 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002615 char buf[MAXPATHLEN+1];
2616 struct filedescr *fdp;
2617 FILE *fp = NULL;
Tim Peters1cd70172004-08-02 03:52:12 +00002618 PyObject *newm;
Collin Winter47c52a82007-03-13 23:02:15 +00002619
2620 if (modules_reloading == NULL) {
2621 Py_FatalError("PyImport_ReloadModule: "
Neal Norwitz2fca81c2007-05-30 04:53:41 +00002622 "no modules_reloading dictionary!");
Collin Winter47c52a82007-03-13 23:02:15 +00002623 return NULL;
2624 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002625
Guido van Rossum79f25d91997-04-29 20:08:16 +00002626 if (m == NULL || !PyModule_Check(m)) {
2627 PyErr_SetString(PyExc_TypeError,
2628 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002629 return NULL;
2630 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002631 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002632 if (name == NULL)
2633 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00002634 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002635 PyErr_Format(PyExc_ImportError,
2636 "reload(): module %.200s not in sys.modules",
2637 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002638 return NULL;
2639 }
Neal Norwitz75c7c802007-03-13 05:31:38 +00002640 existing_m = PyDict_GetItemString(modules_reloading, name);
2641 if (existing_m != NULL) {
2642 /* Due to a recursive reload, this module is already
2643 being reloaded. */
2644 Py_INCREF(existing_m);
2645 return existing_m;
Collin Winter276887b2007-03-12 16:11:39 +00002646 }
Neal Norwitz75c7c802007-03-13 05:31:38 +00002647 if (PyDict_SetItemString(modules_reloading, name, m) < 0)
2648 return NULL;
Collin Winter276887b2007-03-12 16:11:39 +00002649
Guido van Rossum222ef561997-09-06 19:41:09 +00002650 subname = strrchr(name, '.');
2651 if (subname == NULL)
2652 subname = name;
2653 else {
2654 PyObject *parentname, *parent;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002655 parentname = PyString_FromStringAndSize(name, (subname-name));
Collin Winter276887b2007-03-12 16:11:39 +00002656 if (parentname == NULL) {
2657 imp_modules_reloading_clear();
Guido van Rossum222ef561997-09-06 19:41:09 +00002658 return NULL;
Neal Norwitz75c7c802007-03-13 05:31:38 +00002659 }
Guido van Rossum222ef561997-09-06 19:41:09 +00002660 parent = PyDict_GetItem(modules, parentname);
2661 if (parent == NULL) {
2662 PyErr_Format(PyExc_ImportError,
2663 "reload(): parent %.200s not in sys.modules",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002664 PyString_AS_STRING(parentname));
Georg Brandl0c55f292005-09-14 06:56:20 +00002665 Py_DECREF(parentname);
Neal Norwitz2fca81c2007-05-30 04:53:41 +00002666 imp_modules_reloading_clear();
Guido van Rossum222ef561997-09-06 19:41:09 +00002667 return NULL;
2668 }
Georg Brandl0c55f292005-09-14 06:56:20 +00002669 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00002670 subname++;
2671 path = PyObject_GetAttrString(parent, "__path__");
2672 if (path == NULL)
2673 PyErr_Clear();
2674 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002675 buf[0] = '\0';
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002676 fdp = find_module(name, subname, path, buf, MAXPATHLEN+1, &fp, &loader);
Guido van Rossum222ef561997-09-06 19:41:09 +00002677 Py_XDECREF(path);
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002678
2679 if (fdp == NULL) {
2680 Py_XDECREF(loader);
Collin Winter276887b2007-03-12 16:11:39 +00002681 imp_modules_reloading_clear();
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002682 return NULL;
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002683 }
2684
2685 newm = load_module(name, fp, buf, fdp->type, loader);
2686 Py_XDECREF(loader);
2687
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002688 if (fp)
2689 fclose(fp);
Tim Peters1cd70172004-08-02 03:52:12 +00002690 if (newm == NULL) {
2691 /* load_module probably removed name from modules because of
2692 * the error. Put back the original module object. We're
2693 * going to return NULL in this case regardless of whether
2694 * replacing name succeeds, so the return value is ignored.
2695 */
2696 PyDict_SetItemString(modules, name, m);
2697 }
Neal Norwitz75c7c802007-03-13 05:31:38 +00002698 imp_modules_reloading_clear();
Tim Peters1cd70172004-08-02 03:52:12 +00002699 return newm;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002700}
2701
2702
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002703/* Higher-level import emulator which emulates the "import" statement
2704 more accurately -- it invokes the __import__() function from the
2705 builtins of the current globals. This means that the import is
2706 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00002707 environment, e.g. by "rexec".
2708 A dummy list ["__doc__"] is passed as the 4th argument so that
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002709 e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
Guido van Rossum6058eb41998-12-21 19:51:00 +00002710 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002711
2712PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002713PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002714{
2715 static PyObject *silly_list = NULL;
2716 static PyObject *builtins_str = NULL;
2717 static PyObject *import_str = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002718 PyObject *globals = NULL;
2719 PyObject *import = NULL;
2720 PyObject *builtins = NULL;
2721 PyObject *r = NULL;
2722
2723 /* Initialize constant string objects */
2724 if (silly_list == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002725 import_str = PyString_InternFromString("__import__");
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002726 if (import_str == NULL)
2727 return NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002728 builtins_str = PyString_InternFromString("__builtins__");
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002729 if (builtins_str == NULL)
2730 return NULL;
2731 silly_list = Py_BuildValue("[s]", "__doc__");
2732 if (silly_list == NULL)
2733 return NULL;
2734 }
2735
2736 /* Get the builtins from current globals */
2737 globals = PyEval_GetGlobals();
Guido van Rossum85cd1d62001-02-20 21:43:24 +00002738 if (globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00002739 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002740 builtins = PyObject_GetItem(globals, builtins_str);
2741 if (builtins == NULL)
2742 goto err;
2743 }
2744 else {
2745 /* No globals -- use standard builtins, and fake globals */
2746 PyErr_Clear();
2747
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002748 builtins = PyImport_ImportModuleLevel("__builtin__",
2749 NULL, NULL, NULL, 0);
Guido van Rossum85cd1d62001-02-20 21:43:24 +00002750 if (builtins == NULL)
2751 return NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002752 globals = Py_BuildValue("{OO}", builtins_str, builtins);
2753 if (globals == NULL)
2754 goto err;
2755 }
2756
2757 /* Get the __import__ function from the builtins */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002758 if (PyDict_Check(builtins)) {
Fred Drakea76ba6e2001-03-06 06:31:15 +00002759 import = PyObject_GetItem(builtins, import_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002760 if (import == NULL)
2761 PyErr_SetObject(PyExc_KeyError, import_str);
2762 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002763 else
Fred Drakea76ba6e2001-03-06 06:31:15 +00002764 import = PyObject_GetAttr(builtins, import_str);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002765 if (import == NULL)
2766 goto err;
2767
Christian Heimes000a0742008-01-03 22:16:32 +00002768 /* Call the __import__ function with the proper argument list
2769 * Always use absolute import here. */
2770 r = PyObject_CallFunction(import, "OOOOi", module_name, globals,
2771 globals, silly_list, 0, NULL);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002772
2773 err:
2774 Py_XDECREF(globals);
2775 Py_XDECREF(builtins);
2776 Py_XDECREF(import);
Tim Peters50d8d372001-02-28 05:34:27 +00002777
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002778 return r;
2779}
2780
2781
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002782/* Module 'imp' provides Python access to the primitives used for
2783 importing modules.
2784*/
2785
Guido van Rossum79f25d91997-04-29 20:08:16 +00002786static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +00002787imp_get_magic(PyObject *self, PyObject *noargs)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002788{
2789 char buf[4];
2790
Guido van Rossum96774c12000-05-01 20:19:08 +00002791 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
2792 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
2793 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
2794 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002795
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002796 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002797}
2798
Guido van Rossum79f25d91997-04-29 20:08:16 +00002799static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +00002800imp_get_suffixes(PyObject *self, PyObject *noargs)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002801{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002802 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002803 struct filedescr *fdp;
2804
Guido van Rossum79f25d91997-04-29 20:08:16 +00002805 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002806 if (list == NULL)
2807 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002808 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
2809 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002810 fdp->suffix, fdp->mode, fdp->type);
2811 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002812 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002813 return NULL;
2814 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002815 if (PyList_Append(list, item) < 0) {
2816 Py_DECREF(list);
2817 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002818 return NULL;
2819 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002820 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002821 }
2822 return list;
2823}
2824
Guido van Rossum79f25d91997-04-29 20:08:16 +00002825static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002826call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002827{
Tim Petersdbd9ba62000-07-09 03:09:57 +00002828 extern int fclose(FILE *);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002829 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002830 struct filedescr *fdp;
2831 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002832 FILE *fp = NULL;
2833
2834 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002835 if (path == Py_None)
2836 path = NULL;
Just van Rossum52e14d62002-12-30 22:08:05 +00002837 fdp = find_module(NULL, name, path, pathname, MAXPATHLEN+1, &fp, NULL);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002838 if (fdp == NULL)
2839 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002840 if (fp != NULL) {
2841 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
2842 if (fob == NULL) {
2843 fclose(fp);
2844 return NULL;
2845 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002846 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002847 else {
2848 fob = Py_None;
2849 Py_INCREF(fob);
Tim Peters50d8d372001-02-28 05:34:27 +00002850 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002851 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002852 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002853 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002854 return ret;
2855}
2856
Guido van Rossum79f25d91997-04-29 20:08:16 +00002857static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002858imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002859{
2860 char *name;
2861 PyObject *path = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002862 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002863 return NULL;
2864 return call_find_module(name, path);
2865}
2866
2867static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002868imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002869{
2870 char *name;
2871 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002872 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002873 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002874 return NULL;
2875 ret = init_builtin(name);
2876 if (ret < 0)
2877 return NULL;
2878 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002879 Py_INCREF(Py_None);
2880 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002881 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002882 m = PyImport_AddModule(name);
2883 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002884 return m;
2885}
2886
Guido van Rossum79f25d91997-04-29 20:08:16 +00002887static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002888imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002889{
2890 char *name;
2891 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002892 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002893 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002894 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002895 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002896 if (ret < 0)
2897 return NULL;
2898 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002899 Py_INCREF(Py_None);
2900 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002901 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002902 m = PyImport_AddModule(name);
2903 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002904 return m;
2905}
2906
Guido van Rossum79f25d91997-04-29 20:08:16 +00002907static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002908imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002909{
2910 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002911
Guido van Rossum43713e52000-02-29 13:59:29 +00002912 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002913 return NULL;
2914 return get_frozen_object(name);
2915}
2916
Guido van Rossum79f25d91997-04-29 20:08:16 +00002917static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002918imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002919{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002920 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002921 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002922 return NULL;
Guido van Rossum50ee94f2002-04-09 18:00:58 +00002923 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002924}
2925
Guido van Rossum79f25d91997-04-29 20:08:16 +00002926static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002927imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002928{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002929 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002930 struct _frozen *p;
Guido van Rossum43713e52000-02-29 13:59:29 +00002931 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002932 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002933 p = find_frozen(name);
Guido van Rossumb8bff3f2002-04-07 06:34:38 +00002934 return PyBool_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002935}
2936
2937static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002938get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002939{
2940 FILE *fp;
2941 if (fob == NULL) {
Tim Peters86c7d2f2004-08-01 23:24:21 +00002942 if (mode[0] == 'U')
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00002943 mode = "r" PY_STDIOTEXTMODE;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002944 fp = fopen(pathname, mode);
2945 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002946 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002947 }
2948 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002949 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002950 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002951 PyErr_SetString(PyExc_ValueError,
2952 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002953 }
2954 return fp;
2955}
2956
Guido van Rossum79f25d91997-04-29 20:08:16 +00002957static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002958imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002959{
2960 char *name;
2961 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002962 PyObject *fob = NULL;
2963 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002964 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00002965 if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002966 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002967 return NULL;
2968 fp = get_file(pathname, fob, "rb");
2969 if (fp == NULL)
2970 return NULL;
2971 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002972 if (fob == NULL)
2973 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002974 return m;
2975}
2976
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002977#ifdef HAVE_DYNAMIC_LOADING
2978
Guido van Rossum79f25d91997-04-29 20:08:16 +00002979static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002980imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002981{
2982 char *name;
2983 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002984 PyObject *fob = NULL;
2985 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002986 FILE *fp = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002987 if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002988 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002989 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002990 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002991 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002992 if (fp == NULL)
2993 return NULL;
2994 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002995 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002996 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002997}
2998
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002999#endif /* HAVE_DYNAMIC_LOADING */
3000
Guido van Rossum79f25d91997-04-29 20:08:16 +00003001static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003002imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003003{
3004 char *name;
3005 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003006 PyObject *fob = NULL;
3007 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003008 FILE *fp;
Guido van Rossum43713e52000-02-29 13:59:29 +00003009 if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00003010 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003011 return NULL;
3012 fp = get_file(pathname, fob, "r");
3013 if (fp == NULL)
3014 return NULL;
3015 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003016 if (fob == NULL)
3017 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003018 return m;
3019}
3020
Guido van Rossum79f25d91997-04-29 20:08:16 +00003021static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003022imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003023{
3024 char *name;
3025 PyObject *fob;
3026 char *pathname;
3027 char *suffix; /* Unused */
3028 char *mode;
3029 int type;
3030 FILE *fp;
3031
Guido van Rossum43713e52000-02-29 13:59:29 +00003032 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003033 &name, &fob, &pathname,
3034 &suffix, &mode, &type))
3035 return NULL;
Guido van Rossum5e2c5fa2002-05-30 17:33:07 +00003036 if (*mode) {
3037 /* Mode must start with 'r' or 'U' and must not contain '+'.
3038 Implicit in this test is the assumption that the mode
3039 may contain other modifiers like 'b' or 't'. */
3040
3041 if (!(*mode == 'r' || *mode == 'U') || strchr(mode, '+')) {
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00003042 PyErr_Format(PyExc_ValueError,
3043 "invalid file open mode %.200s", mode);
3044 return NULL;
Guido van Rossum5e2c5fa2002-05-30 17:33:07 +00003045 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003046 }
3047 if (fob == Py_None)
3048 fp = NULL;
3049 else {
3050 if (!PyFile_Check(fob)) {
3051 PyErr_SetString(PyExc_ValueError,
3052 "load_module arg#2 should be a file or None");
3053 return NULL;
3054 }
3055 fp = get_file(pathname, fob, mode);
3056 if (fp == NULL)
3057 return NULL;
3058 }
Just van Rossum52e14d62002-12-30 22:08:05 +00003059 return load_module(name, fp, pathname, type, NULL);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003060}
3061
3062static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003063imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003064{
3065 char *name;
3066 char *pathname;
Guido van Rossum43713e52000-02-29 13:59:29 +00003067 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003068 return NULL;
3069 return load_package(name, pathname);
3070}
3071
3072static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003073imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003074{
3075 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00003076 if (!PyArg_ParseTuple(args, "s:new_module", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003077 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003078 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003079}
3080
Brett Cannon3aa2a492008-08-06 22:28:09 +00003081static PyObject *
3082imp_reload(PyObject *self, PyObject *v)
3083{
3084 return PyImport_ReloadModule(v);
3085}
3086
3087
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003088/* Doc strings */
3089
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003090PyDoc_STRVAR(doc_imp,
3091"This module provides the components needed to build your own\n\
3092__import__ function. Undocumented functions are obsolete.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003093
Brett Cannon3aa2a492008-08-06 22:28:09 +00003094PyDoc_STRVAR(doc_reload,
3095"reload(module) -> module\n\
3096\n\
3097Reload the module. The module must have been successfully imported before.");
3098
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003099PyDoc_STRVAR(doc_find_module,
3100"find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003101Search for a module. If path is omitted or None, search for a\n\
3102built-in, frozen or special module and continue search in sys.path.\n\
3103The module name cannot contain '.'; to search for a submodule of a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003104package, pass the submodule name and the package's __path__.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003105
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003106PyDoc_STRVAR(doc_load_module,
3107"load_module(name, file, filename, (suffix, mode, type)) -> module\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003108Load a module, given information returned by find_module().\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003109The module name must include the full package name, if any.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003110
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003111PyDoc_STRVAR(doc_get_magic,
3112"get_magic() -> string\n\
3113Return the magic number for .pyc or .pyo files.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003114
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003115PyDoc_STRVAR(doc_get_suffixes,
3116"get_suffixes() -> [(suffix, mode, type), ...]\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003117Return a list of (suffix, mode, type) tuples describing the files\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003118that find_module() looks for.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003119
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003120PyDoc_STRVAR(doc_new_module,
3121"new_module(name) -> module\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003122Create a new module. Do not enter it in sys.modules.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003123The module name must include the full package name, if any.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003124
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003125PyDoc_STRVAR(doc_lock_held,
Tim Petersa7c65092004-08-01 23:26:05 +00003126"lock_held() -> boolean\n\
3127Return True if the import lock is currently held, else False.\n\
3128On platforms without threads, return False.");
Tim Peters69232342001-08-30 05:16:13 +00003129
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00003130PyDoc_STRVAR(doc_acquire_lock,
3131"acquire_lock() -> None\n\
Neal Norwitz2294c0d2003-02-12 23:02:21 +00003132Acquires the interpreter's import lock for the current thread.\n\
3133This lock should be used by import hooks to ensure thread-safety\n\
3134when importing modules.\n\
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00003135On platforms without threads, this function does nothing.");
3136
3137PyDoc_STRVAR(doc_release_lock,
3138"release_lock() -> None\n\
3139Release the interpreter's import lock.\n\
3140On platforms without threads, this function does nothing.");
3141
Guido van Rossum79f25d91997-04-29 20:08:16 +00003142static PyMethodDef imp_methods[] = {
Brett Cannon3aa2a492008-08-06 22:28:09 +00003143 {"reload", imp_reload, METH_O, doc_reload},
Neal Norwitz08ea61a2003-02-17 18:18:00 +00003144 {"find_module", imp_find_module, METH_VARARGS, doc_find_module},
3145 {"get_magic", imp_get_magic, METH_NOARGS, doc_get_magic},
3146 {"get_suffixes", imp_get_suffixes, METH_NOARGS, doc_get_suffixes},
3147 {"load_module", imp_load_module, METH_VARARGS, doc_load_module},
3148 {"new_module", imp_new_module, METH_VARARGS, doc_new_module},
3149 {"lock_held", imp_lock_held, METH_NOARGS, doc_lock_held},
3150 {"acquire_lock", imp_acquire_lock, METH_NOARGS, doc_acquire_lock},
3151 {"release_lock", imp_release_lock, METH_NOARGS, doc_release_lock},
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003152 /* The rest are obsolete */
Neal Norwitz031829d2002-03-31 14:37:44 +00003153 {"get_frozen_object", imp_get_frozen_object, METH_VARARGS},
3154 {"init_builtin", imp_init_builtin, METH_VARARGS},
3155 {"init_frozen", imp_init_frozen, METH_VARARGS},
3156 {"is_builtin", imp_is_builtin, METH_VARARGS},
3157 {"is_frozen", imp_is_frozen, METH_VARARGS},
3158 {"load_compiled", imp_load_compiled, METH_VARARGS},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00003159#ifdef HAVE_DYNAMIC_LOADING
Neal Norwitz031829d2002-03-31 14:37:44 +00003160 {"load_dynamic", imp_load_dynamic, METH_VARARGS},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00003161#endif
Neal Norwitz031829d2002-03-31 14:37:44 +00003162 {"load_package", imp_load_package, METH_VARARGS},
Neal Norwitz031829d2002-03-31 14:37:44 +00003163 {"load_source", imp_load_source, METH_VARARGS},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003164 {NULL, NULL} /* sentinel */
3165};
3166
Guido van Rossum1a8791e1998-08-04 22:46:29 +00003167static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003168setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003169{
3170 PyObject *v;
3171 int err;
3172
3173 v = PyInt_FromLong((long)value);
3174 err = PyDict_SetItemString(d, name, v);
3175 Py_XDECREF(v);
3176 return err;
3177}
3178
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003179typedef struct {
3180 PyObject_HEAD
3181} NullImporter;
3182
3183static int
3184NullImporter_init(NullImporter *self, PyObject *args, PyObject *kwds)
3185{
3186 char *path;
Christian Heimescea681b2007-11-07 17:50:54 +00003187 Py_ssize_t pathlen;
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003188
3189 if (!_PyArg_NoKeywords("NullImporter()", kwds))
3190 return -1;
3191
3192 if (!PyArg_ParseTuple(args, "s:NullImporter",
3193 &path))
3194 return -1;
3195
Christian Heimescea681b2007-11-07 17:50:54 +00003196 pathlen = strlen(path);
3197 if (pathlen == 0) {
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003198 PyErr_SetString(PyExc_ImportError, "empty pathname");
3199 return -1;
3200 } else {
3201#ifndef RISCOS
3202 struct stat statbuf;
3203 int rv;
3204
3205 rv = stat(path, &statbuf);
Christian Heimes004c1c12007-11-07 18:30:22 +00003206#ifdef MS_WINDOWS
3207 /* MS Windows stat() chokes on paths like C:\path\. Try to
3208 * recover *one* time by stripping off a trailing slash or
3209 * backslash. http://bugs.python.org/issue1293
3210 */
Christian Heimescea681b2007-11-07 17:50:54 +00003211 if (rv != 0 && pathlen <= MAXPATHLEN &&
3212 (path[pathlen-1] == '/' || path[pathlen-1] == '\\')) {
3213 char mangled[MAXPATHLEN+1];
3214
3215 strcpy(mangled, path);
3216 mangled[pathlen-1] = '\0';
3217 rv = stat(mangled, &statbuf);
3218 }
Christian Heimescea681b2007-11-07 17:50:54 +00003219#endif
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003220 if (rv == 0) {
3221 /* it exists */
3222 if (S_ISDIR(statbuf.st_mode)) {
3223 /* it's a directory */
3224 PyErr_SetString(PyExc_ImportError,
3225 "existing directory");
3226 return -1;
3227 }
3228 }
3229#else
3230 if (object_exists(path)) {
3231 /* it exists */
3232 if (isdir(path)) {
3233 /* it's a directory */
3234 PyErr_SetString(PyExc_ImportError,
3235 "existing directory");
3236 return -1;
3237 }
3238 }
3239#endif
3240 }
3241 return 0;
3242}
3243
3244static PyObject *
3245NullImporter_find_module(NullImporter *self, PyObject *args)
3246{
3247 Py_RETURN_NONE;
3248}
3249
3250static PyMethodDef NullImporter_methods[] = {
3251 {"find_module", (PyCFunction)NullImporter_find_module, METH_VARARGS,
3252 "Always return None"
3253 },
3254 {NULL} /* Sentinel */
3255};
3256
3257
Nick Coghlan327a39b2007-11-18 11:56:28 +00003258PyTypeObject PyNullImporter_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00003259 PyVarObject_HEAD_INIT(NULL, 0)
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003260 "imp.NullImporter", /*tp_name*/
3261 sizeof(NullImporter), /*tp_basicsize*/
3262 0, /*tp_itemsize*/
3263 0, /*tp_dealloc*/
3264 0, /*tp_print*/
3265 0, /*tp_getattr*/
3266 0, /*tp_setattr*/
3267 0, /*tp_compare*/
3268 0, /*tp_repr*/
3269 0, /*tp_as_number*/
3270 0, /*tp_as_sequence*/
3271 0, /*tp_as_mapping*/
3272 0, /*tp_hash */
3273 0, /*tp_call*/
3274 0, /*tp_str*/
3275 0, /*tp_getattro*/
3276 0, /*tp_setattro*/
3277 0, /*tp_as_buffer*/
3278 Py_TPFLAGS_DEFAULT, /*tp_flags*/
3279 "Null importer object", /* tp_doc */
3280 0, /* tp_traverse */
3281 0, /* tp_clear */
3282 0, /* tp_richcompare */
3283 0, /* tp_weaklistoffset */
3284 0, /* tp_iter */
3285 0, /* tp_iternext */
3286 NullImporter_methods, /* tp_methods */
3287 0, /* tp_members */
3288 0, /* tp_getset */
3289 0, /* tp_base */
3290 0, /* tp_dict */
3291 0, /* tp_descr_get */
3292 0, /* tp_descr_set */
3293 0, /* tp_dictoffset */
3294 (initproc)NullImporter_init, /* tp_init */
3295 0, /* tp_alloc */
3296 PyType_GenericNew /* tp_new */
3297};
3298
3299
Jason Tishler6bc06ec2003-09-04 11:59:50 +00003300PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003301initimp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003302{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003303 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003304
Nick Coghlan327a39b2007-11-18 11:56:28 +00003305 if (PyType_Ready(&PyNullImporter_Type) < 0)
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003306 goto failure;
3307
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003308 m = Py_InitModule4("imp", imp_methods, doc_imp,
3309 NULL, PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00003310 if (m == NULL)
3311 goto failure;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003312 d = PyModule_GetDict(m);
Neal Norwitz3cb31ac2006-08-13 18:10:47 +00003313 if (d == NULL)
3314 goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003315
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003316 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
3317 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
3318 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
3319 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
3320 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
3321 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
3322 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
3323 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00003324 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Just van Rossum52e14d62002-12-30 22:08:05 +00003325 if (setint(d, "IMP_HOOK", IMP_HOOK) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003326
Nick Coghlan327a39b2007-11-18 11:56:28 +00003327 Py_INCREF(&PyNullImporter_Type);
3328 PyModule_AddObject(m, "NullImporter", (PyObject *)&PyNullImporter_Type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003329 failure:
3330 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003331}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003332
3333
Guido van Rossumb18618d2000-05-03 23:44:39 +00003334/* API for embedding applications that want to add their own entries
3335 to the table of built-in modules. This should normally be called
3336 *before* Py_Initialize(). When the table resize fails, -1 is
3337 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003338
3339 After a similar function by Just van Rossum. */
3340
3341int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003342PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003343{
3344 static struct _inittab *our_copy = NULL;
3345 struct _inittab *p;
3346 int i, n;
3347
3348 /* Count the number of entries in both tables */
3349 for (n = 0; newtab[n].name != NULL; n++)
3350 ;
3351 if (n == 0)
3352 return 0; /* Nothing to do */
3353 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
3354 ;
3355
3356 /* Allocate new memory for the combined table */
Guido van Rossumb18618d2000-05-03 23:44:39 +00003357 p = our_copy;
3358 PyMem_RESIZE(p, struct _inittab, i+n+1);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003359 if (p == NULL)
3360 return -1;
3361
3362 /* Copy the tables into the new memory */
3363 if (our_copy != PyImport_Inittab)
3364 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
3365 PyImport_Inittab = our_copy = p;
3366 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
3367
3368 return 0;
3369}
3370
3371/* Shorthand to add a single entry given a name and a function */
3372
3373int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003374PyImport_AppendInittab(char *name, void (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003375{
3376 struct _inittab newtab[2];
3377
3378 memset(newtab, '\0', sizeof newtab);
3379
3380 newtab[0].name = name;
3381 newtab[0].initfunc = initfunc;
3382
3383 return PyImport_ExtendInittab(newtab);
3384}
Anthony Baxterac6bd462006-04-13 02:06:09 +00003385
3386#ifdef __cplusplus
3387}
3388#endif