blob: 92363b39376ea5483ee71f1a904c5637c0b19886 [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
Brett Cannonb166afc2010-05-05 20:25:47 +000022extern "C" {
Anthony Baxterac6bd462006-04-13 02:06:09 +000023#endif
Guido van Rossum55a83382000-09-20 20:31:38 +000024
Christian Heimes5e8e6d22008-02-23 23:59:45 +000025#ifdef MS_WINDOWS
26/* for stat.st_mode */
27typedef unsigned short mode_t;
28#endif
29
Guido van Rossum21d335e1993-10-15 13:01:11 +000030
Jeremy Hyltond4ceb312004-04-01 02:45:22 +000031/* Magic word to reject .pyc files generated by other Python versions.
32 It should change for each incompatible change to the bytecode.
33
34 The value of CR and LF is incorporated so if you ever read or write
Guido van Rossum7faeab31995-07-07 22:50:36 +000035 a .pyc file in text mode the magic number will be wrong; also, the
Tim Peters36515e22001-11-18 04:06:29 +000036 Apple MPW compiler swaps their values, botching string constants.
Marc-André Lemburgbd3be8f2002-02-07 11:33:49 +000037
Martin v. Löwisef82d2f2004-06-27 16:51:46 +000038 The magic numbers must be spaced apart atleast 2 values, as the
39 -U interpeter flag will cause MAGIC+1 being used. They have been
40 odd numbers for some time now.
Marc-André Lemburgbd3be8f2002-02-07 11:33:49 +000041
Jeremy Hyltond4ceb312004-04-01 02:45:22 +000042 There were a variety of old schemes for setting the magic number.
43 The current working scheme is to increment the previous value by
44 10.
Guido van Rossumf6894922002-08-31 15:16:14 +000045
Marc-André Lemburgbd3be8f2002-02-07 11:33:49 +000046 Known values:
47 Python 1.5: 20121
48 Python 1.5.1: 20121
49 Python 1.5.2: 20121
Skip Montanaro4ec3c262006-03-25 14:12:03 +000050 Python 1.6: 50428
Marc-André Lemburgbd3be8f2002-02-07 11:33:49 +000051 Python 2.0: 50823
52 Python 2.0.1: 50823
53 Python 2.1: 60202
54 Python 2.1.1: 60202
55 Python 2.1.2: 60202
56 Python 2.2: 60717
Neal Norwitz7fdcb412002-06-14 01:07:39 +000057 Python 2.3a0: 62011
Michael W. Hudsondd32a912002-08-15 14:59:02 +000058 Python 2.3a0: 62021
Guido van Rossumf6894922002-08-31 15:16:14 +000059 Python 2.3a0: 62011 (!)
Martin v. Löwisef82d2f2004-06-27 16:51:46 +000060 Python 2.4a0: 62041
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +000061 Python 2.4a3: 62051
Raymond Hettinger2c31a052004-09-22 18:44:21 +000062 Python 2.4b1: 62061
Michael W. Hudsondf888462005-06-03 14:41:55 +000063 Python 2.5a0: 62071
Michael W. Hudsonaee2e282005-10-21 11:32:20 +000064 Python 2.5a0: 62081 (ast-branch)
Guido van Rossumc2e20742006-02-27 22:32:47 +000065 Python 2.5a0: 62091 (with)
Guido van Rossumf6694362006-03-10 02:28:35 +000066 Python 2.5a0: 62092 (changed WITH_CLEANUP opcode)
Neal Norwitz0d62a062006-07-30 06:53:31 +000067 Python 2.5b3: 62101 (fix wrong code: for x, in ...)
68 Python 2.5b3: 62111 (fix wrong code: x += yield)
Neal Norwitz9a70f952006-08-04 05:12:19 +000069 Python 2.5c1: 62121 (fix wrong lnotab with for loops and
Antoine Pitrouc83ea132010-05-09 14:46:46 +000070 storing constants that should have been removed)
Neal Norwitzdac090d2006-09-05 03:53:08 +000071 Python 2.5c2: 62131 (fix wrong code: for x, in ... in listcomp/genexp)
Raymond Hettingereffde122007-12-18 18:26:18 +000072 Python 2.6a0: 62151 (peephole optimizations and STORE_MAP opcode)
Nick Coghlan7af53be2008-03-07 14:13:28 +000073 Python 2.6a1: 62161 (WITH_CLEANUP optimization)
Antoine Pitroud0c35152008-12-17 00:38:28 +000074 Python 2.7a0: 62171 (optimize list comprehensions/change LIST_APPEND)
Jeffrey Yasskin68d68522009-02-28 19:03:21 +000075 Python 2.7a0: 62181 (optimize conditional branches:
Antoine Pitrouc83ea132010-05-09 14:46:46 +000076 introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE)
Benjamin Peterson1880d8b2009-05-25 13:13:44 +000077 Python 2.7a0 62191 (introduce SETUP_WITH)
Alexandre Vassalottiee936a22010-01-09 23:35:54 +000078 Python 2.7a0 62201 (introduce BUILD_SET)
Alexandre Vassalottib6465472010-01-11 22:36:12 +000079 Python 2.7a0 62211 (introduce MAP_ADD and SET_ADD)
Michael W. Hudsonaee2e282005-10-21 11:32:20 +000080.
Tim Peters36515e22001-11-18 04:06:29 +000081*/
Alexandre Vassalottib6465472010-01-11 22:36:12 +000082#define MAGIC (62211 | ((long)'\r'<<16) | ((long)'\n'<<24))
Guido van Rossum3ddee711991-12-16 13:06:34 +000083
Guido van Rossum96774c12000-05-01 20:19:08 +000084/* Magic word as global; note that _PyImport_Init() can change the
Jeremy Hylton9262b8a2000-06-30 04:59:17 +000085 value of this global to accommodate for alterations of how the
Guido van Rossum96774c12000-05-01 20:19:08 +000086 compiler works which are enabled by command line switches. */
Christian Heimes61e45902008-03-27 10:35:52 +000087static long pyc_magic = MAGIC;
Guido van Rossum96774c12000-05-01 20:19:08 +000088
Guido van Rossum25ce5661997-08-02 03:10:38 +000089/* See _PyImport_FixupExtension() below */
90static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000091
Guido van Rossum771c6c81997-10-31 18:37:24 +000092/* This table is defined in config.c: */
93extern struct _inittab _PyImport_Inittab[];
94
95struct _inittab *PyImport_Inittab = _PyImport_Inittab;
Guido van Rossum66f1fa81991-04-03 19:03:52 +000096
Guido van Rossumed1170e1999-12-20 21:23:41 +000097/* these tables define the module suffixes that Python recognizes */
98struct filedescr * _PyImport_Filetab = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +000099
100#ifdef RISCOS
101static const struct filedescr _PyImport_StandardFiletab[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000102 {"/py", "U", PY_SOURCE},
103 {"/pyc", "rb", PY_COMPILED},
104 {0, 0}
Guido van Rossum48a680c2001-03-02 06:34:14 +0000105};
106#else
Guido van Rossumed1170e1999-12-20 21:23:41 +0000107static const struct filedescr _PyImport_StandardFiletab[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000108 {".py", "U", PY_SOURCE},
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000109#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000110 {".pyw", "U", PY_SOURCE},
Tim Peters36515e22001-11-18 04:06:29 +0000111#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000112 {".pyc", "rb", PY_COMPILED},
113 {0, 0}
Guido van Rossumed1170e1999-12-20 21:23:41 +0000114};
Guido van Rossum48a680c2001-03-02 06:34:14 +0000115#endif
Guido van Rossumed1170e1999-12-20 21:23:41 +0000116
Jason R. Coombsfa93cf82012-01-13 17:37:18 -0500117#ifdef MS_WINDOWS
Matthias Klose92636bf2012-08-14 17:42:45 +0200118static int isdir(char *path) {
Jason R. Coombs0737b722012-01-13 17:59:05 -0500119 DWORD rv;
120 /* see issue1293 and issue3677:
121 * stat() on Windows doesn't recognise paths like
122 * "e:\\shared\\" and "\\\\whiterab-c2znlh\\shared" as dirs.
123 * Also reference issue6727:
124 * stat() on Windows is broken and doesn't resolve symlinks properly.
125 */
126 rv = GetFileAttributesA(path);
127 return rv != INVALID_FILE_ATTRIBUTES && rv & FILE_ATTRIBUTE_DIRECTORY;
Jason R. Coombsfa93cf82012-01-13 17:37:18 -0500128}
129#else
Jason R. Coombs0e17dfb2012-03-08 09:56:00 -0500130#ifdef HAVE_STAT
Matthias Klose92636bf2012-08-14 17:42:45 +0200131static int isdir(char *path) {
Jason R. Coombs925ff742012-01-13 17:12:25 -0500132 struct stat statbuf;
Jason R. Coombs0737b722012-01-13 17:59:05 -0500133 return stat(path, &statbuf) == 0 && S_ISDIR(statbuf.st_mode);
Jason R. Coombs925ff742012-01-13 17:12:25 -0500134}
135#else
Jason R. Coombsfa93cf82012-01-13 17:37:18 -0500136#ifdef RISCOS
Jason R. Coombs925ff742012-01-13 17:12:25 -0500137/* with RISCOS, isdir is in unixstuff */
Jason R. Coombsfa93cf82012-01-13 17:37:18 -0500138#else
Jason R. Coombs925ff742012-01-13 17:12:25 -0500139int isdir(char *path) {
Jason R. Coombs0737b722012-01-13 17:59:05 -0500140 return 0;
Jason R. Coombs925ff742012-01-13 17:12:25 -0500141}
Jason R. Coombsfa93cf82012-01-13 17:37:18 -0500142#endif /* RISCOS */
143#endif /* HAVE_STAT */
144#endif /* MS_WINDOWS */
Phillip J. Ebyf7575d02006-07-28 21:12:07 +0000145
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000146/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000147
148void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000149_PyImport_Init(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000150{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000151 const struct filedescr *scan;
152 struct filedescr *filetab;
153 int countD = 0;
154 int countS = 0;
Guido van Rossumed1170e1999-12-20 21:23:41 +0000155
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000156 /* prepare _PyImport_Filetab: copy entries from
157 _PyImport_DynLoadFiletab and _PyImport_StandardFiletab.
158 */
Georg Brandladd36e52007-08-23 18:08:06 +0000159#ifdef HAVE_DYNAMIC_LOADING
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000160 for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan)
161 ++countD;
Georg Brandladd36e52007-08-23 18:08:06 +0000162#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000163 for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan)
164 ++countS;
165 filetab = PyMem_NEW(struct filedescr, countD + countS + 1);
166 if (filetab == NULL)
167 Py_FatalError("Can't initialize import file table.");
Georg Brandladd36e52007-08-23 18:08:06 +0000168#ifdef HAVE_DYNAMIC_LOADING
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000169 memcpy(filetab, _PyImport_DynLoadFiletab,
170 countD * sizeof(struct filedescr));
Georg Brandladd36e52007-08-23 18:08:06 +0000171#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000172 memcpy(filetab + countD, _PyImport_StandardFiletab,
173 countS * sizeof(struct filedescr));
174 filetab[countD + countS].suffix = NULL;
Guido van Rossumed1170e1999-12-20 21:23:41 +0000175
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000176 _PyImport_Filetab = filetab;
Guido van Rossumed1170e1999-12-20 21:23:41 +0000177
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000178 if (Py_OptimizeFlag) {
179 /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */
180 for (; filetab->suffix != NULL; filetab++) {
Guido van Rossum48a680c2001-03-02 06:34:14 +0000181#ifndef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000182 if (strcmp(filetab->suffix, ".pyc") == 0)
183 filetab->suffix = ".pyo";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000184#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000185 if (strcmp(filetab->suffix, "/pyc") == 0)
186 filetab->suffix = "/pyo";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000187#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000188 }
189 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000190
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000191 if (Py_UnicodeFlag) {
192 /* Fix the pyc_magic so that byte compiled code created
193 using the all-Unicode method doesn't interfere with
194 code created in normal operation mode. */
195 pyc_magic = MAGIC + 1;
196 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000197}
198
Guido van Rossum25ce5661997-08-02 03:10:38 +0000199void
Just van Rossum52e14d62002-12-30 22:08:05 +0000200_PyImportHooks_Init(void)
201{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000202 PyObject *v, *path_hooks = NULL, *zimpimport;
203 int err = 0;
Just van Rossum52e14d62002-12-30 22:08:05 +0000204
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000205 /* adding sys.path_hooks and sys.path_importer_cache, setting up
206 zipimport */
207 if (PyType_Ready(&PyNullImporter_Type) < 0)
208 goto error;
Just van Rossum52e14d62002-12-30 22:08:05 +0000209
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000210 if (Py_VerboseFlag)
211 PySys_WriteStderr("# installing zipimport hook\n");
Just van Rossum52e14d62002-12-30 22:08:05 +0000212
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000213 v = PyList_New(0);
214 if (v == NULL)
215 goto error;
216 err = PySys_SetObject("meta_path", v);
217 Py_DECREF(v);
218 if (err)
219 goto error;
220 v = PyDict_New();
221 if (v == NULL)
222 goto error;
223 err = PySys_SetObject("path_importer_cache", v);
224 Py_DECREF(v);
225 if (err)
226 goto error;
227 path_hooks = PyList_New(0);
228 if (path_hooks == NULL)
229 goto error;
230 err = PySys_SetObject("path_hooks", path_hooks);
231 if (err) {
Just van Rossum52e14d62002-12-30 22:08:05 +0000232 error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000233 PyErr_Print();
234 Py_FatalError("initializing sys.meta_path, sys.path_hooks, "
235 "path_importer_cache, or NullImporter failed"
236 );
237 }
Phillip J. Ebyf7575d02006-07-28 21:12:07 +0000238
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000239 zimpimport = PyImport_ImportModule("zipimport");
240 if (zimpimport == NULL) {
241 PyErr_Clear(); /* No zip import module -- okay */
242 if (Py_VerboseFlag)
243 PySys_WriteStderr("# can't import zipimport\n");
244 }
245 else {
246 PyObject *zipimporter = PyObject_GetAttrString(zimpimport,
247 "zipimporter");
248 Py_DECREF(zimpimport);
249 if (zipimporter == NULL) {
250 PyErr_Clear(); /* No zipimporter object -- okay */
251 if (Py_VerboseFlag)
252 PySys_WriteStderr(
253 "# can't import zipimport.zipimporter\n");
254 }
255 else {
256 /* sys.path_hooks.append(zipimporter) */
257 err = PyList_Append(path_hooks, zipimporter);
258 Py_DECREF(zipimporter);
259 if (err)
260 goto error;
261 if (Py_VerboseFlag)
262 PySys_WriteStderr(
263 "# installed zipimport hook\n");
264 }
265 }
266 Py_DECREF(path_hooks);
Just van Rossum52e14d62002-12-30 22:08:05 +0000267}
268
269void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000270_PyImport_Fini(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000271{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000272 Py_XDECREF(extensions);
273 extensions = NULL;
274 PyMem_DEL(_PyImport_Filetab);
275 _PyImport_Filetab = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000276}
277
278
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000279/* Locking primitives to prevent parallel imports of the same module
280 in different threads to return with a partially loaded module.
281 These calls are serialized by the global interpreter lock. */
282
283#ifdef WITH_THREAD
284
Guido van Rossum49b56061998-10-01 20:42:43 +0000285#include "pythread.h"
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000286
Guido van Rossum65d5b571998-12-21 19:32:43 +0000287static PyThread_type_lock import_lock = 0;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000288static long import_lock_thread = -1;
289static int import_lock_level = 0;
290
Thomas Woutersc4dcb382009-09-16 19:55:54 +0000291void
292_PyImport_AcquireLock(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000293{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000294 long me = PyThread_get_thread_ident();
295 if (me == -1)
296 return; /* Too bad */
297 if (import_lock == NULL) {
298 import_lock = PyThread_allocate_lock();
299 if (import_lock == NULL)
300 return; /* Nothing much we can do. */
301 }
302 if (import_lock_thread == me) {
303 import_lock_level++;
304 return;
305 }
306 if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0))
307 {
308 PyThreadState *tstate = PyEval_SaveThread();
309 PyThread_acquire_lock(import_lock, 1);
310 PyEval_RestoreThread(tstate);
311 }
312 import_lock_thread = me;
313 import_lock_level = 1;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000314}
315
Thomas Woutersc4dcb382009-09-16 19:55:54 +0000316int
317_PyImport_ReleaseLock(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000318{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000319 long me = PyThread_get_thread_ident();
320 if (me == -1 || import_lock == NULL)
321 return 0; /* Too bad */
322 if (import_lock_thread != me)
323 return -1;
324 import_lock_level--;
325 if (import_lock_level == 0) {
326 import_lock_thread = -1;
327 PyThread_release_lock(import_lock);
328 }
329 return 1;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000330}
331
Gregory P. Smith9e5d1322010-03-01 01:22:39 +0000332/* This function is called from PyOS_AfterFork to ensure that newly
333 created child processes do not share locks with the parent.
334 We now acquire the import lock around fork() calls but on some platforms
335 (Solaris 9 and earlier? see isue7242) that still left us with problems. */
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +0000336
337void
338_PyImport_ReInitLock(void)
339{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000340 if (import_lock != NULL)
341 import_lock = PyThread_allocate_lock();
342 import_lock_thread = -1;
343 import_lock_level = 0;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +0000344}
345
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000346#endif
347
Tim Peters69232342001-08-30 05:16:13 +0000348static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +0000349imp_lock_held(PyObject *self, PyObject *noargs)
Tim Peters69232342001-08-30 05:16:13 +0000350{
Tim Peters69232342001-08-30 05:16:13 +0000351#ifdef WITH_THREAD
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000352 return PyBool_FromLong(import_lock_thread != -1);
Tim Peters69232342001-08-30 05:16:13 +0000353#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000354 return PyBool_FromLong(0);
Tim Peters69232342001-08-30 05:16:13 +0000355#endif
356}
357
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000358static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +0000359imp_acquire_lock(PyObject *self, PyObject *noargs)
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000360{
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000361#ifdef WITH_THREAD
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000362 _PyImport_AcquireLock();
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000363#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000364 Py_INCREF(Py_None);
365 return Py_None;
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000366}
367
368static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +0000369imp_release_lock(PyObject *self, PyObject *noargs)
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000370{
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000371#ifdef WITH_THREAD
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000372 if (_PyImport_ReleaseLock() < 0) {
373 PyErr_SetString(PyExc_RuntimeError,
374 "not holding the import lock");
375 return NULL;
376 }
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000377#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000378 Py_INCREF(Py_None);
379 return Py_None;
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000380}
381
Collin Winter276887b2007-03-12 16:11:39 +0000382static void
Neal Norwitz75c7c802007-03-13 05:31:38 +0000383imp_modules_reloading_clear(void)
Collin Winter276887b2007-03-12 16:11:39 +0000384{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000385 PyInterpreterState *interp = PyThreadState_Get()->interp;
386 if (interp->modules_reloading != NULL)
387 PyDict_Clear(interp->modules_reloading);
Collin Winter276887b2007-03-12 16:11:39 +0000388}
389
Guido van Rossum25ce5661997-08-02 03:10:38 +0000390/* Helper for sys */
391
392PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000393PyImport_GetModuleDict(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000394{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000395 PyInterpreterState *interp = PyThreadState_GET()->interp;
396 if (interp->modules == NULL)
397 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
398 return interp->modules;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000399}
400
Guido van Rossum3f5da241990-12-20 15:06:42 +0000401
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000402/* List of names to clear in sys */
403static char* sys_deletes[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000404 "path", "argv", "ps1", "ps2", "exitfunc",
405 "exc_type", "exc_value", "exc_traceback",
406 "last_type", "last_value", "last_traceback",
407 "path_hooks", "path_importer_cache", "meta_path",
408 /* misc stuff */
409 "flags", "float_info",
410 NULL
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000411};
412
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000413static char* sys_files[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000414 "stdin", "__stdin__",
415 "stdout", "__stdout__",
416 "stderr", "__stderr__",
417 NULL
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000418};
419
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000420
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000421/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000422
Guido van Rossum3f5da241990-12-20 15:06:42 +0000423void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000424PyImport_Cleanup(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000425{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000426 Py_ssize_t pos, ndone;
427 char *name;
428 PyObject *key, *value, *dict;
429 PyInterpreterState *interp = PyThreadState_GET()->interp;
430 PyObject *modules = interp->modules;
Guido van Rossum758eec01998-01-19 21:58:26 +0000431
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000432 if (modules == NULL)
433 return; /* Already done */
Guido van Rossum758eec01998-01-19 21:58:26 +0000434
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000435 /* Delete some special variables first. These are common
436 places where user values hide and people complain when their
437 destructors fail. Since the modules containing them are
438 deleted *last* of all, they would come too late in the normal
439 destruction order. Sigh. */
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000440
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000441 value = PyDict_GetItemString(modules, "__builtin__");
442 if (value != NULL && PyModule_Check(value)) {
443 dict = PyModule_GetDict(value);
444 if (Py_VerboseFlag)
445 PySys_WriteStderr("# clear __builtin__._\n");
446 PyDict_SetItemString(dict, "_", Py_None);
447 }
448 value = PyDict_GetItemString(modules, "sys");
449 if (value != NULL && PyModule_Check(value)) {
450 char **p;
451 PyObject *v;
452 dict = PyModule_GetDict(value);
453 for (p = sys_deletes; *p != NULL; p++) {
454 if (Py_VerboseFlag)
455 PySys_WriteStderr("# clear sys.%s\n", *p);
456 PyDict_SetItemString(dict, *p, Py_None);
457 }
458 for (p = sys_files; *p != NULL; p+=2) {
459 if (Py_VerboseFlag)
460 PySys_WriteStderr("# restore sys.%s\n", *p);
461 v = PyDict_GetItemString(dict, *(p+1));
462 if (v == NULL)
463 v = Py_None;
464 PyDict_SetItemString(dict, *p, v);
465 }
466 }
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000467
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000468 /* First, delete __main__ */
469 value = PyDict_GetItemString(modules, "__main__");
470 if (value != NULL && PyModule_Check(value)) {
471 if (Py_VerboseFlag)
472 PySys_WriteStderr("# cleanup __main__\n");
473 _PyModule_Clear(value);
474 PyDict_SetItemString(modules, "__main__", Py_None);
475 }
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000476
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000477 /* The special treatment of __builtin__ here is because even
478 when it's not referenced as a module, its dictionary is
479 referenced by almost every module's __builtins__. Since
480 deleting a module clears its dictionary (even if there are
481 references left to it), we need to delete the __builtin__
482 module last. Likewise, we don't delete sys until the very
483 end because it is implicitly referenced (e.g. by print).
Guido van Rossum758eec01998-01-19 21:58:26 +0000484
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000485 Also note that we 'delete' modules by replacing their entry
486 in the modules dict with None, rather than really deleting
487 them; this avoids a rehash of the modules dictionary and
488 also marks them as "non existent" so they won't be
489 re-imported. */
Guido van Rossum758eec01998-01-19 21:58:26 +0000490
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000491 /* Next, repeatedly delete modules with a reference count of
492 one (skipping __builtin__ and sys) and delete them */
493 do {
494 ndone = 0;
495 pos = 0;
496 while (PyDict_Next(modules, &pos, &key, &value)) {
497 if (value->ob_refcnt != 1)
498 continue;
499 if (PyString_Check(key) && PyModule_Check(value)) {
500 name = PyString_AS_STRING(key);
501 if (strcmp(name, "__builtin__") == 0)
502 continue;
503 if (strcmp(name, "sys") == 0)
504 continue;
505 if (Py_VerboseFlag)
506 PySys_WriteStderr(
507 "# cleanup[1] %s\n", name);
508 _PyModule_Clear(value);
509 PyDict_SetItem(modules, key, Py_None);
510 ndone++;
511 }
512 }
513 } while (ndone > 0);
Guido van Rossum758eec01998-01-19 21:58:26 +0000514
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000515 /* Next, delete all modules (still skipping __builtin__ and sys) */
516 pos = 0;
517 while (PyDict_Next(modules, &pos, &key, &value)) {
518 if (PyString_Check(key) && PyModule_Check(value)) {
519 name = PyString_AS_STRING(key);
520 if (strcmp(name, "__builtin__") == 0)
521 continue;
522 if (strcmp(name, "sys") == 0)
523 continue;
524 if (Py_VerboseFlag)
525 PySys_WriteStderr("# cleanup[2] %s\n", name);
526 _PyModule_Clear(value);
527 PyDict_SetItem(modules, key, Py_None);
528 }
529 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000530
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000531 /* Next, delete sys and __builtin__ (in that order) */
532 value = PyDict_GetItemString(modules, "sys");
533 if (value != NULL && PyModule_Check(value)) {
534 if (Py_VerboseFlag)
535 PySys_WriteStderr("# cleanup sys\n");
536 _PyModule_Clear(value);
537 PyDict_SetItemString(modules, "sys", Py_None);
538 }
539 value = PyDict_GetItemString(modules, "__builtin__");
540 if (value != NULL && PyModule_Check(value)) {
541 if (Py_VerboseFlag)
542 PySys_WriteStderr("# cleanup __builtin__\n");
543 _PyModule_Clear(value);
544 PyDict_SetItemString(modules, "__builtin__", Py_None);
545 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000546
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000547 /* Finally, clear and delete the modules directory */
548 PyDict_Clear(modules);
549 interp->modules = NULL;
550 Py_DECREF(modules);
551 Py_CLEAR(interp->modules_reloading);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000552}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000553
554
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000555/* Helper for pythonrun.c -- return magic number */
556
557long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000558PyImport_GetMagicNumber(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000559{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000560 return pyc_magic;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000561}
562
563
Guido van Rossum25ce5661997-08-02 03:10:38 +0000564/* Magic for extension modules (built-in as well as dynamically
565 loaded). To prevent initializing an extension module more than
566 once, we keep a static dictionary 'extensions' keyed by module name
567 (for built-in modules) or by filename (for dynamically loaded
Barry Warsaw92883382001-08-13 23:05:44 +0000568 modules), containing these modules. A copy of the module's
Guido van Rossum25ce5661997-08-02 03:10:38 +0000569 dictionary is stored by calling _PyImport_FixupExtension()
570 immediately after the module initialization function succeeds. A
571 copy can be retrieved from there by calling
572 _PyImport_FindExtension(). */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000573
Guido van Rossum79f25d91997-04-29 20:08:16 +0000574PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000575_PyImport_FixupExtension(char *name, char *filename)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000576{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000577 PyObject *modules, *mod, *dict, *copy;
578 if (extensions == NULL) {
579 extensions = PyDict_New();
580 if (extensions == NULL)
581 return NULL;
582 }
583 modules = PyImport_GetModuleDict();
584 mod = PyDict_GetItemString(modules, name);
585 if (mod == NULL || !PyModule_Check(mod)) {
586 PyErr_Format(PyExc_SystemError,
587 "_PyImport_FixupExtension: module %.200s not loaded", name);
588 return NULL;
589 }
590 dict = PyModule_GetDict(mod);
591 if (dict == NULL)
592 return NULL;
593 copy = PyDict_Copy(dict);
594 if (copy == NULL)
595 return NULL;
596 PyDict_SetItemString(extensions, filename, copy);
597 Py_DECREF(copy);
598 return copy;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000599}
600
601PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000602_PyImport_FindExtension(char *name, char *filename)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000603{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000604 PyObject *dict, *mod, *mdict;
605 if (extensions == NULL)
606 return NULL;
607 dict = PyDict_GetItemString(extensions, filename);
608 if (dict == NULL)
609 return NULL;
610 mod = PyImport_AddModule(name);
611 if (mod == NULL)
612 return NULL;
613 mdict = PyModule_GetDict(mod);
614 if (mdict == NULL)
615 return NULL;
616 if (PyDict_Update(mdict, dict))
617 return NULL;
618 if (Py_VerboseFlag)
619 PySys_WriteStderr("import %s # previously loaded (%s)\n",
620 name, filename);
621 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000622}
623
624
625/* Get the module object corresponding to a module name.
626 First check the modules dictionary if there's one there,
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000627 if not, create a new one and insert it in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000628 Because the former action is most common, THIS DOES NOT RETURN A
629 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000630
Guido van Rossum79f25d91997-04-29 20:08:16 +0000631PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000632PyImport_AddModule(const char *name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000633{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000634 PyObject *modules = PyImport_GetModuleDict();
635 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000636
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000637 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
638 PyModule_Check(m))
639 return m;
640 m = PyModule_New(name);
641 if (m == NULL)
642 return NULL;
643 if (PyDict_SetItemString(modules, name, m) != 0) {
644 Py_DECREF(m);
645 return NULL;
646 }
647 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000648
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000649 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000650}
651
Tim Peters1cd70172004-08-02 03:52:12 +0000652/* Remove name from sys.modules, if it's there. */
653static void
Benjamin Peterson06638732010-03-25 23:27:16 +0000654remove_module(const char *name)
Tim Peters1cd70172004-08-02 03:52:12 +0000655{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000656 PyObject *modules = PyImport_GetModuleDict();
657 if (PyDict_GetItemString(modules, name) == NULL)
658 return;
659 if (PyDict_DelItemString(modules, name) < 0)
660 Py_FatalError("import: deleting existing key in"
661 "sys.modules failed");
Tim Peters1cd70172004-08-02 03:52:12 +0000662}
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000663
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000664/* Execute a code object in a module and return the module object
Tim Peters1cd70172004-08-02 03:52:12 +0000665 * WITH INCREMENTED REFERENCE COUNT. If an error occurs, name is
666 * removed from sys.modules, to avoid leaving damaged module objects
667 * in sys.modules. The caller may wish to restore the original
668 * module object (if any) in this case; PyImport_ReloadModule is an
669 * example.
670 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000671PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000672PyImport_ExecCodeModule(char *name, PyObject *co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000673{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000674 return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000675}
676
677PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000678PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname)
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000679{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000680 PyObject *modules = PyImport_GetModuleDict();
681 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000682
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000683 m = PyImport_AddModule(name);
684 if (m == NULL)
685 return NULL;
686 /* If the module is being reloaded, we get the old module back
687 and re-use its dict to exec the new code. */
688 d = PyModule_GetDict(m);
689 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
690 if (PyDict_SetItemString(d, "__builtins__",
691 PyEval_GetBuiltins()) != 0)
692 goto error;
693 }
694 /* Remember the filename as the __file__ attribute */
695 v = NULL;
696 if (pathname != NULL) {
697 v = PyString_FromString(pathname);
698 if (v == NULL)
699 PyErr_Clear();
700 }
701 if (v == NULL) {
702 v = ((PyCodeObject *)co)->co_filename;
703 Py_INCREF(v);
704 }
705 if (PyDict_SetItemString(d, "__file__", v) != 0)
706 PyErr_Clear(); /* Not important enough to report */
707 Py_DECREF(v);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000708
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000709 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
710 if (v == NULL)
711 goto error;
712 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000713
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000714 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
715 PyErr_Format(PyExc_ImportError,
716 "Loaded module %.200s not found in sys.modules",
717 name);
718 return NULL;
719 }
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000720
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000721 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000722
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000723 return m;
Tim Peters1cd70172004-08-02 03:52:12 +0000724
725 error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000726 remove_module(name);
727 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000728}
729
730
731/* Given a pathname for a Python source file, fill a buffer with the
732 pathname for the corresponding compiled file. Return the pathname
733 for the compiled file, or NULL if there's no space in the buffer.
734 Doesn't set an exception. */
735
736static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000737make_compiled_pathname(char *pathname, char *buf, size_t buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000738{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000739 size_t len = strlen(pathname);
740 if (len+2 > buflen)
741 return NULL;
Tim Petersc1731372001-08-04 08:12:36 +0000742
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000743#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000744 /* Treat .pyw as if it were .py. The case of ".pyw" must match
745 that used in _PyImport_StandardFiletab. */
746 if (len >= 4 && strcmp(&pathname[len-4], ".pyw") == 0)
747 --len; /* pretend 'w' isn't there */
Tim Petersc1731372001-08-04 08:12:36 +0000748#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000749 memcpy(buf, pathname, len);
750 buf[len] = Py_OptimizeFlag ? 'o' : 'c';
751 buf[len+1] = '\0';
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000752
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000753 return buf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000754}
755
756
757/* Given a pathname for a Python source file, its time of last
758 modification, and a pathname for a compiled file, check whether the
759 compiled file represents the same version of the source. If so,
760 return a FILE pointer for the compiled file, positioned just after
761 the header; if not, return NULL.
762 Doesn't set an exception. */
763
764static FILE *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000765check_compiled_module(char *pathname, time_t mtime, char *cpathname)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000766{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000767 FILE *fp;
768 long magic;
769 long pyc_mtime;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000770
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000771 fp = fopen(cpathname, "rb");
772 if (fp == NULL)
773 return NULL;
774 magic = PyMarshal_ReadLongFromFile(fp);
775 if (magic != pyc_magic) {
776 if (Py_VerboseFlag)
777 PySys_WriteStderr("# %s has bad magic\n", cpathname);
778 fclose(fp);
779 return NULL;
780 }
781 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
782 if (pyc_mtime != mtime) {
783 if (Py_VerboseFlag)
784 PySys_WriteStderr("# %s has bad mtime\n", cpathname);
785 fclose(fp);
786 return NULL;
787 }
788 if (Py_VerboseFlag)
789 PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
790 return fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000791}
792
793
794/* Read a code object from a file and check it for validity */
795
Guido van Rossum79f25d91997-04-29 20:08:16 +0000796static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000797read_compiled_module(char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000798{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000799 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000800
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000801 co = PyMarshal_ReadLastObjectFromFile(fp);
802 if (co == NULL)
803 return NULL;
804 if (!PyCode_Check(co)) {
805 PyErr_Format(PyExc_ImportError,
806 "Non-code object in %.200s", cpathname);
807 Py_DECREF(co);
808 return NULL;
809 }
810 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000811}
812
813
814/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000815 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000816
Guido van Rossum79f25d91997-04-29 20:08:16 +0000817static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000818load_compiled_module(char *name, char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000819{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000820 long magic;
821 PyCodeObject *co;
822 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000823
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000824 magic = PyMarshal_ReadLongFromFile(fp);
825 if (magic != pyc_magic) {
826 PyErr_Format(PyExc_ImportError,
827 "Bad magic number in %.200s", cpathname);
828 return NULL;
829 }
830 (void) PyMarshal_ReadLongFromFile(fp);
831 co = read_compiled_module(cpathname, fp);
832 if (co == NULL)
833 return NULL;
834 if (Py_VerboseFlag)
835 PySys_WriteStderr("import %s # precompiled from %s\n",
836 name, cpathname);
837 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
838 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000839
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000840 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000841}
842
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000843/* Parse a source file and return the corresponding code object */
844
Guido van Rossum79f25d91997-04-29 20:08:16 +0000845static PyCodeObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000846parse_source_module(const char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000847{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000848 PyCodeObject *co = NULL;
849 mod_ty mod;
850 PyCompilerFlags flags;
851 PyArena *arena = PyArena_New();
852 if (arena == NULL)
853 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000854
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000855 flags.cf_flags = 0;
Christian Heimes7f23d862008-03-26 22:51:58 +0000856
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000857 mod = PyParser_ASTFromFile(fp, pathname, Py_file_input, 0, 0, &flags,
858 NULL, arena);
859 if (mod) {
860 co = PyAST_Compile(mod, pathname, NULL, arena);
861 }
862 PyArena_Free(arena);
863 return co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000864}
865
866
Guido van Rossum55a83382000-09-20 20:31:38 +0000867/* Helper to open a bytecode file for writing in exclusive mode */
868
869static FILE *
Christian Heimes40346852008-02-23 17:52:07 +0000870open_exclusive(char *filename, mode_t mode)
Guido van Rossum55a83382000-09-20 20:31:38 +0000871{
872#if defined(O_EXCL)&&defined(O_CREAT)&&defined(O_WRONLY)&&defined(O_TRUNC)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000873 /* Use O_EXCL to avoid a race condition when another process tries to
874 write the same file. When that happens, our open() call fails,
875 which is just fine (since it's only a cache).
876 XXX If the file exists and is writable but the directory is not
877 writable, the file will never be written. Oh well.
878 */
879 int fd;
880 (void) unlink(filename);
881 fd = open(filename, O_EXCL|O_CREAT|O_WRONLY|O_TRUNC
Tim Peters42c83af2000-09-29 04:03:10 +0000882#ifdef O_BINARY
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000883 |O_BINARY /* necessary for Windows */
Tim Peters42c83af2000-09-29 04:03:10 +0000884#endif
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000885#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000886 , mode, "ctxt=bin", "shr=nil"
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000887#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000888 , mode
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000889#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000890 );
891 if (fd < 0)
892 return NULL;
893 return fdopen(fd, "wb");
Guido van Rossum55a83382000-09-20 20:31:38 +0000894#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000895 /* Best we can do -- on Windows this can't happen anyway */
896 return fopen(filename, "wb");
Guido van Rossum55a83382000-09-20 20:31:38 +0000897#endif
898}
899
900
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000901/* Write a compiled module to a file, placing the time of last
902 modification of its source into the header.
903 Errors are ignored, if a write error occurs an attempt is made to
904 remove the file. */
905
906static void
Mark Dickinson9fade762012-12-24 16:33:18 +0000907write_compiled_module(PyCodeObject *co, char *cpathname, struct stat *srcstat, time_t mtime)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000908{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000909 FILE *fp;
R. David Murray3310a102009-07-07 09:54:16 +0000910#ifdef MS_WINDOWS /* since Windows uses different permissions */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000911 mode_t mode = srcstat->st_mode & ~S_IEXEC;
Nick Coghlanb48c0282012-10-19 21:58:18 +1000912 /* Issue #6074: We ensure user write access, so we can delete it later
913 * when the source file changes. (On POSIX, this only requires write
914 * access to the directory, on Windows, we need write access to the file
915 * as well)
916 */
917 mode |= _S_IWRITE;
R. David Murray3310a102009-07-07 09:54:16 +0000918#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000919 mode_t mode = srcstat->st_mode & ~S_IXUSR & ~S_IXGRP & ~S_IXOTH;
Brett Cannonb166afc2010-05-05 20:25:47 +0000920#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000921
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000922 fp = open_exclusive(cpathname, mode);
923 if (fp == NULL) {
924 if (Py_VerboseFlag)
925 PySys_WriteStderr(
926 "# can't create %s\n", cpathname);
927 return;
928 }
929 PyMarshal_WriteLongToFile(pyc_magic, fp, Py_MARSHAL_VERSION);
930 /* First write a 0 for mtime */
931 PyMarshal_WriteLongToFile(0L, fp, Py_MARSHAL_VERSION);
932 PyMarshal_WriteObjectToFile((PyObject *)co, fp, Py_MARSHAL_VERSION);
933 if (fflush(fp) != 0 || ferror(fp)) {
934 if (Py_VerboseFlag)
935 PySys_WriteStderr("# can't write %s\n", cpathname);
936 /* Don't keep partial file */
937 fclose(fp);
938 (void) unlink(cpathname);
939 return;
940 }
Antoine Pitrou6f25d752012-01-25 15:38:32 +0100941 /* Now write the true mtime (as a 32-bit field) */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000942 fseek(fp, 4L, 0);
Antoine Pitrou6f25d752012-01-25 15:38:32 +0100943 assert(mtime <= 0xFFFFFFFF);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000944 PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION);
945 fflush(fp);
946 fclose(fp);
947 if (Py_VerboseFlag)
948 PySys_WriteStderr("# wrote %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000949}
950
Antoine Pitroue96d4ea2009-01-06 18:10:47 +0000951static void
952update_code_filenames(PyCodeObject *co, PyObject *oldname, PyObject *newname)
953{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000954 PyObject *constants, *tmp;
955 Py_ssize_t i, n;
Antoine Pitroue96d4ea2009-01-06 18:10:47 +0000956
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000957 if (!_PyString_Eq(co->co_filename, oldname))
958 return;
Antoine Pitroue96d4ea2009-01-06 18:10:47 +0000959
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000960 tmp = co->co_filename;
961 co->co_filename = newname;
962 Py_INCREF(co->co_filename);
963 Py_DECREF(tmp);
Antoine Pitroue96d4ea2009-01-06 18:10:47 +0000964
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000965 constants = co->co_consts;
966 n = PyTuple_GET_SIZE(constants);
967 for (i = 0; i < n; i++) {
968 tmp = PyTuple_GET_ITEM(constants, i);
969 if (PyCode_Check(tmp))
970 update_code_filenames((PyCodeObject *)tmp,
971 oldname, newname);
972 }
Antoine Pitroue96d4ea2009-01-06 18:10:47 +0000973}
974
975static int
976update_compiled_module(PyCodeObject *co, char *pathname)
977{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000978 PyObject *oldname, *newname;
Antoine Pitroue96d4ea2009-01-06 18:10:47 +0000979
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000980 if (strcmp(PyString_AsString(co->co_filename), pathname) == 0)
981 return 0;
Antoine Pitroue96d4ea2009-01-06 18:10:47 +0000982
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000983 newname = PyString_FromString(pathname);
984 if (newname == NULL)
985 return -1;
Antoine Pitroue96d4ea2009-01-06 18:10:47 +0000986
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000987 oldname = co->co_filename;
988 Py_INCREF(oldname);
989 update_code_filenames(co, oldname, newname);
990 Py_DECREF(oldname);
991 Py_DECREF(newname);
992 return 1;
Antoine Pitroue96d4ea2009-01-06 18:10:47 +0000993}
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000994
Mark Dickinson9fade762012-12-24 16:33:18 +0000995#ifdef MS_WINDOWS
996
997/* Seconds between 1.1.1601 and 1.1.1970 */
998static __int64 secs_between_epochs = 11644473600;
999
1000/* Get mtime from file pointer. */
1001
1002static time_t
1003win32_mtime(FILE *fp, char *pathname)
1004{
1005 __int64 filetime;
1006 HANDLE fh;
1007 BY_HANDLE_FILE_INFORMATION file_information;
1008
1009 fh = (HANDLE)_get_osfhandle(fileno(fp));
1010 if (fh == INVALID_HANDLE_VALUE ||
1011 !GetFileInformationByHandle(fh, &file_information)) {
1012 PyErr_Format(PyExc_RuntimeError,
1013 "unable to get file status from '%s'",
1014 pathname);
1015 return -1;
1016 }
1017 /* filetime represents the number of 100ns intervals since
1018 1.1.1601 (UTC). Convert to seconds since 1.1.1970 (UTC). */
1019 filetime = (__int64)file_information.ftLastWriteTime.dwHighDateTime << 32 |
1020 file_information.ftLastWriteTime.dwLowDateTime;
1021 return filetime / 10000000 - secs_between_epochs;
1022}
1023
1024#endif /* #ifdef MS_WINDOWS */
1025
1026
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001027/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001028 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
1029 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001030
Guido van Rossum79f25d91997-04-29 20:08:16 +00001031static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001032load_source_module(char *name, char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001033{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001034 struct stat st;
1035 FILE *fpc;
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001036 char *buf;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001037 char *cpathname;
Antoine Pitrou284fa082012-05-09 13:24:31 +02001038 PyCodeObject *co = NULL;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001039 PyObject *m;
Mark Dickinson9fade762012-12-24 16:33:18 +00001040 time_t mtime;
Brett Cannonb166afc2010-05-05 20:25:47 +00001041
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001042 if (fstat(fileno(fp), &st) != 0) {
1043 PyErr_Format(PyExc_RuntimeError,
1044 "unable to get file status from '%s'",
1045 pathname);
1046 return NULL;
1047 }
Mark Dickinson9fade762012-12-24 16:33:18 +00001048
1049#ifdef MS_WINDOWS
1050 mtime = win32_mtime(fp, pathname);
1051 if (mtime == (time_t)-1 && PyErr_Occurred())
1052 return NULL;
1053#else
1054 mtime = st.st_mtime;
1055#endif
1056 if (sizeof mtime > 4) {
Antoine Pitrou0e5fd592012-01-25 03:31:39 +01001057 /* Python's .pyc timestamp handling presumes that the timestamp fits
1058 in 4 bytes. Since the code only does an equality comparison,
1059 ordering is not important and we can safely ignore the higher bits
1060 (collisions are extremely unlikely).
1061 */
Mark Dickinson9fade762012-12-24 16:33:18 +00001062 mtime &= 0xFFFFFFFF;
Antoine Pitrou0e5fd592012-01-25 03:31:39 +01001063 }
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001064 buf = PyMem_MALLOC(MAXPATHLEN+1);
1065 if (buf == NULL) {
1066 return PyErr_NoMemory();
1067 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001068 cpathname = make_compiled_pathname(pathname, buf,
1069 (size_t)MAXPATHLEN + 1);
1070 if (cpathname != NULL &&
Mark Dickinson9fade762012-12-24 16:33:18 +00001071 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001072 co = read_compiled_module(cpathname, fpc);
1073 fclose(fpc);
1074 if (co == NULL)
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001075 goto error_exit;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001076 if (update_compiled_module(co, pathname) < 0)
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001077 goto error_exit;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001078 if (Py_VerboseFlag)
1079 PySys_WriteStderr("import %s # precompiled from %s\n",
1080 name, cpathname);
1081 pathname = cpathname;
1082 }
1083 else {
1084 co = parse_source_module(pathname, fp);
1085 if (co == NULL)
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001086 goto error_exit;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001087 if (Py_VerboseFlag)
1088 PySys_WriteStderr("import %s # from %s\n",
1089 name, pathname);
1090 if (cpathname) {
1091 PyObject *ro = PySys_GetObject("dont_write_bytecode");
Antoine Pitrouc5bef752012-08-15 23:16:51 +02001092 int b = (ro == NULL) ? 0 : PyObject_IsTrue(ro);
1093 if (b < 0)
1094 goto error_exit;
1095 if (!b)
Mark Dickinson9fade762012-12-24 16:33:18 +00001096 write_compiled_module(co, cpathname, &st, mtime);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001097 }
1098 }
1099 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
1100 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001101
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001102 PyMem_FREE(buf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001103 return m;
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001104
1105error_exit:
Antoine Pitrou284fa082012-05-09 13:24:31 +02001106 Py_XDECREF(co);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001107 PyMem_FREE(buf);
1108 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001109}
1110
1111
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001112/* Forward */
Just van Rossum52e14d62002-12-30 22:08:05 +00001113static PyObject *load_module(char *, FILE *, char *, int, PyObject *);
1114static struct filedescr *find_module(char *, char *, PyObject *,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001115 char *, size_t, FILE **, PyObject **);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001116static struct _frozen *find_frozen(char *name);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001117
1118/* Load a package and return its module object WITH INCREMENTED
1119 REFERENCE COUNT */
1120
1121static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001122load_package(char *name, char *pathname)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001123{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001124 PyObject *m, *d;
1125 PyObject *file = NULL;
1126 PyObject *path = NULL;
1127 int err;
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001128 char *buf = NULL;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001129 FILE *fp = NULL;
1130 struct filedescr *fdp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001131
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001132 m = PyImport_AddModule(name);
1133 if (m == NULL)
1134 return NULL;
1135 if (Py_VerboseFlag)
1136 PySys_WriteStderr("import %s # directory %s\n",
1137 name, pathname);
1138 d = PyModule_GetDict(m);
1139 file = PyString_FromString(pathname);
1140 if (file == NULL)
1141 goto error;
1142 path = Py_BuildValue("[O]", file);
1143 if (path == NULL)
1144 goto error;
1145 err = PyDict_SetItemString(d, "__file__", file);
1146 if (err == 0)
1147 err = PyDict_SetItemString(d, "__path__", path);
1148 if (err != 0)
1149 goto error;
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001150 buf = PyMem_MALLOC(MAXPATHLEN+1);
1151 if (buf == NULL) {
1152 PyErr_NoMemory();
1153 goto error;
1154 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001155 buf[0] = '\0';
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001156 fdp = find_module(name, "__init__", path, buf, MAXPATHLEN+1, &fp, NULL);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001157 if (fdp == NULL) {
1158 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
1159 PyErr_Clear();
1160 Py_INCREF(m);
1161 }
1162 else
1163 m = NULL;
1164 goto cleanup;
1165 }
1166 m = load_module(name, fp, buf, fdp->type, NULL);
1167 if (fp != NULL)
1168 fclose(fp);
1169 goto cleanup;
Tim Peters1cd70172004-08-02 03:52:12 +00001170
1171 error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001172 m = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001173 cleanup:
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001174 if (buf)
1175 PyMem_FREE(buf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001176 Py_XDECREF(path);
1177 Py_XDECREF(file);
1178 return m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001179}
1180
1181
1182/* Helper to test for built-in module */
1183
1184static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001185is_builtin(char *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001186{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001187 int i;
1188 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
1189 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
1190 if (PyImport_Inittab[i].initfunc == NULL)
1191 return -1;
1192 else
1193 return 1;
1194 }
1195 }
1196 return 0;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001197}
1198
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001199
Just van Rossum52e14d62002-12-30 22:08:05 +00001200/* Return an importer object for a sys.path/pkg.__path__ item 'p',
1201 possibly by fetching it from the path_importer_cache dict. If it
Brett Cannon94b69f62006-09-28 22:10:14 +00001202 wasn't yet cached, traverse path_hooks until a hook is found
Just van Rossum52e14d62002-12-30 22:08:05 +00001203 that can handle the path item. Return None if no hook could;
1204 this tells our caller it should fall back to the builtin
1205 import mechanism. Cache the result in path_importer_cache.
1206 Returns a borrowed reference. */
1207
1208static PyObject *
1209get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001210 PyObject *p)
Just van Rossum52e14d62002-12-30 22:08:05 +00001211{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001212 PyObject *importer;
1213 Py_ssize_t j, nhooks;
Just van Rossum52e14d62002-12-30 22:08:05 +00001214
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001215 /* These conditions are the caller's responsibility: */
1216 assert(PyList_Check(path_hooks));
1217 assert(PyDict_Check(path_importer_cache));
Just van Rossum52e14d62002-12-30 22:08:05 +00001218
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001219 nhooks = PyList_Size(path_hooks);
1220 if (nhooks < 0)
1221 return NULL; /* Shouldn't happen */
Just van Rossum52e14d62002-12-30 22:08:05 +00001222
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001223 importer = PyDict_GetItem(path_importer_cache, p);
1224 if (importer != NULL)
1225 return importer;
Just van Rossum52e14d62002-12-30 22:08:05 +00001226
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001227 /* set path_importer_cache[p] to None to avoid recursion */
1228 if (PyDict_SetItem(path_importer_cache, p, Py_None) != 0)
1229 return NULL;
Just van Rossum52e14d62002-12-30 22:08:05 +00001230
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001231 for (j = 0; j < nhooks; j++) {
1232 PyObject *hook = PyList_GetItem(path_hooks, j);
1233 if (hook == NULL)
1234 return NULL;
1235 importer = PyObject_CallFunctionObjArgs(hook, p, NULL);
1236 if (importer != NULL)
1237 break;
Just van Rossum52e14d62002-12-30 22:08:05 +00001238
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001239 if (!PyErr_ExceptionMatches(PyExc_ImportError)) {
1240 return NULL;
1241 }
1242 PyErr_Clear();
1243 }
1244 if (importer == NULL) {
1245 importer = PyObject_CallFunctionObjArgs(
1246 (PyObject *)&PyNullImporter_Type, p, NULL
1247 );
1248 if (importer == NULL) {
1249 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
1250 PyErr_Clear();
1251 return Py_None;
1252 }
1253 }
1254 }
1255 if (importer != NULL) {
1256 int err = PyDict_SetItem(path_importer_cache, p, importer);
1257 Py_DECREF(importer);
1258 if (err != 0)
1259 return NULL;
1260 }
1261 return importer;
Just van Rossum52e14d62002-12-30 22:08:05 +00001262}
1263
Nick Coghlan327a39b2007-11-18 11:56:28 +00001264PyAPI_FUNC(PyObject *)
1265PyImport_GetImporter(PyObject *path) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001266 PyObject *importer=NULL, *path_importer_cache=NULL, *path_hooks=NULL;
Nick Coghlan327a39b2007-11-18 11:56:28 +00001267
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001268 if ((path_importer_cache = PySys_GetObject("path_importer_cache"))) {
1269 if ((path_hooks = PySys_GetObject("path_hooks"))) {
1270 importer = get_path_importer(path_importer_cache,
1271 path_hooks, path);
1272 }
1273 }
1274 Py_XINCREF(importer); /* get_path_importer returns a borrowed reference */
1275 return importer;
Nick Coghlan327a39b2007-11-18 11:56:28 +00001276}
1277
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001278/* Search the path (default sys.path) for a module. Return the
1279 corresponding filedescr struct, and (via return arguments) the
1280 pathname and an open file. Return NULL if the module is not found. */
1281
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001282#ifdef MS_COREDLL
Thomas Woutersb4bd21c2000-07-22 23:38:01 +00001283extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001284 char *, Py_ssize_t);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001285#endif
1286
Martin v. Löwis18e16552006-02-15 17:27:45 +00001287static int case_ok(char *, Py_ssize_t, Py_ssize_t, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001288static int find_init_module(char *); /* Forward */
Just van Rossum52e14d62002-12-30 22:08:05 +00001289static struct filedescr importhookdescr = {"", "", IMP_HOOK};
Guido van Rossum197346f1997-10-31 18:38:52 +00001290
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001291static struct filedescr *
Just van Rossum52e14d62002-12-30 22:08:05 +00001292find_module(char *fullname, char *subname, PyObject *path, char *buf,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001293 size_t buflen, FILE **p_fp, PyObject **p_loader)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001294{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001295 Py_ssize_t i, npath;
1296 size_t len, namelen;
1297 struct filedescr *fdp = NULL;
1298 char *filemode;
1299 FILE *fp = NULL;
1300 PyObject *path_hooks, *path_importer_cache;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001301 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
1302 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
1303 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001304 char *name;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001305#if defined(PYOS_OS2)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001306 size_t saved_len;
1307 size_t saved_namelen;
1308 char *saved_buf = NULL;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001309#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001310 if (p_loader != NULL)
1311 *p_loader = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001312
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001313 if (strlen(subname) > MAXPATHLEN) {
1314 PyErr_SetString(PyExc_OverflowError,
1315 "module name is too long");
1316 return NULL;
1317 }
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001318 name = PyMem_MALLOC(MAXPATHLEN+1);
1319 if (name == NULL) {
Gregory P. Smitha72aa842012-04-18 16:41:56 -07001320 PyErr_NoMemory();
1321 return NULL;
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001322 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001323 strcpy(name, subname);
Just van Rossum52e14d62002-12-30 22:08:05 +00001324
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001325 /* sys.meta_path import hook */
1326 if (p_loader != NULL) {
1327 PyObject *meta_path;
Just van Rossum52e14d62002-12-30 22:08:05 +00001328
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001329 meta_path = PySys_GetObject("meta_path");
1330 if (meta_path == NULL || !PyList_Check(meta_path)) {
Victor Stinnered36c062011-09-15 19:45:53 +02001331 PyErr_SetString(PyExc_RuntimeError,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001332 "sys.meta_path must be a list of "
1333 "import hooks");
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001334 goto error_exit;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001335 }
1336 Py_INCREF(meta_path); /* zap guard */
1337 npath = PyList_Size(meta_path);
1338 for (i = 0; i < npath; i++) {
1339 PyObject *loader;
1340 PyObject *hook = PyList_GetItem(meta_path, i);
1341 loader = PyObject_CallMethod(hook, "find_module",
1342 "sO", fullname,
1343 path != NULL ?
1344 path : Py_None);
1345 if (loader == NULL) {
1346 Py_DECREF(meta_path);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001347 goto error_exit; /* true error */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001348 }
1349 if (loader != Py_None) {
1350 /* a loader was found */
1351 *p_loader = loader;
1352 Py_DECREF(meta_path);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001353 PyMem_FREE(name);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001354 return &importhookdescr;
1355 }
1356 Py_DECREF(loader);
1357 }
1358 Py_DECREF(meta_path);
1359 }
Guido van Rossum0506a431998-08-11 15:07:39 +00001360
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001361 if (path != NULL && PyString_Check(path)) {
1362 /* The only type of submodule allowed inside a "frozen"
1363 package are other frozen modules or packages. */
1364 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
1365 PyErr_SetString(PyExc_ImportError,
1366 "full frozen module name too long");
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001367 goto error_exit;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001368 }
1369 strcpy(buf, PyString_AsString(path));
1370 strcat(buf, ".");
1371 strcat(buf, name);
1372 strcpy(name, buf);
1373 if (find_frozen(name) != NULL) {
1374 strcpy(buf, name);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001375 PyMem_FREE(name);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001376 return &fd_frozen;
1377 }
1378 PyErr_Format(PyExc_ImportError,
1379 "No frozen submodule named %.200s", name);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001380 goto error_exit;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001381 }
1382 if (path == NULL) {
1383 if (is_builtin(name)) {
1384 strcpy(buf, name);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001385 PyMem_FREE(name);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001386 return &fd_builtin;
1387 }
1388 if ((find_frozen(name)) != NULL) {
1389 strcpy(buf, name);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001390 PyMem_FREE(name);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001391 return &fd_frozen;
1392 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001393
Guido van Rossumac279101996-08-22 23:10:58 +00001394#ifdef MS_COREDLL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001395 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
1396 if (fp != NULL) {
1397 *p_fp = fp;
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001398 PyMem_FREE(name);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001399 return fdp;
1400 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +00001401#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001402 path = PySys_GetObject("path");
1403 }
1404 if (path == NULL || !PyList_Check(path)) {
Victor Stinnered36c062011-09-15 19:45:53 +02001405 PyErr_SetString(PyExc_RuntimeError,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001406 "sys.path must be a list of directory names");
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001407 goto error_exit;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001408 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001409
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001410 path_hooks = PySys_GetObject("path_hooks");
1411 if (path_hooks == NULL || !PyList_Check(path_hooks)) {
Victor Stinnered36c062011-09-15 19:45:53 +02001412 PyErr_SetString(PyExc_RuntimeError,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001413 "sys.path_hooks must be a list of "
1414 "import hooks");
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001415 goto error_exit;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001416 }
1417 path_importer_cache = PySys_GetObject("path_importer_cache");
1418 if (path_importer_cache == NULL ||
1419 !PyDict_Check(path_importer_cache)) {
Victor Stinnered36c062011-09-15 19:45:53 +02001420 PyErr_SetString(PyExc_RuntimeError,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001421 "sys.path_importer_cache must be a dict");
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001422 goto error_exit;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001423 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001424
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001425 npath = PyList_Size(path);
1426 namelen = strlen(name);
1427 for (i = 0; i < npath; i++) {
1428 PyObject *copy = NULL;
1429 PyObject *v = PyList_GetItem(path, i);
1430 if (!v)
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001431 goto error_exit;
Walter Dörwald3430d702002-06-17 10:43:59 +00001432#ifdef Py_USING_UNICODE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001433 if (PyUnicode_Check(v)) {
1434 copy = PyUnicode_Encode(PyUnicode_AS_UNICODE(v),
1435 PyUnicode_GET_SIZE(v), Py_FileSystemDefaultEncoding, NULL);
1436 if (copy == NULL)
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001437 goto error_exit;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001438 v = copy;
1439 }
1440 else
Walter Dörwald3430d702002-06-17 10:43:59 +00001441#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001442 if (!PyString_Check(v))
1443 continue;
1444 len = PyString_GET_SIZE(v);
1445 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen) {
1446 Py_XDECREF(copy);
1447 continue; /* Too long */
1448 }
1449 strcpy(buf, PyString_AS_STRING(v));
1450 if (strlen(buf) != len) {
1451 Py_XDECREF(copy);
1452 continue; /* v contains '\0' */
1453 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001454
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001455 /* sys.path_hooks import hook */
1456 if (p_loader != NULL) {
1457 PyObject *importer;
Just van Rossum52e14d62002-12-30 22:08:05 +00001458
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001459 importer = get_path_importer(path_importer_cache,
1460 path_hooks, v);
1461 if (importer == NULL) {
1462 Py_XDECREF(copy);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001463 goto error_exit;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001464 }
1465 /* Note: importer is a borrowed reference */
1466 if (importer != Py_None) {
1467 PyObject *loader;
1468 loader = PyObject_CallMethod(importer,
1469 "find_module",
1470 "s", fullname);
1471 Py_XDECREF(copy);
1472 if (loader == NULL)
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001473 goto error_exit; /* error */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001474 if (loader != Py_None) {
1475 /* a loader was found */
1476 *p_loader = loader;
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001477 PyMem_FREE(name);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001478 return &importhookdescr;
1479 }
1480 Py_DECREF(loader);
1481 continue;
1482 }
1483 }
1484 /* no hook was found, use builtin import */
Just van Rossum52e14d62002-12-30 22:08:05 +00001485
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001486 if (len > 0 && buf[len-1] != SEP
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001487#ifdef ALTSEP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001488 && buf[len-1] != ALTSEP
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001489#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001490 )
1491 buf[len++] = SEP;
1492 strcpy(buf+len, name);
1493 len += namelen;
Tim Peters50d8d372001-02-28 05:34:27 +00001494
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001495 /* Check for package import (buf holds a directory name,
1496 and there's an __init__ module in that directory */
Jason R. Coombs925ff742012-01-13 17:12:25 -05001497 if (isdir(buf) && /* it's an existing directory */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001498 case_ok(buf, len, namelen, name)) { /* case matches */
1499 if (find_init_module(buf)) { /* and has __init__.py */
1500 Py_XDECREF(copy);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001501 PyMem_FREE(name);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001502 return &fd_package;
1503 }
1504 else {
1505 char warnstr[MAXPATHLEN+80];
1506 sprintf(warnstr, "Not importing directory "
1507 "'%.*s': missing __init__.py",
1508 MAXPATHLEN, buf);
1509 if (PyErr_Warn(PyExc_ImportWarning,
1510 warnstr)) {
1511 Py_XDECREF(copy);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001512 goto error_exit;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001513 }
1514 }
1515 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001516#if defined(PYOS_OS2)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001517 /* take a snapshot of the module spec for restoration
1518 * after the 8 character DLL hackery
1519 */
1520 saved_buf = strdup(buf);
1521 saved_len = len;
1522 saved_namelen = namelen;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001523#endif /* PYOS_OS2 */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001524 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Georg Brandladd36e52007-08-23 18:08:06 +00001525#if defined(PYOS_OS2) && defined(HAVE_DYNAMIC_LOADING)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001526 /* OS/2 limits DLLs to 8 character names (w/o
1527 extension)
1528 * so if the name is longer than that and its a
1529 * dynamically loaded module we're going to try,
1530 * truncate the name before trying
1531 */
1532 if (strlen(subname) > 8) {
1533 /* is this an attempt to load a C extension? */
1534 const struct filedescr *scan;
1535 scan = _PyImport_DynLoadFiletab;
1536 while (scan->suffix != NULL) {
1537 if (!strcmp(scan->suffix, fdp->suffix))
1538 break;
1539 else
1540 scan++;
1541 }
1542 if (scan->suffix != NULL) {
1543 /* yes, so truncate the name */
1544 namelen = 8;
1545 len -= strlen(subname) - namelen;
1546 buf[len] = '\0';
1547 }
1548 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001549#endif /* PYOS_OS2 */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001550 strcpy(buf+len, fdp->suffix);
1551 if (Py_VerboseFlag > 1)
1552 PySys_WriteStderr("# trying %s\n", buf);
1553 filemode = fdp->mode;
1554 if (filemode[0] == 'U')
1555 filemode = "r" PY_STDIOTEXTMODE;
1556 fp = fopen(buf, filemode);
1557 if (fp != NULL) {
1558 if (case_ok(buf, len, namelen, name))
1559 break;
1560 else { /* continue search */
1561 fclose(fp);
1562 fp = NULL;
1563 }
1564 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001565#if defined(PYOS_OS2)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001566 /* restore the saved snapshot */
1567 strcpy(buf, saved_buf);
1568 len = saved_len;
1569 namelen = saved_namelen;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001570#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001571 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001572#if defined(PYOS_OS2)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001573 /* don't need/want the module name snapshot anymore */
1574 if (saved_buf)
1575 {
1576 free(saved_buf);
1577 saved_buf = NULL;
1578 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001579#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001580 Py_XDECREF(copy);
1581 if (fp != NULL)
1582 break;
1583 }
1584 if (fp == NULL) {
1585 PyErr_Format(PyExc_ImportError,
1586 "No module named %.200s", name);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001587 goto error_exit;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001588 }
1589 *p_fp = fp;
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001590 PyMem_FREE(name);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001591 return fdp;
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001592
1593error_exit:
1594 PyMem_FREE(name);
1595 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001596}
1597
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +00001598/* Helpers for main.c
1599 * Find the source file corresponding to a named module
1600 */
1601struct filedescr *
1602_PyImport_FindModule(const char *name, PyObject *path, char *buf,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001603 size_t buflen, FILE **p_fp, PyObject **p_loader)
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +00001604{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001605 return find_module((char *) name, (char *) name, path,
1606 buf, buflen, p_fp, p_loader);
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +00001607}
1608
1609PyAPI_FUNC(int) _PyImport_IsScript(struct filedescr * fd)
1610{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001611 return fd->type == PY_SOURCE || fd->type == PY_COMPILED;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +00001612}
1613
Martin v. Löwis18e16552006-02-15 17:27:45 +00001614/* case_ok(char* buf, Py_ssize_t len, Py_ssize_t namelen, char* name)
Tim Petersd1e87a82001-03-01 18:12:00 +00001615 * The arguments here are tricky, best shown by example:
1616 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1617 * ^ ^ ^ ^
1618 * |--------------------- buf ---------------------|
1619 * |------------------- len ------------------|
1620 * |------ name -------|
1621 * |----- namelen -----|
1622 * buf is the full path, but len only counts up to (& exclusive of) the
1623 * extension. name is the module name, also exclusive of extension.
1624 *
1625 * We've already done a successful stat() or fopen() on buf, so know that
1626 * there's some match, possibly case-insensitive.
1627 *
Tim Peters50d8d372001-02-28 05:34:27 +00001628 * case_ok() is to return 1 if there's a case-sensitive match for
1629 * name, else 0. case_ok() is also to return 1 if envar PYTHONCASEOK
1630 * exists.
Tim Petersd1e87a82001-03-01 18:12:00 +00001631 *
Tim Peters50d8d372001-02-28 05:34:27 +00001632 * case_ok() is used to implement case-sensitive import semantics even
1633 * on platforms with case-insensitive filesystems. It's trivial to implement
1634 * for case-sensitive filesystems. It's pretty much a cross-platform
1635 * nightmare for systems with case-insensitive filesystems.
1636 */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001637
Tim Peters50d8d372001-02-28 05:34:27 +00001638/* First we may need a pile of platform-specific header files; the sequence
1639 * of #if's here should match the sequence in the body of case_ok().
1640 */
Jason Tishler7961aa62005-05-20 00:56:54 +00001641#if defined(MS_WINDOWS)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001642#include <windows.h>
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001643
Tim Peters50d8d372001-02-28 05:34:27 +00001644#elif defined(DJGPP)
1645#include <dir.h>
1646
Jason Tishler7961aa62005-05-20 00:56:54 +00001647#elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001648#include <sys/types.h>
1649#include <dirent.h>
1650
Andrew MacIntyred9400542002-02-26 11:41:34 +00001651#elif defined(PYOS_OS2)
1652#define INCL_DOS
1653#define INCL_DOSERRORS
1654#define INCL_NOPMAPI
1655#include <os2.h>
1656
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001657#elif defined(RISCOS)
1658#include "oslib/osfscontrol.h"
Tim Peters50d8d372001-02-28 05:34:27 +00001659#endif
1660
Guido van Rossum0980bd91998-02-13 17:18:36 +00001661static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001662case_ok(char *buf, Py_ssize_t len, Py_ssize_t namelen, char *name)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001663{
Tim Peters50d8d372001-02-28 05:34:27 +00001664/* Pick a platform-specific implementation; the sequence of #if's here should
1665 * match the sequence just above.
1666 */
1667
Jason Tishler7961aa62005-05-20 00:56:54 +00001668/* MS_WINDOWS */
1669#if defined(MS_WINDOWS)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001670 WIN32_FIND_DATA data;
1671 HANDLE h;
Tim Peters50d8d372001-02-28 05:34:27 +00001672
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001673 if (Py_GETENV("PYTHONCASEOK") != NULL)
1674 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001675
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001676 h = FindFirstFile(buf, &data);
1677 if (h == INVALID_HANDLE_VALUE) {
1678 PyErr_Format(PyExc_NameError,
1679 "Can't find file for module %.100s\n(filename %.300s)",
1680 name, buf);
1681 return 0;
1682 }
1683 FindClose(h);
1684 return strncmp(data.cFileName, name, namelen) == 0;
Tim Peters50d8d372001-02-28 05:34:27 +00001685
1686/* DJGPP */
1687#elif defined(DJGPP)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001688 struct ffblk ffblk;
1689 int done;
Tim Peters50d8d372001-02-28 05:34:27 +00001690
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001691 if (Py_GETENV("PYTHONCASEOK") != NULL)
1692 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001693
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001694 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
1695 if (done) {
1696 PyErr_Format(PyExc_NameError,
1697 "Can't find file for module %.100s\n(filename %.300s)",
1698 name, buf);
1699 return 0;
1700 }
1701 return strncmp(ffblk.ff_name, name, namelen) == 0;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001702
Jason Tishler7961aa62005-05-20 00:56:54 +00001703/* new-fangled macintosh (macosx) or Cygwin */
1704#elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001705 DIR *dirp;
1706 struct dirent *dp;
1707 char dirname[MAXPATHLEN + 1];
1708 const int dirlen = len - namelen - 1; /* don't want trailing SEP */
Tim Peters430f5d42001-03-01 01:30:56 +00001709
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001710 if (Py_GETENV("PYTHONCASEOK") != NULL)
1711 return 1;
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001712
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001713 /* Copy the dir component into dirname; substitute "." if empty */
1714 if (dirlen <= 0) {
1715 dirname[0] = '.';
1716 dirname[1] = '\0';
1717 }
1718 else {
1719 assert(dirlen <= MAXPATHLEN);
1720 memcpy(dirname, buf, dirlen);
1721 dirname[dirlen] = '\0';
1722 }
1723 /* Open the directory and search the entries for an exact match. */
1724 dirp = opendir(dirname);
1725 if (dirp) {
1726 char *nameWithExt = buf + len - namelen;
1727 while ((dp = readdir(dirp)) != NULL) {
1728 const int thislen =
Tim Peters430f5d42001-03-01 01:30:56 +00001729#ifdef _DIRENT_HAVE_D_NAMELEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001730 dp->d_namlen;
Tim Peters430f5d42001-03-01 01:30:56 +00001731#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001732 strlen(dp->d_name);
Tim Peters430f5d42001-03-01 01:30:56 +00001733#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001734 if (thislen >= namelen &&
1735 strcmp(dp->d_name, nameWithExt) == 0) {
1736 (void)closedir(dirp);
1737 return 1; /* Found */
1738 }
1739 }
1740 (void)closedir(dirp);
1741 }
1742 return 0 ; /* Not found */
Tim Peters430f5d42001-03-01 01:30:56 +00001743
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001744/* RISC OS */
1745#elif defined(RISCOS)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001746 char canon[MAXPATHLEN+1]; /* buffer for the canonical form of the path */
1747 char buf2[MAXPATHLEN+2];
1748 char *nameWithExt = buf+len-namelen;
1749 int canonlen;
1750 os_error *e;
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001751
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001752 if (Py_GETENV("PYTHONCASEOK") != NULL)
1753 return 1;
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001754
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001755 /* workaround:
1756 append wildcard, otherwise case of filename wouldn't be touched */
1757 strcpy(buf2, buf);
1758 strcat(buf2, "*");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001759
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001760 e = xosfscontrol_canonicalise_path(buf2,canon,0,0,MAXPATHLEN+1,&canonlen);
1761 canonlen = MAXPATHLEN+1-canonlen;
1762 if (e || canonlen<=0 || canonlen>(MAXPATHLEN+1) )
1763 return 0;
1764 if (strcmp(nameWithExt, canon+canonlen-strlen(nameWithExt))==0)
1765 return 1; /* match */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001766
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001767 return 0;
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001768
Andrew MacIntyred9400542002-02-26 11:41:34 +00001769/* OS/2 */
1770#elif defined(PYOS_OS2)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001771 HDIR hdir = 1;
1772 ULONG srchcnt = 1;
1773 FILEFINDBUF3 ffbuf;
1774 APIRET rc;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001775
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001776 if (Py_GETENV("PYTHONCASEOK") != NULL)
1777 return 1;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001778
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001779 rc = DosFindFirst(buf,
1780 &hdir,
1781 FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY,
1782 &ffbuf, sizeof(ffbuf),
1783 &srchcnt,
1784 FIL_STANDARD);
1785 if (rc != NO_ERROR)
1786 return 0;
1787 return strncmp(ffbuf.achName, name, namelen) == 0;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001788
Tim Peters50d8d372001-02-28 05:34:27 +00001789/* assuming it's a case-sensitive filesystem, so there's nothing to do! */
1790#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001791 return 1;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001792
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001793#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001794}
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001795
Guido van Rossum0980bd91998-02-13 17:18:36 +00001796
Guido van Rossum197346f1997-10-31 18:38:52 +00001797#ifdef HAVE_STAT
1798/* Helper to look for __init__.py or __init__.py[co] in potential package */
1799static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001800find_init_module(char *buf)
Guido van Rossum197346f1997-10-31 18:38:52 +00001801{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001802 const size_t save_len = strlen(buf);
1803 size_t i = save_len;
1804 char *pname; /* pointer to start of __init__ */
1805 struct stat statbuf;
Guido van Rossum197346f1997-10-31 18:38:52 +00001806
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001807/* For calling case_ok(buf, len, namelen, name):
1808 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1809 * ^ ^ ^ ^
1810 * |--------------------- buf ---------------------|
1811 * |------------------- len ------------------|
1812 * |------ name -------|
1813 * |----- namelen -----|
Tim Peters0f9431f2001-07-05 03:47:53 +00001814 */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001815 if (save_len + 13 >= MAXPATHLEN)
1816 return 0;
1817 buf[i++] = SEP;
1818 pname = buf + i;
1819 strcpy(pname, "__init__.py");
1820 if (stat(buf, &statbuf) == 0) {
1821 if (case_ok(buf,
1822 save_len + 9, /* len("/__init__") */
1823 8, /* len("__init__") */
1824 pname)) {
1825 buf[save_len] = '\0';
1826 return 1;
1827 }
1828 }
1829 i += strlen(pname);
1830 strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
1831 if (stat(buf, &statbuf) == 0) {
1832 if (case_ok(buf,
1833 save_len + 9, /* len("/__init__") */
1834 8, /* len("__init__") */
1835 pname)) {
1836 buf[save_len] = '\0';
1837 return 1;
1838 }
1839 }
1840 buf[save_len] = '\0';
1841 return 0;
Guido van Rossum197346f1997-10-31 18:38:52 +00001842}
Guido van Rossum48a680c2001-03-02 06:34:14 +00001843
1844#else
1845
1846#ifdef RISCOS
1847static int
1848find_init_module(buf)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001849 char *buf;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001850{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001851 int save_len = strlen(buf);
1852 int i = save_len;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001853
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001854 if (save_len + 13 >= MAXPATHLEN)
1855 return 0;
1856 buf[i++] = SEP;
1857 strcpy(buf+i, "__init__/py");
1858 if (isfile(buf)) {
1859 buf[save_len] = '\0';
1860 return 1;
1861 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001862
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001863 if (Py_OptimizeFlag)
1864 strcpy(buf+i, "o");
1865 else
1866 strcpy(buf+i, "c");
1867 if (isfile(buf)) {
1868 buf[save_len] = '\0';
1869 return 1;
1870 }
1871 buf[save_len] = '\0';
1872 return 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001873}
1874#endif /*RISCOS*/
1875
Guido van Rossum197346f1997-10-31 18:38:52 +00001876#endif /* HAVE_STAT */
1877
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001878
Tim Petersdbd9ba62000-07-09 03:09:57 +00001879static int init_builtin(char *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001880
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001881/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001882 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001883
Guido van Rossum79f25d91997-04-29 20:08:16 +00001884static PyObject *
Amaury Forgeot d'Arc982b2fa2009-07-25 16:22:06 +00001885load_module(char *name, FILE *fp, char *pathname, int type, PyObject *loader)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001886{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001887 PyObject *modules;
1888 PyObject *m;
1889 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001890
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001891 /* First check that there's an open file (if we need one) */
1892 switch (type) {
1893 case PY_SOURCE:
1894 case PY_COMPILED:
1895 if (fp == NULL) {
1896 PyErr_Format(PyExc_ValueError,
1897 "file object required for import (type code %d)",
1898 type);
1899 return NULL;
1900 }
1901 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001902
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001903 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001904
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001905 case PY_SOURCE:
1906 m = load_source_module(name, pathname, fp);
1907 break;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001908
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001909 case PY_COMPILED:
1910 m = load_compiled_module(name, pathname, fp);
1911 break;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001912
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001913#ifdef HAVE_DYNAMIC_LOADING
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001914 case C_EXTENSION:
1915 m = _PyImport_LoadDynamicModule(name, pathname, fp);
1916 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001917#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001918
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001919 case PKG_DIRECTORY:
1920 m = load_package(name, pathname);
1921 break;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001922
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001923 case C_BUILTIN:
1924 case PY_FROZEN:
1925 if (pathname != NULL && pathname[0] != '\0')
1926 name = pathname;
1927 if (type == C_BUILTIN)
1928 err = init_builtin(name);
1929 else
1930 err = PyImport_ImportFrozenModule(name);
1931 if (err < 0)
1932 return NULL;
1933 if (err == 0) {
1934 PyErr_Format(PyExc_ImportError,
1935 "Purported %s module %.200s not found",
1936 type == C_BUILTIN ?
1937 "builtin" : "frozen",
1938 name);
1939 return NULL;
1940 }
1941 modules = PyImport_GetModuleDict();
1942 m = PyDict_GetItemString(modules, name);
1943 if (m == NULL) {
1944 PyErr_Format(
1945 PyExc_ImportError,
1946 "%s module %.200s not properly initialized",
1947 type == C_BUILTIN ?
1948 "builtin" : "frozen",
1949 name);
1950 return NULL;
1951 }
1952 Py_INCREF(m);
1953 break;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001954
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001955 case IMP_HOOK: {
1956 if (loader == NULL) {
1957 PyErr_SetString(PyExc_ImportError,
1958 "import hook without loader");
1959 return NULL;
1960 }
1961 m = PyObject_CallMethod(loader, "load_module", "s", name);
1962 break;
1963 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001964
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001965 default:
1966 PyErr_Format(PyExc_ImportError,
1967 "Don't know how to import %.200s (type code %d)",
1968 name, type);
1969 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001970
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001971 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001972
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001973 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001974}
1975
1976
1977/* Initialize a built-in module.
Brett Cannon5a9aa4f2006-10-03 21:58:55 +00001978 Return 1 for success, 0 if the module is not found, and -1 with
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001979 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001980
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001981static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001982init_builtin(char *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001983{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001984 struct _inittab *p;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001985
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001986 if (_PyImport_FindExtension(name, name) != NULL)
1987 return 1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001988
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001989 for (p = PyImport_Inittab; p->name != NULL; p++) {
1990 if (strcmp(name, p->name) == 0) {
1991 if (p->initfunc == NULL) {
1992 PyErr_Format(PyExc_ImportError,
1993 "Cannot re-init internal module %.200s",
1994 name);
1995 return -1;
1996 }
1997 if (Py_VerboseFlag)
1998 PySys_WriteStderr("import %s # builtin\n", name);
1999 (*p->initfunc)();
2000 if (PyErr_Occurred())
2001 return -1;
2002 if (_PyImport_FixupExtension(name, name) == NULL)
2003 return -1;
2004 return 1;
2005 }
2006 }
2007 return 0;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00002008}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00002009
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002010
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002011/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002012
Guido van Rossumcfd0a221996-06-17 17:06:34 +00002013static struct _frozen *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002014find_frozen(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002015{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002016 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002017
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002018 for (p = PyImport_FrozenModules; ; p++) {
2019 if (p->name == NULL)
2020 return NULL;
2021 if (strcmp(p->name, name) == 0)
2022 break;
2023 }
2024 return p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002025}
2026
Guido van Rossum79f25d91997-04-29 20:08:16 +00002027static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002028get_frozen_object(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002029{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002030 struct _frozen *p = find_frozen(name);
2031 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002032
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002033 if (p == NULL) {
2034 PyErr_Format(PyExc_ImportError,
2035 "No such frozen object named %.200s",
2036 name);
2037 return NULL;
2038 }
2039 if (p->code == NULL) {
2040 PyErr_Format(PyExc_ImportError,
2041 "Excluded frozen object named %.200s",
2042 name);
2043 return NULL;
2044 }
2045 size = p->size;
2046 if (size < 0)
2047 size = -size;
2048 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002049}
2050
2051/* Initialize a frozen module.
2052 Return 1 for succes, 0 if the module is not found, and -1 with
2053 an exception set if the initialization failed.
2054 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00002055
2056int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002057PyImport_ImportFrozenModule(char *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00002058{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002059 struct _frozen *p = find_frozen(name);
2060 PyObject *co;
2061 PyObject *m;
2062 int ispackage;
2063 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002064
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002065 if (p == NULL)
2066 return 0;
2067 if (p->code == NULL) {
2068 PyErr_Format(PyExc_ImportError,
2069 "Excluded frozen object named %.200s",
2070 name);
2071 return -1;
2072 }
2073 size = p->size;
2074 ispackage = (size < 0);
2075 if (ispackage)
2076 size = -size;
2077 if (Py_VerboseFlag)
2078 PySys_WriteStderr("import %s # frozen%s\n",
2079 name, ispackage ? " package" : "");
2080 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
2081 if (co == NULL)
2082 return -1;
2083 if (!PyCode_Check(co)) {
2084 PyErr_Format(PyExc_TypeError,
2085 "frozen object %.200s is not a code object",
2086 name);
2087 goto err_return;
2088 }
2089 if (ispackage) {
2090 /* Set __path__ to the package name */
2091 PyObject *d, *s;
2092 int err;
2093 m = PyImport_AddModule(name);
2094 if (m == NULL)
2095 goto err_return;
2096 d = PyModule_GetDict(m);
2097 s = PyString_InternFromString(name);
2098 if (s == NULL)
2099 goto err_return;
2100 err = PyDict_SetItemString(d, "__path__", s);
2101 Py_DECREF(s);
2102 if (err != 0)
2103 goto err_return;
2104 }
2105 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
2106 if (m == NULL)
2107 goto err_return;
2108 Py_DECREF(co);
2109 Py_DECREF(m);
2110 return 1;
Neal Norwitzc0cde4d2006-07-16 02:17:36 +00002111err_return:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002112 Py_DECREF(co);
2113 return -1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00002114}
Guido van Rossum74e6a111994-08-29 12:54:38 +00002115
2116
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002117/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00002118 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00002119
Guido van Rossum79f25d91997-04-29 20:08:16 +00002120PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00002121PyImport_ImportModule(const char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00002122{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002123 PyObject *pname;
2124 PyObject *result;
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00002125
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002126 pname = PyString_FromString(name);
2127 if (pname == NULL)
2128 return NULL;
2129 result = PyImport_Import(pname);
2130 Py_DECREF(pname);
2131 return result;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002132}
2133
Christian Heimes000a0742008-01-03 22:16:32 +00002134/* Import a module without blocking
2135 *
2136 * At first it tries to fetch the module from sys.modules. If the module was
2137 * never loaded before it loads it with PyImport_ImportModule() unless another
2138 * thread holds the import lock. In the latter case the function raises an
2139 * ImportError instead of blocking.
2140 *
2141 * Returns the module object with incremented ref count.
2142 */
2143PyObject *
2144PyImport_ImportModuleNoBlock(const char *name)
2145{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002146 PyObject *result;
2147 PyObject *modules;
Victor Stinner871a0fb2011-09-02 00:21:36 +02002148#ifdef WITH_THREAD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002149 long me;
Victor Stinner871a0fb2011-09-02 00:21:36 +02002150#endif
Christian Heimes000a0742008-01-03 22:16:32 +00002151
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002152 /* Try to get the module from sys.modules[name] */
2153 modules = PyImport_GetModuleDict();
2154 if (modules == NULL)
2155 return NULL;
Christian Heimes000a0742008-01-03 22:16:32 +00002156
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002157 result = PyDict_GetItemString(modules, name);
2158 if (result != NULL) {
2159 Py_INCREF(result);
2160 return result;
2161 }
2162 else {
2163 PyErr_Clear();
2164 }
Benjamin Peterson17f03ca2008-09-01 14:18:30 +00002165#ifdef WITH_THREAD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002166 /* check the import lock
2167 * me might be -1 but I ignore the error here, the lock function
2168 * takes care of the problem */
2169 me = PyThread_get_thread_ident();
2170 if (import_lock_thread == -1 || import_lock_thread == me) {
2171 /* no thread or me is holding the lock */
2172 return PyImport_ImportModule(name);
2173 }
2174 else {
2175 PyErr_Format(PyExc_ImportError,
2176 "Failed to import %.200s because the import lock"
2177 "is held by another thread.",
2178 name);
2179 return NULL;
2180 }
Benjamin Peterson17f03ca2008-09-01 14:18:30 +00002181#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002182 return PyImport_ImportModule(name);
Benjamin Peterson17f03ca2008-09-01 14:18:30 +00002183#endif
Christian Heimes000a0742008-01-03 22:16:32 +00002184}
2185
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002186/* Forward declarations for helper routines */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002187static PyObject *get_parent(PyObject *globals, char *buf,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002188 Py_ssize_t *p_buflen, int level);
Tim Petersdbd9ba62000-07-09 03:09:57 +00002189static PyObject *load_next(PyObject *mod, PyObject *altmod,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002190 char **p_name, char *buf, Py_ssize_t *p_buflen);
Tim Petersdbd9ba62000-07-09 03:09:57 +00002191static int mark_miss(char *name);
2192static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002193 char *buf, Py_ssize_t buflen, int recursive);
Tim Petersdbd9ba62000-07-09 03:09:57 +00002194static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002195
2196/* The Magnum Opus of dotted-name import :-) */
2197
Guido van Rossum75acc9c1998-03-03 22:26:50 +00002198static PyObject *
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002199import_module_level(char *name, PyObject *globals, PyObject *locals,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002200 PyObject *fromlist, int level)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002201{
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002202 char *buf;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002203 Py_ssize_t buflen = 0;
2204 PyObject *parent, *head, *next, *tail;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002205
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002206 if (strchr(name, '/') != NULL
Christian Heimes3403f152008-01-09 19:56:33 +00002207#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002208 || strchr(name, '\\') != NULL
Christian Heimes3403f152008-01-09 19:56:33 +00002209#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002210 ) {
2211 PyErr_SetString(PyExc_ImportError,
2212 "Import by filename is not supported.");
2213 return NULL;
2214 }
Christian Heimes3403f152008-01-09 19:56:33 +00002215
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002216 buf = PyMem_MALLOC(MAXPATHLEN+1);
2217 if (buf == NULL) {
2218 return PyErr_NoMemory();
2219 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002220 parent = get_parent(globals, buf, &buflen, level);
2221 if (parent == NULL)
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002222 goto error_exit;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002223
Brett Cannoneb3cd302010-05-20 18:37:55 +00002224 head = load_next(parent, level < 0 ? Py_None : parent, &name, buf,
2225 &buflen);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002226 if (head == NULL)
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002227 goto error_exit;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002228
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002229 tail = head;
2230 Py_INCREF(tail);
2231 while (name) {
2232 next = load_next(tail, tail, &name, buf, &buflen);
2233 Py_DECREF(tail);
2234 if (next == NULL) {
2235 Py_DECREF(head);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002236 goto error_exit;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002237 }
2238 tail = next;
2239 }
2240 if (tail == Py_None) {
2241 /* If tail is Py_None, both get_parent and load_next found
2242 an empty module name: someone called __import__("") or
2243 doctored faulty bytecode */
2244 Py_DECREF(tail);
2245 Py_DECREF(head);
2246 PyErr_SetString(PyExc_ValueError,
2247 "Empty module name");
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002248 goto error_exit;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002249 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002250
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002251 if (fromlist != NULL) {
Antoine Pitrouc5bef752012-08-15 23:16:51 +02002252 int b = (fromlist == Py_None) ? 0 : PyObject_IsTrue(fromlist);
2253 if (b < 0) {
2254 Py_DECREF(tail);
2255 Py_DECREF(head);
2256 goto error_exit;
2257 }
2258 if (!b)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002259 fromlist = NULL;
2260 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002261
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002262 if (fromlist == NULL) {
2263 Py_DECREF(tail);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002264 PyMem_FREE(buf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002265 return head;
2266 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002267
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002268 Py_DECREF(head);
2269 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
2270 Py_DECREF(tail);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002271 goto error_exit;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002272 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002273
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002274 PyMem_FREE(buf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002275 return tail;
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002276
2277error_exit:
2278 PyMem_FREE(buf);
2279 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002280}
2281
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002282PyObject *
2283PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002284 PyObject *fromlist, int level)
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002285{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002286 PyObject *result;
2287 _PyImport_AcquireLock();
2288 result = import_module_level(name, globals, locals, fromlist, level);
2289 if (_PyImport_ReleaseLock() < 0) {
2290 Py_XDECREF(result);
2291 PyErr_SetString(PyExc_RuntimeError,
2292 "not holding the import lock");
2293 return NULL;
2294 }
2295 return result;
Guido van Rossum75acc9c1998-03-03 22:26:50 +00002296}
2297
Fred Drake87590902004-05-28 20:21:36 +00002298/* Return the package that an import is being performed in. If globals comes
2299 from the module foo.bar.bat (not itself a package), this returns the
2300 sys.modules entry for foo.bar. If globals is from a package's __init__.py,
Georg Brandl5f6861d2006-05-28 21:57:35 +00002301 the package's entry in sys.modules is returned, as a borrowed reference.
Fred Drake87590902004-05-28 20:21:36 +00002302
2303 The *name* of the returned package is returned in buf, with the length of
2304 the name in *p_buflen.
2305
2306 If globals doesn't come from a package or a module in a package, or a
2307 corresponding entry is not found in sys.modules, Py_None is returned.
2308*/
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002309static PyObject *
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002310get_parent(PyObject *globals, char *buf, Py_ssize_t *p_buflen, int level)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002311{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002312 static PyObject *namestr = NULL;
2313 static PyObject *pathstr = NULL;
2314 static PyObject *pkgstr = NULL;
2315 PyObject *pkgname, *modname, *modpath, *modules, *parent;
2316 int orig_level = level;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002317
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002318 if (globals == NULL || !PyDict_Check(globals) || !level)
2319 return Py_None;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002320
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002321 if (namestr == NULL) {
2322 namestr = PyString_InternFromString("__name__");
2323 if (namestr == NULL)
2324 return NULL;
2325 }
2326 if (pathstr == NULL) {
2327 pathstr = PyString_InternFromString("__path__");
2328 if (pathstr == NULL)
2329 return NULL;
2330 }
2331 if (pkgstr == NULL) {
2332 pkgstr = PyString_InternFromString("__package__");
2333 if (pkgstr == NULL)
2334 return NULL;
2335 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002336
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002337 *buf = '\0';
2338 *p_buflen = 0;
2339 pkgname = PyDict_GetItem(globals, pkgstr);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002340
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002341 if ((pkgname != NULL) && (pkgname != Py_None)) {
2342 /* __package__ is set, so use it */
2343 Py_ssize_t len;
2344 if (!PyString_Check(pkgname)) {
2345 PyErr_SetString(PyExc_ValueError,
2346 "__package__ set to non-string");
2347 return NULL;
2348 }
2349 len = PyString_GET_SIZE(pkgname);
2350 if (len == 0) {
2351 if (level > 0) {
2352 PyErr_SetString(PyExc_ValueError,
2353 "Attempted relative import in non-package");
2354 return NULL;
2355 }
2356 return Py_None;
2357 }
2358 if (len > MAXPATHLEN) {
2359 PyErr_SetString(PyExc_ValueError,
2360 "Package name too long");
2361 return NULL;
2362 }
2363 strcpy(buf, PyString_AS_STRING(pkgname));
2364 } else {
2365 /* __package__ not set, so figure it out and set it */
2366 modname = PyDict_GetItem(globals, namestr);
2367 if (modname == NULL || !PyString_Check(modname))
2368 return Py_None;
Brett Cannonb166afc2010-05-05 20:25:47 +00002369
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002370 modpath = PyDict_GetItem(globals, pathstr);
2371 if (modpath != NULL) {
2372 /* __path__ is set, so modname is already the package name */
2373 Py_ssize_t len = PyString_GET_SIZE(modname);
2374 int error;
2375 if (len > MAXPATHLEN) {
2376 PyErr_SetString(PyExc_ValueError,
2377 "Module name too long");
2378 return NULL;
2379 }
2380 strcpy(buf, PyString_AS_STRING(modname));
2381 error = PyDict_SetItem(globals, pkgstr, modname);
2382 if (error) {
2383 PyErr_SetString(PyExc_ValueError,
2384 "Could not set __package__");
2385 return NULL;
2386 }
2387 } else {
2388 /* Normal module, so work out the package name if any */
2389 char *start = PyString_AS_STRING(modname);
2390 char *lastdot = strrchr(start, '.');
2391 size_t len;
2392 int error;
2393 if (lastdot == NULL && level > 0) {
2394 PyErr_SetString(PyExc_ValueError,
2395 "Attempted relative import in non-package");
2396 return NULL;
2397 }
2398 if (lastdot == NULL) {
2399 error = PyDict_SetItem(globals, pkgstr, Py_None);
2400 if (error) {
2401 PyErr_SetString(PyExc_ValueError,
2402 "Could not set __package__");
2403 return NULL;
2404 }
2405 return Py_None;
2406 }
2407 len = lastdot - start;
2408 if (len >= MAXPATHLEN) {
2409 PyErr_SetString(PyExc_ValueError,
2410 "Module name too long");
2411 return NULL;
2412 }
2413 strncpy(buf, start, len);
2414 buf[len] = '\0';
2415 pkgname = PyString_FromString(buf);
2416 if (pkgname == NULL) {
2417 return NULL;
2418 }
2419 error = PyDict_SetItem(globals, pkgstr, pkgname);
2420 Py_DECREF(pkgname);
2421 if (error) {
2422 PyErr_SetString(PyExc_ValueError,
2423 "Could not set __package__");
2424 return NULL;
2425 }
2426 }
2427 }
2428 while (--level > 0) {
2429 char *dot = strrchr(buf, '.');
2430 if (dot == NULL) {
2431 PyErr_SetString(PyExc_ValueError,
2432 "Attempted relative import beyond "
2433 "toplevel package");
2434 return NULL;
2435 }
2436 *dot = '\0';
2437 }
2438 *p_buflen = strlen(buf);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002439
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002440 modules = PyImport_GetModuleDict();
2441 parent = PyDict_GetItemString(modules, buf);
2442 if (parent == NULL) {
2443 if (orig_level < 1) {
2444 PyObject *err_msg = PyString_FromFormat(
2445 "Parent module '%.200s' not found "
2446 "while handling absolute import", buf);
2447 if (err_msg == NULL) {
2448 return NULL;
2449 }
2450 if (!PyErr_WarnEx(PyExc_RuntimeWarning,
2451 PyString_AsString(err_msg), 1)) {
2452 *buf = '\0';
2453 *p_buflen = 0;
2454 parent = Py_None;
2455 }
2456 Py_DECREF(err_msg);
2457 } else {
2458 PyErr_Format(PyExc_SystemError,
2459 "Parent module '%.200s' not loaded, "
2460 "cannot perform relative import", buf);
2461 }
2462 }
2463 return parent;
2464 /* We expect, but can't guarantee, if parent != None, that:
2465 - parent.__name__ == buf
2466 - parent.__dict__ is globals
2467 If this is violated... Who cares? */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002468}
2469
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002470/* altmod is either None or same as mod */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002471static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002472load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002473 Py_ssize_t *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002474{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002475 char *name = *p_name;
2476 char *dot = strchr(name, '.');
2477 size_t len;
2478 char *p;
2479 PyObject *result;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002480
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002481 if (strlen(name) == 0) {
2482 /* completely empty module name should only happen in
2483 'from . import' (or '__import__("")')*/
2484 Py_INCREF(mod);
2485 *p_name = NULL;
2486 return mod;
2487 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002488
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002489 if (dot == NULL) {
2490 *p_name = NULL;
2491 len = strlen(name);
2492 }
2493 else {
2494 *p_name = dot+1;
2495 len = dot-name;
2496 }
2497 if (len == 0) {
2498 PyErr_SetString(PyExc_ValueError,
2499 "Empty module name");
2500 return NULL;
2501 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002502
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002503 p = buf + *p_buflen;
2504 if (p != buf)
2505 *p++ = '.';
2506 if (p+len-buf >= MAXPATHLEN) {
2507 PyErr_SetString(PyExc_ValueError,
2508 "Module name too long");
2509 return NULL;
2510 }
2511 strncpy(p, name, len);
2512 p[len] = '\0';
2513 *p_buflen = p+len-buf;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002514
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002515 result = import_submodule(mod, p, buf);
2516 if (result == Py_None && altmod != mod) {
2517 Py_DECREF(result);
2518 /* Here, altmod must be None and mod must not be None */
2519 result = import_submodule(altmod, p, p);
2520 if (result != NULL && result != Py_None) {
2521 if (mark_miss(buf) != 0) {
2522 Py_DECREF(result);
2523 return NULL;
2524 }
2525 strncpy(buf, name, len);
2526 buf[len] = '\0';
2527 *p_buflen = len;
2528 }
2529 }
2530 if (result == NULL)
2531 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002532
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002533 if (result == Py_None) {
2534 Py_DECREF(result);
2535 PyErr_Format(PyExc_ImportError,
2536 "No module named %.200s", name);
2537 return NULL;
2538 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002539
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002540 return result;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002541}
2542
2543static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002544mark_miss(char *name)
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00002545{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002546 PyObject *modules = PyImport_GetModuleDict();
2547 return PyDict_SetItemString(modules, name, Py_None);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00002548}
2549
2550static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002551ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, Py_ssize_t buflen,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002552 int recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002553{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002554 int i;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002555
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002556 if (!PyObject_HasAttrString(mod, "__path__"))
2557 return 1;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002558
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002559 for (i = 0; ; i++) {
2560 PyObject *item = PySequence_GetItem(fromlist, i);
2561 int hasit;
2562 if (item == NULL) {
2563 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2564 PyErr_Clear();
2565 return 1;
2566 }
2567 return 0;
2568 }
2569 if (!PyString_Check(item)) {
2570 PyErr_SetString(PyExc_TypeError,
2571 "Item in ``from list'' not a string");
2572 Py_DECREF(item);
2573 return 0;
2574 }
2575 if (PyString_AS_STRING(item)[0] == '*') {
2576 PyObject *all;
2577 Py_DECREF(item);
2578 /* See if the package defines __all__ */
2579 if (recursive)
2580 continue; /* Avoid endless recursion */
2581 all = PyObject_GetAttrString(mod, "__all__");
2582 if (all == NULL)
2583 PyErr_Clear();
2584 else {
2585 int ret = ensure_fromlist(mod, all, buf, buflen, 1);
2586 Py_DECREF(all);
2587 if (!ret)
2588 return 0;
2589 }
2590 continue;
2591 }
2592 hasit = PyObject_HasAttr(mod, item);
2593 if (!hasit) {
2594 char *subname = PyString_AS_STRING(item);
2595 PyObject *submod;
2596 char *p;
2597 if (buflen + strlen(subname) >= MAXPATHLEN) {
2598 PyErr_SetString(PyExc_ValueError,
2599 "Module name too long");
2600 Py_DECREF(item);
2601 return 0;
2602 }
2603 p = buf + buflen;
2604 *p++ = '.';
2605 strcpy(p, subname);
2606 submod = import_submodule(mod, subname, buf);
2607 Py_XDECREF(submod);
2608 if (submod == NULL) {
2609 Py_DECREF(item);
2610 return 0;
2611 }
2612 }
2613 Py_DECREF(item);
2614 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002615
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002616 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002617}
2618
Neil Schemenauer00b09662003-06-16 21:03:07 +00002619static int
2620add_submodule(PyObject *mod, PyObject *submod, char *fullname, char *subname,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002621 PyObject *modules)
Neil Schemenauer00b09662003-06-16 21:03:07 +00002622{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002623 if (mod == Py_None)
2624 return 1;
2625 /* Irrespective of the success of this load, make a
2626 reference to it in the parent package module. A copy gets
2627 saved in the modules dictionary under the full name, so get a
2628 reference from there, if need be. (The exception is when the
2629 load failed with a SyntaxError -- then there's no trace in
2630 sys.modules. In that case, of course, do nothing extra.) */
2631 if (submod == NULL) {
2632 submod = PyDict_GetItemString(modules, fullname);
2633 if (submod == NULL)
2634 return 1;
2635 }
2636 if (PyModule_Check(mod)) {
2637 /* We can't use setattr here since it can give a
2638 * spurious warning if the submodule name shadows a
2639 * builtin name */
2640 PyObject *dict = PyModule_GetDict(mod);
2641 if (!dict)
2642 return 0;
2643 if (PyDict_SetItemString(dict, subname, submod) < 0)
2644 return 0;
2645 }
2646 else {
2647 if (PyObject_SetAttrString(mod, subname, submod) < 0)
2648 return 0;
2649 }
2650 return 1;
Neil Schemenauer00b09662003-06-16 21:03:07 +00002651}
2652
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002653static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002654import_submodule(PyObject *mod, char *subname, char *fullname)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002655{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002656 PyObject *modules = PyImport_GetModuleDict();
2657 PyObject *m = NULL;
Guido van Rossum74e6a111994-08-29 12:54:38 +00002658
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002659 /* Require:
2660 if mod == None: subname == fullname
2661 else: mod.__name__ + "." + subname == fullname
2662 */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002663
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002664 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
2665 Py_INCREF(m);
2666 }
2667 else {
2668 PyObject *path, *loader = NULL;
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002669 char *buf;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002670 struct filedescr *fdp;
2671 FILE *fp = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002672
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002673 if (mod == Py_None)
2674 path = NULL;
2675 else {
2676 path = PyObject_GetAttrString(mod, "__path__");
2677 if (path == NULL) {
2678 PyErr_Clear();
2679 Py_INCREF(Py_None);
2680 return Py_None;
2681 }
2682 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002683
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002684 buf = PyMem_MALLOC(MAXPATHLEN+1);
2685 if (buf == NULL) {
2686 return PyErr_NoMemory();
2687 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002688 buf[0] = '\0';
2689 fdp = find_module(fullname, subname, path, buf, MAXPATHLEN+1,
2690 &fp, &loader);
2691 Py_XDECREF(path);
2692 if (fdp == NULL) {
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002693 PyMem_FREE(buf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002694 if (!PyErr_ExceptionMatches(PyExc_ImportError))
2695 return NULL;
2696 PyErr_Clear();
2697 Py_INCREF(Py_None);
2698 return Py_None;
2699 }
2700 m = load_module(fullname, fp, buf, fdp->type, loader);
2701 Py_XDECREF(loader);
2702 if (fp)
2703 fclose(fp);
2704 if (!add_submodule(mod, m, fullname, subname, modules)) {
2705 Py_XDECREF(m);
2706 m = NULL;
2707 }
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002708 PyMem_FREE(buf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002709 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002710
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002711 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00002712}
2713
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002714
2715/* Re-import a module of any kind and return its module object, WITH
2716 INCREMENTED REFERENCE COUNT */
2717
Guido van Rossum79f25d91997-04-29 20:08:16 +00002718PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002719PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002720{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002721 PyInterpreterState *interp = PyThreadState_Get()->interp;
2722 PyObject *modules_reloading = interp->modules_reloading;
2723 PyObject *modules = PyImport_GetModuleDict();
2724 PyObject *path = NULL, *loader = NULL, *existing_m = NULL;
2725 char *name, *subname;
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002726 char *buf;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002727 struct filedescr *fdp;
2728 FILE *fp = NULL;
2729 PyObject *newm;
Brett Cannonb166afc2010-05-05 20:25:47 +00002730
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002731 if (modules_reloading == NULL) {
2732 Py_FatalError("PyImport_ReloadModule: "
2733 "no modules_reloading dictionary!");
2734 return NULL;
2735 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002736
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002737 if (m == NULL || !PyModule_Check(m)) {
2738 PyErr_SetString(PyExc_TypeError,
2739 "reload() argument must be module");
2740 return NULL;
2741 }
2742 name = PyModule_GetName(m);
2743 if (name == NULL)
2744 return NULL;
2745 if (m != PyDict_GetItemString(modules, name)) {
2746 PyErr_Format(PyExc_ImportError,
2747 "reload(): module %.200s not in sys.modules",
2748 name);
2749 return NULL;
2750 }
2751 existing_m = PyDict_GetItemString(modules_reloading, name);
2752 if (existing_m != NULL) {
2753 /* Due to a recursive reload, this module is already
2754 being reloaded. */
2755 Py_INCREF(existing_m);
2756 return existing_m;
2757 }
2758 if (PyDict_SetItemString(modules_reloading, name, m) < 0)
2759 return NULL;
Collin Winter276887b2007-03-12 16:11:39 +00002760
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002761 subname = strrchr(name, '.');
2762 if (subname == NULL)
2763 subname = name;
2764 else {
2765 PyObject *parentname, *parent;
2766 parentname = PyString_FromStringAndSize(name, (subname-name));
2767 if (parentname == NULL) {
2768 imp_modules_reloading_clear();
2769 return NULL;
2770 }
2771 parent = PyDict_GetItem(modules, parentname);
2772 if (parent == NULL) {
2773 PyErr_Format(PyExc_ImportError,
2774 "reload(): parent %.200s not in sys.modules",
2775 PyString_AS_STRING(parentname));
2776 Py_DECREF(parentname);
2777 imp_modules_reloading_clear();
2778 return NULL;
2779 }
2780 Py_DECREF(parentname);
2781 subname++;
2782 path = PyObject_GetAttrString(parent, "__path__");
2783 if (path == NULL)
2784 PyErr_Clear();
2785 }
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002786 buf = PyMem_MALLOC(MAXPATHLEN+1);
2787 if (buf == NULL) {
2788 Py_XDECREF(path);
2789 return PyErr_NoMemory();
2790 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002791 buf[0] = '\0';
2792 fdp = find_module(name, subname, path, buf, MAXPATHLEN+1, &fp, &loader);
2793 Py_XDECREF(path);
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002794
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002795 if (fdp == NULL) {
2796 Py_XDECREF(loader);
2797 imp_modules_reloading_clear();
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002798 PyMem_FREE(buf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002799 return NULL;
2800 }
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002801
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002802 newm = load_module(name, fp, buf, fdp->type, loader);
2803 Py_XDECREF(loader);
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002804
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002805 if (fp)
2806 fclose(fp);
2807 if (newm == NULL) {
2808 /* load_module probably removed name from modules because of
2809 * the error. Put back the original module object. We're
2810 * going to return NULL in this case regardless of whether
2811 * replacing name succeeds, so the return value is ignored.
2812 */
2813 PyDict_SetItemString(modules, name, m);
2814 }
2815 imp_modules_reloading_clear();
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002816 PyMem_FREE(buf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002817 return newm;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002818}
2819
2820
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002821/* Higher-level import emulator which emulates the "import" statement
2822 more accurately -- it invokes the __import__() function from the
2823 builtins of the current globals. This means that the import is
2824 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00002825 environment, e.g. by "rexec".
2826 A dummy list ["__doc__"] is passed as the 4th argument so that
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002827 e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
Guido van Rossum6058eb41998-12-21 19:51:00 +00002828 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002829
2830PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002831PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002832{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002833 static PyObject *silly_list = NULL;
2834 static PyObject *builtins_str = NULL;
2835 static PyObject *import_str = NULL;
2836 PyObject *globals = NULL;
2837 PyObject *import = NULL;
2838 PyObject *builtins = NULL;
2839 PyObject *r = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002840
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002841 /* Initialize constant string objects */
2842 if (silly_list == NULL) {
2843 import_str = PyString_InternFromString("__import__");
2844 if (import_str == NULL)
2845 return NULL;
2846 builtins_str = PyString_InternFromString("__builtins__");
2847 if (builtins_str == NULL)
2848 return NULL;
2849 silly_list = Py_BuildValue("[s]", "__doc__");
2850 if (silly_list == NULL)
2851 return NULL;
2852 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002853
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002854 /* Get the builtins from current globals */
2855 globals = PyEval_GetGlobals();
2856 if (globals != NULL) {
2857 Py_INCREF(globals);
2858 builtins = PyObject_GetItem(globals, builtins_str);
2859 if (builtins == NULL)
2860 goto err;
2861 }
2862 else {
2863 /* No globals -- use standard builtins, and fake globals */
2864 builtins = PyImport_ImportModuleLevel("__builtin__",
2865 NULL, NULL, NULL, 0);
2866 if (builtins == NULL)
2867 return NULL;
2868 globals = Py_BuildValue("{OO}", builtins_str, builtins);
2869 if (globals == NULL)
2870 goto err;
2871 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002872
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002873 /* Get the __import__ function from the builtins */
2874 if (PyDict_Check(builtins)) {
2875 import = PyObject_GetItem(builtins, import_str);
2876 if (import == NULL)
2877 PyErr_SetObject(PyExc_KeyError, import_str);
2878 }
2879 else
2880 import = PyObject_GetAttr(builtins, import_str);
2881 if (import == NULL)
2882 goto err;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002883
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002884 /* Call the __import__ function with the proper argument list
2885 * Always use absolute import here. */
2886 r = PyObject_CallFunction(import, "OOOOi", module_name, globals,
2887 globals, silly_list, 0, NULL);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002888
2889 err:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002890 Py_XDECREF(globals);
2891 Py_XDECREF(builtins);
2892 Py_XDECREF(import);
Tim Peters50d8d372001-02-28 05:34:27 +00002893
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002894 return r;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002895}
2896
2897
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002898/* Module 'imp' provides Python access to the primitives used for
2899 importing modules.
2900*/
2901
Guido van Rossum79f25d91997-04-29 20:08:16 +00002902static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +00002903imp_get_magic(PyObject *self, PyObject *noargs)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002904{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002905 char buf[4];
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002906
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002907 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
2908 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
2909 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
2910 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002911
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002912 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002913}
2914
Guido van Rossum79f25d91997-04-29 20:08:16 +00002915static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +00002916imp_get_suffixes(PyObject *self, PyObject *noargs)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002917{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002918 PyObject *list;
2919 struct filedescr *fdp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002920
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002921 list = PyList_New(0);
2922 if (list == NULL)
2923 return NULL;
2924 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
2925 PyObject *item = Py_BuildValue("ssi",
2926 fdp->suffix, fdp->mode, fdp->type);
2927 if (item == NULL) {
2928 Py_DECREF(list);
2929 return NULL;
2930 }
2931 if (PyList_Append(list, item) < 0) {
2932 Py_DECREF(list);
2933 Py_DECREF(item);
2934 return NULL;
2935 }
2936 Py_DECREF(item);
2937 }
2938 return list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002939}
2940
Guido van Rossum79f25d91997-04-29 20:08:16 +00002941static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002942call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002943{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002944 extern int fclose(FILE *);
2945 PyObject *fob, *ret;
2946 struct filedescr *fdp;
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002947 char *pathname;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002948 FILE *fp = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002949
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002950 pathname = PyMem_MALLOC(MAXPATHLEN+1);
2951 if (pathname == NULL) {
2952 return PyErr_NoMemory();
2953 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002954 pathname[0] = '\0';
2955 if (path == Py_None)
2956 path = NULL;
2957 fdp = find_module(NULL, name, path, pathname, MAXPATHLEN+1, &fp, NULL);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002958 if (fdp == NULL) {
2959 PyMem_FREE(pathname);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002960 return NULL;
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002961 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002962 if (fp != NULL) {
2963 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002964 if (fob == NULL) {
2965 PyMem_FREE(pathname);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002966 return NULL;
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002967 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002968 }
2969 else {
2970 fob = Py_None;
2971 Py_INCREF(fob);
2972 }
2973 ret = Py_BuildValue("Os(ssi)",
2974 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
2975 Py_DECREF(fob);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002976 PyMem_FREE(pathname);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002977 return ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002978}
2979
Guido van Rossum79f25d91997-04-29 20:08:16 +00002980static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002981imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002982{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002983 char *name;
2984 PyObject *path = NULL;
2985 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
2986 return NULL;
2987 return call_find_module(name, path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002988}
2989
2990static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002991imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002992{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002993 char *name;
2994 int ret;
2995 PyObject *m;
2996 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
2997 return NULL;
2998 ret = init_builtin(name);
2999 if (ret < 0)
3000 return NULL;
3001 if (ret == 0) {
3002 Py_INCREF(Py_None);
3003 return Py_None;
3004 }
3005 m = PyImport_AddModule(name);
3006 Py_XINCREF(m);
3007 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003008}
3009
Guido van Rossum79f25d91997-04-29 20:08:16 +00003010static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003011imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003012{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003013 char *name;
3014 int ret;
3015 PyObject *m;
3016 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
3017 return NULL;
3018 ret = PyImport_ImportFrozenModule(name);
3019 if (ret < 0)
3020 return NULL;
3021 if (ret == 0) {
3022 Py_INCREF(Py_None);
3023 return Py_None;
3024 }
3025 m = PyImport_AddModule(name);
3026 Py_XINCREF(m);
3027 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003028}
3029
Guido van Rossum79f25d91997-04-29 20:08:16 +00003030static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003031imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00003032{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003033 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00003034
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003035 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
3036 return NULL;
3037 return get_frozen_object(name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00003038}
3039
Guido van Rossum79f25d91997-04-29 20:08:16 +00003040static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003041imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003042{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003043 char *name;
3044 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
3045 return NULL;
3046 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003047}
3048
Guido van Rossum79f25d91997-04-29 20:08:16 +00003049static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003050imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003051{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003052 char *name;
3053 struct _frozen *p;
3054 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
3055 return NULL;
3056 p = find_frozen(name);
3057 return PyBool_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003058}
3059
3060static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003061get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003062{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003063 FILE *fp;
3064 if (fob == NULL) {
3065 if (mode[0] == 'U')
3066 mode = "r" PY_STDIOTEXTMODE;
3067 fp = fopen(pathname, mode);
3068 if (fp == NULL)
3069 PyErr_SetFromErrno(PyExc_IOError);
3070 }
3071 else {
3072 fp = PyFile_AsFile(fob);
3073 if (fp == NULL)
3074 PyErr_SetString(PyExc_ValueError,
3075 "bad/closed file object");
3076 }
3077 return fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003078}
3079
Guido van Rossum79f25d91997-04-29 20:08:16 +00003080static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003081imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003082{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003083 char *name;
3084 char *pathname;
3085 PyObject *fob = NULL;
3086 PyObject *m;
3087 FILE *fp;
3088 if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
3089 &PyFile_Type, &fob))
3090 return NULL;
3091 fp = get_file(pathname, fob, "rb");
3092 if (fp == NULL)
3093 return NULL;
3094 m = load_compiled_module(name, pathname, fp);
3095 if (fob == NULL)
3096 fclose(fp);
3097 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003098}
3099
Guido van Rossum96a8fb71999-12-22 14:09:35 +00003100#ifdef HAVE_DYNAMIC_LOADING
3101
Guido van Rossum79f25d91997-04-29 20:08:16 +00003102static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003103imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003104{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003105 char *name;
3106 char *pathname;
3107 PyObject *fob = NULL;
3108 PyObject *m;
3109 FILE *fp = NULL;
3110 if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
3111 &PyFile_Type, &fob))
3112 return NULL;
3113 if (fob) {
3114 fp = get_file(pathname, fob, "r");
3115 if (fp == NULL)
3116 return NULL;
3117 }
3118 m = _PyImport_LoadDynamicModule(name, pathname, fp);
3119 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003120}
3121
Guido van Rossum96a8fb71999-12-22 14:09:35 +00003122#endif /* HAVE_DYNAMIC_LOADING */
3123
Guido van Rossum79f25d91997-04-29 20:08:16 +00003124static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003125imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003126{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003127 char *name;
3128 char *pathname;
3129 PyObject *fob = NULL;
3130 PyObject *m;
3131 FILE *fp;
3132 if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
3133 &PyFile_Type, &fob))
3134 return NULL;
3135 fp = get_file(pathname, fob, "r");
3136 if (fp == NULL)
3137 return NULL;
3138 m = load_source_module(name, pathname, fp);
3139 if (fob == NULL)
3140 fclose(fp);
3141 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003142}
3143
Guido van Rossum79f25d91997-04-29 20:08:16 +00003144static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003145imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003146{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003147 char *name;
3148 PyObject *fob;
3149 char *pathname;
3150 char *suffix; /* Unused */
3151 char *mode;
3152 int type;
3153 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003154
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003155 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
3156 &name, &fob, &pathname,
3157 &suffix, &mode, &type))
3158 return NULL;
3159 if (*mode) {
3160 /* Mode must start with 'r' or 'U' and must not contain '+'.
3161 Implicit in this test is the assumption that the mode
3162 may contain other modifiers like 'b' or 't'. */
Guido van Rossum5e2c5fa2002-05-30 17:33:07 +00003163
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003164 if (!(*mode == 'r' || *mode == 'U') || strchr(mode, '+')) {
3165 PyErr_Format(PyExc_ValueError,
3166 "invalid file open mode %.200s", mode);
3167 return NULL;
3168 }
3169 }
3170 if (fob == Py_None)
3171 fp = NULL;
3172 else {
3173 if (!PyFile_Check(fob)) {
3174 PyErr_SetString(PyExc_ValueError,
3175 "load_module arg#2 should be a file or None");
3176 return NULL;
3177 }
3178 fp = get_file(pathname, fob, mode);
3179 if (fp == NULL)
3180 return NULL;
3181 }
3182 return load_module(name, fp, pathname, type, NULL);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003183}
3184
3185static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003186imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003187{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003188 char *name;
3189 char *pathname;
3190 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
3191 return NULL;
3192 return load_package(name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003193}
3194
3195static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003196imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003197{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003198 char *name;
3199 if (!PyArg_ParseTuple(args, "s:new_module", &name))
3200 return NULL;
3201 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003202}
3203
Brett Cannon3aa2a492008-08-06 22:28:09 +00003204static PyObject *
3205imp_reload(PyObject *self, PyObject *v)
3206{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003207 return PyImport_ReloadModule(v);
Brett Cannon3aa2a492008-08-06 22:28:09 +00003208}
3209
3210
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003211/* Doc strings */
3212
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003213PyDoc_STRVAR(doc_imp,
3214"This module provides the components needed to build your own\n\
3215__import__ function. Undocumented functions are obsolete.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003216
Brett Cannon3aa2a492008-08-06 22:28:09 +00003217PyDoc_STRVAR(doc_reload,
3218"reload(module) -> module\n\
3219\n\
3220Reload the module. The module must have been successfully imported before.");
3221
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003222PyDoc_STRVAR(doc_find_module,
3223"find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003224Search for a module. If path is omitted or None, search for a\n\
3225built-in, frozen or special module and continue search in sys.path.\n\
3226The module name cannot contain '.'; to search for a submodule of a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003227package, pass the submodule name and the package's __path__.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003228
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003229PyDoc_STRVAR(doc_load_module,
3230"load_module(name, file, filename, (suffix, mode, type)) -> module\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003231Load a module, given information returned by find_module().\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003232The module name must include the full package name, if any.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003233
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003234PyDoc_STRVAR(doc_get_magic,
3235"get_magic() -> string\n\
3236Return the magic number for .pyc or .pyo files.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003237
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003238PyDoc_STRVAR(doc_get_suffixes,
3239"get_suffixes() -> [(suffix, mode, type), ...]\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003240Return a list of (suffix, mode, type) tuples describing the files\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003241that find_module() looks for.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003242
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003243PyDoc_STRVAR(doc_new_module,
3244"new_module(name) -> module\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003245Create a new module. Do not enter it in sys.modules.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003246The module name must include the full package name, if any.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003247
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003248PyDoc_STRVAR(doc_lock_held,
Tim Petersa7c65092004-08-01 23:26:05 +00003249"lock_held() -> boolean\n\
3250Return True if the import lock is currently held, else False.\n\
3251On platforms without threads, return False.");
Tim Peters69232342001-08-30 05:16:13 +00003252
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00003253PyDoc_STRVAR(doc_acquire_lock,
3254"acquire_lock() -> None\n\
Neal Norwitz2294c0d2003-02-12 23:02:21 +00003255Acquires the interpreter's import lock for the current thread.\n\
3256This lock should be used by import hooks to ensure thread-safety\n\
3257when importing modules.\n\
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00003258On platforms without threads, this function does nothing.");
3259
3260PyDoc_STRVAR(doc_release_lock,
3261"release_lock() -> None\n\
3262Release the interpreter's import lock.\n\
3263On platforms without threads, this function does nothing.");
3264
Guido van Rossum79f25d91997-04-29 20:08:16 +00003265static PyMethodDef imp_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003266 {"reload", imp_reload, METH_O, doc_reload},
3267 {"find_module", imp_find_module, METH_VARARGS, doc_find_module},
3268 {"get_magic", imp_get_magic, METH_NOARGS, doc_get_magic},
3269 {"get_suffixes", imp_get_suffixes, METH_NOARGS, doc_get_suffixes},
3270 {"load_module", imp_load_module, METH_VARARGS, doc_load_module},
3271 {"new_module", imp_new_module, METH_VARARGS, doc_new_module},
3272 {"lock_held", imp_lock_held, METH_NOARGS, doc_lock_held},
3273 {"acquire_lock", imp_acquire_lock, METH_NOARGS, doc_acquire_lock},
3274 {"release_lock", imp_release_lock, METH_NOARGS, doc_release_lock},
3275 /* The rest are obsolete */
3276 {"get_frozen_object", imp_get_frozen_object, METH_VARARGS},
3277 {"init_builtin", imp_init_builtin, METH_VARARGS},
3278 {"init_frozen", imp_init_frozen, METH_VARARGS},
3279 {"is_builtin", imp_is_builtin, METH_VARARGS},
3280 {"is_frozen", imp_is_frozen, METH_VARARGS},
3281 {"load_compiled", imp_load_compiled, METH_VARARGS},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00003282#ifdef HAVE_DYNAMIC_LOADING
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003283 {"load_dynamic", imp_load_dynamic, METH_VARARGS},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00003284#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003285 {"load_package", imp_load_package, METH_VARARGS},
3286 {"load_source", imp_load_source, METH_VARARGS},
3287 {NULL, NULL} /* sentinel */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003288};
3289
Guido van Rossum1a8791e1998-08-04 22:46:29 +00003290static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003291setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003292{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003293 PyObject *v;
3294 int err;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003295
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003296 v = PyInt_FromLong((long)value);
3297 err = PyDict_SetItemString(d, name, v);
3298 Py_XDECREF(v);
3299 return err;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003300}
3301
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003302typedef struct {
3303 PyObject_HEAD
3304} NullImporter;
3305
3306static int
3307NullImporter_init(NullImporter *self, PyObject *args, PyObject *kwds)
3308{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003309 char *path;
3310 Py_ssize_t pathlen;
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003311
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003312 if (!_PyArg_NoKeywords("NullImporter()", kwds))
3313 return -1;
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003314
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003315 if (!PyArg_ParseTuple(args, "s:NullImporter",
3316 &path))
3317 return -1;
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003318
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003319 pathlen = strlen(path);
3320 if (pathlen == 0) {
3321 PyErr_SetString(PyExc_ImportError, "empty pathname");
3322 return -1;
3323 } else {
Jason R. Coombs0737b722012-01-13 17:59:05 -05003324 if(isdir(path)) {
3325 PyErr_SetString(PyExc_ImportError,
3326 "existing directory");
3327 return -1;
3328 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003329 }
3330 return 0;
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003331}
3332
3333static PyObject *
3334NullImporter_find_module(NullImporter *self, PyObject *args)
3335{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003336 Py_RETURN_NONE;
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003337}
3338
3339static PyMethodDef NullImporter_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003340 {"find_module", (PyCFunction)NullImporter_find_module, METH_VARARGS,
3341 "Always return None"
3342 },
3343 {NULL} /* Sentinel */
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003344};
3345
3346
Nick Coghlan327a39b2007-11-18 11:56:28 +00003347PyTypeObject PyNullImporter_Type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003348 PyVarObject_HEAD_INIT(NULL, 0)
3349 "imp.NullImporter", /*tp_name*/
3350 sizeof(NullImporter), /*tp_basicsize*/
3351 0, /*tp_itemsize*/
3352 0, /*tp_dealloc*/
3353 0, /*tp_print*/
3354 0, /*tp_getattr*/
3355 0, /*tp_setattr*/
3356 0, /*tp_compare*/
3357 0, /*tp_repr*/
3358 0, /*tp_as_number*/
3359 0, /*tp_as_sequence*/
3360 0, /*tp_as_mapping*/
3361 0, /*tp_hash */
3362 0, /*tp_call*/
3363 0, /*tp_str*/
3364 0, /*tp_getattro*/
3365 0, /*tp_setattro*/
3366 0, /*tp_as_buffer*/
3367 Py_TPFLAGS_DEFAULT, /*tp_flags*/
3368 "Null importer object", /* tp_doc */
3369 0, /* tp_traverse */
3370 0, /* tp_clear */
3371 0, /* tp_richcompare */
3372 0, /* tp_weaklistoffset */
3373 0, /* tp_iter */
3374 0, /* tp_iternext */
3375 NullImporter_methods, /* tp_methods */
3376 0, /* tp_members */
3377 0, /* tp_getset */
3378 0, /* tp_base */
3379 0, /* tp_dict */
3380 0, /* tp_descr_get */
3381 0, /* tp_descr_set */
3382 0, /* tp_dictoffset */
3383 (initproc)NullImporter_init, /* tp_init */
3384 0, /* tp_alloc */
3385 PyType_GenericNew /* tp_new */
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003386};
3387
3388
Jason Tishler6bc06ec2003-09-04 11:59:50 +00003389PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003390initimp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003391{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003392 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003393
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003394 if (PyType_Ready(&PyNullImporter_Type) < 0)
3395 goto failure;
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003396
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003397 m = Py_InitModule4("imp", imp_methods, doc_imp,
3398 NULL, PYTHON_API_VERSION);
3399 if (m == NULL)
3400 goto failure;
3401 d = PyModule_GetDict(m);
3402 if (d == NULL)
3403 goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003404
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003405 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
3406 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
3407 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
3408 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
3409 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
3410 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
3411 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
3412 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
3413 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
3414 if (setint(d, "IMP_HOOK", IMP_HOOK) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003415
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003416 Py_INCREF(&PyNullImporter_Type);
3417 PyModule_AddObject(m, "NullImporter", (PyObject *)&PyNullImporter_Type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003418 failure:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003419 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003420}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003421
3422
Guido van Rossumb18618d2000-05-03 23:44:39 +00003423/* API for embedding applications that want to add their own entries
3424 to the table of built-in modules. This should normally be called
3425 *before* Py_Initialize(). When the table resize fails, -1 is
3426 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003427
3428 After a similar function by Just van Rossum. */
3429
3430int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003431PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003432{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003433 static struct _inittab *our_copy = NULL;
3434 struct _inittab *p;
3435 int i, n;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003436
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003437 /* Count the number of entries in both tables */
3438 for (n = 0; newtab[n].name != NULL; n++)
3439 ;
3440 if (n == 0)
3441 return 0; /* Nothing to do */
3442 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
3443 ;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003444
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003445 /* Allocate new memory for the combined table */
3446 p = our_copy;
3447 PyMem_RESIZE(p, struct _inittab, i+n+1);
3448 if (p == NULL)
3449 return -1;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003450
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003451 /* Copy the tables into the new memory */
3452 if (our_copy != PyImport_Inittab)
3453 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
3454 PyImport_Inittab = our_copy = p;
3455 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003456
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003457 return 0;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003458}
3459
3460/* Shorthand to add a single entry given a name and a function */
3461
3462int
Brett Cannonc4f90eb2009-04-02 03:17:39 +00003463PyImport_AppendInittab(const char *name, void (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003464{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003465 struct _inittab newtab[2];
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003466
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003467 memset(newtab, '\0', sizeof newtab);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003468
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003469 newtab[0].name = (char *)name;
3470 newtab[0].initfunc = initfunc;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003471
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003472 return PyImport_ExtendInittab(newtab);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003473}
Anthony Baxterac6bd462006-04-13 02:06:09 +00003474
3475#ifdef __cplusplus
3476}
3477#endif