blob: f43a47c1c4720142c74aa8ffe6641ae97642b17d [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{
Christian Heimes3ce78732015-04-19 21:08:28 +0200340 if (import_lock != NULL) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000341 import_lock = PyThread_allocate_lock();
Christian Heimes3ce78732015-04-19 21:08:28 +0200342 if (import_lock == NULL) {
343 Py_FatalError("PyImport_ReInitLock failed to create a new lock");
344 }
345 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000346 import_lock_thread = -1;
347 import_lock_level = 0;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +0000348}
349
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000350#endif
351
Tim Peters69232342001-08-30 05:16:13 +0000352static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +0000353imp_lock_held(PyObject *self, PyObject *noargs)
Tim Peters69232342001-08-30 05:16:13 +0000354{
Tim Peters69232342001-08-30 05:16:13 +0000355#ifdef WITH_THREAD
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000356 return PyBool_FromLong(import_lock_thread != -1);
Tim Peters69232342001-08-30 05:16:13 +0000357#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000358 return PyBool_FromLong(0);
Tim Peters69232342001-08-30 05:16:13 +0000359#endif
360}
361
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000362static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +0000363imp_acquire_lock(PyObject *self, PyObject *noargs)
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000364{
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000365#ifdef WITH_THREAD
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000366 _PyImport_AcquireLock();
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000367#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000368 Py_INCREF(Py_None);
369 return Py_None;
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000370}
371
372static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +0000373imp_release_lock(PyObject *self, PyObject *noargs)
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000374{
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000375#ifdef WITH_THREAD
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000376 if (_PyImport_ReleaseLock() < 0) {
377 PyErr_SetString(PyExc_RuntimeError,
378 "not holding the import lock");
379 return NULL;
380 }
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000381#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000382 Py_INCREF(Py_None);
383 return Py_None;
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000384}
385
Collin Winter276887b2007-03-12 16:11:39 +0000386static void
Neal Norwitz75c7c802007-03-13 05:31:38 +0000387imp_modules_reloading_clear(void)
Collin Winter276887b2007-03-12 16:11:39 +0000388{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000389 PyInterpreterState *interp = PyThreadState_Get()->interp;
390 if (interp->modules_reloading != NULL)
391 PyDict_Clear(interp->modules_reloading);
Collin Winter276887b2007-03-12 16:11:39 +0000392}
393
Guido van Rossum25ce5661997-08-02 03:10:38 +0000394/* Helper for sys */
395
396PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000397PyImport_GetModuleDict(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000398{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000399 PyInterpreterState *interp = PyThreadState_GET()->interp;
400 if (interp->modules == NULL)
401 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
402 return interp->modules;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000403}
404
Guido van Rossum3f5da241990-12-20 15:06:42 +0000405
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000406/* List of names to clear in sys */
407static char* sys_deletes[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000408 "path", "argv", "ps1", "ps2", "exitfunc",
409 "exc_type", "exc_value", "exc_traceback",
410 "last_type", "last_value", "last_traceback",
411 "path_hooks", "path_importer_cache", "meta_path",
412 /* misc stuff */
413 "flags", "float_info",
414 NULL
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000415};
416
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000417static char* sys_files[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000418 "stdin", "__stdin__",
419 "stdout", "__stdout__",
420 "stderr", "__stderr__",
421 NULL
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000422};
423
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000424
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000425/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000426
Guido van Rossum3f5da241990-12-20 15:06:42 +0000427void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000428PyImport_Cleanup(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000429{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000430 Py_ssize_t pos, ndone;
431 char *name;
432 PyObject *key, *value, *dict;
433 PyInterpreterState *interp = PyThreadState_GET()->interp;
434 PyObject *modules = interp->modules;
Guido van Rossum758eec01998-01-19 21:58:26 +0000435
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000436 if (modules == NULL)
437 return; /* Already done */
Guido van Rossum758eec01998-01-19 21:58:26 +0000438
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000439 /* Delete some special variables first. These are common
440 places where user values hide and people complain when their
441 destructors fail. Since the modules containing them are
442 deleted *last* of all, they would come too late in the normal
443 destruction order. Sigh. */
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000444
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000445 value = PyDict_GetItemString(modules, "__builtin__");
446 if (value != NULL && PyModule_Check(value)) {
447 dict = PyModule_GetDict(value);
448 if (Py_VerboseFlag)
449 PySys_WriteStderr("# clear __builtin__._\n");
Serhiy Storchaka55299ff2018-04-26 03:28:14 +0300450 if (PyDict_SetItemString(dict, "_", Py_None) < 0) {
451 PyErr_Clear();
452 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000453 }
454 value = PyDict_GetItemString(modules, "sys");
455 if (value != NULL && PyModule_Check(value)) {
456 char **p;
457 PyObject *v;
458 dict = PyModule_GetDict(value);
459 for (p = sys_deletes; *p != NULL; p++) {
460 if (Py_VerboseFlag)
461 PySys_WriteStderr("# clear sys.%s\n", *p);
Serhiy Storchaka55299ff2018-04-26 03:28:14 +0300462 if (PyDict_SetItemString(dict, *p, Py_None) < 0) {
463 PyErr_Clear();
464 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000465 }
466 for (p = sys_files; *p != NULL; p+=2) {
467 if (Py_VerboseFlag)
468 PySys_WriteStderr("# restore sys.%s\n", *p);
469 v = PyDict_GetItemString(dict, *(p+1));
470 if (v == NULL)
471 v = Py_None;
Serhiy Storchaka55299ff2018-04-26 03:28:14 +0300472 if (PyDict_SetItemString(dict, *p, v) < 0) {
473 PyErr_Clear();
474 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000475 }
476 }
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000477
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000478 /* First, delete __main__ */
479 value = PyDict_GetItemString(modules, "__main__");
480 if (value != NULL && PyModule_Check(value)) {
481 if (Py_VerboseFlag)
482 PySys_WriteStderr("# cleanup __main__\n");
483 _PyModule_Clear(value);
Serhiy Storchaka55299ff2018-04-26 03:28:14 +0300484 if (PyDict_SetItemString(modules, "__main__", Py_None) < 0) {
485 PyErr_Clear();
486 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000487 }
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000488
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000489 /* The special treatment of __builtin__ here is because even
490 when it's not referenced as a module, its dictionary is
491 referenced by almost every module's __builtins__. Since
492 deleting a module clears its dictionary (even if there are
493 references left to it), we need to delete the __builtin__
494 module last. Likewise, we don't delete sys until the very
495 end because it is implicitly referenced (e.g. by print).
Guido van Rossum758eec01998-01-19 21:58:26 +0000496
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000497 Also note that we 'delete' modules by replacing their entry
498 in the modules dict with None, rather than really deleting
499 them; this avoids a rehash of the modules dictionary and
500 also marks them as "non existent" so they won't be
501 re-imported. */
Guido van Rossum758eec01998-01-19 21:58:26 +0000502
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000503 /* Next, repeatedly delete modules with a reference count of
504 one (skipping __builtin__ and sys) and delete them */
505 do {
506 ndone = 0;
507 pos = 0;
508 while (PyDict_Next(modules, &pos, &key, &value)) {
509 if (value->ob_refcnt != 1)
510 continue;
511 if (PyString_Check(key) && PyModule_Check(value)) {
512 name = PyString_AS_STRING(key);
513 if (strcmp(name, "__builtin__") == 0)
514 continue;
515 if (strcmp(name, "sys") == 0)
516 continue;
517 if (Py_VerboseFlag)
518 PySys_WriteStderr(
519 "# cleanup[1] %s\n", name);
520 _PyModule_Clear(value);
Serhiy Storchaka55299ff2018-04-26 03:28:14 +0300521 if (PyDict_SetItem(modules, key, Py_None) < 0) {
522 PyErr_Clear();
523 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000524 ndone++;
525 }
526 }
Serhiy Storchaka55299ff2018-04-26 03:28:14 +0300527 if (PyErr_Occurred()) {
528 PyErr_Clear();
529 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000530 } while (ndone > 0);
Guido van Rossum758eec01998-01-19 21:58:26 +0000531
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000532 /* Next, delete all modules (still skipping __builtin__ and sys) */
533 pos = 0;
534 while (PyDict_Next(modules, &pos, &key, &value)) {
535 if (PyString_Check(key) && PyModule_Check(value)) {
536 name = PyString_AS_STRING(key);
537 if (strcmp(name, "__builtin__") == 0)
538 continue;
539 if (strcmp(name, "sys") == 0)
540 continue;
541 if (Py_VerboseFlag)
542 PySys_WriteStderr("# cleanup[2] %s\n", name);
543 _PyModule_Clear(value);
Serhiy Storchaka55299ff2018-04-26 03:28:14 +0300544 if (PyDict_SetItem(modules, key, Py_None) < 0) {
545 PyErr_Clear();
546 }
547 }
548 if (PyErr_Occurred()) {
549 PyErr_Clear();
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000550 }
551 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000552
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000553 /* Next, delete sys and __builtin__ (in that order) */
554 value = PyDict_GetItemString(modules, "sys");
555 if (value != NULL && PyModule_Check(value)) {
556 if (Py_VerboseFlag)
557 PySys_WriteStderr("# cleanup sys\n");
558 _PyModule_Clear(value);
Serhiy Storchaka55299ff2018-04-26 03:28:14 +0300559 if (PyDict_SetItemString(modules, "sys", Py_None) < 0) {
560 PyErr_Clear();
561 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000562 }
563 value = PyDict_GetItemString(modules, "__builtin__");
564 if (value != NULL && PyModule_Check(value)) {
565 if (Py_VerboseFlag)
566 PySys_WriteStderr("# cleanup __builtin__\n");
567 _PyModule_Clear(value);
Serhiy Storchaka55299ff2018-04-26 03:28:14 +0300568 if (PyDict_SetItemString(modules, "__builtin__", Py_None) < 0) {
569 PyErr_Clear();
570 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000571 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000572
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000573 /* Finally, clear and delete the modules directory */
574 PyDict_Clear(modules);
575 interp->modules = NULL;
576 Py_DECREF(modules);
577 Py_CLEAR(interp->modules_reloading);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000578}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000579
580
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000581/* Helper for pythonrun.c -- return magic number */
582
583long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000584PyImport_GetMagicNumber(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000585{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000586 return pyc_magic;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000587}
588
589
Guido van Rossum25ce5661997-08-02 03:10:38 +0000590/* Magic for extension modules (built-in as well as dynamically
591 loaded). To prevent initializing an extension module more than
592 once, we keep a static dictionary 'extensions' keyed by module name
593 (for built-in modules) or by filename (for dynamically loaded
Barry Warsaw92883382001-08-13 23:05:44 +0000594 modules), containing these modules. A copy of the module's
Guido van Rossum25ce5661997-08-02 03:10:38 +0000595 dictionary is stored by calling _PyImport_FixupExtension()
596 immediately after the module initialization function succeeds. A
597 copy can be retrieved from there by calling
598 _PyImport_FindExtension(). */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000599
Guido van Rossum79f25d91997-04-29 20:08:16 +0000600PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000601_PyImport_FixupExtension(char *name, char *filename)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000602{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000603 PyObject *modules, *mod, *dict, *copy;
604 if (extensions == NULL) {
605 extensions = PyDict_New();
606 if (extensions == NULL)
607 return NULL;
608 }
609 modules = PyImport_GetModuleDict();
610 mod = PyDict_GetItemString(modules, name);
611 if (mod == NULL || !PyModule_Check(mod)) {
612 PyErr_Format(PyExc_SystemError,
613 "_PyImport_FixupExtension: module %.200s not loaded", name);
614 return NULL;
615 }
616 dict = PyModule_GetDict(mod);
617 if (dict == NULL)
618 return NULL;
619 copy = PyDict_Copy(dict);
620 if (copy == NULL)
621 return NULL;
622 PyDict_SetItemString(extensions, filename, copy);
623 Py_DECREF(copy);
624 return copy;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000625}
626
627PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000628_PyImport_FindExtension(char *name, char *filename)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000629{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000630 PyObject *dict, *mod, *mdict;
631 if (extensions == NULL)
632 return NULL;
633 dict = PyDict_GetItemString(extensions, filename);
634 if (dict == NULL)
635 return NULL;
636 mod = PyImport_AddModule(name);
637 if (mod == NULL)
638 return NULL;
639 mdict = PyModule_GetDict(mod);
640 if (mdict == NULL)
641 return NULL;
642 if (PyDict_Update(mdict, dict))
643 return NULL;
644 if (Py_VerboseFlag)
645 PySys_WriteStderr("import %s # previously loaded (%s)\n",
646 name, filename);
647 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000648}
649
650
651/* Get the module object corresponding to a module name.
652 First check the modules dictionary if there's one there,
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000653 if not, create a new one and insert it in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000654 Because the former action is most common, THIS DOES NOT RETURN A
655 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000656
Serhiy Storchaka1c496172016-02-10 10:28:06 +0200657static PyObject *
658_PyImport_AddModuleObject(PyObject *name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000659{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000660 PyObject *modules = PyImport_GetModuleDict();
661 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000662
Serhiy Storchaka1c496172016-02-10 10:28:06 +0200663 if ((m = _PyDict_GetItemWithError(modules, name)) != NULL &&
664 PyModule_Check(m)) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000665 return m;
Serhiy Storchaka1c496172016-02-10 10:28:06 +0200666 }
667 if (PyErr_Occurred()) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000668 return NULL;
Serhiy Storchaka1c496172016-02-10 10:28:06 +0200669 }
670 m = PyModule_New(PyString_AS_STRING(name));
671 if (m == NULL) {
672 return NULL;
673 }
674 if (PyDict_SetItem(modules, name, m) != 0) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000675 Py_DECREF(m);
676 return NULL;
677 }
Serhiy Storchaka1c496172016-02-10 10:28:06 +0200678 assert(Py_REFCNT(m) > 1);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000679 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000680
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000681 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000682}
683
Serhiy Storchaka1c496172016-02-10 10:28:06 +0200684PyObject *
685PyImport_AddModule(const char *name)
686{
687 PyObject *nameobj, *module;
688 nameobj = PyString_FromString(name);
689 if (nameobj == NULL)
690 return NULL;
691 module = _PyImport_AddModuleObject(nameobj);
692 Py_DECREF(nameobj);
693 return module;
694}
695
Tim Peters1cd70172004-08-02 03:52:12 +0000696/* Remove name from sys.modules, if it's there. */
697static void
Benjamin Peterson06638732010-03-25 23:27:16 +0000698remove_module(const char *name)
Tim Peters1cd70172004-08-02 03:52:12 +0000699{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000700 PyObject *modules = PyImport_GetModuleDict();
701 if (PyDict_GetItemString(modules, name) == NULL)
702 return;
703 if (PyDict_DelItemString(modules, name) < 0)
704 Py_FatalError("import: deleting existing key in"
705 "sys.modules failed");
Tim Peters1cd70172004-08-02 03:52:12 +0000706}
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000707
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000708/* Execute a code object in a module and return the module object
Tim Peters1cd70172004-08-02 03:52:12 +0000709 * WITH INCREMENTED REFERENCE COUNT. If an error occurs, name is
710 * removed from sys.modules, to avoid leaving damaged module objects
711 * in sys.modules. The caller may wish to restore the original
712 * module object (if any) in this case; PyImport_ReloadModule is an
713 * example.
714 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000715PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000716PyImport_ExecCodeModule(char *name, PyObject *co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000717{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000718 return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000719}
720
721PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000722PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname)
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000723{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000724 PyObject *modules = PyImport_GetModuleDict();
725 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000726
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000727 m = PyImport_AddModule(name);
728 if (m == NULL)
729 return NULL;
730 /* If the module is being reloaded, we get the old module back
731 and re-use its dict to exec the new code. */
732 d = PyModule_GetDict(m);
733 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
734 if (PyDict_SetItemString(d, "__builtins__",
735 PyEval_GetBuiltins()) != 0)
736 goto error;
737 }
738 /* Remember the filename as the __file__ attribute */
739 v = NULL;
740 if (pathname != NULL) {
741 v = PyString_FromString(pathname);
742 if (v == NULL)
743 PyErr_Clear();
744 }
745 if (v == NULL) {
746 v = ((PyCodeObject *)co)->co_filename;
747 Py_INCREF(v);
748 }
749 if (PyDict_SetItemString(d, "__file__", v) != 0)
750 PyErr_Clear(); /* Not important enough to report */
751 Py_DECREF(v);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000752
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000753 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
754 if (v == NULL)
755 goto error;
756 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000757
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000758 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
759 PyErr_Format(PyExc_ImportError,
760 "Loaded module %.200s not found in sys.modules",
761 name);
762 return NULL;
763 }
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000764
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000765 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000766
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000767 return m;
Tim Peters1cd70172004-08-02 03:52:12 +0000768
769 error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000770 remove_module(name);
771 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000772}
773
774
775/* Given a pathname for a Python source file, fill a buffer with the
776 pathname for the corresponding compiled file. Return the pathname
777 for the compiled file, or NULL if there's no space in the buffer.
778 Doesn't set an exception. */
779
780static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000781make_compiled_pathname(char *pathname, char *buf, size_t buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000782{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000783 size_t len = strlen(pathname);
784 if (len+2 > buflen)
785 return NULL;
Tim Petersc1731372001-08-04 08:12:36 +0000786
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000787#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000788 /* Treat .pyw as if it were .py. The case of ".pyw" must match
789 that used in _PyImport_StandardFiletab. */
790 if (len >= 4 && strcmp(&pathname[len-4], ".pyw") == 0)
791 --len; /* pretend 'w' isn't there */
Tim Petersc1731372001-08-04 08:12:36 +0000792#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000793 memcpy(buf, pathname, len);
794 buf[len] = Py_OptimizeFlag ? 'o' : 'c';
795 buf[len+1] = '\0';
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000796
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000797 return buf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000798}
799
800
801/* Given a pathname for a Python source file, its time of last
802 modification, and a pathname for a compiled file, check whether the
803 compiled file represents the same version of the source. If so,
804 return a FILE pointer for the compiled file, positioned just after
805 the header; if not, return NULL.
806 Doesn't set an exception. */
807
808static FILE *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000809check_compiled_module(char *pathname, time_t mtime, char *cpathname)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000810{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000811 FILE *fp;
812 long magic;
813 long pyc_mtime;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000814
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000815 fp = fopen(cpathname, "rb");
816 if (fp == NULL)
817 return NULL;
818 magic = PyMarshal_ReadLongFromFile(fp);
819 if (magic != pyc_magic) {
820 if (Py_VerboseFlag)
821 PySys_WriteStderr("# %s has bad magic\n", cpathname);
822 fclose(fp);
823 return NULL;
824 }
825 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
826 if (pyc_mtime != mtime) {
827 if (Py_VerboseFlag)
828 PySys_WriteStderr("# %s has bad mtime\n", cpathname);
829 fclose(fp);
830 return NULL;
831 }
832 if (Py_VerboseFlag)
833 PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
834 return fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000835}
836
837
838/* Read a code object from a file and check it for validity */
839
Guido van Rossum79f25d91997-04-29 20:08:16 +0000840static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000841read_compiled_module(char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000842{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000843 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000844
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000845 co = PyMarshal_ReadLastObjectFromFile(fp);
846 if (co == NULL)
847 return NULL;
848 if (!PyCode_Check(co)) {
849 PyErr_Format(PyExc_ImportError,
850 "Non-code object in %.200s", cpathname);
851 Py_DECREF(co);
852 return NULL;
853 }
854 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000855}
856
857
858/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000859 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000860
Guido van Rossum79f25d91997-04-29 20:08:16 +0000861static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000862load_compiled_module(char *name, char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000863{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000864 long magic;
865 PyCodeObject *co;
866 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000867
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000868 magic = PyMarshal_ReadLongFromFile(fp);
869 if (magic != pyc_magic) {
870 PyErr_Format(PyExc_ImportError,
871 "Bad magic number in %.200s", cpathname);
872 return NULL;
873 }
874 (void) PyMarshal_ReadLongFromFile(fp);
875 co = read_compiled_module(cpathname, fp);
876 if (co == NULL)
877 return NULL;
878 if (Py_VerboseFlag)
879 PySys_WriteStderr("import %s # precompiled from %s\n",
880 name, cpathname);
881 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
882 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000883
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000884 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000885}
886
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000887/* Parse a source file and return the corresponding code object */
888
Guido van Rossum79f25d91997-04-29 20:08:16 +0000889static PyCodeObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000890parse_source_module(const char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000891{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000892 PyCodeObject *co = NULL;
893 mod_ty mod;
894 PyCompilerFlags flags;
895 PyArena *arena = PyArena_New();
896 if (arena == NULL)
897 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000898
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000899 flags.cf_flags = 0;
Christian Heimes7f23d862008-03-26 22:51:58 +0000900
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000901 mod = PyParser_ASTFromFile(fp, pathname, Py_file_input, 0, 0, &flags,
902 NULL, arena);
903 if (mod) {
904 co = PyAST_Compile(mod, pathname, NULL, arena);
905 }
906 PyArena_Free(arena);
907 return co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000908}
909
910
Guido van Rossum55a83382000-09-20 20:31:38 +0000911/* Helper to open a bytecode file for writing in exclusive mode */
912
913static FILE *
Christian Heimes40346852008-02-23 17:52:07 +0000914open_exclusive(char *filename, mode_t mode)
Guido van Rossum55a83382000-09-20 20:31:38 +0000915{
916#if defined(O_EXCL)&&defined(O_CREAT)&&defined(O_WRONLY)&&defined(O_TRUNC)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000917 /* Use O_EXCL to avoid a race condition when another process tries to
918 write the same file. When that happens, our open() call fails,
919 which is just fine (since it's only a cache).
920 XXX If the file exists and is writable but the directory is not
921 writable, the file will never be written. Oh well.
922 */
923 int fd;
924 (void) unlink(filename);
925 fd = open(filename, O_EXCL|O_CREAT|O_WRONLY|O_TRUNC
Tim Peters42c83af2000-09-29 04:03:10 +0000926#ifdef O_BINARY
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000927 |O_BINARY /* necessary for Windows */
Tim Peters42c83af2000-09-29 04:03:10 +0000928#endif
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000929#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000930 , mode, "ctxt=bin", "shr=nil"
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000931#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000932 , mode
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000933#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000934 );
935 if (fd < 0)
936 return NULL;
937 return fdopen(fd, "wb");
Guido van Rossum55a83382000-09-20 20:31:38 +0000938#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000939 /* Best we can do -- on Windows this can't happen anyway */
940 return fopen(filename, "wb");
Guido van Rossum55a83382000-09-20 20:31:38 +0000941#endif
942}
943
944
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000945/* Write a compiled module to a file, placing the time of last
946 modification of its source into the header.
947 Errors are ignored, if a write error occurs an attempt is made to
948 remove the file. */
949
950static void
Mark Dickinson9fade762012-12-24 16:33:18 +0000951write_compiled_module(PyCodeObject *co, char *cpathname, struct stat *srcstat, time_t mtime)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000952{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000953 FILE *fp;
R. David Murray3310a102009-07-07 09:54:16 +0000954#ifdef MS_WINDOWS /* since Windows uses different permissions */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000955 mode_t mode = srcstat->st_mode & ~S_IEXEC;
Nick Coghlanb48c0282012-10-19 21:58:18 +1000956 /* Issue #6074: We ensure user write access, so we can delete it later
957 * when the source file changes. (On POSIX, this only requires write
958 * access to the directory, on Windows, we need write access to the file
959 * as well)
960 */
961 mode |= _S_IWRITE;
R. David Murray3310a102009-07-07 09:54:16 +0000962#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000963 mode_t mode = srcstat->st_mode & ~S_IXUSR & ~S_IXGRP & ~S_IXOTH;
Brett Cannonb166afc2010-05-05 20:25:47 +0000964#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000965
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000966 fp = open_exclusive(cpathname, mode);
967 if (fp == NULL) {
968 if (Py_VerboseFlag)
969 PySys_WriteStderr(
970 "# can't create %s\n", cpathname);
971 return;
972 }
973 PyMarshal_WriteLongToFile(pyc_magic, fp, Py_MARSHAL_VERSION);
974 /* First write a 0 for mtime */
975 PyMarshal_WriteLongToFile(0L, fp, Py_MARSHAL_VERSION);
976 PyMarshal_WriteObjectToFile((PyObject *)co, fp, Py_MARSHAL_VERSION);
977 if (fflush(fp) != 0 || ferror(fp)) {
978 if (Py_VerboseFlag)
979 PySys_WriteStderr("# can't write %s\n", cpathname);
980 /* Don't keep partial file */
981 fclose(fp);
982 (void) unlink(cpathname);
983 return;
984 }
Antoine Pitrou6f25d752012-01-25 15:38:32 +0100985 /* Now write the true mtime (as a 32-bit field) */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000986 fseek(fp, 4L, 0);
Antoine Pitrou6f25d752012-01-25 15:38:32 +0100987 assert(mtime <= 0xFFFFFFFF);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000988 PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION);
989 fflush(fp);
990 fclose(fp);
991 if (Py_VerboseFlag)
992 PySys_WriteStderr("# wrote %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000993}
994
Antoine Pitroue96d4ea2009-01-06 18:10:47 +0000995static void
996update_code_filenames(PyCodeObject *co, PyObject *oldname, PyObject *newname)
997{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000998 PyObject *constants, *tmp;
999 Py_ssize_t i, n;
Antoine Pitroue96d4ea2009-01-06 18:10:47 +00001000
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001001 if (!_PyString_Eq(co->co_filename, oldname))
1002 return;
Antoine Pitroue96d4ea2009-01-06 18:10:47 +00001003
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001004 tmp = co->co_filename;
1005 co->co_filename = newname;
1006 Py_INCREF(co->co_filename);
1007 Py_DECREF(tmp);
Antoine Pitroue96d4ea2009-01-06 18:10:47 +00001008
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001009 constants = co->co_consts;
1010 n = PyTuple_GET_SIZE(constants);
1011 for (i = 0; i < n; i++) {
1012 tmp = PyTuple_GET_ITEM(constants, i);
1013 if (PyCode_Check(tmp))
1014 update_code_filenames((PyCodeObject *)tmp,
1015 oldname, newname);
1016 }
Antoine Pitroue96d4ea2009-01-06 18:10:47 +00001017}
1018
1019static int
1020update_compiled_module(PyCodeObject *co, char *pathname)
1021{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001022 PyObject *oldname, *newname;
Antoine Pitroue96d4ea2009-01-06 18:10:47 +00001023
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001024 if (strcmp(PyString_AsString(co->co_filename), pathname) == 0)
1025 return 0;
Antoine Pitroue96d4ea2009-01-06 18:10:47 +00001026
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001027 newname = PyString_FromString(pathname);
1028 if (newname == NULL)
1029 return -1;
Antoine Pitroue96d4ea2009-01-06 18:10:47 +00001030
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001031 oldname = co->co_filename;
1032 Py_INCREF(oldname);
1033 update_code_filenames(co, oldname, newname);
1034 Py_DECREF(oldname);
1035 Py_DECREF(newname);
1036 return 1;
Antoine Pitroue96d4ea2009-01-06 18:10:47 +00001037}
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001038
Mark Dickinson9fade762012-12-24 16:33:18 +00001039#ifdef MS_WINDOWS
1040
1041/* Seconds between 1.1.1601 and 1.1.1970 */
1042static __int64 secs_between_epochs = 11644473600;
1043
1044/* Get mtime from file pointer. */
1045
1046static time_t
1047win32_mtime(FILE *fp, char *pathname)
1048{
1049 __int64 filetime;
1050 HANDLE fh;
1051 BY_HANDLE_FILE_INFORMATION file_information;
1052
1053 fh = (HANDLE)_get_osfhandle(fileno(fp));
1054 if (fh == INVALID_HANDLE_VALUE ||
1055 !GetFileInformationByHandle(fh, &file_information)) {
1056 PyErr_Format(PyExc_RuntimeError,
1057 "unable to get file status from '%s'",
1058 pathname);
1059 return -1;
1060 }
1061 /* filetime represents the number of 100ns intervals since
1062 1.1.1601 (UTC). Convert to seconds since 1.1.1970 (UTC). */
1063 filetime = (__int64)file_information.ftLastWriteTime.dwHighDateTime << 32 |
1064 file_information.ftLastWriteTime.dwLowDateTime;
1065 return filetime / 10000000 - secs_between_epochs;
1066}
1067
1068#endif /* #ifdef MS_WINDOWS */
1069
1070
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001071/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001072 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
1073 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001074
Guido van Rossum79f25d91997-04-29 20:08:16 +00001075static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001076load_source_module(char *name, char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001077{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001078 struct stat st;
1079 FILE *fpc;
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001080 char *buf;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001081 char *cpathname;
Antoine Pitrou284fa082012-05-09 13:24:31 +02001082 PyCodeObject *co = NULL;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001083 PyObject *m;
Mark Dickinson9fade762012-12-24 16:33:18 +00001084 time_t mtime;
Brett Cannonb166afc2010-05-05 20:25:47 +00001085
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001086 if (fstat(fileno(fp), &st) != 0) {
1087 PyErr_Format(PyExc_RuntimeError,
1088 "unable to get file status from '%s'",
1089 pathname);
1090 return NULL;
1091 }
Mark Dickinson9fade762012-12-24 16:33:18 +00001092
1093#ifdef MS_WINDOWS
1094 mtime = win32_mtime(fp, pathname);
1095 if (mtime == (time_t)-1 && PyErr_Occurred())
1096 return NULL;
1097#else
1098 mtime = st.st_mtime;
1099#endif
1100 if (sizeof mtime > 4) {
Antoine Pitrou0e5fd592012-01-25 03:31:39 +01001101 /* Python's .pyc timestamp handling presumes that the timestamp fits
1102 in 4 bytes. Since the code only does an equality comparison,
1103 ordering is not important and we can safely ignore the higher bits
1104 (collisions are extremely unlikely).
1105 */
Mark Dickinson9fade762012-12-24 16:33:18 +00001106 mtime &= 0xFFFFFFFF;
Antoine Pitrou0e5fd592012-01-25 03:31:39 +01001107 }
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001108 buf = PyMem_MALLOC(MAXPATHLEN+1);
1109 if (buf == NULL) {
1110 return PyErr_NoMemory();
1111 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001112 cpathname = make_compiled_pathname(pathname, buf,
1113 (size_t)MAXPATHLEN + 1);
1114 if (cpathname != NULL &&
Mark Dickinson9fade762012-12-24 16:33:18 +00001115 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001116 co = read_compiled_module(cpathname, fpc);
1117 fclose(fpc);
1118 if (co == NULL)
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001119 goto error_exit;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001120 if (update_compiled_module(co, pathname) < 0)
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001121 goto error_exit;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001122 if (Py_VerboseFlag)
1123 PySys_WriteStderr("import %s # precompiled from %s\n",
1124 name, cpathname);
1125 pathname = cpathname;
1126 }
1127 else {
1128 co = parse_source_module(pathname, fp);
1129 if (co == NULL)
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001130 goto error_exit;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001131 if (Py_VerboseFlag)
1132 PySys_WriteStderr("import %s # from %s\n",
1133 name, pathname);
1134 if (cpathname) {
1135 PyObject *ro = PySys_GetObject("dont_write_bytecode");
Antoine Pitrouc5bef752012-08-15 23:16:51 +02001136 int b = (ro == NULL) ? 0 : PyObject_IsTrue(ro);
1137 if (b < 0)
1138 goto error_exit;
1139 if (!b)
Mark Dickinson9fade762012-12-24 16:33:18 +00001140 write_compiled_module(co, cpathname, &st, mtime);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001141 }
1142 }
1143 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
1144 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001145
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001146 PyMem_FREE(buf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001147 return m;
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001148
1149error_exit:
Antoine Pitrou284fa082012-05-09 13:24:31 +02001150 Py_XDECREF(co);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001151 PyMem_FREE(buf);
1152 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001153}
1154
1155
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001156/* Forward */
Just van Rossum52e14d62002-12-30 22:08:05 +00001157static PyObject *load_module(char *, FILE *, char *, int, PyObject *);
1158static struct filedescr *find_module(char *, char *, PyObject *,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001159 char *, size_t, FILE **, PyObject **);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001160static struct _frozen *find_frozen(char *name);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001161
1162/* Load a package and return its module object WITH INCREMENTED
1163 REFERENCE COUNT */
1164
1165static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001166load_package(char *name, char *pathname)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001167{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001168 PyObject *m, *d;
1169 PyObject *file = NULL;
1170 PyObject *path = NULL;
1171 int err;
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001172 char *buf = NULL;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001173 FILE *fp = NULL;
1174 struct filedescr *fdp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001175
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001176 m = PyImport_AddModule(name);
1177 if (m == NULL)
1178 return NULL;
1179 if (Py_VerboseFlag)
1180 PySys_WriteStderr("import %s # directory %s\n",
1181 name, pathname);
1182 d = PyModule_GetDict(m);
1183 file = PyString_FromString(pathname);
1184 if (file == NULL)
1185 goto error;
1186 path = Py_BuildValue("[O]", file);
1187 if (path == NULL)
1188 goto error;
1189 err = PyDict_SetItemString(d, "__file__", file);
1190 if (err == 0)
1191 err = PyDict_SetItemString(d, "__path__", path);
1192 if (err != 0)
1193 goto error;
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001194 buf = PyMem_MALLOC(MAXPATHLEN+1);
1195 if (buf == NULL) {
1196 PyErr_NoMemory();
1197 goto error;
1198 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001199 buf[0] = '\0';
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001200 fdp = find_module(name, "__init__", path, buf, MAXPATHLEN+1, &fp, NULL);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001201 if (fdp == NULL) {
1202 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
1203 PyErr_Clear();
1204 Py_INCREF(m);
1205 }
1206 else
1207 m = NULL;
1208 goto cleanup;
1209 }
1210 m = load_module(name, fp, buf, fdp->type, NULL);
1211 if (fp != NULL)
1212 fclose(fp);
1213 goto cleanup;
Tim Peters1cd70172004-08-02 03:52:12 +00001214
1215 error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001216 m = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001217 cleanup:
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001218 if (buf)
1219 PyMem_FREE(buf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001220 Py_XDECREF(path);
1221 Py_XDECREF(file);
1222 return m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001223}
1224
1225
1226/* Helper to test for built-in module */
1227
1228static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001229is_builtin(char *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001230{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001231 int i;
1232 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
1233 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
1234 if (PyImport_Inittab[i].initfunc == NULL)
1235 return -1;
1236 else
1237 return 1;
1238 }
1239 }
1240 return 0;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001241}
1242
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001243
Just van Rossum52e14d62002-12-30 22:08:05 +00001244/* Return an importer object for a sys.path/pkg.__path__ item 'p',
1245 possibly by fetching it from the path_importer_cache dict. If it
Brett Cannon94b69f62006-09-28 22:10:14 +00001246 wasn't yet cached, traverse path_hooks until a hook is found
Just van Rossum52e14d62002-12-30 22:08:05 +00001247 that can handle the path item. Return None if no hook could;
1248 this tells our caller it should fall back to the builtin
1249 import mechanism. Cache the result in path_importer_cache.
1250 Returns a borrowed reference. */
1251
1252static PyObject *
1253get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001254 PyObject *p)
Just van Rossum52e14d62002-12-30 22:08:05 +00001255{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001256 PyObject *importer;
1257 Py_ssize_t j, nhooks;
Just van Rossum52e14d62002-12-30 22:08:05 +00001258
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001259 /* These conditions are the caller's responsibility: */
1260 assert(PyList_Check(path_hooks));
1261 assert(PyDict_Check(path_importer_cache));
Just van Rossum52e14d62002-12-30 22:08:05 +00001262
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001263 nhooks = PyList_Size(path_hooks);
1264 if (nhooks < 0)
1265 return NULL; /* Shouldn't happen */
Just van Rossum52e14d62002-12-30 22:08:05 +00001266
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001267 importer = PyDict_GetItem(path_importer_cache, p);
1268 if (importer != NULL)
1269 return importer;
Just van Rossum52e14d62002-12-30 22:08:05 +00001270
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001271 /* set path_importer_cache[p] to None to avoid recursion */
1272 if (PyDict_SetItem(path_importer_cache, p, Py_None) != 0)
1273 return NULL;
Just van Rossum52e14d62002-12-30 22:08:05 +00001274
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001275 for (j = 0; j < nhooks; j++) {
1276 PyObject *hook = PyList_GetItem(path_hooks, j);
1277 if (hook == NULL)
1278 return NULL;
1279 importer = PyObject_CallFunctionObjArgs(hook, p, NULL);
1280 if (importer != NULL)
1281 break;
Just van Rossum52e14d62002-12-30 22:08:05 +00001282
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001283 if (!PyErr_ExceptionMatches(PyExc_ImportError)) {
1284 return NULL;
1285 }
1286 PyErr_Clear();
1287 }
1288 if (importer == NULL) {
1289 importer = PyObject_CallFunctionObjArgs(
1290 (PyObject *)&PyNullImporter_Type, p, NULL
1291 );
1292 if (importer == NULL) {
1293 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
1294 PyErr_Clear();
1295 return Py_None;
1296 }
1297 }
1298 }
1299 if (importer != NULL) {
1300 int err = PyDict_SetItem(path_importer_cache, p, importer);
1301 Py_DECREF(importer);
1302 if (err != 0)
1303 return NULL;
1304 }
1305 return importer;
Just van Rossum52e14d62002-12-30 22:08:05 +00001306}
1307
Nick Coghlan327a39b2007-11-18 11:56:28 +00001308PyAPI_FUNC(PyObject *)
1309PyImport_GetImporter(PyObject *path) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001310 PyObject *importer=NULL, *path_importer_cache=NULL, *path_hooks=NULL;
Nick Coghlan327a39b2007-11-18 11:56:28 +00001311
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001312 if ((path_importer_cache = PySys_GetObject("path_importer_cache"))) {
1313 if ((path_hooks = PySys_GetObject("path_hooks"))) {
1314 importer = get_path_importer(path_importer_cache,
1315 path_hooks, path);
1316 }
1317 }
1318 Py_XINCREF(importer); /* get_path_importer returns a borrowed reference */
1319 return importer;
Nick Coghlan327a39b2007-11-18 11:56:28 +00001320}
1321
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001322/* Search the path (default sys.path) for a module. Return the
1323 corresponding filedescr struct, and (via return arguments) the
1324 pathname and an open file. Return NULL if the module is not found. */
1325
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001326#ifdef MS_COREDLL
Thomas Woutersb4bd21c2000-07-22 23:38:01 +00001327extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001328 char *, Py_ssize_t);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001329#endif
1330
Martin v. Löwis18e16552006-02-15 17:27:45 +00001331static int case_ok(char *, Py_ssize_t, Py_ssize_t, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001332static int find_init_module(char *); /* Forward */
Just van Rossum52e14d62002-12-30 22:08:05 +00001333static struct filedescr importhookdescr = {"", "", IMP_HOOK};
Guido van Rossum197346f1997-10-31 18:38:52 +00001334
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001335static struct filedescr *
Just van Rossum52e14d62002-12-30 22:08:05 +00001336find_module(char *fullname, char *subname, PyObject *path, char *buf,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001337 size_t buflen, FILE **p_fp, PyObject **p_loader)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001338{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001339 Py_ssize_t i, npath;
1340 size_t len, namelen;
1341 struct filedescr *fdp = NULL;
1342 char *filemode;
1343 FILE *fp = NULL;
1344 PyObject *path_hooks, *path_importer_cache;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001345 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
1346 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
1347 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001348 char *name;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001349#if defined(PYOS_OS2)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001350 size_t saved_len;
1351 size_t saved_namelen;
1352 char *saved_buf = NULL;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001353#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001354 if (p_loader != NULL)
1355 *p_loader = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001356
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001357 if (strlen(subname) > MAXPATHLEN) {
1358 PyErr_SetString(PyExc_OverflowError,
1359 "module name is too long");
1360 return NULL;
1361 }
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001362 name = PyMem_MALLOC(MAXPATHLEN+1);
1363 if (name == NULL) {
Gregory P. Smitha72aa842012-04-18 16:41:56 -07001364 PyErr_NoMemory();
1365 return NULL;
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001366 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001367 strcpy(name, subname);
Just van Rossum52e14d62002-12-30 22:08:05 +00001368
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001369 /* sys.meta_path import hook */
1370 if (p_loader != NULL) {
1371 PyObject *meta_path;
Just van Rossum52e14d62002-12-30 22:08:05 +00001372
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001373 meta_path = PySys_GetObject("meta_path");
1374 if (meta_path == NULL || !PyList_Check(meta_path)) {
Victor Stinnered36c062011-09-15 19:45:53 +02001375 PyErr_SetString(PyExc_RuntimeError,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001376 "sys.meta_path must be a list of "
1377 "import hooks");
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001378 goto error_exit;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001379 }
1380 Py_INCREF(meta_path); /* zap guard */
1381 npath = PyList_Size(meta_path);
1382 for (i = 0; i < npath; i++) {
1383 PyObject *loader;
1384 PyObject *hook = PyList_GetItem(meta_path, i);
1385 loader = PyObject_CallMethod(hook, "find_module",
1386 "sO", fullname,
1387 path != NULL ?
1388 path : Py_None);
1389 if (loader == NULL) {
1390 Py_DECREF(meta_path);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001391 goto error_exit; /* true error */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001392 }
1393 if (loader != Py_None) {
1394 /* a loader was found */
1395 *p_loader = loader;
1396 Py_DECREF(meta_path);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001397 PyMem_FREE(name);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001398 return &importhookdescr;
1399 }
1400 Py_DECREF(loader);
1401 }
1402 Py_DECREF(meta_path);
1403 }
Guido van Rossum0506a431998-08-11 15:07:39 +00001404
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001405 if (path != NULL && PyString_Check(path)) {
1406 /* The only type of submodule allowed inside a "frozen"
1407 package are other frozen modules or packages. */
1408 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
1409 PyErr_SetString(PyExc_ImportError,
1410 "full frozen module name too long");
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001411 goto error_exit;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001412 }
1413 strcpy(buf, PyString_AsString(path));
1414 strcat(buf, ".");
1415 strcat(buf, name);
1416 strcpy(name, buf);
1417 if (find_frozen(name) != NULL) {
1418 strcpy(buf, name);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001419 PyMem_FREE(name);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001420 return &fd_frozen;
1421 }
1422 PyErr_Format(PyExc_ImportError,
1423 "No frozen submodule named %.200s", name);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001424 goto error_exit;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001425 }
1426 if (path == NULL) {
1427 if (is_builtin(name)) {
1428 strcpy(buf, name);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001429 PyMem_FREE(name);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001430 return &fd_builtin;
1431 }
1432 if ((find_frozen(name)) != NULL) {
1433 strcpy(buf, name);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001434 PyMem_FREE(name);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001435 return &fd_frozen;
1436 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001437
Guido van Rossumac279101996-08-22 23:10:58 +00001438#ifdef MS_COREDLL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001439 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
1440 if (fp != NULL) {
1441 *p_fp = fp;
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001442 PyMem_FREE(name);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001443 return fdp;
1444 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +00001445#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001446 path = PySys_GetObject("path");
1447 }
1448 if (path == NULL || !PyList_Check(path)) {
Victor Stinnered36c062011-09-15 19:45:53 +02001449 PyErr_SetString(PyExc_RuntimeError,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001450 "sys.path must be a list of directory names");
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001451 goto error_exit;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001452 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001453
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001454 path_hooks = PySys_GetObject("path_hooks");
1455 if (path_hooks == NULL || !PyList_Check(path_hooks)) {
Victor Stinnered36c062011-09-15 19:45:53 +02001456 PyErr_SetString(PyExc_RuntimeError,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001457 "sys.path_hooks must be a list of "
1458 "import hooks");
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001459 goto error_exit;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001460 }
1461 path_importer_cache = PySys_GetObject("path_importer_cache");
1462 if (path_importer_cache == NULL ||
1463 !PyDict_Check(path_importer_cache)) {
Victor Stinnered36c062011-09-15 19:45:53 +02001464 PyErr_SetString(PyExc_RuntimeError,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001465 "sys.path_importer_cache must be a dict");
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001466 goto error_exit;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001467 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001468
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001469 npath = PyList_Size(path);
1470 namelen = strlen(name);
1471 for (i = 0; i < npath; i++) {
1472 PyObject *copy = NULL;
1473 PyObject *v = PyList_GetItem(path, i);
1474 if (!v)
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001475 goto error_exit;
Walter Dörwald3430d702002-06-17 10:43:59 +00001476#ifdef Py_USING_UNICODE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001477 if (PyUnicode_Check(v)) {
1478 copy = PyUnicode_Encode(PyUnicode_AS_UNICODE(v),
1479 PyUnicode_GET_SIZE(v), Py_FileSystemDefaultEncoding, NULL);
1480 if (copy == NULL)
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001481 goto error_exit;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001482 v = copy;
1483 }
1484 else
Walter Dörwald3430d702002-06-17 10:43:59 +00001485#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001486 if (!PyString_Check(v))
1487 continue;
1488 len = PyString_GET_SIZE(v);
1489 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen) {
1490 Py_XDECREF(copy);
1491 continue; /* Too long */
1492 }
1493 strcpy(buf, PyString_AS_STRING(v));
1494 if (strlen(buf) != len) {
1495 Py_XDECREF(copy);
1496 continue; /* v contains '\0' */
1497 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001498
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001499 /* sys.path_hooks import hook */
1500 if (p_loader != NULL) {
1501 PyObject *importer;
Just van Rossum52e14d62002-12-30 22:08:05 +00001502
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001503 importer = get_path_importer(path_importer_cache,
1504 path_hooks, v);
1505 if (importer == NULL) {
1506 Py_XDECREF(copy);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001507 goto error_exit;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001508 }
1509 /* Note: importer is a borrowed reference */
1510 if (importer != Py_None) {
1511 PyObject *loader;
1512 loader = PyObject_CallMethod(importer,
1513 "find_module",
1514 "s", fullname);
1515 Py_XDECREF(copy);
1516 if (loader == NULL)
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001517 goto error_exit; /* error */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001518 if (loader != Py_None) {
1519 /* a loader was found */
1520 *p_loader = loader;
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001521 PyMem_FREE(name);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001522 return &importhookdescr;
1523 }
1524 Py_DECREF(loader);
1525 continue;
1526 }
1527 }
1528 /* no hook was found, use builtin import */
Just van Rossum52e14d62002-12-30 22:08:05 +00001529
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001530 if (len > 0 && buf[len-1] != SEP
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001531#ifdef ALTSEP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001532 && buf[len-1] != ALTSEP
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001533#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001534 )
1535 buf[len++] = SEP;
1536 strcpy(buf+len, name);
1537 len += namelen;
Tim Peters50d8d372001-02-28 05:34:27 +00001538
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001539 /* Check for package import (buf holds a directory name,
1540 and there's an __init__ module in that directory */
Jason R. Coombs925ff742012-01-13 17:12:25 -05001541 if (isdir(buf) && /* it's an existing directory */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001542 case_ok(buf, len, namelen, name)) { /* case matches */
1543 if (find_init_module(buf)) { /* and has __init__.py */
1544 Py_XDECREF(copy);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001545 PyMem_FREE(name);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001546 return &fd_package;
1547 }
1548 else {
1549 char warnstr[MAXPATHLEN+80];
1550 sprintf(warnstr, "Not importing directory "
1551 "'%.*s': missing __init__.py",
1552 MAXPATHLEN, buf);
1553 if (PyErr_Warn(PyExc_ImportWarning,
1554 warnstr)) {
1555 Py_XDECREF(copy);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001556 goto error_exit;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001557 }
1558 }
1559 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001560#if defined(PYOS_OS2)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001561 /* take a snapshot of the module spec for restoration
1562 * after the 8 character DLL hackery
1563 */
1564 saved_buf = strdup(buf);
1565 saved_len = len;
1566 saved_namelen = namelen;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001567#endif /* PYOS_OS2 */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001568 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Georg Brandladd36e52007-08-23 18:08:06 +00001569#if defined(PYOS_OS2) && defined(HAVE_DYNAMIC_LOADING)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001570 /* OS/2 limits DLLs to 8 character names (w/o
1571 extension)
1572 * so if the name is longer than that and its a
1573 * dynamically loaded module we're going to try,
1574 * truncate the name before trying
1575 */
1576 if (strlen(subname) > 8) {
1577 /* is this an attempt to load a C extension? */
1578 const struct filedescr *scan;
1579 scan = _PyImport_DynLoadFiletab;
1580 while (scan->suffix != NULL) {
1581 if (!strcmp(scan->suffix, fdp->suffix))
1582 break;
1583 else
1584 scan++;
1585 }
1586 if (scan->suffix != NULL) {
1587 /* yes, so truncate the name */
1588 namelen = 8;
1589 len -= strlen(subname) - namelen;
1590 buf[len] = '\0';
1591 }
1592 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001593#endif /* PYOS_OS2 */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001594 strcpy(buf+len, fdp->suffix);
1595 if (Py_VerboseFlag > 1)
1596 PySys_WriteStderr("# trying %s\n", buf);
1597 filemode = fdp->mode;
1598 if (filemode[0] == 'U')
1599 filemode = "r" PY_STDIOTEXTMODE;
1600 fp = fopen(buf, filemode);
1601 if (fp != NULL) {
1602 if (case_ok(buf, len, namelen, name))
1603 break;
1604 else { /* continue search */
1605 fclose(fp);
1606 fp = NULL;
1607 }
1608 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001609#if defined(PYOS_OS2)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001610 /* restore the saved snapshot */
1611 strcpy(buf, saved_buf);
1612 len = saved_len;
1613 namelen = saved_namelen;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001614#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001615 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001616#if defined(PYOS_OS2)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001617 /* don't need/want the module name snapshot anymore */
1618 if (saved_buf)
1619 {
1620 free(saved_buf);
1621 saved_buf = NULL;
1622 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001623#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001624 Py_XDECREF(copy);
1625 if (fp != NULL)
1626 break;
1627 }
1628 if (fp == NULL) {
1629 PyErr_Format(PyExc_ImportError,
1630 "No module named %.200s", name);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001631 goto error_exit;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001632 }
1633 *p_fp = fp;
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001634 PyMem_FREE(name);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001635 return fdp;
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07001636
1637error_exit:
1638 PyMem_FREE(name);
1639 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001640}
1641
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +00001642/* Helpers for main.c
1643 * Find the source file corresponding to a named module
1644 */
1645struct filedescr *
1646_PyImport_FindModule(const char *name, PyObject *path, char *buf,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001647 size_t buflen, FILE **p_fp, PyObject **p_loader)
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +00001648{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001649 return find_module((char *) name, (char *) name, path,
1650 buf, buflen, p_fp, p_loader);
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +00001651}
1652
1653PyAPI_FUNC(int) _PyImport_IsScript(struct filedescr * fd)
1654{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001655 return fd->type == PY_SOURCE || fd->type == PY_COMPILED;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +00001656}
1657
Martin v. Löwis18e16552006-02-15 17:27:45 +00001658/* case_ok(char* buf, Py_ssize_t len, Py_ssize_t namelen, char* name)
Tim Petersd1e87a82001-03-01 18:12:00 +00001659 * The arguments here are tricky, best shown by example:
1660 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1661 * ^ ^ ^ ^
1662 * |--------------------- buf ---------------------|
1663 * |------------------- len ------------------|
1664 * |------ name -------|
1665 * |----- namelen -----|
1666 * buf is the full path, but len only counts up to (& exclusive of) the
1667 * extension. name is the module name, also exclusive of extension.
1668 *
1669 * We've already done a successful stat() or fopen() on buf, so know that
1670 * there's some match, possibly case-insensitive.
1671 *
Tim Peters50d8d372001-02-28 05:34:27 +00001672 * case_ok() is to return 1 if there's a case-sensitive match for
1673 * name, else 0. case_ok() is also to return 1 if envar PYTHONCASEOK
1674 * exists.
Tim Petersd1e87a82001-03-01 18:12:00 +00001675 *
Tim Peters50d8d372001-02-28 05:34:27 +00001676 * case_ok() is used to implement case-sensitive import semantics even
1677 * on platforms with case-insensitive filesystems. It's trivial to implement
1678 * for case-sensitive filesystems. It's pretty much a cross-platform
1679 * nightmare for systems with case-insensitive filesystems.
1680 */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001681
Tim Peters50d8d372001-02-28 05:34:27 +00001682/* First we may need a pile of platform-specific header files; the sequence
1683 * of #if's here should match the sequence in the body of case_ok().
1684 */
Jason Tishler7961aa62005-05-20 00:56:54 +00001685#if defined(MS_WINDOWS)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001686#include <windows.h>
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001687
Tim Peters50d8d372001-02-28 05:34:27 +00001688#elif defined(DJGPP)
1689#include <dir.h>
1690
Jason Tishler7961aa62005-05-20 00:56:54 +00001691#elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001692#include <sys/types.h>
1693#include <dirent.h>
1694
Andrew MacIntyred9400542002-02-26 11:41:34 +00001695#elif defined(PYOS_OS2)
1696#define INCL_DOS
1697#define INCL_DOSERRORS
1698#define INCL_NOPMAPI
1699#include <os2.h>
1700
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001701#elif defined(RISCOS)
1702#include "oslib/osfscontrol.h"
Tim Peters50d8d372001-02-28 05:34:27 +00001703#endif
1704
Guido van Rossum0980bd91998-02-13 17:18:36 +00001705static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001706case_ok(char *buf, Py_ssize_t len, Py_ssize_t namelen, char *name)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001707{
Tim Peters50d8d372001-02-28 05:34:27 +00001708/* Pick a platform-specific implementation; the sequence of #if's here should
1709 * match the sequence just above.
1710 */
1711
Jason Tishler7961aa62005-05-20 00:56:54 +00001712/* MS_WINDOWS */
1713#if defined(MS_WINDOWS)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001714 WIN32_FIND_DATA data;
1715 HANDLE h;
Tim Peters50d8d372001-02-28 05:34:27 +00001716
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001717 if (Py_GETENV("PYTHONCASEOK") != NULL)
1718 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001719
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001720 h = FindFirstFile(buf, &data);
1721 if (h == INVALID_HANDLE_VALUE) {
1722 PyErr_Format(PyExc_NameError,
1723 "Can't find file for module %.100s\n(filename %.300s)",
1724 name, buf);
1725 return 0;
1726 }
1727 FindClose(h);
1728 return strncmp(data.cFileName, name, namelen) == 0;
Tim Peters50d8d372001-02-28 05:34:27 +00001729
1730/* DJGPP */
1731#elif defined(DJGPP)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001732 struct ffblk ffblk;
1733 int done;
Tim Peters50d8d372001-02-28 05:34:27 +00001734
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001735 if (Py_GETENV("PYTHONCASEOK") != NULL)
1736 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001737
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001738 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
1739 if (done) {
1740 PyErr_Format(PyExc_NameError,
1741 "Can't find file for module %.100s\n(filename %.300s)",
1742 name, buf);
1743 return 0;
1744 }
1745 return strncmp(ffblk.ff_name, name, namelen) == 0;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001746
Jason Tishler7961aa62005-05-20 00:56:54 +00001747/* new-fangled macintosh (macosx) or Cygwin */
1748#elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001749 DIR *dirp;
1750 struct dirent *dp;
1751 char dirname[MAXPATHLEN + 1];
1752 const int dirlen = len - namelen - 1; /* don't want trailing SEP */
Tim Peters430f5d42001-03-01 01:30:56 +00001753
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001754 if (Py_GETENV("PYTHONCASEOK") != NULL)
1755 return 1;
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001756
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001757 /* Copy the dir component into dirname; substitute "." if empty */
1758 if (dirlen <= 0) {
1759 dirname[0] = '.';
1760 dirname[1] = '\0';
1761 }
1762 else {
1763 assert(dirlen <= MAXPATHLEN);
1764 memcpy(dirname, buf, dirlen);
1765 dirname[dirlen] = '\0';
1766 }
1767 /* Open the directory and search the entries for an exact match. */
1768 dirp = opendir(dirname);
1769 if (dirp) {
1770 char *nameWithExt = buf + len - namelen;
1771 while ((dp = readdir(dirp)) != NULL) {
1772 const int thislen =
Tim Peters430f5d42001-03-01 01:30:56 +00001773#ifdef _DIRENT_HAVE_D_NAMELEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001774 dp->d_namlen;
Tim Peters430f5d42001-03-01 01:30:56 +00001775#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001776 strlen(dp->d_name);
Tim Peters430f5d42001-03-01 01:30:56 +00001777#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001778 if (thislen >= namelen &&
1779 strcmp(dp->d_name, nameWithExt) == 0) {
1780 (void)closedir(dirp);
1781 return 1; /* Found */
1782 }
1783 }
1784 (void)closedir(dirp);
1785 }
1786 return 0 ; /* Not found */
Tim Peters430f5d42001-03-01 01:30:56 +00001787
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001788/* RISC OS */
1789#elif defined(RISCOS)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001790 char canon[MAXPATHLEN+1]; /* buffer for the canonical form of the path */
1791 char buf2[MAXPATHLEN+2];
1792 char *nameWithExt = buf+len-namelen;
1793 int canonlen;
1794 os_error *e;
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001795
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001796 if (Py_GETENV("PYTHONCASEOK") != NULL)
1797 return 1;
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001798
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001799 /* workaround:
1800 append wildcard, otherwise case of filename wouldn't be touched */
1801 strcpy(buf2, buf);
1802 strcat(buf2, "*");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001803
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001804 e = xosfscontrol_canonicalise_path(buf2,canon,0,0,MAXPATHLEN+1,&canonlen);
1805 canonlen = MAXPATHLEN+1-canonlen;
1806 if (e || canonlen<=0 || canonlen>(MAXPATHLEN+1) )
1807 return 0;
1808 if (strcmp(nameWithExt, canon+canonlen-strlen(nameWithExt))==0)
1809 return 1; /* match */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001810
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001811 return 0;
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001812
Andrew MacIntyred9400542002-02-26 11:41:34 +00001813/* OS/2 */
1814#elif defined(PYOS_OS2)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001815 HDIR hdir = 1;
1816 ULONG srchcnt = 1;
1817 FILEFINDBUF3 ffbuf;
1818 APIRET rc;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001819
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001820 if (Py_GETENV("PYTHONCASEOK") != NULL)
1821 return 1;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001822
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001823 rc = DosFindFirst(buf,
1824 &hdir,
1825 FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY,
1826 &ffbuf, sizeof(ffbuf),
1827 &srchcnt,
1828 FIL_STANDARD);
1829 if (rc != NO_ERROR)
1830 return 0;
1831 return strncmp(ffbuf.achName, name, namelen) == 0;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001832
Tim Peters50d8d372001-02-28 05:34:27 +00001833/* assuming it's a case-sensitive filesystem, so there's nothing to do! */
1834#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001835 return 1;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001836
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001837#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001838}
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001839
Guido van Rossum0980bd91998-02-13 17:18:36 +00001840
Guido van Rossum197346f1997-10-31 18:38:52 +00001841#ifdef HAVE_STAT
1842/* Helper to look for __init__.py or __init__.py[co] in potential package */
1843static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001844find_init_module(char *buf)
Guido van Rossum197346f1997-10-31 18:38:52 +00001845{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001846 const size_t save_len = strlen(buf);
1847 size_t i = save_len;
1848 char *pname; /* pointer to start of __init__ */
1849 struct stat statbuf;
Guido van Rossum197346f1997-10-31 18:38:52 +00001850
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001851/* For calling case_ok(buf, len, namelen, name):
1852 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1853 * ^ ^ ^ ^
1854 * |--------------------- buf ---------------------|
1855 * |------------------- len ------------------|
1856 * |------ name -------|
1857 * |----- namelen -----|
Tim Peters0f9431f2001-07-05 03:47:53 +00001858 */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001859 if (save_len + 13 >= MAXPATHLEN)
1860 return 0;
1861 buf[i++] = SEP;
1862 pname = buf + i;
1863 strcpy(pname, "__init__.py");
1864 if (stat(buf, &statbuf) == 0) {
1865 if (case_ok(buf,
1866 save_len + 9, /* len("/__init__") */
1867 8, /* len("__init__") */
1868 pname)) {
1869 buf[save_len] = '\0';
1870 return 1;
1871 }
1872 }
1873 i += strlen(pname);
1874 strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
1875 if (stat(buf, &statbuf) == 0) {
1876 if (case_ok(buf,
1877 save_len + 9, /* len("/__init__") */
1878 8, /* len("__init__") */
1879 pname)) {
1880 buf[save_len] = '\0';
1881 return 1;
1882 }
1883 }
1884 buf[save_len] = '\0';
1885 return 0;
Guido van Rossum197346f1997-10-31 18:38:52 +00001886}
Guido van Rossum48a680c2001-03-02 06:34:14 +00001887
1888#else
1889
1890#ifdef RISCOS
1891static int
1892find_init_module(buf)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001893 char *buf;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001894{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001895 int save_len = strlen(buf);
1896 int i = save_len;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001897
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001898 if (save_len + 13 >= MAXPATHLEN)
1899 return 0;
1900 buf[i++] = SEP;
1901 strcpy(buf+i, "__init__/py");
1902 if (isfile(buf)) {
1903 buf[save_len] = '\0';
1904 return 1;
1905 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001906
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001907 if (Py_OptimizeFlag)
1908 strcpy(buf+i, "o");
1909 else
1910 strcpy(buf+i, "c");
1911 if (isfile(buf)) {
1912 buf[save_len] = '\0';
1913 return 1;
1914 }
1915 buf[save_len] = '\0';
1916 return 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001917}
1918#endif /*RISCOS*/
1919
Guido van Rossum197346f1997-10-31 18:38:52 +00001920#endif /* HAVE_STAT */
1921
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001922
Tim Petersdbd9ba62000-07-09 03:09:57 +00001923static int init_builtin(char *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001924
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001925/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001926 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001927
Guido van Rossum79f25d91997-04-29 20:08:16 +00001928static PyObject *
Amaury Forgeot d'Arc982b2fa2009-07-25 16:22:06 +00001929load_module(char *name, FILE *fp, char *pathname, int type, PyObject *loader)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001930{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001931 PyObject *modules;
1932 PyObject *m;
1933 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001934
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001935 /* First check that there's an open file (if we need one) */
1936 switch (type) {
1937 case PY_SOURCE:
1938 case PY_COMPILED:
1939 if (fp == NULL) {
1940 PyErr_Format(PyExc_ValueError,
1941 "file object required for import (type code %d)",
1942 type);
1943 return NULL;
1944 }
1945 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001946
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001947 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001948
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001949 case PY_SOURCE:
1950 m = load_source_module(name, pathname, fp);
1951 break;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001952
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001953 case PY_COMPILED:
1954 m = load_compiled_module(name, pathname, fp);
1955 break;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001956
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001957#ifdef HAVE_DYNAMIC_LOADING
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001958 case C_EXTENSION:
1959 m = _PyImport_LoadDynamicModule(name, pathname, fp);
1960 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001961#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001962
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001963 case PKG_DIRECTORY:
1964 m = load_package(name, pathname);
1965 break;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001966
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001967 case C_BUILTIN:
1968 case PY_FROZEN:
1969 if (pathname != NULL && pathname[0] != '\0')
1970 name = pathname;
1971 if (type == C_BUILTIN)
1972 err = init_builtin(name);
1973 else
1974 err = PyImport_ImportFrozenModule(name);
1975 if (err < 0)
1976 return NULL;
1977 if (err == 0) {
1978 PyErr_Format(PyExc_ImportError,
1979 "Purported %s module %.200s not found",
1980 type == C_BUILTIN ?
1981 "builtin" : "frozen",
1982 name);
1983 return NULL;
1984 }
1985 modules = PyImport_GetModuleDict();
1986 m = PyDict_GetItemString(modules, name);
1987 if (m == NULL) {
1988 PyErr_Format(
1989 PyExc_ImportError,
1990 "%s module %.200s not properly initialized",
1991 type == C_BUILTIN ?
1992 "builtin" : "frozen",
1993 name);
1994 return NULL;
1995 }
1996 Py_INCREF(m);
1997 break;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001998
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001999 case IMP_HOOK: {
2000 if (loader == NULL) {
2001 PyErr_SetString(PyExc_ImportError,
2002 "import hook without loader");
2003 return NULL;
2004 }
2005 m = PyObject_CallMethod(loader, "load_module", "s", name);
2006 break;
2007 }
Just van Rossum52e14d62002-12-30 22:08:05 +00002008
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002009 default:
2010 PyErr_Format(PyExc_ImportError,
2011 "Don't know how to import %.200s (type code %d)",
2012 name, type);
2013 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002014
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002015 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002016
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002017 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002018}
2019
2020
2021/* Initialize a built-in module.
Brett Cannon5a9aa4f2006-10-03 21:58:55 +00002022 Return 1 for success, 0 if the module is not found, and -1 with
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002023 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00002024
Guido van Rossum7f133ed1991-02-19 12:23:57 +00002025static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002026init_builtin(char *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00002027{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002028 struct _inittab *p;
Guido van Rossum25ce5661997-08-02 03:10:38 +00002029
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002030 if (_PyImport_FindExtension(name, name) != NULL)
2031 return 1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00002032
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002033 for (p = PyImport_Inittab; p->name != NULL; p++) {
2034 if (strcmp(name, p->name) == 0) {
2035 if (p->initfunc == NULL) {
2036 PyErr_Format(PyExc_ImportError,
2037 "Cannot re-init internal module %.200s",
2038 name);
2039 return -1;
2040 }
2041 if (Py_VerboseFlag)
2042 PySys_WriteStderr("import %s # builtin\n", name);
2043 (*p->initfunc)();
2044 if (PyErr_Occurred())
2045 return -1;
2046 if (_PyImport_FixupExtension(name, name) == NULL)
2047 return -1;
2048 return 1;
2049 }
2050 }
2051 return 0;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00002052}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00002053
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002054
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002055/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002056
Guido van Rossumcfd0a221996-06-17 17:06:34 +00002057static struct _frozen *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002058find_frozen(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002059{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002060 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002061
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002062 for (p = PyImport_FrozenModules; ; p++) {
2063 if (p->name == NULL)
2064 return NULL;
2065 if (strcmp(p->name, name) == 0)
2066 break;
2067 }
2068 return p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002069}
2070
Guido van Rossum79f25d91997-04-29 20:08:16 +00002071static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002072get_frozen_object(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002073{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002074 struct _frozen *p = find_frozen(name);
2075 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002076
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002077 if (p == NULL) {
2078 PyErr_Format(PyExc_ImportError,
2079 "No such frozen object named %.200s",
2080 name);
2081 return NULL;
2082 }
2083 if (p->code == NULL) {
2084 PyErr_Format(PyExc_ImportError,
2085 "Excluded frozen object named %.200s",
2086 name);
2087 return NULL;
2088 }
2089 size = p->size;
2090 if (size < 0)
2091 size = -size;
2092 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002093}
2094
2095/* Initialize a frozen module.
2096 Return 1 for succes, 0 if the module is not found, and -1 with
2097 an exception set if the initialization failed.
2098 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00002099
2100int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002101PyImport_ImportFrozenModule(char *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00002102{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002103 struct _frozen *p = find_frozen(name);
2104 PyObject *co;
2105 PyObject *m;
2106 int ispackage;
2107 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002108
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002109 if (p == NULL)
2110 return 0;
2111 if (p->code == NULL) {
2112 PyErr_Format(PyExc_ImportError,
2113 "Excluded frozen object named %.200s",
2114 name);
2115 return -1;
2116 }
2117 size = p->size;
2118 ispackage = (size < 0);
2119 if (ispackage)
2120 size = -size;
2121 if (Py_VerboseFlag)
2122 PySys_WriteStderr("import %s # frozen%s\n",
2123 name, ispackage ? " package" : "");
2124 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
2125 if (co == NULL)
2126 return -1;
2127 if (!PyCode_Check(co)) {
2128 PyErr_Format(PyExc_TypeError,
2129 "frozen object %.200s is not a code object",
2130 name);
2131 goto err_return;
2132 }
2133 if (ispackage) {
2134 /* Set __path__ to the package name */
2135 PyObject *d, *s;
2136 int err;
2137 m = PyImport_AddModule(name);
2138 if (m == NULL)
2139 goto err_return;
2140 d = PyModule_GetDict(m);
2141 s = PyString_InternFromString(name);
2142 if (s == NULL)
2143 goto err_return;
2144 err = PyDict_SetItemString(d, "__path__", s);
2145 Py_DECREF(s);
2146 if (err != 0)
2147 goto err_return;
2148 }
2149 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
2150 if (m == NULL)
2151 goto err_return;
2152 Py_DECREF(co);
2153 Py_DECREF(m);
2154 return 1;
Neal Norwitzc0cde4d2006-07-16 02:17:36 +00002155err_return:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002156 Py_DECREF(co);
2157 return -1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00002158}
Guido van Rossum74e6a111994-08-29 12:54:38 +00002159
2160
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002161/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00002162 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00002163
Guido van Rossum79f25d91997-04-29 20:08:16 +00002164PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00002165PyImport_ImportModule(const char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00002166{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002167 PyObject *pname;
2168 PyObject *result;
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00002169
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002170 pname = PyString_FromString(name);
2171 if (pname == NULL)
2172 return NULL;
2173 result = PyImport_Import(pname);
2174 Py_DECREF(pname);
2175 return result;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002176}
2177
Christian Heimes000a0742008-01-03 22:16:32 +00002178/* Import a module without blocking
2179 *
2180 * At first it tries to fetch the module from sys.modules. If the module was
2181 * never loaded before it loads it with PyImport_ImportModule() unless another
2182 * thread holds the import lock. In the latter case the function raises an
2183 * ImportError instead of blocking.
2184 *
2185 * Returns the module object with incremented ref count.
2186 */
2187PyObject *
2188PyImport_ImportModuleNoBlock(const char *name)
2189{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002190 PyObject *result;
2191 PyObject *modules;
Victor Stinner871a0fb2011-09-02 00:21:36 +02002192#ifdef WITH_THREAD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002193 long me;
Victor Stinner871a0fb2011-09-02 00:21:36 +02002194#endif
Christian Heimes000a0742008-01-03 22:16:32 +00002195
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002196 /* Try to get the module from sys.modules[name] */
2197 modules = PyImport_GetModuleDict();
2198 if (modules == NULL)
2199 return NULL;
Christian Heimes000a0742008-01-03 22:16:32 +00002200
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002201 result = PyDict_GetItemString(modules, name);
2202 if (result != NULL) {
2203 Py_INCREF(result);
2204 return result;
2205 }
2206 else {
2207 PyErr_Clear();
2208 }
Benjamin Peterson17f03ca2008-09-01 14:18:30 +00002209#ifdef WITH_THREAD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002210 /* check the import lock
2211 * me might be -1 but I ignore the error here, the lock function
2212 * takes care of the problem */
2213 me = PyThread_get_thread_ident();
2214 if (import_lock_thread == -1 || import_lock_thread == me) {
2215 /* no thread or me is holding the lock */
2216 return PyImport_ImportModule(name);
2217 }
2218 else {
2219 PyErr_Format(PyExc_ImportError,
2220 "Failed to import %.200s because the import lock"
2221 "is held by another thread.",
2222 name);
2223 return NULL;
2224 }
Benjamin Peterson17f03ca2008-09-01 14:18:30 +00002225#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002226 return PyImport_ImportModule(name);
Benjamin Peterson17f03ca2008-09-01 14:18:30 +00002227#endif
Christian Heimes000a0742008-01-03 22:16:32 +00002228}
2229
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002230/* Forward declarations for helper routines */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002231static PyObject *get_parent(PyObject *globals, char *buf,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002232 Py_ssize_t *p_buflen, int level);
Tim Petersdbd9ba62000-07-09 03:09:57 +00002233static PyObject *load_next(PyObject *mod, PyObject *altmod,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002234 char **p_name, char *buf, Py_ssize_t *p_buflen);
Tim Petersdbd9ba62000-07-09 03:09:57 +00002235static int mark_miss(char *name);
2236static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002237 char *buf, Py_ssize_t buflen, int recursive);
Tim Petersdbd9ba62000-07-09 03:09:57 +00002238static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002239
2240/* The Magnum Opus of dotted-name import :-) */
2241
Guido van Rossum75acc9c1998-03-03 22:26:50 +00002242static PyObject *
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002243import_module_level(char *name, PyObject *globals, PyObject *locals,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002244 PyObject *fromlist, int level)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002245{
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002246 char *buf;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002247 Py_ssize_t buflen = 0;
2248 PyObject *parent, *head, *next, *tail;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002249
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002250 if (strchr(name, '/') != NULL
Christian Heimes3403f152008-01-09 19:56:33 +00002251#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002252 || strchr(name, '\\') != NULL
Christian Heimes3403f152008-01-09 19:56:33 +00002253#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002254 ) {
2255 PyErr_SetString(PyExc_ImportError,
2256 "Import by filename is not supported.");
2257 return NULL;
2258 }
Christian Heimes3403f152008-01-09 19:56:33 +00002259
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002260 buf = PyMem_MALLOC(MAXPATHLEN+1);
2261 if (buf == NULL) {
2262 return PyErr_NoMemory();
2263 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002264 parent = get_parent(globals, buf, &buflen, level);
2265 if (parent == NULL)
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002266 goto error_exit;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002267
Eric Snowbf00bc72016-09-07 19:08:02 -07002268 Py_INCREF(parent);
Brett Cannoneb3cd302010-05-20 18:37:55 +00002269 head = load_next(parent, level < 0 ? Py_None : parent, &name, buf,
2270 &buflen);
Eric Snowbf00bc72016-09-07 19:08:02 -07002271 Py_DECREF(parent);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002272 if (head == NULL)
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002273 goto error_exit;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002274
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002275 tail = head;
2276 Py_INCREF(tail);
2277 while (name) {
2278 next = load_next(tail, tail, &name, buf, &buflen);
2279 Py_DECREF(tail);
2280 if (next == NULL) {
2281 Py_DECREF(head);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002282 goto error_exit;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002283 }
2284 tail = next;
2285 }
2286 if (tail == Py_None) {
2287 /* If tail is Py_None, both get_parent and load_next found
2288 an empty module name: someone called __import__("") or
2289 doctored faulty bytecode */
2290 Py_DECREF(tail);
2291 Py_DECREF(head);
2292 PyErr_SetString(PyExc_ValueError,
2293 "Empty module name");
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002294 goto error_exit;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002295 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002296
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002297 if (fromlist != NULL) {
Antoine Pitrouc5bef752012-08-15 23:16:51 +02002298 int b = (fromlist == Py_None) ? 0 : PyObject_IsTrue(fromlist);
2299 if (b < 0) {
2300 Py_DECREF(tail);
2301 Py_DECREF(head);
2302 goto error_exit;
2303 }
2304 if (!b)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002305 fromlist = NULL;
2306 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002307
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002308 if (fromlist == NULL) {
2309 Py_DECREF(tail);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002310 PyMem_FREE(buf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002311 return head;
2312 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002313
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002314 Py_DECREF(head);
2315 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
2316 Py_DECREF(tail);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002317 goto error_exit;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002318 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002319
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002320 PyMem_FREE(buf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002321 return tail;
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002322
2323error_exit:
2324 PyMem_FREE(buf);
2325 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002326}
2327
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002328PyObject *
2329PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002330 PyObject *fromlist, int level)
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002331{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002332 PyObject *result;
2333 _PyImport_AcquireLock();
2334 result = import_module_level(name, globals, locals, fromlist, level);
2335 if (_PyImport_ReleaseLock() < 0) {
2336 Py_XDECREF(result);
2337 PyErr_SetString(PyExc_RuntimeError,
2338 "not holding the import lock");
2339 return NULL;
2340 }
2341 return result;
Guido van Rossum75acc9c1998-03-03 22:26:50 +00002342}
2343
Fred Drake87590902004-05-28 20:21:36 +00002344/* Return the package that an import is being performed in. If globals comes
2345 from the module foo.bar.bat (not itself a package), this returns the
2346 sys.modules entry for foo.bar. If globals is from a package's __init__.py,
Georg Brandl5f6861d2006-05-28 21:57:35 +00002347 the package's entry in sys.modules is returned, as a borrowed reference.
Fred Drake87590902004-05-28 20:21:36 +00002348
2349 The *name* of the returned package is returned in buf, with the length of
2350 the name in *p_buflen.
2351
2352 If globals doesn't come from a package or a module in a package, or a
2353 corresponding entry is not found in sys.modules, Py_None is returned.
2354*/
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002355static PyObject *
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002356get_parent(PyObject *globals, char *buf, Py_ssize_t *p_buflen, int level)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002357{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002358 static PyObject *namestr = NULL;
2359 static PyObject *pathstr = NULL;
2360 static PyObject *pkgstr = NULL;
2361 PyObject *pkgname, *modname, *modpath, *modules, *parent;
2362 int orig_level = level;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002363
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002364 if (globals == NULL || !PyDict_Check(globals) || !level)
2365 return Py_None;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002366
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002367 if (namestr == NULL) {
2368 namestr = PyString_InternFromString("__name__");
2369 if (namestr == NULL)
2370 return NULL;
2371 }
2372 if (pathstr == NULL) {
2373 pathstr = PyString_InternFromString("__path__");
2374 if (pathstr == NULL)
2375 return NULL;
2376 }
2377 if (pkgstr == NULL) {
2378 pkgstr = PyString_InternFromString("__package__");
2379 if (pkgstr == NULL)
2380 return NULL;
2381 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002382
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002383 *buf = '\0';
2384 *p_buflen = 0;
2385 pkgname = PyDict_GetItem(globals, pkgstr);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002386
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002387 if ((pkgname != NULL) && (pkgname != Py_None)) {
2388 /* __package__ is set, so use it */
2389 Py_ssize_t len;
2390 if (!PyString_Check(pkgname)) {
2391 PyErr_SetString(PyExc_ValueError,
2392 "__package__ set to non-string");
2393 return NULL;
2394 }
2395 len = PyString_GET_SIZE(pkgname);
2396 if (len == 0) {
2397 if (level > 0) {
2398 PyErr_SetString(PyExc_ValueError,
2399 "Attempted relative import in non-package");
2400 return NULL;
2401 }
2402 return Py_None;
2403 }
2404 if (len > MAXPATHLEN) {
2405 PyErr_SetString(PyExc_ValueError,
2406 "Package name too long");
2407 return NULL;
2408 }
2409 strcpy(buf, PyString_AS_STRING(pkgname));
2410 } else {
2411 /* __package__ not set, so figure it out and set it */
2412 modname = PyDict_GetItem(globals, namestr);
2413 if (modname == NULL || !PyString_Check(modname))
2414 return Py_None;
Brett Cannonb166afc2010-05-05 20:25:47 +00002415
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002416 modpath = PyDict_GetItem(globals, pathstr);
2417 if (modpath != NULL) {
2418 /* __path__ is set, so modname is already the package name */
2419 Py_ssize_t len = PyString_GET_SIZE(modname);
2420 int error;
2421 if (len > MAXPATHLEN) {
2422 PyErr_SetString(PyExc_ValueError,
2423 "Module name too long");
2424 return NULL;
2425 }
2426 strcpy(buf, PyString_AS_STRING(modname));
2427 error = PyDict_SetItem(globals, pkgstr, modname);
2428 if (error) {
2429 PyErr_SetString(PyExc_ValueError,
2430 "Could not set __package__");
2431 return NULL;
2432 }
2433 } else {
2434 /* Normal module, so work out the package name if any */
2435 char *start = PyString_AS_STRING(modname);
2436 char *lastdot = strrchr(start, '.');
2437 size_t len;
2438 int error;
2439 if (lastdot == NULL && level > 0) {
2440 PyErr_SetString(PyExc_ValueError,
2441 "Attempted relative import in non-package");
2442 return NULL;
2443 }
2444 if (lastdot == NULL) {
2445 error = PyDict_SetItem(globals, pkgstr, Py_None);
2446 if (error) {
2447 PyErr_SetString(PyExc_ValueError,
2448 "Could not set __package__");
2449 return NULL;
2450 }
2451 return Py_None;
2452 }
2453 len = lastdot - start;
2454 if (len >= MAXPATHLEN) {
2455 PyErr_SetString(PyExc_ValueError,
2456 "Module name too long");
2457 return NULL;
2458 }
2459 strncpy(buf, start, len);
2460 buf[len] = '\0';
2461 pkgname = PyString_FromString(buf);
2462 if (pkgname == NULL) {
2463 return NULL;
2464 }
2465 error = PyDict_SetItem(globals, pkgstr, pkgname);
2466 Py_DECREF(pkgname);
2467 if (error) {
2468 PyErr_SetString(PyExc_ValueError,
2469 "Could not set __package__");
2470 return NULL;
2471 }
2472 }
2473 }
2474 while (--level > 0) {
2475 char *dot = strrchr(buf, '.');
2476 if (dot == NULL) {
2477 PyErr_SetString(PyExc_ValueError,
2478 "Attempted relative import beyond "
2479 "toplevel package");
2480 return NULL;
2481 }
2482 *dot = '\0';
2483 }
2484 *p_buflen = strlen(buf);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002485
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002486 modules = PyImport_GetModuleDict();
2487 parent = PyDict_GetItemString(modules, buf);
2488 if (parent == NULL) {
2489 if (orig_level < 1) {
2490 PyObject *err_msg = PyString_FromFormat(
2491 "Parent module '%.200s' not found "
2492 "while handling absolute import", buf);
2493 if (err_msg == NULL) {
2494 return NULL;
2495 }
2496 if (!PyErr_WarnEx(PyExc_RuntimeWarning,
2497 PyString_AsString(err_msg), 1)) {
2498 *buf = '\0';
2499 *p_buflen = 0;
2500 parent = Py_None;
2501 }
2502 Py_DECREF(err_msg);
2503 } else {
2504 PyErr_Format(PyExc_SystemError,
2505 "Parent module '%.200s' not loaded, "
2506 "cannot perform relative import", buf);
2507 }
2508 }
2509 return parent;
2510 /* We expect, but can't guarantee, if parent != None, that:
2511 - parent.__name__ == buf
2512 - parent.__dict__ is globals
2513 If this is violated... Who cares? */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002514}
2515
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002516/* altmod is either None or same as mod */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002517static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002518load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002519 Py_ssize_t *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002520{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002521 char *name = *p_name;
2522 char *dot = strchr(name, '.');
2523 size_t len;
2524 char *p;
2525 PyObject *result;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002526
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002527 if (strlen(name) == 0) {
2528 /* completely empty module name should only happen in
2529 'from . import' (or '__import__("")')*/
2530 Py_INCREF(mod);
2531 *p_name = NULL;
2532 return mod;
2533 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002534
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002535 if (dot == NULL) {
2536 *p_name = NULL;
2537 len = strlen(name);
2538 }
2539 else {
2540 *p_name = dot+1;
2541 len = dot-name;
2542 }
2543 if (len == 0) {
2544 PyErr_SetString(PyExc_ValueError,
2545 "Empty module name");
2546 return NULL;
2547 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002548
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002549 p = buf + *p_buflen;
2550 if (p != buf)
2551 *p++ = '.';
2552 if (p+len-buf >= MAXPATHLEN) {
2553 PyErr_SetString(PyExc_ValueError,
2554 "Module name too long");
2555 return NULL;
2556 }
2557 strncpy(p, name, len);
2558 p[len] = '\0';
2559 *p_buflen = p+len-buf;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002560
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002561 result = import_submodule(mod, p, buf);
2562 if (result == Py_None && altmod != mod) {
2563 Py_DECREF(result);
2564 /* Here, altmod must be None and mod must not be None */
2565 result = import_submodule(altmod, p, p);
2566 if (result != NULL && result != Py_None) {
2567 if (mark_miss(buf) != 0) {
2568 Py_DECREF(result);
2569 return NULL;
2570 }
2571 strncpy(buf, name, len);
2572 buf[len] = '\0';
2573 *p_buflen = len;
2574 }
2575 }
2576 if (result == NULL)
2577 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002578
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002579 if (result == Py_None) {
2580 Py_DECREF(result);
2581 PyErr_Format(PyExc_ImportError,
2582 "No module named %.200s", name);
2583 return NULL;
2584 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002585
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002586 return result;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002587}
2588
2589static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002590mark_miss(char *name)
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00002591{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002592 PyObject *modules = PyImport_GetModuleDict();
2593 return PyDict_SetItemString(modules, name, Py_None);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00002594}
2595
2596static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002597ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, Py_ssize_t buflen,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002598 int recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002599{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002600 int i;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002601
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002602 if (!PyObject_HasAttrString(mod, "__path__"))
2603 return 1;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002604
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002605 for (i = 0; ; i++) {
2606 PyObject *item = PySequence_GetItem(fromlist, i);
2607 int hasit;
2608 if (item == NULL) {
2609 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2610 PyErr_Clear();
2611 return 1;
2612 }
2613 return 0;
2614 }
2615 if (!PyString_Check(item)) {
Berker Peksag05b84432016-10-17 01:05:04 +03002616 PyErr_Format(PyExc_TypeError,
2617 "Item in ``from list'' must be str, not %.200s",
2618 Py_TYPE(item)->tp_name);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002619 Py_DECREF(item);
2620 return 0;
2621 }
2622 if (PyString_AS_STRING(item)[0] == '*') {
2623 PyObject *all;
2624 Py_DECREF(item);
2625 /* See if the package defines __all__ */
2626 if (recursive)
2627 continue; /* Avoid endless recursion */
2628 all = PyObject_GetAttrString(mod, "__all__");
2629 if (all == NULL)
2630 PyErr_Clear();
2631 else {
2632 int ret = ensure_fromlist(mod, all, buf, buflen, 1);
2633 Py_DECREF(all);
2634 if (!ret)
2635 return 0;
2636 }
2637 continue;
2638 }
2639 hasit = PyObject_HasAttr(mod, item);
2640 if (!hasit) {
2641 char *subname = PyString_AS_STRING(item);
2642 PyObject *submod;
2643 char *p;
2644 if (buflen + strlen(subname) >= MAXPATHLEN) {
2645 PyErr_SetString(PyExc_ValueError,
2646 "Module name too long");
2647 Py_DECREF(item);
2648 return 0;
2649 }
2650 p = buf + buflen;
2651 *p++ = '.';
2652 strcpy(p, subname);
2653 submod = import_submodule(mod, subname, buf);
2654 Py_XDECREF(submod);
2655 if (submod == NULL) {
2656 Py_DECREF(item);
2657 return 0;
2658 }
2659 }
2660 Py_DECREF(item);
2661 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002662
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002663 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002664}
2665
Neil Schemenauer00b09662003-06-16 21:03:07 +00002666static int
2667add_submodule(PyObject *mod, PyObject *submod, char *fullname, char *subname,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002668 PyObject *modules)
Neil Schemenauer00b09662003-06-16 21:03:07 +00002669{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002670 if (mod == Py_None)
2671 return 1;
2672 /* Irrespective of the success of this load, make a
2673 reference to it in the parent package module. A copy gets
2674 saved in the modules dictionary under the full name, so get a
2675 reference from there, if need be. (The exception is when the
2676 load failed with a SyntaxError -- then there's no trace in
2677 sys.modules. In that case, of course, do nothing extra.) */
2678 if (submod == NULL) {
2679 submod = PyDict_GetItemString(modules, fullname);
2680 if (submod == NULL)
2681 return 1;
2682 }
2683 if (PyModule_Check(mod)) {
2684 /* We can't use setattr here since it can give a
2685 * spurious warning if the submodule name shadows a
2686 * builtin name */
2687 PyObject *dict = PyModule_GetDict(mod);
2688 if (!dict)
2689 return 0;
2690 if (PyDict_SetItemString(dict, subname, submod) < 0)
2691 return 0;
2692 }
2693 else {
2694 if (PyObject_SetAttrString(mod, subname, submod) < 0)
2695 return 0;
2696 }
2697 return 1;
Neil Schemenauer00b09662003-06-16 21:03:07 +00002698}
2699
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002700static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002701import_submodule(PyObject *mod, char *subname, char *fullname)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002702{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002703 PyObject *modules = PyImport_GetModuleDict();
2704 PyObject *m = NULL;
Guido van Rossum74e6a111994-08-29 12:54:38 +00002705
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002706 /* Require:
2707 if mod == None: subname == fullname
2708 else: mod.__name__ + "." + subname == fullname
2709 */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002710
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002711 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
2712 Py_INCREF(m);
2713 }
2714 else {
2715 PyObject *path, *loader = NULL;
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002716 char *buf;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002717 struct filedescr *fdp;
2718 FILE *fp = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002719
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002720 if (mod == Py_None)
2721 path = NULL;
2722 else {
2723 path = PyObject_GetAttrString(mod, "__path__");
2724 if (path == NULL) {
2725 PyErr_Clear();
2726 Py_INCREF(Py_None);
2727 return Py_None;
2728 }
2729 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002730
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002731 buf = PyMem_MALLOC(MAXPATHLEN+1);
2732 if (buf == NULL) {
2733 return PyErr_NoMemory();
2734 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002735 buf[0] = '\0';
2736 fdp = find_module(fullname, subname, path, buf, MAXPATHLEN+1,
2737 &fp, &loader);
2738 Py_XDECREF(path);
2739 if (fdp == NULL) {
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002740 PyMem_FREE(buf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002741 if (!PyErr_ExceptionMatches(PyExc_ImportError))
2742 return NULL;
2743 PyErr_Clear();
2744 Py_INCREF(Py_None);
2745 return Py_None;
2746 }
2747 m = load_module(fullname, fp, buf, fdp->type, loader);
2748 Py_XDECREF(loader);
2749 if (fp)
2750 fclose(fp);
2751 if (!add_submodule(mod, m, fullname, subname, modules)) {
2752 Py_XDECREF(m);
2753 m = NULL;
2754 }
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002755 PyMem_FREE(buf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002756 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002757
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002758 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00002759}
2760
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002761
2762/* Re-import a module of any kind and return its module object, WITH
2763 INCREMENTED REFERENCE COUNT */
2764
Guido van Rossum79f25d91997-04-29 20:08:16 +00002765PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002766PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002767{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002768 PyInterpreterState *interp = PyThreadState_Get()->interp;
2769 PyObject *modules_reloading = interp->modules_reloading;
2770 PyObject *modules = PyImport_GetModuleDict();
2771 PyObject *path = NULL, *loader = NULL, *existing_m = NULL;
2772 char *name, *subname;
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002773 char *buf;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002774 struct filedescr *fdp;
2775 FILE *fp = NULL;
2776 PyObject *newm;
Brett Cannonb166afc2010-05-05 20:25:47 +00002777
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002778 if (modules_reloading == NULL) {
2779 Py_FatalError("PyImport_ReloadModule: "
2780 "no modules_reloading dictionary!");
2781 return NULL;
2782 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002783
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002784 if (m == NULL || !PyModule_Check(m)) {
2785 PyErr_SetString(PyExc_TypeError,
2786 "reload() argument must be module");
2787 return NULL;
2788 }
2789 name = PyModule_GetName(m);
2790 if (name == NULL)
2791 return NULL;
2792 if (m != PyDict_GetItemString(modules, name)) {
2793 PyErr_Format(PyExc_ImportError,
2794 "reload(): module %.200s not in sys.modules",
2795 name);
2796 return NULL;
2797 }
2798 existing_m = PyDict_GetItemString(modules_reloading, name);
2799 if (existing_m != NULL) {
2800 /* Due to a recursive reload, this module is already
2801 being reloaded. */
2802 Py_INCREF(existing_m);
2803 return existing_m;
2804 }
2805 if (PyDict_SetItemString(modules_reloading, name, m) < 0)
2806 return NULL;
Collin Winter276887b2007-03-12 16:11:39 +00002807
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002808 subname = strrchr(name, '.');
2809 if (subname == NULL)
2810 subname = name;
2811 else {
2812 PyObject *parentname, *parent;
2813 parentname = PyString_FromStringAndSize(name, (subname-name));
2814 if (parentname == NULL) {
2815 imp_modules_reloading_clear();
2816 return NULL;
2817 }
2818 parent = PyDict_GetItem(modules, parentname);
2819 if (parent == NULL) {
2820 PyErr_Format(PyExc_ImportError,
2821 "reload(): parent %.200s not in sys.modules",
2822 PyString_AS_STRING(parentname));
2823 Py_DECREF(parentname);
2824 imp_modules_reloading_clear();
2825 return NULL;
2826 }
2827 Py_DECREF(parentname);
2828 subname++;
2829 path = PyObject_GetAttrString(parent, "__path__");
2830 if (path == NULL)
2831 PyErr_Clear();
2832 }
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002833 buf = PyMem_MALLOC(MAXPATHLEN+1);
2834 if (buf == NULL) {
2835 Py_XDECREF(path);
2836 return PyErr_NoMemory();
2837 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002838 buf[0] = '\0';
2839 fdp = find_module(name, subname, path, buf, MAXPATHLEN+1, &fp, &loader);
2840 Py_XDECREF(path);
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002841
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002842 if (fdp == NULL) {
2843 Py_XDECREF(loader);
2844 imp_modules_reloading_clear();
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002845 PyMem_FREE(buf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002846 return NULL;
2847 }
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002848
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002849 newm = load_module(name, fp, buf, fdp->type, loader);
2850 Py_XDECREF(loader);
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002851
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002852 if (fp)
2853 fclose(fp);
2854 if (newm == NULL) {
2855 /* load_module probably removed name from modules because of
2856 * the error. Put back the original module object. We're
2857 * going to return NULL in this case regardless of whether
2858 * replacing name succeeds, so the return value is ignored.
2859 */
2860 PyDict_SetItemString(modules, name, m);
2861 }
2862 imp_modules_reloading_clear();
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002863 PyMem_FREE(buf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002864 return newm;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002865}
2866
2867
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002868/* Higher-level import emulator which emulates the "import" statement
2869 more accurately -- it invokes the __import__() function from the
2870 builtins of the current globals. This means that the import is
2871 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00002872 environment, e.g. by "rexec".
2873 A dummy list ["__doc__"] is passed as the 4th argument so that
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002874 e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
Guido van Rossum6058eb41998-12-21 19:51:00 +00002875 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002876
2877PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002878PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002879{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002880 static PyObject *silly_list = NULL;
2881 static PyObject *builtins_str = NULL;
2882 static PyObject *import_str = NULL;
2883 PyObject *globals = NULL;
2884 PyObject *import = NULL;
2885 PyObject *builtins = NULL;
2886 PyObject *r = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002887
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002888 /* Initialize constant string objects */
2889 if (silly_list == NULL) {
2890 import_str = PyString_InternFromString("__import__");
2891 if (import_str == NULL)
2892 return NULL;
2893 builtins_str = PyString_InternFromString("__builtins__");
2894 if (builtins_str == NULL)
2895 return NULL;
2896 silly_list = Py_BuildValue("[s]", "__doc__");
2897 if (silly_list == NULL)
2898 return NULL;
2899 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002900
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002901 /* Get the builtins from current globals */
2902 globals = PyEval_GetGlobals();
2903 if (globals != NULL) {
2904 Py_INCREF(globals);
2905 builtins = PyObject_GetItem(globals, builtins_str);
2906 if (builtins == NULL)
2907 goto err;
2908 }
2909 else {
2910 /* No globals -- use standard builtins, and fake globals */
2911 builtins = PyImport_ImportModuleLevel("__builtin__",
2912 NULL, NULL, NULL, 0);
2913 if (builtins == NULL)
2914 return NULL;
2915 globals = Py_BuildValue("{OO}", builtins_str, builtins);
2916 if (globals == NULL)
2917 goto err;
2918 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002919
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002920 /* Get the __import__ function from the builtins */
2921 if (PyDict_Check(builtins)) {
2922 import = PyObject_GetItem(builtins, import_str);
2923 if (import == NULL)
2924 PyErr_SetObject(PyExc_KeyError, import_str);
2925 }
2926 else
2927 import = PyObject_GetAttr(builtins, import_str);
2928 if (import == NULL)
2929 goto err;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002930
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002931 /* Call the __import__ function with the proper argument list
2932 * Always use absolute import here. */
2933 r = PyObject_CallFunction(import, "OOOOi", module_name, globals,
2934 globals, silly_list, 0, NULL);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002935
2936 err:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002937 Py_XDECREF(globals);
2938 Py_XDECREF(builtins);
2939 Py_XDECREF(import);
Tim Peters50d8d372001-02-28 05:34:27 +00002940
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002941 return r;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002942}
2943
2944
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002945/* Module 'imp' provides Python access to the primitives used for
2946 importing modules.
2947*/
2948
Guido van Rossum79f25d91997-04-29 20:08:16 +00002949static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +00002950imp_get_magic(PyObject *self, PyObject *noargs)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002951{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002952 char buf[4];
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002953
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002954 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
2955 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
2956 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
2957 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002958
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002959 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002960}
2961
Guido van Rossum79f25d91997-04-29 20:08:16 +00002962static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +00002963imp_get_suffixes(PyObject *self, PyObject *noargs)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002964{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002965 PyObject *list;
2966 struct filedescr *fdp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002967
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002968 list = PyList_New(0);
2969 if (list == NULL)
2970 return NULL;
2971 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
2972 PyObject *item = Py_BuildValue("ssi",
2973 fdp->suffix, fdp->mode, fdp->type);
2974 if (item == NULL) {
2975 Py_DECREF(list);
2976 return NULL;
2977 }
2978 if (PyList_Append(list, item) < 0) {
2979 Py_DECREF(list);
2980 Py_DECREF(item);
2981 return NULL;
2982 }
2983 Py_DECREF(item);
2984 }
2985 return list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002986}
2987
Guido van Rossum79f25d91997-04-29 20:08:16 +00002988static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002989call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002990{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002991 extern int fclose(FILE *);
2992 PyObject *fob, *ret;
2993 struct filedescr *fdp;
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002994 char *pathname;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002995 FILE *fp = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002996
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07002997 pathname = PyMem_MALLOC(MAXPATHLEN+1);
2998 if (pathname == NULL) {
2999 return PyErr_NoMemory();
3000 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003001 pathname[0] = '\0';
3002 if (path == Py_None)
3003 path = NULL;
3004 fdp = find_module(NULL, name, path, pathname, MAXPATHLEN+1, &fp, NULL);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07003005 if (fdp == NULL) {
3006 PyMem_FREE(pathname);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003007 return NULL;
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07003008 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003009 if (fp != NULL) {
3010 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07003011 if (fob == NULL) {
3012 PyMem_FREE(pathname);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003013 return NULL;
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07003014 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003015 }
3016 else {
3017 fob = Py_None;
3018 Py_INCREF(fob);
3019 }
3020 ret = Py_BuildValue("Os(ssi)",
3021 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
3022 Py_DECREF(fob);
Gregory P. Smithfcdf04b2012-03-18 16:07:10 -07003023 PyMem_FREE(pathname);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003024 return ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003025}
3026
Guido van Rossum79f25d91997-04-29 20:08:16 +00003027static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003028imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003029{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003030 char *name;
3031 PyObject *path = NULL;
3032 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
3033 return NULL;
3034 return call_find_module(name, path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003035}
3036
3037static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003038imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003039{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003040 char *name;
3041 int ret;
3042 PyObject *m;
3043 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
3044 return NULL;
3045 ret = init_builtin(name);
3046 if (ret < 0)
3047 return NULL;
3048 if (ret == 0) {
3049 Py_INCREF(Py_None);
3050 return Py_None;
3051 }
3052 m = PyImport_AddModule(name);
3053 Py_XINCREF(m);
3054 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003055}
3056
Guido van Rossum79f25d91997-04-29 20:08:16 +00003057static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003058imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003059{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003060 char *name;
3061 int ret;
3062 PyObject *m;
3063 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
3064 return NULL;
3065 ret = PyImport_ImportFrozenModule(name);
3066 if (ret < 0)
3067 return NULL;
3068 if (ret == 0) {
3069 Py_INCREF(Py_None);
3070 return Py_None;
3071 }
3072 m = PyImport_AddModule(name);
3073 Py_XINCREF(m);
3074 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003075}
3076
Guido van Rossum79f25d91997-04-29 20:08:16 +00003077static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003078imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00003079{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003080 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00003081
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003082 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
3083 return NULL;
3084 return get_frozen_object(name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00003085}
3086
Guido van Rossum79f25d91997-04-29 20:08:16 +00003087static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003088imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003089{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003090 char *name;
3091 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
3092 return NULL;
3093 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003094}
3095
Guido van Rossum79f25d91997-04-29 20:08:16 +00003096static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003097imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003098{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003099 char *name;
3100 struct _frozen *p;
3101 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
3102 return NULL;
3103 p = find_frozen(name);
3104 return PyBool_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003105}
3106
3107static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003108get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003109{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003110 FILE *fp;
3111 if (fob == NULL) {
3112 if (mode[0] == 'U')
3113 mode = "r" PY_STDIOTEXTMODE;
3114 fp = fopen(pathname, mode);
3115 if (fp == NULL)
3116 PyErr_SetFromErrno(PyExc_IOError);
3117 }
3118 else {
3119 fp = PyFile_AsFile(fob);
3120 if (fp == NULL)
3121 PyErr_SetString(PyExc_ValueError,
3122 "bad/closed file object");
3123 }
3124 return fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003125}
3126
Guido van Rossum79f25d91997-04-29 20:08:16 +00003127static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003128imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003129{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003130 char *name;
3131 char *pathname;
3132 PyObject *fob = NULL;
3133 PyObject *m;
3134 FILE *fp;
3135 if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
3136 &PyFile_Type, &fob))
3137 return NULL;
3138 fp = get_file(pathname, fob, "rb");
3139 if (fp == NULL)
3140 return NULL;
3141 m = load_compiled_module(name, pathname, fp);
3142 if (fob == NULL)
3143 fclose(fp);
3144 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003145}
3146
Guido van Rossum96a8fb71999-12-22 14:09:35 +00003147#ifdef HAVE_DYNAMIC_LOADING
3148
Guido van Rossum79f25d91997-04-29 20:08:16 +00003149static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003150imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003151{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003152 char *name;
3153 char *pathname;
3154 PyObject *fob = NULL;
3155 PyObject *m;
3156 FILE *fp = NULL;
3157 if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
3158 &PyFile_Type, &fob))
3159 return NULL;
3160 if (fob) {
3161 fp = get_file(pathname, fob, "r");
3162 if (fp == NULL)
3163 return NULL;
3164 }
3165 m = _PyImport_LoadDynamicModule(name, pathname, fp);
3166 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003167}
3168
Guido van Rossum96a8fb71999-12-22 14:09:35 +00003169#endif /* HAVE_DYNAMIC_LOADING */
3170
Guido van Rossum79f25d91997-04-29 20:08:16 +00003171static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003172imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003173{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003174 char *name;
3175 char *pathname;
3176 PyObject *fob = NULL;
3177 PyObject *m;
3178 FILE *fp;
3179 if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
3180 &PyFile_Type, &fob))
3181 return NULL;
3182 fp = get_file(pathname, fob, "r");
3183 if (fp == NULL)
3184 return NULL;
3185 m = load_source_module(name, pathname, fp);
3186 if (fob == NULL)
3187 fclose(fp);
3188 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003189}
3190
Guido van Rossum79f25d91997-04-29 20:08:16 +00003191static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003192imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003193{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003194 char *name;
3195 PyObject *fob;
3196 char *pathname;
3197 char *suffix; /* Unused */
3198 char *mode;
3199 int type;
3200 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003201
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003202 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
3203 &name, &fob, &pathname,
3204 &suffix, &mode, &type))
3205 return NULL;
3206 if (*mode) {
3207 /* Mode must start with 'r' or 'U' and must not contain '+'.
3208 Implicit in this test is the assumption that the mode
3209 may contain other modifiers like 'b' or 't'. */
Guido van Rossum5e2c5fa2002-05-30 17:33:07 +00003210
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003211 if (!(*mode == 'r' || *mode == 'U') || strchr(mode, '+')) {
3212 PyErr_Format(PyExc_ValueError,
3213 "invalid file open mode %.200s", mode);
3214 return NULL;
3215 }
3216 }
3217 if (fob == Py_None)
3218 fp = NULL;
3219 else {
3220 if (!PyFile_Check(fob)) {
3221 PyErr_SetString(PyExc_ValueError,
3222 "load_module arg#2 should be a file or None");
3223 return NULL;
3224 }
3225 fp = get_file(pathname, fob, mode);
3226 if (fp == NULL)
3227 return NULL;
3228 }
3229 return load_module(name, fp, pathname, type, NULL);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003230}
3231
3232static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003233imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003234{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003235 char *name;
3236 char *pathname;
3237 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
3238 return NULL;
3239 return load_package(name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003240}
3241
3242static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003243imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003244{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003245 char *name;
3246 if (!PyArg_ParseTuple(args, "s:new_module", &name))
3247 return NULL;
3248 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003249}
3250
Brett Cannon3aa2a492008-08-06 22:28:09 +00003251static PyObject *
3252imp_reload(PyObject *self, PyObject *v)
3253{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003254 return PyImport_ReloadModule(v);
Brett Cannon3aa2a492008-08-06 22:28:09 +00003255}
3256
3257
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003258/* Doc strings */
3259
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003260PyDoc_STRVAR(doc_imp,
3261"This module provides the components needed to build your own\n\
3262__import__ function. Undocumented functions are obsolete.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003263
Brett Cannon3aa2a492008-08-06 22:28:09 +00003264PyDoc_STRVAR(doc_reload,
3265"reload(module) -> module\n\
3266\n\
3267Reload the module. The module must have been successfully imported before.");
3268
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003269PyDoc_STRVAR(doc_find_module,
3270"find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003271Search for a module. If path is omitted or None, search for a\n\
3272built-in, frozen or special module and continue search in sys.path.\n\
3273The module name cannot contain '.'; to search for a submodule of a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003274package, pass the submodule name and the package's __path__.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003275
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003276PyDoc_STRVAR(doc_load_module,
3277"load_module(name, file, filename, (suffix, mode, type)) -> module\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003278Load a module, given information returned by find_module().\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003279The module name must include the full package name, if any.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003280
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003281PyDoc_STRVAR(doc_get_magic,
3282"get_magic() -> string\n\
3283Return the magic number for .pyc or .pyo files.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003284
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003285PyDoc_STRVAR(doc_get_suffixes,
3286"get_suffixes() -> [(suffix, mode, type), ...]\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003287Return a list of (suffix, mode, type) tuples describing the files\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003288that find_module() looks for.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003289
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003290PyDoc_STRVAR(doc_new_module,
3291"new_module(name) -> module\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003292Create a new module. Do not enter it in sys.modules.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003293The module name must include the full package name, if any.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003294
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003295PyDoc_STRVAR(doc_lock_held,
Tim Petersa7c65092004-08-01 23:26:05 +00003296"lock_held() -> boolean\n\
3297Return True if the import lock is currently held, else False.\n\
3298On platforms without threads, return False.");
Tim Peters69232342001-08-30 05:16:13 +00003299
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00003300PyDoc_STRVAR(doc_acquire_lock,
3301"acquire_lock() -> None\n\
Neal Norwitz2294c0d2003-02-12 23:02:21 +00003302Acquires the interpreter's import lock for the current thread.\n\
3303This lock should be used by import hooks to ensure thread-safety\n\
3304when importing modules.\n\
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00003305On platforms without threads, this function does nothing.");
3306
3307PyDoc_STRVAR(doc_release_lock,
3308"release_lock() -> None\n\
3309Release the interpreter's import lock.\n\
3310On platforms without threads, this function does nothing.");
3311
Guido van Rossum79f25d91997-04-29 20:08:16 +00003312static PyMethodDef imp_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003313 {"reload", imp_reload, METH_O, doc_reload},
3314 {"find_module", imp_find_module, METH_VARARGS, doc_find_module},
3315 {"get_magic", imp_get_magic, METH_NOARGS, doc_get_magic},
3316 {"get_suffixes", imp_get_suffixes, METH_NOARGS, doc_get_suffixes},
3317 {"load_module", imp_load_module, METH_VARARGS, doc_load_module},
3318 {"new_module", imp_new_module, METH_VARARGS, doc_new_module},
3319 {"lock_held", imp_lock_held, METH_NOARGS, doc_lock_held},
3320 {"acquire_lock", imp_acquire_lock, METH_NOARGS, doc_acquire_lock},
3321 {"release_lock", imp_release_lock, METH_NOARGS, doc_release_lock},
3322 /* The rest are obsolete */
3323 {"get_frozen_object", imp_get_frozen_object, METH_VARARGS},
3324 {"init_builtin", imp_init_builtin, METH_VARARGS},
3325 {"init_frozen", imp_init_frozen, METH_VARARGS},
3326 {"is_builtin", imp_is_builtin, METH_VARARGS},
3327 {"is_frozen", imp_is_frozen, METH_VARARGS},
3328 {"load_compiled", imp_load_compiled, METH_VARARGS},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00003329#ifdef HAVE_DYNAMIC_LOADING
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003330 {"load_dynamic", imp_load_dynamic, METH_VARARGS},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00003331#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003332 {"load_package", imp_load_package, METH_VARARGS},
3333 {"load_source", imp_load_source, METH_VARARGS},
3334 {NULL, NULL} /* sentinel */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003335};
3336
Guido van Rossum1a8791e1998-08-04 22:46:29 +00003337static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003338setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003339{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003340 PyObject *v;
3341 int err;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003342
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003343 v = PyInt_FromLong((long)value);
3344 err = PyDict_SetItemString(d, name, v);
3345 Py_XDECREF(v);
3346 return err;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003347}
3348
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003349typedef struct {
3350 PyObject_HEAD
3351} NullImporter;
3352
3353static int
3354NullImporter_init(NullImporter *self, PyObject *args, PyObject *kwds)
3355{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003356 char *path;
3357 Py_ssize_t pathlen;
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003358
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003359 if (!_PyArg_NoKeywords("NullImporter()", kwds))
3360 return -1;
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003361
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003362 if (!PyArg_ParseTuple(args, "s:NullImporter",
3363 &path))
3364 return -1;
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003365
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003366 pathlen = strlen(path);
3367 if (pathlen == 0) {
3368 PyErr_SetString(PyExc_ImportError, "empty pathname");
3369 return -1;
3370 } else {
Jason R. Coombs0737b722012-01-13 17:59:05 -05003371 if(isdir(path)) {
3372 PyErr_SetString(PyExc_ImportError,
3373 "existing directory");
3374 return -1;
3375 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003376 }
3377 return 0;
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003378}
3379
3380static PyObject *
3381NullImporter_find_module(NullImporter *self, PyObject *args)
3382{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003383 Py_RETURN_NONE;
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003384}
3385
3386static PyMethodDef NullImporter_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003387 {"find_module", (PyCFunction)NullImporter_find_module, METH_VARARGS,
3388 "Always return None"
3389 },
3390 {NULL} /* Sentinel */
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003391};
3392
3393
Nick Coghlan327a39b2007-11-18 11:56:28 +00003394PyTypeObject PyNullImporter_Type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003395 PyVarObject_HEAD_INIT(NULL, 0)
3396 "imp.NullImporter", /*tp_name*/
3397 sizeof(NullImporter), /*tp_basicsize*/
3398 0, /*tp_itemsize*/
3399 0, /*tp_dealloc*/
3400 0, /*tp_print*/
3401 0, /*tp_getattr*/
3402 0, /*tp_setattr*/
3403 0, /*tp_compare*/
3404 0, /*tp_repr*/
3405 0, /*tp_as_number*/
3406 0, /*tp_as_sequence*/
3407 0, /*tp_as_mapping*/
3408 0, /*tp_hash */
3409 0, /*tp_call*/
3410 0, /*tp_str*/
3411 0, /*tp_getattro*/
3412 0, /*tp_setattro*/
3413 0, /*tp_as_buffer*/
3414 Py_TPFLAGS_DEFAULT, /*tp_flags*/
3415 "Null importer object", /* tp_doc */
3416 0, /* tp_traverse */
3417 0, /* tp_clear */
3418 0, /* tp_richcompare */
3419 0, /* tp_weaklistoffset */
3420 0, /* tp_iter */
3421 0, /* tp_iternext */
3422 NullImporter_methods, /* tp_methods */
3423 0, /* tp_members */
3424 0, /* tp_getset */
3425 0, /* tp_base */
3426 0, /* tp_dict */
3427 0, /* tp_descr_get */
3428 0, /* tp_descr_set */
3429 0, /* tp_dictoffset */
3430 (initproc)NullImporter_init, /* tp_init */
3431 0, /* tp_alloc */
3432 PyType_GenericNew /* tp_new */
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003433};
3434
3435
Jason Tishler6bc06ec2003-09-04 11:59:50 +00003436PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003437initimp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003438{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003439 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003440
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003441 if (PyType_Ready(&PyNullImporter_Type) < 0)
3442 goto failure;
Phillip J. Ebyf7575d02006-07-28 21:12:07 +00003443
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003444 m = Py_InitModule4("imp", imp_methods, doc_imp,
3445 NULL, PYTHON_API_VERSION);
3446 if (m == NULL)
3447 goto failure;
3448 d = PyModule_GetDict(m);
3449 if (d == NULL)
3450 goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003451
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003452 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
3453 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
3454 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
3455 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
3456 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
3457 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
3458 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
3459 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
3460 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
3461 if (setint(d, "IMP_HOOK", IMP_HOOK) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003462
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003463 Py_INCREF(&PyNullImporter_Type);
3464 PyModule_AddObject(m, "NullImporter", (PyObject *)&PyNullImporter_Type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003465 failure:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003466 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003467}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003468
3469
Guido van Rossumb18618d2000-05-03 23:44:39 +00003470/* API for embedding applications that want to add their own entries
3471 to the table of built-in modules. This should normally be called
3472 *before* Py_Initialize(). When the table resize fails, -1 is
3473 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003474
3475 After a similar function by Just van Rossum. */
3476
3477int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003478PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003479{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003480 static struct _inittab *our_copy = NULL;
3481 struct _inittab *p;
3482 int i, n;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003483
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003484 /* Count the number of entries in both tables */
3485 for (n = 0; newtab[n].name != NULL; n++)
3486 ;
3487 if (n == 0)
3488 return 0; /* Nothing to do */
3489 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
3490 ;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003491
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003492 /* Allocate new memory for the combined table */
3493 p = our_copy;
3494 PyMem_RESIZE(p, struct _inittab, i+n+1);
3495 if (p == NULL)
3496 return -1;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003497
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003498 /* Copy the tables into the new memory */
3499 if (our_copy != PyImport_Inittab)
3500 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
3501 PyImport_Inittab = our_copy = p;
3502 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003503
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003504 return 0;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003505}
3506
3507/* Shorthand to add a single entry given a name and a function */
3508
3509int
Brett Cannonc4f90eb2009-04-02 03:17:39 +00003510PyImport_AppendInittab(const char *name, void (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003511{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003512 struct _inittab newtab[2];
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003513
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003514 memset(newtab, '\0', sizeof newtab);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003515
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003516 newtab[0].name = (char *)name;
3517 newtab[0].initfunc = initfunc;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003518
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003519 return PyImport_ExtendInittab(newtab);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003520}
Anthony Baxterac6bd462006-04-13 02:06:09 +00003521
3522#ifdef __cplusplus
3523}
3524#endif