blob: 11cbc58189c1832819d92f976f29ab7b5303b952 [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"
Guido van Rossumd8faa362007-04-27 19:54:29 +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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000021#ifdef __cplusplus
22extern "C" {
23#endif
Guido van Rossum55a83382000-09-20 20:31:38 +000024
Christian Heimesd3eb5a152008-02-24 00:38:49 +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
Guido van Rossum45aecf42006-03-15 04:58:47 +000038 The magic numbers must be spaced apart at least 2 values, as the
Martin v. Löwisef82d2f2004-06-27 16:51:46 +000039 -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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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)
Thomas Wouters0e3f5912006-08-11 14:57:12 +000067 Python 2.5b3: 62101 (fix wrong code: for x, in ...)
68 Python 2.5b3: 62111 (fix wrong code: x += yield)
69 Python 2.5c1: 62121 (fix wrong lnotab with for loops and
70 storing constants that should have been removed)
Thomas Wouters89f507f2006-12-13 04:49:30 +000071 Python 2.5c2: 62131 (fix wrong code: for x, in ... in listcomp/genexp)
Christian Heimes99170a52007-12-19 02:07:34 +000072 Python 2.6a0: 62151 (peephole optimizations and STORE_MAP opcode)
Christian Heimesdd15f6c2008-03-16 00:07:10 +000073 Python 2.6a1: 62161 (WITH_CLEANUP optimization)
Guido van Rossum45aecf42006-03-15 04:58:47 +000074 Python 3000: 3000
Brett Cannone2e23ef2006-08-25 05:05:30 +000075 3010 (removed UNARY_CONVERT)
Guido van Rossum86e58e22006-08-28 15:27:34 +000076 3020 (added BUILD_SET)
Guido van Rossum4f72a782006-10-27 23:31:49 +000077 3030 (added keyword-only parameters)
Guido van Rossum3203bdc2006-12-28 21:03:31 +000078 3040 (added signature annotations)
Guido van Rossum452bf512007-02-09 05:32:43 +000079 3050 (print becomes a function)
Guido van Rossum52cc1d82007-03-18 15:41:51 +000080 3060 (PEP 3115 metaclass syntax)
Guido van Rossum00bc0e02007-10-15 02:52:41 +000081 3070 (PEP 3109 raise changes)
82 3080 (PEP 3137 make __file__ and __name__ unicode)
Guido van Rossum98297ee2007-11-06 21:34:58 +000083 3090 (kill str8 interning)
Christian Heimes99170a52007-12-19 02:07:34 +000084 3100 (merge from 2.6a0, see 62151)
Christian Heimes3b06e532008-01-07 20:12:44 +000085 3102 (__file__ points to source file)
Christian Heimesdd15f6c2008-03-16 00:07:10 +000086 Python 3.0a4: 3110 (WITH_CLEANUP optimization).
Benjamin Petersoneec3d712008-06-11 15:59:43 +000087 Python 3.0a5: 3130 (lexical exception stacking, including POP_EXCEPT)
Antoine Pitrouf289ae62008-12-18 11:06:25 +000088 Python 3.1a0: 3140 (optimize list, set and dict comprehensions:
89 change LIST_APPEND and SET_ADD, add MAP_ADD)
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +000090 Python 3.1a0: 3150 (optimize conditional branches:
91 introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE)
Tim Peters36515e22001-11-18 04:06:29 +000092*/
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +000093#define MAGIC (3150 | ((long)'\r'<<16) | ((long)'\n'<<24))
Guido van Rossum3ddee711991-12-16 13:06:34 +000094
Guido van Rossum96774c12000-05-01 20:19:08 +000095/* Magic word as global; note that _PyImport_Init() can change the
Jeremy Hylton9262b8a2000-06-30 04:59:17 +000096 value of this global to accommodate for alterations of how the
Guido van Rossum96774c12000-05-01 20:19:08 +000097 compiler works which are enabled by command line switches. */
98static long pyc_magic = MAGIC;
99
Guido van Rossum25ce5661997-08-02 03:10:38 +0000100/* See _PyImport_FixupExtension() below */
101static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000102
Guido van Rossum771c6c81997-10-31 18:37:24 +0000103/* This table is defined in config.c: */
104extern struct _inittab _PyImport_Inittab[];
105
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000106/* Method from Parser/tokenizer.c */
Guido van Rossum40d20bc2007-10-22 00:09:51 +0000107extern char * PyTokenizer_FindEncoding(int);
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000108
Guido van Rossum771c6c81997-10-31 18:37:24 +0000109struct _inittab *PyImport_Inittab = _PyImport_Inittab;
Guido van Rossum66f1fa81991-04-03 19:03:52 +0000110
Guido van Rossumed1170e1999-12-20 21:23:41 +0000111/* these tables define the module suffixes that Python recognizes */
112struct filedescr * _PyImport_Filetab = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000113
Guido van Rossumed1170e1999-12-20 21:23:41 +0000114static const struct filedescr _PyImport_StandardFiletab[] = {
Jack Jansenc88da1f2002-05-28 10:58:19 +0000115 {".py", "U", PY_SOURCE},
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000116#ifdef MS_WINDOWS
Jack Jansenc88da1f2002-05-28 10:58:19 +0000117 {".pyw", "U", PY_SOURCE},
Tim Peters36515e22001-11-18 04:06:29 +0000118#endif
Guido van Rossumed1170e1999-12-20 21:23:41 +0000119 {".pyc", "rb", PY_COMPILED},
120 {0, 0}
121};
122
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000123
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000124/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000125
126void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000127_PyImport_Init(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000128{
Guido van Rossumed1170e1999-12-20 21:23:41 +0000129 const struct filedescr *scan;
130 struct filedescr *filetab;
131 int countD = 0;
132 int countS = 0;
133
134 /* prepare _PyImport_Filetab: copy entries from
135 _PyImport_DynLoadFiletab and _PyImport_StandardFiletab.
136 */
Guido van Rossum04110fb2007-08-24 16:32:05 +0000137#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossumed1170e1999-12-20 21:23:41 +0000138 for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan)
139 ++countD;
Guido van Rossum04110fb2007-08-24 16:32:05 +0000140#endif
Guido van Rossumed1170e1999-12-20 21:23:41 +0000141 for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan)
142 ++countS;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000143 filetab = PyMem_NEW(struct filedescr, countD + countS + 1);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000144 if (filetab == NULL)
145 Py_FatalError("Can't initialize import file table.");
Guido van Rossum04110fb2007-08-24 16:32:05 +0000146#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossumed1170e1999-12-20 21:23:41 +0000147 memcpy(filetab, _PyImport_DynLoadFiletab,
148 countD * sizeof(struct filedescr));
Guido van Rossum04110fb2007-08-24 16:32:05 +0000149#endif
Guido van Rossumed1170e1999-12-20 21:23:41 +0000150 memcpy(filetab + countD, _PyImport_StandardFiletab,
151 countS * sizeof(struct filedescr));
152 filetab[countD + countS].suffix = NULL;
153
154 _PyImport_Filetab = filetab;
155
Guido van Rossum0824f631997-03-11 18:37:35 +0000156 if (Py_OptimizeFlag) {
Guido van Rossumed1170e1999-12-20 21:23:41 +0000157 /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */
158 for (; filetab->suffix != NULL; filetab++) {
159 if (strcmp(filetab->suffix, ".pyc") == 0)
160 filetab->suffix = ".pyo";
Guido van Rossum0824f631997-03-11 18:37:35 +0000161 }
162 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000163
Guido van Rossum572dbf82007-04-27 23:53:51 +0000164 {
Guido van Rossum96774c12000-05-01 20:19:08 +0000165 /* Fix the pyc_magic so that byte compiled code created
166 using the all-Unicode method doesn't interfere with
167 code created in normal operation mode. */
168 pyc_magic = MAGIC + 1;
169 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000170}
171
Guido van Rossum25ce5661997-08-02 03:10:38 +0000172void
Just van Rossum52e14d62002-12-30 22:08:05 +0000173_PyImportHooks_Init(void)
174{
175 PyObject *v, *path_hooks = NULL, *zimpimport;
176 int err = 0;
177
178 /* adding sys.path_hooks and sys.path_importer_cache, setting up
179 zipimport */
Christian Heimes9cd17752007-11-18 19:35:23 +0000180 if (PyType_Ready(&PyNullImporter_Type) < 0)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000181 goto error;
Just van Rossum52e14d62002-12-30 22:08:05 +0000182
183 if (Py_VerboseFlag)
184 PySys_WriteStderr("# installing zipimport hook\n");
185
186 v = PyList_New(0);
187 if (v == NULL)
188 goto error;
189 err = PySys_SetObject("meta_path", v);
190 Py_DECREF(v);
191 if (err)
192 goto error;
193 v = PyDict_New();
194 if (v == NULL)
195 goto error;
196 err = PySys_SetObject("path_importer_cache", v);
197 Py_DECREF(v);
198 if (err)
199 goto error;
200 path_hooks = PyList_New(0);
201 if (path_hooks == NULL)
202 goto error;
203 err = PySys_SetObject("path_hooks", path_hooks);
204 if (err) {
205 error:
206 PyErr_Print();
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000207 Py_FatalError("initializing sys.meta_path, sys.path_hooks, "
208 "path_importer_cache, or NullImporter failed"
209 );
Just van Rossum52e14d62002-12-30 22:08:05 +0000210 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000211
Just van Rossum52e14d62002-12-30 22:08:05 +0000212 zimpimport = PyImport_ImportModule("zipimport");
213 if (zimpimport == NULL) {
214 PyErr_Clear(); /* No zip import module -- okay */
215 if (Py_VerboseFlag)
216 PySys_WriteStderr("# can't import zipimport\n");
217 }
218 else {
219 PyObject *zipimporter = PyObject_GetAttrString(zimpimport,
220 "zipimporter");
221 Py_DECREF(zimpimport);
222 if (zipimporter == NULL) {
223 PyErr_Clear(); /* No zipimporter object -- okay */
224 if (Py_VerboseFlag)
225 PySys_WriteStderr(
Fred Drake1e5fc552003-07-11 15:01:02 +0000226 "# can't import zipimport.zipimporter\n");
Just van Rossum52e14d62002-12-30 22:08:05 +0000227 }
228 else {
229 /* sys.path_hooks.append(zipimporter) */
230 err = PyList_Append(path_hooks, zipimporter);
231 Py_DECREF(zipimporter);
232 if (err)
233 goto error;
234 if (Py_VerboseFlag)
235 PySys_WriteStderr(
236 "# installed zipimport hook\n");
237 }
238 }
239 Py_DECREF(path_hooks);
240}
241
242void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000243_PyImport_Fini(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000244{
245 Py_XDECREF(extensions);
246 extensions = NULL;
Barry Warsaw84294482000-10-03 16:02:05 +0000247 PyMem_DEL(_PyImport_Filetab);
248 _PyImport_Filetab = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000249}
250
251
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000252/* Locking primitives to prevent parallel imports of the same module
253 in different threads to return with a partially loaded module.
254 These calls are serialized by the global interpreter lock. */
255
256#ifdef WITH_THREAD
257
Guido van Rossum49b56061998-10-01 20:42:43 +0000258#include "pythread.h"
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000259
Guido van Rossum65d5b571998-12-21 19:32:43 +0000260static PyThread_type_lock import_lock = 0;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000261static long import_lock_thread = -1;
262static int import_lock_level = 0;
263
264static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000265lock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000266{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000267 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000268 if (me == -1)
269 return; /* Too bad */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000270 if (import_lock == NULL) {
Guido van Rossum65d5b571998-12-21 19:32:43 +0000271 import_lock = PyThread_allocate_lock();
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000272 if (import_lock == NULL)
273 return; /* Nothing much we can do. */
274 }
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000275 if (import_lock_thread == me) {
276 import_lock_level++;
277 return;
278 }
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000279 if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0))
280 {
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000281 PyThreadState *tstate = PyEval_SaveThread();
Guido van Rossum65d5b571998-12-21 19:32:43 +0000282 PyThread_acquire_lock(import_lock, 1);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000283 PyEval_RestoreThread(tstate);
284 }
285 import_lock_thread = me;
286 import_lock_level = 1;
287}
288
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000289static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000290unlock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000291{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000292 long me = PyThread_get_thread_ident();
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000293 if (me == -1 || import_lock == NULL)
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000294 return 0; /* Too bad */
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000295 if (import_lock_thread != me)
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000296 return -1;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000297 import_lock_level--;
298 if (import_lock_level == 0) {
299 import_lock_thread = -1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000300 PyThread_release_lock(import_lock);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000301 }
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000302 return 1;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000303}
304
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +0000305/* This function is called from PyOS_AfterFork to ensure that newly
306 created child processes do not share locks with the parent. */
307
308void
309_PyImport_ReInitLock(void)
310{
311#ifdef _AIX
312 if (import_lock != NULL)
313 import_lock = PyThread_allocate_lock();
314#endif
315}
316
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000317#else
318
319#define lock_import()
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000320#define unlock_import() 0
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000321
322#endif
323
Tim Peters69232342001-08-30 05:16:13 +0000324static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +0000325imp_lock_held(PyObject *self, PyObject *noargs)
Tim Peters69232342001-08-30 05:16:13 +0000326{
Tim Peters69232342001-08-30 05:16:13 +0000327#ifdef WITH_THREAD
Guido van Rossumb8bff3f2002-04-07 06:34:38 +0000328 return PyBool_FromLong(import_lock_thread != -1);
Tim Peters69232342001-08-30 05:16:13 +0000329#else
Guido van Rossumb8bff3f2002-04-07 06:34:38 +0000330 return PyBool_FromLong(0);
Tim Peters69232342001-08-30 05:16:13 +0000331#endif
332}
333
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000334static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +0000335imp_acquire_lock(PyObject *self, PyObject *noargs)
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000336{
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000337#ifdef WITH_THREAD
338 lock_import();
339#endif
Neal Norwitz2294c0d2003-02-12 23:02:21 +0000340 Py_INCREF(Py_None);
341 return Py_None;
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000342}
343
344static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +0000345imp_release_lock(PyObject *self, PyObject *noargs)
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000346{
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000347#ifdef WITH_THREAD
348 if (unlock_import() < 0) {
349 PyErr_SetString(PyExc_RuntimeError,
350 "not holding the import lock");
351 return NULL;
352 }
353#endif
Neal Norwitz2294c0d2003-02-12 23:02:21 +0000354 Py_INCREF(Py_None);
355 return Py_None;
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000356}
357
Guido van Rossumd8faa362007-04-27 19:54:29 +0000358static void
359imp_modules_reloading_clear(void)
360{
361 PyInterpreterState *interp = PyThreadState_Get()->interp;
362 if (interp->modules_reloading != NULL)
363 PyDict_Clear(interp->modules_reloading);
364}
365
Guido van Rossum25ce5661997-08-02 03:10:38 +0000366/* Helper for sys */
367
368PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000369PyImport_GetModuleDict(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000370{
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000371 PyInterpreterState *interp = PyThreadState_GET()->interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000372 if (interp->modules == NULL)
373 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
374 return interp->modules;
375}
376
Guido van Rossum3f5da241990-12-20 15:06:42 +0000377
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000378/* List of names to clear in sys */
379static char* sys_deletes[] = {
Collin Winter670e6922007-03-21 02:57:17 +0000380 "path", "argv", "ps1", "ps2",
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000381 "last_type", "last_value", "last_traceback",
Just van Rossum52e14d62002-12-30 22:08:05 +0000382 "path_hooks", "path_importer_cache", "meta_path",
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000383 /* misc stuff */
384 "flags", "float_info",
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000385 NULL
386};
387
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000388static char* sys_files[] = {
389 "stdin", "__stdin__",
390 "stdout", "__stdout__",
391 "stderr", "__stderr__",
392 NULL
393};
394
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000395
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000396/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000397
Guido van Rossum3f5da241990-12-20 15:06:42 +0000398void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000399PyImport_Cleanup(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000400{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000401 Py_ssize_t pos, ndone;
Guido van Rossum758eec01998-01-19 21:58:26 +0000402 char *name;
403 PyObject *key, *value, *dict;
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000404 PyInterpreterState *interp = PyThreadState_GET()->interp;
Guido van Rossum758eec01998-01-19 21:58:26 +0000405 PyObject *modules = interp->modules;
406
407 if (modules == NULL)
408 return; /* Already done */
409
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000410 /* Delete some special variables first. These are common
411 places where user values hide and people complain when their
412 destructors fail. Since the modules containing them are
413 deleted *last* of all, they would come too late in the normal
414 destruction order. Sigh. */
415
Georg Brandl1a3284e2007-12-02 09:40:06 +0000416 value = PyDict_GetItemString(modules, "builtins");
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000417 if (value != NULL && PyModule_Check(value)) {
418 dict = PyModule_GetDict(value);
419 if (Py_VerboseFlag)
Georg Brandl1a3284e2007-12-02 09:40:06 +0000420 PySys_WriteStderr("# clear builtins._\n");
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000421 PyDict_SetItemString(dict, "_", Py_None);
422 }
423 value = PyDict_GetItemString(modules, "sys");
424 if (value != NULL && PyModule_Check(value)) {
425 char **p;
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000426 PyObject *v;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000427 dict = PyModule_GetDict(value);
428 for (p = sys_deletes; *p != NULL; p++) {
429 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000430 PySys_WriteStderr("# clear sys.%s\n", *p);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000431 PyDict_SetItemString(dict, *p, Py_None);
432 }
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000433 for (p = sys_files; *p != NULL; p+=2) {
434 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000435 PySys_WriteStderr("# restore sys.%s\n", *p);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000436 v = PyDict_GetItemString(dict, *(p+1));
437 if (v == NULL)
438 v = Py_None;
439 PyDict_SetItemString(dict, *p, v);
440 }
441 }
442
443 /* First, delete __main__ */
444 value = PyDict_GetItemString(modules, "__main__");
445 if (value != NULL && PyModule_Check(value)) {
446 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000447 PySys_WriteStderr("# cleanup __main__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000448 _PyModule_Clear(value);
449 PyDict_SetItemString(modules, "__main__", Py_None);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000450 }
451
Georg Brandl1a3284e2007-12-02 09:40:06 +0000452 /* The special treatment of "builtins" here is because even
Guido van Rossum758eec01998-01-19 21:58:26 +0000453 when it's not referenced as a module, its dictionary is
454 referenced by almost every module's __builtins__. Since
455 deleting a module clears its dictionary (even if there are
Georg Brandl1a3284e2007-12-02 09:40:06 +0000456 references left to it), we need to delete the "builtins"
Guido van Rossum758eec01998-01-19 21:58:26 +0000457 module last. Likewise, we don't delete sys until the very
458 end because it is implicitly referenced (e.g. by print).
459
460 Also note that we 'delete' modules by replacing their entry
461 in the modules dict with None, rather than really deleting
462 them; this avoids a rehash of the modules dictionary and
463 also marks them as "non existent" so they won't be
464 re-imported. */
465
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000466 /* Next, repeatedly delete modules with a reference count of
Georg Brandl1a3284e2007-12-02 09:40:06 +0000467 one (skipping builtins and sys) and delete them */
Guido van Rossum758eec01998-01-19 21:58:26 +0000468 do {
469 ndone = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000470 pos = 0;
Guido van Rossum758eec01998-01-19 21:58:26 +0000471 while (PyDict_Next(modules, &pos, &key, &value)) {
472 if (value->ob_refcnt != 1)
473 continue;
Neal Norwitz80e7f272007-08-26 06:45:23 +0000474 if (PyUnicode_Check(key) && PyModule_Check(value)) {
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +0000475 name = _PyUnicode_AsString(key);
Georg Brandl1a3284e2007-12-02 09:40:06 +0000476 if (strcmp(name, "builtins") == 0)
Guido van Rossum758eec01998-01-19 21:58:26 +0000477 continue;
478 if (strcmp(name, "sys") == 0)
479 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000480 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000481 PySys_WriteStderr(
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000482 "# cleanup[1] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000483 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000484 PyDict_SetItem(modules, key, Py_None);
485 ndone++;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000486 }
487 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000488 } while (ndone > 0);
489
Georg Brandl1a3284e2007-12-02 09:40:06 +0000490 /* Next, delete all modules (still skipping builtins and sys) */
Guido van Rossum758eec01998-01-19 21:58:26 +0000491 pos = 0;
492 while (PyDict_Next(modules, &pos, &key, &value)) {
Neal Norwitz80e7f272007-08-26 06:45:23 +0000493 if (PyUnicode_Check(key) && PyModule_Check(value)) {
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +0000494 name = _PyUnicode_AsString(key);
Georg Brandl1a3284e2007-12-02 09:40:06 +0000495 if (strcmp(name, "builtins") == 0)
Guido van Rossum758eec01998-01-19 21:58:26 +0000496 continue;
497 if (strcmp(name, "sys") == 0)
498 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000499 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000500 PySys_WriteStderr("# cleanup[2] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000501 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000502 PyDict_SetItem(modules, key, Py_None);
503 }
504 }
505
Georg Brandl1a3284e2007-12-02 09:40:06 +0000506 /* Next, delete sys and builtins (in that order) */
Guido van Rossum758eec01998-01-19 21:58:26 +0000507 value = PyDict_GetItemString(modules, "sys");
508 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000509 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000510 PySys_WriteStderr("# cleanup sys\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000511 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000512 PyDict_SetItemString(modules, "sys", Py_None);
513 }
Georg Brandl1a3284e2007-12-02 09:40:06 +0000514 value = PyDict_GetItemString(modules, "builtins");
Guido van Rossum758eec01998-01-19 21:58:26 +0000515 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000516 if (Py_VerboseFlag)
Georg Brandl1a3284e2007-12-02 09:40:06 +0000517 PySys_WriteStderr("# cleanup builtins\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000518 _PyModule_Clear(value);
Georg Brandl1a3284e2007-12-02 09:40:06 +0000519 PyDict_SetItemString(modules, "builtins", Py_None);
Guido van Rossum758eec01998-01-19 21:58:26 +0000520 }
521
522 /* Finally, clear and delete the modules directory */
523 PyDict_Clear(modules);
524 interp->modules = NULL;
525 Py_DECREF(modules);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000526 Py_CLEAR(interp->modules_reloading);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000527}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000528
529
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000530/* Helper for pythonrun.c -- return magic number */
531
532long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000533PyImport_GetMagicNumber(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000534{
Guido van Rossum96774c12000-05-01 20:19:08 +0000535 return pyc_magic;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000536}
537
538
Guido van Rossum25ce5661997-08-02 03:10:38 +0000539/* Magic for extension modules (built-in as well as dynamically
540 loaded). To prevent initializing an extension module more than
541 once, we keep a static dictionary 'extensions' keyed by module name
542 (for built-in modules) or by filename (for dynamically loaded
Barry Warsaw92883382001-08-13 23:05:44 +0000543 modules), containing these modules. A copy of the module's
Guido van Rossum25ce5661997-08-02 03:10:38 +0000544 dictionary is stored by calling _PyImport_FixupExtension()
545 immediately after the module initialization function succeeds. A
546 copy can be retrieved from there by calling
Martin v. Löwis1a214512008-06-11 05:26:20 +0000547 _PyImport_FindExtension().
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000548
Martin v. Löwis1a214512008-06-11 05:26:20 +0000549 Modules which do support multiple multiple initialization set
550 their m_size field to a non-negative number (indicating the size
551 of the module-specific state). They are still recorded in the
552 extensions dictionary, to avoid loading shared libraries twice.
553*/
554
555int
556_PyImport_FixupExtension(PyObject *mod, char *name, char *filename)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000557{
Martin v. Löwis1a214512008-06-11 05:26:20 +0000558 PyObject *modules, *dict;
559 struct PyModuleDef *def;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000560 if (extensions == NULL) {
561 extensions = PyDict_New();
562 if (extensions == NULL)
Martin v. Löwis1a214512008-06-11 05:26:20 +0000563 return -1;
564 }
565 if (mod == NULL || !PyModule_Check(mod)) {
566 PyErr_BadInternalCall();
567 return -1;
568 }
569 def = PyModule_GetDef(mod);
570 if (!def) {
571 PyErr_BadInternalCall();
572 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000573 }
574 modules = PyImport_GetModuleDict();
Martin v. Löwis1a214512008-06-11 05:26:20 +0000575 if (PyDict_SetItemString(modules, name, mod) < 0)
576 return -1;
577 if (_PyState_AddModule(mod, def) < 0) {
578 PyDict_DelItemString(modules, name);
579 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000580 }
Martin v. Löwis1a214512008-06-11 05:26:20 +0000581 if (def->m_size == -1) {
582 if (def->m_base.m_copy) {
583 /* Somebody already imported the module,
584 likely under a different name.
585 XXX this should really not happen. */
586 Py_DECREF(def->m_base.m_copy);
587 def->m_base.m_copy = NULL;
588 }
589 dict = PyModule_GetDict(mod);
590 if (dict == NULL)
591 return -1;
592 def->m_base.m_copy = PyDict_Copy(dict);
593 if (def->m_base.m_copy == NULL)
594 return -1;
595 }
596 PyDict_SetItemString(extensions, filename, (PyObject*)def);
597 return 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000598}
599
600PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000601_PyImport_FindExtension(char *name, char *filename)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000602{
Martin v. Löwis1a214512008-06-11 05:26:20 +0000603 PyObject *mod, *mdict;
604 PyModuleDef* def;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000605 if (extensions == NULL)
606 return NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000607 def = (PyModuleDef*)PyDict_GetItemString(extensions, filename);
608 if (def == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000609 return NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000610 if (def->m_size == -1) {
611 /* Module does not support repeated initialization */
612 if (def->m_base.m_copy == NULL)
613 return NULL;
614 mod = PyImport_AddModule(name);
615 if (mod == NULL)
616 return NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000617 mdict = PyModule_GetDict(mod);
618 if (mdict == NULL)
619 return NULL;
620 if (PyDict_Update(mdict, def->m_base.m_copy))
621 return NULL;
622 }
623 else {
624 if (def->m_base.m_init == NULL)
625 return NULL;
626 mod = def->m_base.m_init();
627 if (mod == NULL)
628 return NULL;
629 PyDict_SetItemString(PyImport_GetModuleDict(), name, mod);
Benjamin Petersonad956532008-09-04 02:28:15 +0000630 Py_DECREF(mod);
Martin v. Löwis1a214512008-06-11 05:26:20 +0000631 }
632 if (_PyState_AddModule(mod, def) < 0) {
633 PyDict_DelItemString(PyImport_GetModuleDict(), name);
634 Py_DECREF(mod);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000635 return NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000636 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000637 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000638 PySys_WriteStderr("import %s # previously loaded (%s)\n",
Martin v. Löwis1a214512008-06-11 05:26:20 +0000639 name, filename);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000640 return mod;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000641
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000642}
643
644
645/* Get the module object corresponding to a module name.
646 First check the modules dictionary if there's one there,
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000647 if not, create a new one and insert it in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000648 Because the former action is most common, THIS DOES NOT RETURN A
649 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000650
Guido van Rossum79f25d91997-04-29 20:08:16 +0000651PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000652PyImport_AddModule(const char *name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000653{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000654 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000655 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000656
Guido van Rossum25ce5661997-08-02 03:10:38 +0000657 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
Guido van Rossum79f25d91997-04-29 20:08:16 +0000658 PyModule_Check(m))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000659 return m;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000660 m = PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000661 if (m == NULL)
662 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000663 if (PyDict_SetItemString(modules, name, m) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000664 Py_DECREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000665 return NULL;
666 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000667 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000668
669 return m;
670}
671
Tim Peters1cd70172004-08-02 03:52:12 +0000672/* Remove name from sys.modules, if it's there. */
673static void
674_RemoveModule(const char *name)
675{
676 PyObject *modules = PyImport_GetModuleDict();
677 if (PyDict_GetItemString(modules, name) == NULL)
678 return;
679 if (PyDict_DelItemString(modules, name) < 0)
680 Py_FatalError("import: deleting existing key in"
681 "sys.modules failed");
682}
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000683
Christian Heimes3b06e532008-01-07 20:12:44 +0000684static PyObject * get_sourcefile(const char *file);
685
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000686/* Execute a code object in a module and return the module object
Tim Peters1cd70172004-08-02 03:52:12 +0000687 * WITH INCREMENTED REFERENCE COUNT. If an error occurs, name is
688 * removed from sys.modules, to avoid leaving damaged module objects
689 * in sys.modules. The caller may wish to restore the original
690 * module object (if any) in this case; PyImport_ReloadModule is an
691 * example.
692 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000693PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000694PyImport_ExecCodeModule(char *name, PyObject *co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000695{
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000696 return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
697}
698
699PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000700PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname)
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000701{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000702 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000703 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000704
Guido van Rossum79f25d91997-04-29 20:08:16 +0000705 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000706 if (m == NULL)
707 return NULL;
Jeremy Hyltonecd91292004-01-02 23:25:32 +0000708 /* If the module is being reloaded, we get the old module back
709 and re-use its dict to exec the new code. */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000710 d = PyModule_GetDict(m);
711 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
712 if (PyDict_SetItemString(d, "__builtins__",
713 PyEval_GetBuiltins()) != 0)
Tim Peters1cd70172004-08-02 03:52:12 +0000714 goto error;
Guido van Rossum6135a871995-01-09 17:53:26 +0000715 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000716 /* Remember the filename as the __file__ attribute */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000717 v = NULL;
718 if (pathname != NULL) {
Christian Heimes3b06e532008-01-07 20:12:44 +0000719 v = get_sourcefile(pathname);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000720 if (v == NULL)
721 PyErr_Clear();
722 }
723 if (v == NULL) {
724 v = ((PyCodeObject *)co)->co_filename;
725 Py_INCREF(v);
726 }
727 if (PyDict_SetItemString(d, "__file__", v) != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000728 PyErr_Clear(); /* Not important enough to report */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000729 Py_DECREF(v);
730
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000731 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000732 if (v == NULL)
Tim Peters1cd70172004-08-02 03:52:12 +0000733 goto error;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000734 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000735
Guido van Rossum25ce5661997-08-02 03:10:38 +0000736 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000737 PyErr_Format(PyExc_ImportError,
738 "Loaded module %.200s not found in sys.modules",
739 name);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000740 return NULL;
741 }
742
Guido van Rossum79f25d91997-04-29 20:08:16 +0000743 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000744
745 return m;
Tim Peters1cd70172004-08-02 03:52:12 +0000746
747 error:
748 _RemoveModule(name);
749 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000750}
751
752
753/* Given a pathname for a Python source file, fill a buffer with the
754 pathname for the corresponding compiled file. Return the pathname
755 for the compiled file, or NULL if there's no space in the buffer.
756 Doesn't set an exception. */
757
758static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000759make_compiled_pathname(char *pathname, char *buf, size_t buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000760{
Tim Petersc1731372001-08-04 08:12:36 +0000761 size_t len = strlen(pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000762 if (len+2 > buflen)
763 return NULL;
Tim Petersc1731372001-08-04 08:12:36 +0000764
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000765#ifdef MS_WINDOWS
Tim Petersc1731372001-08-04 08:12:36 +0000766 /* Treat .pyw as if it were .py. The case of ".pyw" must match
767 that used in _PyImport_StandardFiletab. */
768 if (len >= 4 && strcmp(&pathname[len-4], ".pyw") == 0)
769 --len; /* pretend 'w' isn't there */
770#endif
771 memcpy(buf, pathname, len);
772 buf[len] = Py_OptimizeFlag ? 'o' : 'c';
773 buf[len+1] = '\0';
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000774
775 return buf;
776}
777
778
779/* Given a pathname for a Python source file, its time of last
780 modification, and a pathname for a compiled file, check whether the
781 compiled file represents the same version of the source. If so,
782 return a FILE pointer for the compiled file, positioned just after
783 the header; if not, return NULL.
784 Doesn't set an exception. */
785
786static FILE *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000787check_compiled_module(char *pathname, time_t mtime, char *cpathname)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000788{
789 FILE *fp;
790 long magic;
791 long pyc_mtime;
792
793 fp = fopen(cpathname, "rb");
794 if (fp == NULL)
795 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000796 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000797 if (magic != pyc_magic) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000798 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000799 PySys_WriteStderr("# %s has bad magic\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000800 fclose(fp);
801 return NULL;
802 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000803 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000804 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000805 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000806 PySys_WriteStderr("# %s has bad mtime\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000807 fclose(fp);
808 return NULL;
809 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000810 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000811 PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000812 return fp;
813}
814
815
816/* Read a code object from a file and check it for validity */
817
Guido van Rossum79f25d91997-04-29 20:08:16 +0000818static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000819read_compiled_module(char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000820{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000821 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000822
Tim Petersd9b9ac82001-01-28 00:27:39 +0000823 co = PyMarshal_ReadLastObjectFromFile(fp);
Armin Rigo01ab2792004-03-26 15:09:27 +0000824 if (co == NULL)
825 return NULL;
826 if (!PyCode_Check(co)) {
827 PyErr_Format(PyExc_ImportError,
828 "Non-code object in %.200s", cpathname);
829 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000830 return NULL;
831 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000832 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000833}
834
835
836/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000837 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000838
Guido van Rossum79f25d91997-04-29 20:08:16 +0000839static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000840load_compiled_module(char *name, char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000841{
842 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000843 PyCodeObject *co;
844 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000845
Guido van Rossum79f25d91997-04-29 20:08:16 +0000846 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000847 if (magic != pyc_magic) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000848 PyErr_Format(PyExc_ImportError,
849 "Bad magic number in %.200s", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000850 return NULL;
851 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000852 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000853 co = read_compiled_module(cpathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000854 if (co == NULL)
855 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000856 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000857 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000858 name, cpathname);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000859 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000860 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000861
862 return m;
863}
864
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000865/* Parse a source file and return the corresponding code object */
866
Guido van Rossum79f25d91997-04-29 20:08:16 +0000867static PyCodeObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000868parse_source_module(const char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000869{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000870 PyCodeObject *co = NULL;
871 mod_ty mod;
Christian Heimes4d6ec852008-03-26 22:34:47 +0000872 PyCompilerFlags flags;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000873 PyArena *arena = PyArena_New();
874 if (arena == NULL)
875 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000876
Christian Heimesb1b3efc2008-03-26 23:24:27 +0000877 flags.cf_flags = 0;
Martin v. Löwis85bcc662007-09-04 09:18:06 +0000878 mod = PyParser_ASTFromFile(fp, pathname, NULL,
Christian Heimes4d6ec852008-03-26 22:34:47 +0000879 Py_file_input, 0, 0, &flags,
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000880 NULL, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000881 if (mod) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000882 co = PyAST_Compile(mod, pathname, NULL, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000883 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000884 PyArena_Free(arena);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000885 return co;
886}
887
888
Guido van Rossum55a83382000-09-20 20:31:38 +0000889/* Helper to open a bytecode file for writing in exclusive mode */
890
891static FILE *
Christian Heimes05e8be12008-02-23 18:30:17 +0000892open_exclusive(char *filename, mode_t mode)
Guido van Rossum55a83382000-09-20 20:31:38 +0000893{
894#if defined(O_EXCL)&&defined(O_CREAT)&&defined(O_WRONLY)&&defined(O_TRUNC)
895 /* Use O_EXCL to avoid a race condition when another process tries to
896 write the same file. When that happens, our open() call fails,
897 which is just fine (since it's only a cache).
898 XXX If the file exists and is writable but the directory is not
899 writable, the file will never be written. Oh well.
900 */
901 int fd;
902 (void) unlink(filename);
Tim Peters42c83af2000-09-29 04:03:10 +0000903 fd = open(filename, O_EXCL|O_CREAT|O_WRONLY|O_TRUNC
904#ifdef O_BINARY
905 |O_BINARY /* necessary for Windows */
906#endif
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000907#ifdef __VMS
Christian Heimes05e8be12008-02-23 18:30:17 +0000908 , mode, "ctxt=bin", "shr=nil"
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000909#else
Christian Heimes05e8be12008-02-23 18:30:17 +0000910 , mode
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000911#endif
Martin v. Löwis18e16552006-02-15 17:27:45 +0000912 );
Guido van Rossum55a83382000-09-20 20:31:38 +0000913 if (fd < 0)
914 return NULL;
915 return fdopen(fd, "wb");
916#else
917 /* Best we can do -- on Windows this can't happen anyway */
918 return fopen(filename, "wb");
919#endif
920}
921
922
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000923/* Write a compiled module to a file, placing the time of last
924 modification of its source into the header.
925 Errors are ignored, if a write error occurs an attempt is made to
926 remove the file. */
927
928static void
Christian Heimes05e8be12008-02-23 18:30:17 +0000929write_compiled_module(PyCodeObject *co, char *cpathname, struct stat *srcstat)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000930{
931 FILE *fp;
Christian Heimes05e8be12008-02-23 18:30:17 +0000932 time_t mtime = srcstat->st_mtime;
933 mode_t mode = srcstat->st_mode;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000934
Christian Heimes05e8be12008-02-23 18:30:17 +0000935 fp = open_exclusive(cpathname, mode);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000936 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000937 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000938 PySys_WriteStderr(
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000939 "# can't create %s\n", cpathname);
940 return;
941 }
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000942 PyMarshal_WriteLongToFile(pyc_magic, fp, Py_MARSHAL_VERSION);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000943 /* First write a 0 for mtime */
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000944 PyMarshal_WriteLongToFile(0L, fp, Py_MARSHAL_VERSION);
945 PyMarshal_WriteObjectToFile((PyObject *)co, fp, Py_MARSHAL_VERSION);
Armin Rigo01ab2792004-03-26 15:09:27 +0000946 if (fflush(fp) != 0 || ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000947 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000948 PySys_WriteStderr("# can't write %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000949 /* Don't keep partial file */
950 fclose(fp);
951 (void) unlink(cpathname);
952 return;
953 }
954 /* Now write the true mtime */
955 fseek(fp, 4L, 0);
Martin v. Löwis18e16552006-02-15 17:27:45 +0000956 assert(mtime < LONG_MAX);
Martin v. Löwis725507b2006-03-07 12:08:51 +0000957 PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000958 fflush(fp);
959 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000960 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000961 PySys_WriteStderr("# wrote %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000962}
963
Antoine Pitroud35cbf62009-01-06 19:02:24 +0000964static void
965update_code_filenames(PyCodeObject *co, PyObject *oldname, PyObject *newname)
966{
967 PyObject *constants, *tmp;
968 Py_ssize_t i, n;
969
970 if (PyUnicode_Compare(co->co_filename, oldname))
971 return;
972
973 tmp = co->co_filename;
974 co->co_filename = newname;
975 Py_INCREF(co->co_filename);
976 Py_DECREF(tmp);
977
978 constants = co->co_consts;
979 n = PyTuple_GET_SIZE(constants);
980 for (i = 0; i < n; i++) {
981 tmp = PyTuple_GET_ITEM(constants, i);
982 if (PyCode_Check(tmp))
983 update_code_filenames((PyCodeObject *)tmp,
984 oldname, newname);
985 }
986}
987
988static int
989update_compiled_module(PyCodeObject *co, char *pathname)
990{
991 PyObject *oldname, *newname;
992
993 if (!PyUnicode_CompareWithASCIIString(co->co_filename, pathname))
994 return 0;
995
996 newname = PyUnicode_FromString(pathname);
997 if (newname == NULL)
998 return -1;
999
1000 oldname = co->co_filename;
1001 Py_INCREF(oldname);
1002 update_code_filenames(co, oldname, newname);
1003 Py_DECREF(oldname);
1004 Py_DECREF(newname);
1005 return 1;
1006}
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001007
1008/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001009 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
1010 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001011
Guido van Rossum79f25d91997-04-29 20:08:16 +00001012static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001013load_source_module(char *name, char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001014{
Christian Heimes05e8be12008-02-23 18:30:17 +00001015 struct stat st;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001016 FILE *fpc;
1017 char buf[MAXPATHLEN+1];
1018 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001019 PyCodeObject *co;
1020 PyObject *m;
Christian Heimes05e8be12008-02-23 18:30:17 +00001021
1022 if (fstat(fileno(fp), &st) != 0) {
Neal Norwitz708e51a2005-10-03 04:48:15 +00001023 PyErr_Format(PyExc_RuntimeError,
Christian Heimes05e8be12008-02-23 18:30:17 +00001024 "unable to get file status from '%s'",
Neal Norwitz708e51a2005-10-03 04:48:15 +00001025 pathname);
Fred Drake4c82b232000-06-30 16:18:57 +00001026 return NULL;
Neal Norwitz708e51a2005-10-03 04:48:15 +00001027 }
Fred Drake4c82b232000-06-30 16:18:57 +00001028#if SIZEOF_TIME_T > 4
1029 /* Python's .pyc timestamp handling presumes that the timestamp fits
1030 in 4 bytes. This will be fine until sometime in the year 2038,
1031 when a 4-byte signed time_t will overflow.
1032 */
Christian Heimes05e8be12008-02-23 18:30:17 +00001033 if (st.st_mtime >> 32) {
Fred Drake4c82b232000-06-30 16:18:57 +00001034 PyErr_SetString(PyExc_OverflowError,
Fred Drakec63d3e92001-03-01 06:33:32 +00001035 "modification time overflows a 4 byte field");
Fred Drake4c82b232000-06-30 16:18:57 +00001036 return NULL;
1037 }
1038#endif
Tim Peters36515e22001-11-18 04:06:29 +00001039 cpathname = make_compiled_pathname(pathname, buf,
Jeremy Hylton37832f02001-04-13 17:50:20 +00001040 (size_t)MAXPATHLEN + 1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001041 if (cpathname != NULL &&
Christian Heimes05e8be12008-02-23 18:30:17 +00001042 (fpc = check_compiled_module(pathname, st.st_mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001043 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001044 fclose(fpc);
1045 if (co == NULL)
1046 return NULL;
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001047 if (update_compiled_module(co, pathname) < 0)
1048 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001049 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001050 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001051 name, cpathname);
Guido van Rossumafd3dae1998-08-25 18:44:34 +00001052 pathname = cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001053 }
1054 else {
1055 co = parse_source_module(pathname, fp);
1056 if (co == NULL)
1057 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001058 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001059 PySys_WriteStderr("import %s # from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001060 name, pathname);
Christian Heimes790c8232008-01-07 21:14:23 +00001061 if (cpathname) {
1062 PyObject *ro = PySys_GetObject("dont_write_bytecode");
1063 if (ro == NULL || !PyObject_IsTrue(ro))
Christian Heimes05e8be12008-02-23 18:30:17 +00001064 write_compiled_module(co, cpathname, &st);
Christian Heimes790c8232008-01-07 21:14:23 +00001065 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001066 }
Guido van Rossumafd3dae1998-08-25 18:44:34 +00001067 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001068 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001069
1070 return m;
1071}
1072
Christian Heimes3b06e532008-01-07 20:12:44 +00001073/* Get source file -> unicode or None
1074 * Returns the path to the py file if available, else the given path
1075 */
1076static PyObject *
1077get_sourcefile(const char *file)
1078{
1079 char py[MAXPATHLEN + 1];
1080 Py_ssize_t len;
1081 PyObject *u;
1082 struct stat statbuf;
1083
1084 if (!file || !*file) {
1085 Py_RETURN_NONE;
1086 }
1087
1088 len = strlen(file);
Christian Heimes3540b502008-01-11 07:03:05 +00001089 /* match '*.py?' */
1090 if (len > MAXPATHLEN || PyOS_strnicmp(&file[len-4], ".py", 3) != 0) {
Christian Heimes3b06e532008-01-07 20:12:44 +00001091 return PyUnicode_DecodeFSDefault(file);
1092 }
1093
1094 strncpy(py, file, len-1);
Martin v. Löwis5021ebc2008-03-22 22:07:13 +00001095 py[len-1] = '\0';
Christian Heimes3b06e532008-01-07 20:12:44 +00001096 if (stat(py, &statbuf) == 0 &&
1097 S_ISREG(statbuf.st_mode)) {
1098 u = PyUnicode_DecodeFSDefault(py);
1099 }
1100 else {
1101 u = PyUnicode_DecodeFSDefault(file);
1102 }
1103 return u;
1104}
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001105
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001106/* Forward */
Just van Rossum52e14d62002-12-30 22:08:05 +00001107static PyObject *load_module(char *, FILE *, char *, int, PyObject *);
1108static struct filedescr *find_module(char *, char *, PyObject *,
1109 char *, size_t, FILE **, PyObject **);
Christian Heimes3b06e532008-01-07 20:12:44 +00001110static struct _frozen * find_frozen(char *);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001111
1112/* Load a package and return its module object WITH INCREMENTED
1113 REFERENCE COUNT */
1114
1115static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001116load_package(char *name, char *pathname)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001117{
Tim Peters1cd70172004-08-02 03:52:12 +00001118 PyObject *m, *d;
1119 PyObject *file = NULL;
1120 PyObject *path = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001121 int err;
1122 char buf[MAXPATHLEN+1];
1123 FILE *fp = NULL;
1124 struct filedescr *fdp;
1125
1126 m = PyImport_AddModule(name);
1127 if (m == NULL)
1128 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001129 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001130 PySys_WriteStderr("import %s # directory %s\n",
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001131 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001132 d = PyModule_GetDict(m);
Christian Heimes3b06e532008-01-07 20:12:44 +00001133 file = get_sourcefile(pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001134 if (file == NULL)
Tim Peters1cd70172004-08-02 03:52:12 +00001135 goto error;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001136 path = Py_BuildValue("[O]", file);
Tim Peters1cd70172004-08-02 03:52:12 +00001137 if (path == NULL)
1138 goto error;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001139 err = PyDict_SetItemString(d, "__file__", file);
1140 if (err == 0)
1141 err = PyDict_SetItemString(d, "__path__", path);
Tim Peters1cd70172004-08-02 03:52:12 +00001142 if (err != 0)
1143 goto error;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001144 buf[0] = '\0';
Just van Rossum52e14d62002-12-30 22:08:05 +00001145 fdp = find_module(name, "__init__", path, buf, sizeof(buf), &fp, NULL);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001146 if (fdp == NULL) {
1147 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
1148 PyErr_Clear();
Thomas Heller25653242004-06-07 15:04:10 +00001149 Py_INCREF(m);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001150 }
1151 else
1152 m = NULL;
1153 goto cleanup;
1154 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001155 m = load_module(name, fp, buf, fdp->type, NULL);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001156 if (fp != NULL)
1157 fclose(fp);
Tim Peters1cd70172004-08-02 03:52:12 +00001158 goto cleanup;
1159
1160 error:
1161 m = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001162 cleanup:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001163 Py_XDECREF(path);
1164 Py_XDECREF(file);
1165 return m;
1166}
1167
1168
1169/* Helper to test for built-in module */
1170
1171static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001172is_builtin(char *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001173{
1174 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +00001175 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
1176 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
1177 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001178 return -1;
1179 else
1180 return 1;
1181 }
1182 }
1183 return 0;
1184}
1185
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001186
Just van Rossum52e14d62002-12-30 22:08:05 +00001187/* Return an importer object for a sys.path/pkg.__path__ item 'p',
1188 possibly by fetching it from the path_importer_cache dict. If it
Thomas Wouters89f507f2006-12-13 04:49:30 +00001189 wasn't yet cached, traverse path_hooks until a hook is found
Just van Rossum52e14d62002-12-30 22:08:05 +00001190 that can handle the path item. Return None if no hook could;
1191 this tells our caller it should fall back to the builtin
1192 import mechanism. Cache the result in path_importer_cache.
1193 Returns a borrowed reference. */
1194
1195static PyObject *
1196get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks,
1197 PyObject *p)
1198{
1199 PyObject *importer;
Martin v. Löwis725507b2006-03-07 12:08:51 +00001200 Py_ssize_t j, nhooks;
Just van Rossum52e14d62002-12-30 22:08:05 +00001201
1202 /* These conditions are the caller's responsibility: */
1203 assert(PyList_Check(path_hooks));
1204 assert(PyDict_Check(path_importer_cache));
1205
1206 nhooks = PyList_Size(path_hooks);
1207 if (nhooks < 0)
1208 return NULL; /* Shouldn't happen */
1209
1210 importer = PyDict_GetItem(path_importer_cache, p);
1211 if (importer != NULL)
1212 return importer;
1213
1214 /* set path_importer_cache[p] to None to avoid recursion */
1215 if (PyDict_SetItem(path_importer_cache, p, Py_None) != 0)
1216 return NULL;
1217
1218 for (j = 0; j < nhooks; j++) {
1219 PyObject *hook = PyList_GetItem(path_hooks, j);
1220 if (hook == NULL)
1221 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001222 importer = PyObject_CallFunctionObjArgs(hook, p, NULL);
Just van Rossum52e14d62002-12-30 22:08:05 +00001223 if (importer != NULL)
1224 break;
1225
1226 if (!PyErr_ExceptionMatches(PyExc_ImportError)) {
1227 return NULL;
1228 }
1229 PyErr_Clear();
1230 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001231 if (importer == NULL) {
1232 importer = PyObject_CallFunctionObjArgs(
Christian Heimes9cd17752007-11-18 19:35:23 +00001233 (PyObject *)&PyNullImporter_Type, p, NULL
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001234 );
1235 if (importer == NULL) {
1236 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
1237 PyErr_Clear();
1238 return Py_None;
1239 }
1240 }
1241 }
1242 if (importer != NULL) {
Just van Rossum52e14d62002-12-30 22:08:05 +00001243 int err = PyDict_SetItem(path_importer_cache, p, importer);
1244 Py_DECREF(importer);
1245 if (err != 0)
1246 return NULL;
1247 }
1248 return importer;
1249}
1250
Christian Heimes9cd17752007-11-18 19:35:23 +00001251PyAPI_FUNC(PyObject *)
1252PyImport_GetImporter(PyObject *path) {
1253 PyObject *importer=NULL, *path_importer_cache=NULL, *path_hooks=NULL;
1254
1255 if ((path_importer_cache = PySys_GetObject("path_importer_cache"))) {
1256 if ((path_hooks = PySys_GetObject("path_hooks"))) {
1257 importer = get_path_importer(path_importer_cache,
1258 path_hooks, path);
1259 }
1260 }
1261 Py_XINCREF(importer); /* get_path_importer returns a borrowed reference */
1262 return importer;
1263}
1264
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001265/* Search the path (default sys.path) for a module. Return the
1266 corresponding filedescr struct, and (via return arguments) the
1267 pathname and an open file. Return NULL if the module is not found. */
1268
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001269#ifdef MS_COREDLL
Thomas Woutersb4bd21c2000-07-22 23:38:01 +00001270extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **,
Martin v. Löwis18e16552006-02-15 17:27:45 +00001271 char *, Py_ssize_t);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001272#endif
1273
Martin v. Löwis18e16552006-02-15 17:27:45 +00001274static int case_ok(char *, Py_ssize_t, Py_ssize_t, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001275static int find_init_module(char *); /* Forward */
Just van Rossum52e14d62002-12-30 22:08:05 +00001276static struct filedescr importhookdescr = {"", "", IMP_HOOK};
Guido van Rossum197346f1997-10-31 18:38:52 +00001277
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001278static struct filedescr *
Just van Rossum52e14d62002-12-30 22:08:05 +00001279find_module(char *fullname, char *subname, PyObject *path, char *buf,
1280 size_t buflen, FILE **p_fp, PyObject **p_loader)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001281{
Martin v. Löwis725507b2006-03-07 12:08:51 +00001282 Py_ssize_t i, npath;
Fred Drake4c82b232000-06-30 16:18:57 +00001283 size_t len, namelen;
Guido van Rossum80bb9651996-12-05 23:27:02 +00001284 struct filedescr *fdp = NULL;
Jack Jansenc88da1f2002-05-28 10:58:19 +00001285 char *filemode;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001286 FILE *fp = NULL;
Just van Rossum52e14d62002-12-30 22:08:05 +00001287 PyObject *path_hooks, *path_importer_cache;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001288 struct stat statbuf;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001289 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
1290 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
1291 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossum0506a431998-08-11 15:07:39 +00001292 char name[MAXPATHLEN+1];
Andrew MacIntyred9400542002-02-26 11:41:34 +00001293#if defined(PYOS_OS2)
1294 size_t saved_len;
1295 size_t saved_namelen;
1296 char *saved_buf = NULL;
1297#endif
Just van Rossum52e14d62002-12-30 22:08:05 +00001298 if (p_loader != NULL)
1299 *p_loader = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001300
Just van Rossum52e14d62002-12-30 22:08:05 +00001301 if (strlen(subname) > MAXPATHLEN) {
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001302 PyErr_SetString(PyExc_OverflowError,
1303 "module name is too long");
Fred Drake4c82b232000-06-30 16:18:57 +00001304 return NULL;
1305 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001306 strcpy(name, subname);
1307
1308 /* sys.meta_path import hook */
1309 if (p_loader != NULL) {
1310 PyObject *meta_path;
1311
1312 meta_path = PySys_GetObject("meta_path");
1313 if (meta_path == NULL || !PyList_Check(meta_path)) {
1314 PyErr_SetString(PyExc_ImportError,
1315 "sys.meta_path must be a list of "
1316 "import hooks");
1317 return NULL;
1318 }
1319 Py_INCREF(meta_path); /* zap guard */
1320 npath = PyList_Size(meta_path);
1321 for (i = 0; i < npath; i++) {
1322 PyObject *loader;
1323 PyObject *hook = PyList_GetItem(meta_path, i);
1324 loader = PyObject_CallMethod(hook, "find_module",
1325 "sO", fullname,
1326 path != NULL ?
1327 path : Py_None);
1328 if (loader == NULL) {
1329 Py_DECREF(meta_path);
1330 return NULL; /* true error */
1331 }
1332 if (loader != Py_None) {
1333 /* a loader was found */
1334 *p_loader = loader;
1335 Py_DECREF(meta_path);
1336 return &importhookdescr;
1337 }
1338 Py_DECREF(loader);
1339 }
1340 Py_DECREF(meta_path);
1341 }
Guido van Rossum0506a431998-08-11 15:07:39 +00001342
Benjamin Petersond968e272008-11-05 22:48:33 +00001343 if (find_frozen(fullname) != NULL) {
1344 strcpy(buf, fullname);
1345 return &fd_frozen;
Guido van Rossum0506a431998-08-11 15:07:39 +00001346 }
Benjamin Petersond968e272008-11-05 22:48:33 +00001347
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001348 if (path == NULL) {
1349 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +00001350 strcpy(buf, name);
1351 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001352 }
Guido van Rossumac279101996-08-22 23:10:58 +00001353#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001354 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
1355 if (fp != NULL) {
1356 *p_fp = fp;
1357 return fdp;
1358 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +00001359#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +00001360 path = PySys_GetObject("path");
1361 }
Benjamin Petersond968e272008-11-05 22:48:33 +00001362
Guido van Rossum79f25d91997-04-29 20:08:16 +00001363 if (path == NULL || !PyList_Check(path)) {
1364 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +00001365 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001366 return NULL;
1367 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001368
1369 path_hooks = PySys_GetObject("path_hooks");
1370 if (path_hooks == NULL || !PyList_Check(path_hooks)) {
1371 PyErr_SetString(PyExc_ImportError,
1372 "sys.path_hooks must be a list of "
1373 "import hooks");
1374 return NULL;
1375 }
1376 path_importer_cache = PySys_GetObject("path_importer_cache");
1377 if (path_importer_cache == NULL ||
1378 !PyDict_Check(path_importer_cache)) {
1379 PyErr_SetString(PyExc_ImportError,
1380 "sys.path_importer_cache must be a dict");
1381 return NULL;
1382 }
1383
Guido van Rossum79f25d91997-04-29 20:08:16 +00001384 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001385 namelen = strlen(name);
1386 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001387 PyObject *v = PyList_GetItem(path, i);
Guido van Rossumf15a29f2007-05-04 00:41:39 +00001388 PyObject *origv = v;
Guido van Rossum6262cc72007-05-09 23:29:27 +00001389 const char *base;
Guido van Rossumf15a29f2007-05-04 00:41:39 +00001390 Py_ssize_t size;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001391 if (!v)
1392 return NULL;
Guido van Rossuma4b8d1d2007-08-27 15:02:28 +00001393 if (PyUnicode_Check(v)) {
Amaury Forgeot d'Arcf1ca0b12008-06-11 17:40:47 +00001394 v = PyUnicode_AsEncodedString(v,
1395 Py_FileSystemDefaultEncoding, NULL);
Guido van Rossuma4b8d1d2007-08-27 15:02:28 +00001396 if (v == NULL)
1397 return NULL;
1398 }
Amaury Forgeot d'Arcf1ca0b12008-06-11 17:40:47 +00001399 else if (!PyBytes_Check(v))
Guido van Rossuma4b8d1d2007-08-27 15:02:28 +00001400 continue;
Amaury Forgeot d'Arcf1ca0b12008-06-11 17:40:47 +00001401 else
1402 Py_INCREF(v);
1403
Christian Heimes72b710a2008-05-26 13:28:38 +00001404 base = PyBytes_AS_STRING(v);
1405 size = PyBytes_GET_SIZE(v);
Guido van Rossumf15a29f2007-05-04 00:41:39 +00001406 len = size;
Walter Dörwald3430d702002-06-17 10:43:59 +00001407 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen) {
Amaury Forgeot d'Arcf1ca0b12008-06-11 17:40:47 +00001408 Py_DECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001409 continue; /* Too long */
Walter Dörwald3430d702002-06-17 10:43:59 +00001410 }
Guido van Rossumf15a29f2007-05-04 00:41:39 +00001411 strcpy(buf, base);
Amaury Forgeot d'Arcf1ca0b12008-06-11 17:40:47 +00001412 Py_DECREF(v);
1413
Walter Dörwald3430d702002-06-17 10:43:59 +00001414 if (strlen(buf) != len) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001415 continue; /* v contains '\0' */
Walter Dörwald3430d702002-06-17 10:43:59 +00001416 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001417
1418 /* sys.path_hooks import hook */
1419 if (p_loader != NULL) {
1420 PyObject *importer;
1421
1422 importer = get_path_importer(path_importer_cache,
Guido van Rossumf15a29f2007-05-04 00:41:39 +00001423 path_hooks, origv);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001424 if (importer == NULL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001425 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001426 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001427 /* Note: importer is a borrowed reference */
1428 if (importer != Py_None) {
Just van Rossum52e14d62002-12-30 22:08:05 +00001429 PyObject *loader;
1430 loader = PyObject_CallMethod(importer,
1431 "find_module",
1432 "s", fullname);
1433 if (loader == NULL)
1434 return NULL; /* error */
1435 if (loader != Py_None) {
1436 /* a loader was found */
1437 *p_loader = loader;
1438 return &importhookdescr;
1439 }
1440 Py_DECREF(loader);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001441 continue;
Just van Rossum52e14d62002-12-30 22:08:05 +00001442 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001443 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001444 /* no hook was found, use builtin import */
Just van Rossum52e14d62002-12-30 22:08:05 +00001445
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001446 if (len > 0 && buf[len-1] != SEP
1447#ifdef ALTSEP
1448 && buf[len-1] != ALTSEP
1449#endif
1450 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001451 buf[len++] = SEP;
Guido van Rossum215c3402000-11-13 17:26:32 +00001452 strcpy(buf+len, name);
1453 len += namelen;
Tim Peters50d8d372001-02-28 05:34:27 +00001454
1455 /* Check for package import (buf holds a directory name,
1456 and there's an __init__ module in that directory */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001457#ifdef HAVE_STAT
Walter Dörwald3430d702002-06-17 10:43:59 +00001458 if (stat(buf, &statbuf) == 0 && /* it exists */
1459 S_ISDIR(statbuf.st_mode) && /* it's a directory */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001460 case_ok(buf, len, namelen, name)) { /* case matches */
1461 if (find_init_module(buf)) { /* and has __init__.py */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001462 return &fd_package;
1463 }
1464 else {
1465 char warnstr[MAXPATHLEN+80];
1466 sprintf(warnstr, "Not importing directory "
1467 "'%.*s': missing __init__.py",
1468 MAXPATHLEN, buf);
Skip Montanaro46fc3372007-08-12 11:44:53 +00001469 if (PyErr_WarnEx(PyExc_ImportWarning,
1470 warnstr, 1)) {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001471 return NULL;
1472 }
1473 }
Walter Dörwald3430d702002-06-17 10:43:59 +00001474 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001475#endif
Andrew MacIntyred9400542002-02-26 11:41:34 +00001476#if defined(PYOS_OS2)
1477 /* take a snapshot of the module spec for restoration
1478 * after the 8 character DLL hackery
1479 */
1480 saved_buf = strdup(buf);
1481 saved_len = len;
1482 saved_namelen = namelen;
1483#endif /* PYOS_OS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001484 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum04110fb2007-08-24 16:32:05 +00001485#if defined(PYOS_OS2) && defined(HAVE_DYNAMIC_LOADING)
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001486 /* OS/2 limits DLLs to 8 character names (w/o
1487 extension)
Andrew MacIntyred9400542002-02-26 11:41:34 +00001488 * so if the name is longer than that and its a
1489 * dynamically loaded module we're going to try,
1490 * truncate the name before trying
1491 */
Just van Rossum52e14d62002-12-30 22:08:05 +00001492 if (strlen(subname) > 8) {
Andrew MacIntyred9400542002-02-26 11:41:34 +00001493 /* is this an attempt to load a C extension? */
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001494 const struct filedescr *scan;
1495 scan = _PyImport_DynLoadFiletab;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001496 while (scan->suffix != NULL) {
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001497 if (!strcmp(scan->suffix, fdp->suffix))
Andrew MacIntyred9400542002-02-26 11:41:34 +00001498 break;
1499 else
1500 scan++;
1501 }
1502 if (scan->suffix != NULL) {
1503 /* yes, so truncate the name */
1504 namelen = 8;
Just van Rossum52e14d62002-12-30 22:08:05 +00001505 len -= strlen(subname) - namelen;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001506 buf[len] = '\0';
1507 }
1508 }
1509#endif /* PYOS_OS2 */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001510 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001511 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001512 PySys_WriteStderr("# trying %s\n", buf);
Jack Jansenc88da1f2002-05-28 10:58:19 +00001513 filemode = fdp->mode;
Tim Peters86c7d2f2004-08-01 23:24:21 +00001514 if (filemode[0] == 'U')
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001515 filemode = "r" PY_STDIOTEXTMODE;
Jack Jansenc88da1f2002-05-28 10:58:19 +00001516 fp = fopen(buf, filemode);
Tim Peters50d8d372001-02-28 05:34:27 +00001517 if (fp != NULL) {
1518 if (case_ok(buf, len, namelen, name))
1519 break;
1520 else { /* continue search */
1521 fclose(fp);
1522 fp = NULL;
Barry Warsaw914a0b12001-02-02 19:12:16 +00001523 }
Barry Warsaw914a0b12001-02-02 19:12:16 +00001524 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001525#if defined(PYOS_OS2)
1526 /* restore the saved snapshot */
1527 strcpy(buf, saved_buf);
1528 len = saved_len;
1529 namelen = saved_namelen;
1530#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001531 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001532#if defined(PYOS_OS2)
1533 /* don't need/want the module name snapshot anymore */
1534 if (saved_buf)
1535 {
1536 free(saved_buf);
1537 saved_buf = NULL;
1538 }
1539#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001540 if (fp != NULL)
1541 break;
1542 }
1543 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001544 PyErr_Format(PyExc_ImportError,
1545 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001546 return NULL;
1547 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001548 *p_fp = fp;
1549 return fdp;
1550}
1551
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +00001552/* Helpers for main.c
1553 * Find the source file corresponding to a named module
1554 */
1555struct filedescr *
1556_PyImport_FindModule(const char *name, PyObject *path, char *buf,
1557 size_t buflen, FILE **p_fp, PyObject **p_loader)
1558{
1559 return find_module((char *) name, (char *) name, path,
1560 buf, buflen, p_fp, p_loader);
1561}
1562
1563PyAPI_FUNC(int) _PyImport_IsScript(struct filedescr * fd)
1564{
1565 return fd->type == PY_SOURCE || fd->type == PY_COMPILED;
1566}
1567
Martin v. Löwis18e16552006-02-15 17:27:45 +00001568/* case_ok(char* buf, Py_ssize_t len, Py_ssize_t namelen, char* name)
Tim Petersd1e87a82001-03-01 18:12:00 +00001569 * The arguments here are tricky, best shown by example:
1570 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1571 * ^ ^ ^ ^
1572 * |--------------------- buf ---------------------|
1573 * |------------------- len ------------------|
1574 * |------ name -------|
1575 * |----- namelen -----|
1576 * buf is the full path, but len only counts up to (& exclusive of) the
1577 * extension. name is the module name, also exclusive of extension.
1578 *
1579 * We've already done a successful stat() or fopen() on buf, so know that
1580 * there's some match, possibly case-insensitive.
1581 *
Tim Peters50d8d372001-02-28 05:34:27 +00001582 * case_ok() is to return 1 if there's a case-sensitive match for
1583 * name, else 0. case_ok() is also to return 1 if envar PYTHONCASEOK
1584 * exists.
Tim Petersd1e87a82001-03-01 18:12:00 +00001585 *
Tim Peters50d8d372001-02-28 05:34:27 +00001586 * case_ok() is used to implement case-sensitive import semantics even
1587 * on platforms with case-insensitive filesystems. It's trivial to implement
1588 * for case-sensitive filesystems. It's pretty much a cross-platform
1589 * nightmare for systems with case-insensitive filesystems.
1590 */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001591
Tim Peters50d8d372001-02-28 05:34:27 +00001592/* First we may need a pile of platform-specific header files; the sequence
1593 * of #if's here should match the sequence in the body of case_ok().
1594 */
Jason Tishler7961aa62005-05-20 00:56:54 +00001595#if defined(MS_WINDOWS)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001596#include <windows.h>
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001597
Tim Peters50d8d372001-02-28 05:34:27 +00001598#elif defined(DJGPP)
1599#include <dir.h>
1600
Jason Tishler7961aa62005-05-20 00:56:54 +00001601#elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001602#include <sys/types.h>
1603#include <dirent.h>
1604
Andrew MacIntyred9400542002-02-26 11:41:34 +00001605#elif defined(PYOS_OS2)
1606#define INCL_DOS
1607#define INCL_DOSERRORS
1608#define INCL_NOPMAPI
1609#include <os2.h>
Tim Peters50d8d372001-02-28 05:34:27 +00001610#endif
1611
Guido van Rossum0980bd91998-02-13 17:18:36 +00001612static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001613case_ok(char *buf, Py_ssize_t len, Py_ssize_t namelen, char *name)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001614{
Tim Peters50d8d372001-02-28 05:34:27 +00001615/* Pick a platform-specific implementation; the sequence of #if's here should
1616 * match the sequence just above.
1617 */
1618
Jason Tishler7961aa62005-05-20 00:56:54 +00001619/* MS_WINDOWS */
1620#if defined(MS_WINDOWS)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001621 WIN32_FIND_DATA data;
1622 HANDLE h;
Tim Peters50d8d372001-02-28 05:34:27 +00001623
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001624 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001625 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001626
Guido van Rossum0980bd91998-02-13 17:18:36 +00001627 h = FindFirstFile(buf, &data);
1628 if (h == INVALID_HANDLE_VALUE) {
1629 PyErr_Format(PyExc_NameError,
1630 "Can't find file for module %.100s\n(filename %.300s)",
1631 name, buf);
1632 return 0;
1633 }
1634 FindClose(h);
Tim Peters50d8d372001-02-28 05:34:27 +00001635 return strncmp(data.cFileName, name, namelen) == 0;
1636
1637/* DJGPP */
1638#elif defined(DJGPP)
1639 struct ffblk ffblk;
1640 int done;
1641
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001642 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001643 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001644
1645 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
1646 if (done) {
Guido van Rossum0980bd91998-02-13 17:18:36 +00001647 PyErr_Format(PyExc_NameError,
Tim Peters50d8d372001-02-28 05:34:27 +00001648 "Can't find file for module %.100s\n(filename %.300s)",
Guido van Rossum0980bd91998-02-13 17:18:36 +00001649 name, buf);
1650 return 0;
1651 }
Tim Peters50d8d372001-02-28 05:34:27 +00001652 return strncmp(ffblk.ff_name, name, namelen) == 0;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001653
Jason Tishler7961aa62005-05-20 00:56:54 +00001654/* new-fangled macintosh (macosx) or Cygwin */
1655#elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001656 DIR *dirp;
1657 struct dirent *dp;
Tim Petersd1e87a82001-03-01 18:12:00 +00001658 char dirname[MAXPATHLEN + 1];
1659 const int dirlen = len - namelen - 1; /* don't want trailing SEP */
Tim Peters430f5d42001-03-01 01:30:56 +00001660
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001661 if (Py_GETENV("PYTHONCASEOK") != NULL)
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001662 return 1;
1663
Tim Petersd1e87a82001-03-01 18:12:00 +00001664 /* Copy the dir component into dirname; substitute "." if empty */
1665 if (dirlen <= 0) {
1666 dirname[0] = '.';
1667 dirname[1] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001668 }
1669 else {
Tim Petersd1e87a82001-03-01 18:12:00 +00001670 assert(dirlen <= MAXPATHLEN);
1671 memcpy(dirname, buf, dirlen);
1672 dirname[dirlen] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001673 }
1674 /* Open the directory and search the entries for an exact match. */
Tim Petersd1e87a82001-03-01 18:12:00 +00001675 dirp = opendir(dirname);
Tim Peters430f5d42001-03-01 01:30:56 +00001676 if (dirp) {
Tim Peters677898a2001-03-02 03:28:03 +00001677 char *nameWithExt = buf + len - namelen;
Tim Peters430f5d42001-03-01 01:30:56 +00001678 while ((dp = readdir(dirp)) != NULL) {
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001679 const int thislen =
Tim Peters430f5d42001-03-01 01:30:56 +00001680#ifdef _DIRENT_HAVE_D_NAMELEN
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001681 dp->d_namlen;
Tim Peters430f5d42001-03-01 01:30:56 +00001682#else
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001683 strlen(dp->d_name);
Tim Peters430f5d42001-03-01 01:30:56 +00001684#endif
Tim Petersd1e87a82001-03-01 18:12:00 +00001685 if (thislen >= namelen &&
Tim Peters677898a2001-03-02 03:28:03 +00001686 strcmp(dp->d_name, nameWithExt) == 0) {
Tim Peters430f5d42001-03-01 01:30:56 +00001687 (void)closedir(dirp);
1688 return 1; /* Found */
1689 }
1690 }
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001691 (void)closedir(dirp);
Tim Peters430f5d42001-03-01 01:30:56 +00001692 }
Tim Peters430f5d42001-03-01 01:30:56 +00001693 return 0 ; /* Not found */
Tim Peters430f5d42001-03-01 01:30:56 +00001694
Andrew MacIntyred9400542002-02-26 11:41:34 +00001695/* OS/2 */
1696#elif defined(PYOS_OS2)
1697 HDIR hdir = 1;
1698 ULONG srchcnt = 1;
1699 FILEFINDBUF3 ffbuf;
1700 APIRET rc;
1701
Christian Heimes790c8232008-01-07 21:14:23 +00001702 if (Py_GETENV("PYTHONCASEOK") != NULL)
Andrew MacIntyred9400542002-02-26 11:41:34 +00001703 return 1;
1704
1705 rc = DosFindFirst(buf,
1706 &hdir,
1707 FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY,
1708 &ffbuf, sizeof(ffbuf),
1709 &srchcnt,
1710 FIL_STANDARD);
1711 if (rc != NO_ERROR)
1712 return 0;
1713 return strncmp(ffbuf.achName, name, namelen) == 0;
1714
Tim Peters50d8d372001-02-28 05:34:27 +00001715/* assuming it's a case-sensitive filesystem, so there's nothing to do! */
1716#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001717 return 1;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001718
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001719#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001720}
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001721
Guido van Rossum0980bd91998-02-13 17:18:36 +00001722
Guido van Rossum197346f1997-10-31 18:38:52 +00001723#ifdef HAVE_STAT
1724/* Helper to look for __init__.py or __init__.py[co] in potential package */
1725static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001726find_init_module(char *buf)
Guido van Rossum197346f1997-10-31 18:38:52 +00001727{
Tim Peters0f9431f2001-07-05 03:47:53 +00001728 const size_t save_len = strlen(buf);
Fred Drake4c82b232000-06-30 16:18:57 +00001729 size_t i = save_len;
Tim Peters0f9431f2001-07-05 03:47:53 +00001730 char *pname; /* pointer to start of __init__ */
Guido van Rossum197346f1997-10-31 18:38:52 +00001731 struct stat statbuf;
1732
Tim Peters0f9431f2001-07-05 03:47:53 +00001733/* For calling case_ok(buf, len, namelen, name):
1734 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1735 * ^ ^ ^ ^
1736 * |--------------------- buf ---------------------|
1737 * |------------------- len ------------------|
1738 * |------ name -------|
1739 * |----- namelen -----|
1740 */
Guido van Rossum197346f1997-10-31 18:38:52 +00001741 if (save_len + 13 >= MAXPATHLEN)
1742 return 0;
1743 buf[i++] = SEP;
Tim Peters0f9431f2001-07-05 03:47:53 +00001744 pname = buf + i;
1745 strcpy(pname, "__init__.py");
Guido van Rossum197346f1997-10-31 18:38:52 +00001746 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001747 if (case_ok(buf,
1748 save_len + 9, /* len("/__init__") */
1749 8, /* len("__init__") */
1750 pname)) {
1751 buf[save_len] = '\0';
1752 return 1;
1753 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001754 }
Tim Peters0f9431f2001-07-05 03:47:53 +00001755 i += strlen(pname);
1756 strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum197346f1997-10-31 18:38:52 +00001757 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001758 if (case_ok(buf,
1759 save_len + 9, /* len("/__init__") */
1760 8, /* len("__init__") */
1761 pname)) {
1762 buf[save_len] = '\0';
1763 return 1;
1764 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001765 }
1766 buf[save_len] = '\0';
1767 return 0;
1768}
Guido van Rossum48a680c2001-03-02 06:34:14 +00001769
Guido van Rossum197346f1997-10-31 18:38:52 +00001770#endif /* HAVE_STAT */
1771
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001772
Tim Petersdbd9ba62000-07-09 03:09:57 +00001773static int init_builtin(char *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001774
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001775/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001776 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001777
Guido van Rossum79f25d91997-04-29 20:08:16 +00001778static PyObject *
Just van Rossum52e14d62002-12-30 22:08:05 +00001779load_module(char *name, FILE *fp, char *buf, int type, PyObject *loader)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001780{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001781 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001782 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001783 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001784
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001785 /* First check that there's an open file (if we need one) */
1786 switch (type) {
1787 case PY_SOURCE:
1788 case PY_COMPILED:
1789 if (fp == NULL) {
1790 PyErr_Format(PyExc_ValueError,
1791 "file object required for import (type code %d)",
1792 type);
1793 return NULL;
1794 }
1795 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001796
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001797 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001798
1799 case PY_SOURCE:
1800 m = load_source_module(name, buf, fp);
1801 break;
1802
1803 case PY_COMPILED:
1804 m = load_compiled_module(name, buf, fp);
1805 break;
1806
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001807#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001808 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001809 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001810 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001811#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001812
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001813 case PKG_DIRECTORY:
1814 m = load_package(name, buf);
1815 break;
1816
1817 case C_BUILTIN:
1818 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001819 if (buf != NULL && buf[0] != '\0')
1820 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001821 if (type == C_BUILTIN)
1822 err = init_builtin(name);
1823 else
1824 err = PyImport_ImportFrozenModule(name);
1825 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001826 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001827 if (err == 0) {
1828 PyErr_Format(PyExc_ImportError,
1829 "Purported %s module %.200s not found",
1830 type == C_BUILTIN ?
1831 "builtin" : "frozen",
1832 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001833 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001834 }
1835 modules = PyImport_GetModuleDict();
1836 m = PyDict_GetItemString(modules, name);
1837 if (m == NULL) {
1838 PyErr_Format(
1839 PyExc_ImportError,
1840 "%s module %.200s not properly initialized",
1841 type == C_BUILTIN ?
1842 "builtin" : "frozen",
1843 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001844 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001845 }
1846 Py_INCREF(m);
1847 break;
1848
Just van Rossum52e14d62002-12-30 22:08:05 +00001849 case IMP_HOOK: {
1850 if (loader == NULL) {
1851 PyErr_SetString(PyExc_ImportError,
1852 "import hook without loader");
1853 return NULL;
1854 }
1855 m = PyObject_CallMethod(loader, "load_module", "s", name);
1856 break;
1857 }
1858
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001859 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001860 PyErr_Format(PyExc_ImportError,
1861 "Don't know how to import %.200s (type code %d)",
1862 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001863 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001864
1865 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001866
1867 return m;
1868}
1869
1870
1871/* Initialize a built-in module.
Thomas Wouters89f507f2006-12-13 04:49:30 +00001872 Return 1 for success, 0 if the module is not found, and -1 with
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001873 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001874
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001875static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001876init_builtin(char *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001877{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001878 struct _inittab *p;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001879
Greg Ward201baee2001-10-04 14:52:06 +00001880 if (_PyImport_FindExtension(name, name) != NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00001881 return 1;
1882
Guido van Rossum771c6c81997-10-31 18:37:24 +00001883 for (p = PyImport_Inittab; p->name != NULL; p++) {
Martin v. Löwis1a214512008-06-11 05:26:20 +00001884 PyObject *mod;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001885 if (strcmp(name, p->name) == 0) {
1886 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001887 PyErr_Format(PyExc_ImportError,
1888 "Cannot re-init internal module %.200s",
1889 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001890 return -1;
1891 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001892 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001893 PySys_WriteStderr("import %s # builtin\n", name);
Martin v. Löwis1a214512008-06-11 05:26:20 +00001894 mod = (*p->initfunc)();
1895 if (mod == 0)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001896 return -1;
Martin v. Löwis1a214512008-06-11 05:26:20 +00001897 if (_PyImport_FixupExtension(mod, name, name) < 0)
Guido van Rossum25ce5661997-08-02 03:10:38 +00001898 return -1;
Martin v. Löwis1a214512008-06-11 05:26:20 +00001899 /* FixupExtension has put the module into sys.modules,
1900 so we can release our own reference. */
1901 Py_DECREF(mod);
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001902 return 1;
1903 }
1904 }
1905 return 0;
1906}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001907
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001908
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001909/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001910
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001911static struct _frozen *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001912find_frozen(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001913{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001914 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001915
Benjamin Petersond968e272008-11-05 22:48:33 +00001916 if (!name)
1917 return NULL;
1918
Guido van Rossum79f25d91997-04-29 20:08:16 +00001919 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001920 if (p->name == NULL)
1921 return NULL;
1922 if (strcmp(p->name, name) == 0)
1923 break;
1924 }
1925 return p;
1926}
1927
Guido van Rossum79f25d91997-04-29 20:08:16 +00001928static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001929get_frozen_object(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001930{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001931 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001932 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001933
1934 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001935 PyErr_Format(PyExc_ImportError,
1936 "No such frozen object named %.200s",
1937 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001938 return NULL;
1939 }
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001940 if (p->code == NULL) {
1941 PyErr_Format(PyExc_ImportError,
1942 "Excluded frozen object named %.200s",
1943 name);
1944 return NULL;
1945 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001946 size = p->size;
1947 if (size < 0)
1948 size = -size;
1949 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001950}
1951
1952/* Initialize a frozen module.
1953 Return 1 for succes, 0 if the module is not found, and -1 with
1954 an exception set if the initialization failed.
1955 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001956
1957int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001958PyImport_ImportFrozenModule(char *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001959{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001960 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001961 PyObject *co;
1962 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001963 int ispackage;
1964 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001965
1966 if (p == NULL)
1967 return 0;
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001968 if (p->code == NULL) {
1969 PyErr_Format(PyExc_ImportError,
1970 "Excluded frozen object named %.200s",
1971 name);
1972 return -1;
1973 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001974 size = p->size;
1975 ispackage = (size < 0);
1976 if (ispackage)
1977 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001978 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001979 PySys_WriteStderr("import %s # frozen%s\n",
Guido van Rossuma5568d31998-03-05 03:45:08 +00001980 name, ispackage ? " package" : "");
1981 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001982 if (co == NULL)
1983 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001984 if (!PyCode_Check(co)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001985 PyErr_Format(PyExc_TypeError,
1986 "frozen object %.200s is not a code object",
1987 name);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001988 goto err_return;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001989 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001990 if (ispackage) {
1991 /* Set __path__ to the package name */
Benjamin Petersond968e272008-11-05 22:48:33 +00001992 PyObject *d, *s, *l;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001993 int err;
1994 m = PyImport_AddModule(name);
1995 if (m == NULL)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001996 goto err_return;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001997 d = PyModule_GetDict(m);
Martin v. Löwis5b222132007-06-10 09:51:05 +00001998 s = PyUnicode_InternFromString(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001999 if (s == NULL)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002000 goto err_return;
Benjamin Petersond968e272008-11-05 22:48:33 +00002001 l = PyList_New(1);
2002 if (l == NULL) {
2003 Py_DECREF(s);
2004 goto err_return;
2005 }
2006 PyList_SET_ITEM(l, 0, s);
2007 err = PyDict_SetItemString(d, "__path__", l);
2008 Py_DECREF(l);
Guido van Rossuma5568d31998-03-05 03:45:08 +00002009 if (err != 0)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002010 goto err_return;
Guido van Rossuma5568d31998-03-05 03:45:08 +00002011 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00002012 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum7f9fa971995-01-20 16:53:12 +00002013 if (m == NULL)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002014 goto err_return;
2015 Py_DECREF(co);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002016 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00002017 return 1;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002018err_return:
2019 Py_DECREF(co);
2020 return -1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00002021}
Guido van Rossum74e6a111994-08-29 12:54:38 +00002022
2023
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002024/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00002025 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00002026
Guido van Rossum79f25d91997-04-29 20:08:16 +00002027PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00002028PyImport_ImportModule(const char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00002029{
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00002030 PyObject *pname;
2031 PyObject *result;
2032
Martin v. Löwis5b222132007-06-10 09:51:05 +00002033 pname = PyUnicode_FromString(name);
Neal Norwitza11e4c12003-03-23 14:31:01 +00002034 if (pname == NULL)
2035 return NULL;
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00002036 result = PyImport_Import(pname);
2037 Py_DECREF(pname);
2038 return result;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002039}
2040
Christian Heimes072c0f12008-01-03 23:01:04 +00002041/* Import a module without blocking
2042 *
2043 * At first it tries to fetch the module from sys.modules. If the module was
2044 * never loaded before it loads it with PyImport_ImportModule() unless another
2045 * thread holds the import lock. In the latter case the function raises an
2046 * ImportError instead of blocking.
2047 *
2048 * Returns the module object with incremented ref count.
2049 */
2050PyObject *
2051PyImport_ImportModuleNoBlock(const char *name)
2052{
2053 PyObject *result;
2054 PyObject *modules;
2055 long me;
2056
2057 /* Try to get the module from sys.modules[name] */
2058 modules = PyImport_GetModuleDict();
2059 if (modules == NULL)
2060 return NULL;
2061
2062 result = PyDict_GetItemString(modules, name);
2063 if (result != NULL) {
2064 Py_INCREF(result);
2065 return result;
2066 }
2067 else {
2068 PyErr_Clear();
2069 }
Benjamin Peterson3e4f0552008-09-02 00:31:15 +00002070#ifdef WITH_THREAD
Christian Heimes072c0f12008-01-03 23:01:04 +00002071 /* check the import lock
2072 * me might be -1 but I ignore the error here, the lock function
2073 * takes care of the problem */
2074 me = PyThread_get_thread_ident();
2075 if (import_lock_thread == -1 || import_lock_thread == me) {
2076 /* no thread or me is holding the lock */
2077 return PyImport_ImportModule(name);
2078 }
2079 else {
2080 PyErr_Format(PyExc_ImportError,
2081 "Failed to import %.200s because the import lock"
2082 "is held by another thread.",
2083 name);
2084 return NULL;
2085 }
Benjamin Peterson3e4f0552008-09-02 00:31:15 +00002086#else
2087 return PyImport_ImportModule(name);
2088#endif
Christian Heimes072c0f12008-01-03 23:01:04 +00002089}
2090
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002091/* Forward declarations for helper routines */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002092static PyObject *get_parent(PyObject *globals, char *buf,
2093 Py_ssize_t *p_buflen, int level);
Tim Petersdbd9ba62000-07-09 03:09:57 +00002094static PyObject *load_next(PyObject *mod, PyObject *altmod,
Martin v. Löwis18e16552006-02-15 17:27:45 +00002095 char **p_name, char *buf, Py_ssize_t *p_buflen);
Tim Petersdbd9ba62000-07-09 03:09:57 +00002096static int mark_miss(char *name);
2097static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
Martin v. Löwis18e16552006-02-15 17:27:45 +00002098 char *buf, Py_ssize_t buflen, int recursive);
Tim Petersdbd9ba62000-07-09 03:09:57 +00002099static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002100
2101/* The Magnum Opus of dotted-name import :-) */
2102
Guido van Rossum75acc9c1998-03-03 22:26:50 +00002103static PyObject *
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002104import_module_level(char *name, PyObject *globals, PyObject *locals,
2105 PyObject *fromlist, int level)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002106{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002107 char buf[MAXPATHLEN+1];
Martin v. Löwis18e16552006-02-15 17:27:45 +00002108 Py_ssize_t buflen = 0;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002109 PyObject *parent, *head, *next, *tail;
2110
Christian Heimes454f37b2008-01-10 00:10:02 +00002111 if (strchr(name, '/') != NULL
2112#ifdef MS_WINDOWS
2113 || strchr(name, '\\') != NULL
2114#endif
2115 ) {
2116 PyErr_SetString(PyExc_ImportError,
2117 "Import by filename is not supported.");
2118 return NULL;
2119 }
2120
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002121 parent = get_parent(globals, buf, &buflen, level);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002122 if (parent == NULL)
2123 return NULL;
2124
2125 head = load_next(parent, Py_None, &name, buf, &buflen);
2126 if (head == NULL)
2127 return NULL;
2128
2129 tail = head;
2130 Py_INCREF(tail);
2131 while (name) {
2132 next = load_next(tail, tail, &name, buf, &buflen);
2133 Py_DECREF(tail);
2134 if (next == NULL) {
2135 Py_DECREF(head);
2136 return NULL;
2137 }
2138 tail = next;
2139 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002140 if (tail == Py_None) {
2141 /* If tail is Py_None, both get_parent and load_next found
2142 an empty module name: someone called __import__("") or
2143 doctored faulty bytecode */
2144 Py_DECREF(tail);
2145 Py_DECREF(head);
2146 PyErr_SetString(PyExc_ValueError,
2147 "Empty module name");
2148 return NULL;
2149 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002150
2151 if (fromlist != NULL) {
2152 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
2153 fromlist = NULL;
2154 }
2155
2156 if (fromlist == NULL) {
2157 Py_DECREF(tail);
2158 return head;
2159 }
2160
2161 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00002162 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002163 Py_DECREF(tail);
2164 return NULL;
2165 }
2166
2167 return tail;
2168}
2169
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002170PyObject *
2171PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals,
2172 PyObject *fromlist, int level)
2173{
2174 PyObject *result;
2175 lock_import();
2176 result = import_module_level(name, globals, locals, fromlist, level);
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00002177 if (unlock_import() < 0) {
2178 Py_XDECREF(result);
2179 PyErr_SetString(PyExc_RuntimeError,
2180 "not holding the import lock");
2181 return NULL;
2182 }
Guido van Rossum75acc9c1998-03-03 22:26:50 +00002183 return result;
2184}
2185
Fred Drake87590902004-05-28 20:21:36 +00002186/* Return the package that an import is being performed in. If globals comes
2187 from the module foo.bar.bat (not itself a package), this returns the
2188 sys.modules entry for foo.bar. If globals is from a package's __init__.py,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002189 the package's entry in sys.modules is returned, as a borrowed reference.
Fred Drake87590902004-05-28 20:21:36 +00002190
2191 The *name* of the returned package is returned in buf, with the length of
2192 the name in *p_buflen.
2193
2194 If globals doesn't come from a package or a module in a package, or a
2195 corresponding entry is not found in sys.modules, Py_None is returned.
2196*/
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002197static PyObject *
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002198get_parent(PyObject *globals, char *buf, Py_ssize_t *p_buflen, int level)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002199{
2200 static PyObject *namestr = NULL;
2201 static PyObject *pathstr = NULL;
Nick Coghlande10c852007-12-04 12:22:52 +00002202 static PyObject *pkgstr = NULL;
2203 PyObject *pkgname, *modname, *modpath, *modules, *parent;
Georg Brandl2ee470f2008-07-16 12:55:28 +00002204 int orig_level = level;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002205
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002206 if (globals == NULL || !PyDict_Check(globals) || !level)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002207 return Py_None;
2208
2209 if (namestr == NULL) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00002210 namestr = PyUnicode_InternFromString("__name__");
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002211 if (namestr == NULL)
2212 return NULL;
2213 }
2214 if (pathstr == NULL) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00002215 pathstr = PyUnicode_InternFromString("__path__");
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002216 if (pathstr == NULL)
2217 return NULL;
2218 }
Nick Coghlande10c852007-12-04 12:22:52 +00002219 if (pkgstr == NULL) {
2220 pkgstr = PyUnicode_InternFromString("__package__");
2221 if (pkgstr == NULL)
2222 return NULL;
2223 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002224
2225 *buf = '\0';
2226 *p_buflen = 0;
Nick Coghlande10c852007-12-04 12:22:52 +00002227 pkgname = PyDict_GetItem(globals, pkgstr);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002228
Nick Coghlande10c852007-12-04 12:22:52 +00002229 if ((pkgname != NULL) && (pkgname != Py_None)) {
2230 /* __package__ is set, so use it */
Alexandre Vassalottia85998a2008-05-03 18:24:43 +00002231 char *pkgname_str;
Nick Coghlande10c852007-12-04 12:22:52 +00002232 Py_ssize_t len;
Alexandre Vassalottia85998a2008-05-03 18:24:43 +00002233
Nick Coghlande10c852007-12-04 12:22:52 +00002234 if (!PyUnicode_Check(pkgname)) {
2235 PyErr_SetString(PyExc_ValueError,
2236 "__package__ set to non-string");
2237 return NULL;
2238 }
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00002239 pkgname_str = _PyUnicode_AsStringAndSize(pkgname, &len);
Nick Coghlande10c852007-12-04 12:22:52 +00002240 if (len == 0) {
2241 if (level > 0) {
2242 PyErr_SetString(PyExc_ValueError,
2243 "Attempted relative import in non-package");
2244 return NULL;
2245 }
2246 return Py_None;
2247 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002248 if (len > MAXPATHLEN) {
2249 PyErr_SetString(PyExc_ValueError,
Nick Coghlande10c852007-12-04 12:22:52 +00002250 "Package name too long");
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002251 return NULL;
2252 }
Alexandre Vassalottia85998a2008-05-03 18:24:43 +00002253 strcpy(buf, pkgname_str);
Nick Coghlande10c852007-12-04 12:22:52 +00002254 } else {
2255 /* __package__ not set, so figure it out and set it */
2256 modname = PyDict_GetItem(globals, namestr);
2257 if (modname == NULL || !PyUnicode_Check(modname))
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002258 return Py_None;
Nick Coghlande10c852007-12-04 12:22:52 +00002259
2260 modpath = PyDict_GetItem(globals, pathstr);
2261 if (modpath != NULL) {
2262 /* __path__ is set, so modname is already the package name */
Alexandre Vassalottia85998a2008-05-03 18:24:43 +00002263 char *modname_str;
2264 Py_ssize_t len;
Nick Coghlande10c852007-12-04 12:22:52 +00002265 int error;
Alexandre Vassalottia85998a2008-05-03 18:24:43 +00002266
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00002267 modname_str = _PyUnicode_AsStringAndSize(modname, &len);
Nick Coghlande10c852007-12-04 12:22:52 +00002268 if (len > MAXPATHLEN) {
2269 PyErr_SetString(PyExc_ValueError,
2270 "Module name too long");
2271 return NULL;
2272 }
Alexandre Vassalottia85998a2008-05-03 18:24:43 +00002273 strcpy(buf, modname_str);
Nick Coghlande10c852007-12-04 12:22:52 +00002274 error = PyDict_SetItem(globals, pkgstr, modname);
2275 if (error) {
2276 PyErr_SetString(PyExc_ValueError,
2277 "Could not set __package__");
2278 return NULL;
2279 }
2280 } else {
2281 /* Normal module, so work out the package name if any */
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00002282 char *start = _PyUnicode_AsString(modname);
Nick Coghlande10c852007-12-04 12:22:52 +00002283 char *lastdot = strrchr(start, '.');
2284 size_t len;
2285 int error;
2286 if (lastdot == NULL && level > 0) {
2287 PyErr_SetString(PyExc_ValueError,
2288 "Attempted relative import in non-package");
2289 return NULL;
2290 }
2291 if (lastdot == NULL) {
2292 error = PyDict_SetItem(globals, pkgstr, Py_None);
2293 if (error) {
2294 PyErr_SetString(PyExc_ValueError,
2295 "Could not set __package__");
2296 return NULL;
2297 }
2298 return Py_None;
2299 }
2300 len = lastdot - start;
2301 if (len >= MAXPATHLEN) {
2302 PyErr_SetString(PyExc_ValueError,
2303 "Module name too long");
2304 return NULL;
2305 }
2306 strncpy(buf, start, len);
2307 buf[len] = '\0';
2308 pkgname = PyUnicode_FromString(buf);
2309 if (pkgname == NULL) {
2310 return NULL;
2311 }
2312 error = PyDict_SetItem(globals, pkgstr, pkgname);
2313 Py_DECREF(pkgname);
2314 if (error) {
2315 PyErr_SetString(PyExc_ValueError,
2316 "Could not set __package__");
2317 return NULL;
2318 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002319 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002320 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002321 while (--level > 0) {
2322 char *dot = strrchr(buf, '.');
2323 if (dot == NULL) {
2324 PyErr_SetString(PyExc_ValueError,
Thomas Wouters89f507f2006-12-13 04:49:30 +00002325 "Attempted relative import beyond "
2326 "toplevel package");
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002327 return NULL;
2328 }
2329 *dot = '\0';
2330 }
2331 *p_buflen = strlen(buf);
2332
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002333 modules = PyImport_GetModuleDict();
2334 parent = PyDict_GetItemString(modules, buf);
Georg Brandl2ee470f2008-07-16 12:55:28 +00002335 if (parent == NULL) {
2336 if (orig_level < 1) {
2337 PyObject *err_msg = PyBytes_FromFormat(
2338 "Parent module '%.200s' not found "
2339 "while handling absolute import", buf);
2340 if (err_msg == NULL) {
2341 return NULL;
2342 }
2343 if (!PyErr_WarnEx(PyExc_RuntimeWarning,
2344 PyBytes_AsString(err_msg), 1)) {
2345 *buf = '\0';
2346 *p_buflen = 0;
2347 parent = Py_None;
2348 }
2349 Py_DECREF(err_msg);
2350 } else {
2351 PyErr_Format(PyExc_SystemError,
2352 "Parent module '%.200s' not loaded, "
2353 "cannot perform relative import", buf);
2354 }
2355 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002356 return parent;
2357 /* We expect, but can't guarantee, if parent != None, that:
2358 - parent.__name__ == buf
2359 - parent.__dict__ is globals
2360 If this is violated... Who cares? */
2361}
2362
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002363/* altmod is either None or same as mod */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002364static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002365load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
Martin v. Löwis18e16552006-02-15 17:27:45 +00002366 Py_ssize_t *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002367{
2368 char *name = *p_name;
2369 char *dot = strchr(name, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00002370 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002371 char *p;
2372 PyObject *result;
2373
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002374 if (strlen(name) == 0) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002375 /* completely empty module name should only happen in
2376 'from . import' (or '__import__("")')*/
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002377 Py_INCREF(mod);
2378 *p_name = NULL;
2379 return mod;
2380 }
2381
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002382 if (dot == NULL) {
2383 *p_name = NULL;
2384 len = strlen(name);
2385 }
2386 else {
2387 *p_name = dot+1;
2388 len = dot-name;
2389 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00002390 if (len == 0) {
2391 PyErr_SetString(PyExc_ValueError,
2392 "Empty module name");
2393 return NULL;
2394 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002395
2396 p = buf + *p_buflen;
2397 if (p != buf)
2398 *p++ = '.';
2399 if (p+len-buf >= MAXPATHLEN) {
2400 PyErr_SetString(PyExc_ValueError,
2401 "Module name too long");
2402 return NULL;
2403 }
2404 strncpy(p, name, len);
2405 p[len] = '\0';
2406 *p_buflen = p+len-buf;
2407
2408 result = import_submodule(mod, p, buf);
2409 if (result == Py_None && altmod != mod) {
2410 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00002411 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00002412 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00002413 if (result != NULL && result != Py_None) {
2414 if (mark_miss(buf) != 0) {
2415 Py_DECREF(result);
2416 return NULL;
2417 }
2418 strncpy(buf, name, len);
2419 buf[len] = '\0';
2420 *p_buflen = len;
2421 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002422 }
2423 if (result == NULL)
2424 return NULL;
2425
2426 if (result == Py_None) {
2427 Py_DECREF(result);
2428 PyErr_Format(PyExc_ImportError,
2429 "No module named %.200s", name);
2430 return NULL;
2431 }
2432
2433 return result;
2434}
2435
2436static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002437mark_miss(char *name)
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00002438{
2439 PyObject *modules = PyImport_GetModuleDict();
2440 return PyDict_SetItemString(modules, name, Py_None);
2441}
2442
2443static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002444ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, Py_ssize_t buflen,
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002445 int recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002446{
2447 int i;
2448
2449 if (!PyObject_HasAttrString(mod, "__path__"))
2450 return 1;
2451
2452 for (i = 0; ; i++) {
2453 PyObject *item = PySequence_GetItem(fromlist, i);
2454 int hasit;
2455 if (item == NULL) {
2456 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2457 PyErr_Clear();
2458 return 1;
2459 }
2460 return 0;
2461 }
Martin v. Löwis5b222132007-06-10 09:51:05 +00002462 if (!PyUnicode_Check(item)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002463 PyErr_SetString(PyExc_TypeError,
Neal Norwitz80e7f272007-08-26 06:45:23 +00002464 "Item in ``from list'' not a string");
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002465 Py_DECREF(item);
2466 return 0;
2467 }
Martin v. Löwis5b222132007-06-10 09:51:05 +00002468 if (PyUnicode_AS_UNICODE(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00002469 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002470 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00002471 /* See if the package defines __all__ */
2472 if (recursive)
2473 continue; /* Avoid endless recursion */
2474 all = PyObject_GetAttrString(mod, "__all__");
2475 if (all == NULL)
2476 PyErr_Clear();
2477 else {
Martin v. Löwis83969ee2004-03-23 16:28:13 +00002478 int ret = ensure_fromlist(mod, all, buf, buflen, 1);
Guido van Rossum9905ef91997-09-08 16:07:11 +00002479 Py_DECREF(all);
Martin v. Löwis83969ee2004-03-23 16:28:13 +00002480 if (!ret)
2481 return 0;
Guido van Rossum9905ef91997-09-08 16:07:11 +00002482 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002483 continue;
2484 }
2485 hasit = PyObject_HasAttr(mod, item);
2486 if (!hasit) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00002487 PyObject *item8;
2488 char *subname;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002489 PyObject *submod;
2490 char *p;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002491 if (!Py_FileSystemDefaultEncoding) {
2492 item8 = PyUnicode_EncodeASCII(PyUnicode_AsUnicode(item),
2493 PyUnicode_GetSize(item),
Martin v. Löwis427dbff2007-06-12 05:53:00 +00002494 NULL);
Martin v. Löwis5b222132007-06-10 09:51:05 +00002495 } else {
Guido van Rossum98297ee2007-11-06 21:34:58 +00002496 item8 = PyUnicode_AsEncodedString(item,
2497 Py_FileSystemDefaultEncoding, NULL);
Martin v. Löwis5b222132007-06-10 09:51:05 +00002498 }
2499 if (!item8) {
2500 PyErr_SetString(PyExc_ValueError, "Cannot encode path item");
2501 return 0;
2502 }
Christian Heimes72b710a2008-05-26 13:28:38 +00002503 subname = PyBytes_AS_STRING(item8);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002504 if (buflen + strlen(subname) >= MAXPATHLEN) {
2505 PyErr_SetString(PyExc_ValueError,
2506 "Module name too long");
2507 Py_DECREF(item);
2508 return 0;
2509 }
2510 p = buf + buflen;
2511 *p++ = '.';
2512 strcpy(p, subname);
2513 submod = import_submodule(mod, subname, buf);
Martin v. Löwis5b222132007-06-10 09:51:05 +00002514 Py_DECREF(item8);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002515 Py_XDECREF(submod);
2516 if (submod == NULL) {
2517 Py_DECREF(item);
2518 return 0;
2519 }
2520 }
2521 Py_DECREF(item);
2522 }
2523
Guido van Rossuma7f2e811997-10-03 15:33:32 +00002524 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002525}
2526
Neil Schemenauer00b09662003-06-16 21:03:07 +00002527static int
2528add_submodule(PyObject *mod, PyObject *submod, char *fullname, char *subname,
2529 PyObject *modules)
2530{
2531 if (mod == Py_None)
2532 return 1;
2533 /* Irrespective of the success of this load, make a
2534 reference to it in the parent package module. A copy gets
2535 saved in the modules dictionary under the full name, so get a
2536 reference from there, if need be. (The exception is when the
2537 load failed with a SyntaxError -- then there's no trace in
2538 sys.modules. In that case, of course, do nothing extra.) */
2539 if (submod == NULL) {
2540 submod = PyDict_GetItemString(modules, fullname);
2541 if (submod == NULL)
2542 return 1;
2543 }
2544 if (PyModule_Check(mod)) {
2545 /* We can't use setattr here since it can give a
2546 * spurious warning if the submodule name shadows a
2547 * builtin name */
2548 PyObject *dict = PyModule_GetDict(mod);
2549 if (!dict)
2550 return 0;
2551 if (PyDict_SetItemString(dict, subname, submod) < 0)
2552 return 0;
2553 }
2554 else {
2555 if (PyObject_SetAttrString(mod, subname, submod) < 0)
2556 return 0;
2557 }
2558 return 1;
2559}
2560
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002561static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002562import_submodule(PyObject *mod, char *subname, char *fullname)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002563{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002564 PyObject *modules = PyImport_GetModuleDict();
Neil Schemenauer00b09662003-06-16 21:03:07 +00002565 PyObject *m = NULL;
Guido van Rossum74e6a111994-08-29 12:54:38 +00002566
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002567 /* Require:
2568 if mod == None: subname == fullname
2569 else: mod.__name__ + "." + subname == fullname
2570 */
2571
Tim Peters50d8d372001-02-28 05:34:27 +00002572 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002573 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00002574 }
2575 else {
Just van Rossum52e14d62002-12-30 22:08:05 +00002576 PyObject *path, *loader = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002577 char buf[MAXPATHLEN+1];
2578 struct filedescr *fdp;
2579 FILE *fp = NULL;
2580
Guido van Rossum9c0afe51998-05-19 15:09:05 +00002581 if (mod == Py_None)
2582 path = NULL;
2583 else {
2584 path = PyObject_GetAttrString(mod, "__path__");
2585 if (path == NULL) {
2586 PyErr_Clear();
2587 Py_INCREF(Py_None);
2588 return Py_None;
2589 }
2590 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002591
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002592 buf[0] = '\0';
Just van Rossum52e14d62002-12-30 22:08:05 +00002593 fdp = find_module(fullname, subname, path, buf, MAXPATHLEN+1,
2594 &fp, &loader);
Guido van Rossumb68cd421998-07-01 17:36:26 +00002595 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002596 if (fdp == NULL) {
2597 if (!PyErr_ExceptionMatches(PyExc_ImportError))
2598 return NULL;
2599 PyErr_Clear();
2600 Py_INCREF(Py_None);
2601 return Py_None;
2602 }
Just van Rossum52e14d62002-12-30 22:08:05 +00002603 m = load_module(fullname, fp, buf, fdp->type, loader);
2604 Py_XDECREF(loader);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002605 if (fp)
2606 fclose(fp);
Neil Schemenauer00b09662003-06-16 21:03:07 +00002607 if (!add_submodule(mod, m, fullname, subname, modules)) {
2608 Py_XDECREF(m);
2609 m = NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002610 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00002611 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002612
2613 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00002614}
2615
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002616
2617/* Re-import a module of any kind and return its module object, WITH
2618 INCREMENTED REFERENCE COUNT */
2619
Guido van Rossum79f25d91997-04-29 20:08:16 +00002620PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002621PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002622{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002623 PyInterpreterState *interp = PyThreadState_Get()->interp;
2624 PyObject *modules_reloading = interp->modules_reloading;
Guido van Rossum25ce5661997-08-02 03:10:38 +00002625 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossumd8faa362007-04-27 19:54:29 +00002626 PyObject *path = NULL, *loader = NULL, *existing_m = NULL;
Guido van Rossum222ef561997-09-06 19:41:09 +00002627 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002628 char buf[MAXPATHLEN+1];
2629 struct filedescr *fdp;
2630 FILE *fp = NULL;
Tim Peters1cd70172004-08-02 03:52:12 +00002631 PyObject *newm;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002632
2633 if (modules_reloading == NULL) {
2634 Py_FatalError("PyImport_ReloadModule: "
Guido van Rossume7ba4952007-06-06 23:52:48 +00002635 "no modules_reloading dictionary!");
Guido van Rossumd8faa362007-04-27 19:54:29 +00002636 return NULL;
2637 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002638
Guido van Rossum79f25d91997-04-29 20:08:16 +00002639 if (m == NULL || !PyModule_Check(m)) {
2640 PyErr_SetString(PyExc_TypeError,
2641 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002642 return NULL;
2643 }
Neal Norwitz5616c6d2007-08-26 05:32:41 +00002644 name = (char*)PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002645 if (name == NULL)
2646 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00002647 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002648 PyErr_Format(PyExc_ImportError,
2649 "reload(): module %.200s not in sys.modules",
2650 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002651 return NULL;
2652 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002653 existing_m = PyDict_GetItemString(modules_reloading, name);
2654 if (existing_m != NULL) {
2655 /* Due to a recursive reload, this module is already
2656 being reloaded. */
2657 Py_INCREF(existing_m);
2658 return existing_m;
2659 }
2660 if (PyDict_SetItemString(modules_reloading, name, m) < 0)
2661 return NULL;
2662
Guido van Rossum222ef561997-09-06 19:41:09 +00002663 subname = strrchr(name, '.');
2664 if (subname == NULL)
2665 subname = name;
2666 else {
2667 PyObject *parentname, *parent;
Christian Heimesc4cb3b82007-11-04 12:10:01 +00002668 parentname = PyUnicode_FromStringAndSize(name, (subname-name));
Guido van Rossumd8faa362007-04-27 19:54:29 +00002669 if (parentname == NULL) {
2670 imp_modules_reloading_clear();
Guido van Rossum222ef561997-09-06 19:41:09 +00002671 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002672 }
Guido van Rossum222ef561997-09-06 19:41:09 +00002673 parent = PyDict_GetItem(modules, parentname);
2674 if (parent == NULL) {
2675 PyErr_Format(PyExc_ImportError,
2676 "reload(): parent %.200s not in sys.modules",
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00002677 _PyUnicode_AsString(parentname));
Georg Brandl0c55f292005-09-14 06:56:20 +00002678 Py_DECREF(parentname);
Guido van Rossume7ba4952007-06-06 23:52:48 +00002679 imp_modules_reloading_clear();
Guido van Rossum222ef561997-09-06 19:41:09 +00002680 return NULL;
2681 }
Georg Brandl0c55f292005-09-14 06:56:20 +00002682 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00002683 subname++;
2684 path = PyObject_GetAttrString(parent, "__path__");
2685 if (path == NULL)
2686 PyErr_Clear();
2687 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002688 buf[0] = '\0';
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002689 fdp = find_module(name, subname, path, buf, MAXPATHLEN+1, &fp, &loader);
Guido van Rossum222ef561997-09-06 19:41:09 +00002690 Py_XDECREF(path);
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002691
2692 if (fdp == NULL) {
2693 Py_XDECREF(loader);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002694 imp_modules_reloading_clear();
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002695 return NULL;
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002696 }
2697
2698 newm = load_module(name, fp, buf, fdp->type, loader);
2699 Py_XDECREF(loader);
2700
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002701 if (fp)
2702 fclose(fp);
Tim Peters1cd70172004-08-02 03:52:12 +00002703 if (newm == NULL) {
2704 /* load_module probably removed name from modules because of
2705 * the error. Put back the original module object. We're
2706 * going to return NULL in this case regardless of whether
2707 * replacing name succeeds, so the return value is ignored.
2708 */
2709 PyDict_SetItemString(modules, name, m);
2710 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002711 imp_modules_reloading_clear();
Tim Peters1cd70172004-08-02 03:52:12 +00002712 return newm;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002713}
2714
2715
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002716/* Higher-level import emulator which emulates the "import" statement
2717 more accurately -- it invokes the __import__() function from the
2718 builtins of the current globals. This means that the import is
2719 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00002720 environment, e.g. by "rexec".
2721 A dummy list ["__doc__"] is passed as the 4th argument so that
Neal Norwitz80e7f272007-08-26 06:45:23 +00002722 e.g. PyImport_Import(PyUnicode_FromString("win32com.client.gencache"))
Guido van Rossum6058eb41998-12-21 19:51:00 +00002723 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002724
2725PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002726PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002727{
2728 static PyObject *silly_list = NULL;
2729 static PyObject *builtins_str = NULL;
2730 static PyObject *import_str = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002731 PyObject *globals = NULL;
2732 PyObject *import = NULL;
2733 PyObject *builtins = NULL;
2734 PyObject *r = NULL;
2735
2736 /* Initialize constant string objects */
2737 if (silly_list == NULL) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00002738 import_str = PyUnicode_InternFromString("__import__");
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002739 if (import_str == NULL)
2740 return NULL;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002741 builtins_str = PyUnicode_InternFromString("__builtins__");
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002742 if (builtins_str == NULL)
2743 return NULL;
2744 silly_list = Py_BuildValue("[s]", "__doc__");
2745 if (silly_list == NULL)
2746 return NULL;
2747 }
2748
2749 /* Get the builtins from current globals */
2750 globals = PyEval_GetGlobals();
Guido van Rossum85cd1d62001-02-20 21:43:24 +00002751 if (globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00002752 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002753 builtins = PyObject_GetItem(globals, builtins_str);
2754 if (builtins == NULL)
2755 goto err;
2756 }
2757 else {
2758 /* No globals -- use standard builtins, and fake globals */
2759 PyErr_Clear();
2760
Georg Brandl1a3284e2007-12-02 09:40:06 +00002761 builtins = PyImport_ImportModuleLevel("builtins",
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002762 NULL, NULL, NULL, 0);
Guido van Rossum85cd1d62001-02-20 21:43:24 +00002763 if (builtins == NULL)
2764 return NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002765 globals = Py_BuildValue("{OO}", builtins_str, builtins);
2766 if (globals == NULL)
2767 goto err;
2768 }
2769
2770 /* Get the __import__ function from the builtins */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002771 if (PyDict_Check(builtins)) {
Fred Drakea76ba6e2001-03-06 06:31:15 +00002772 import = PyObject_GetItem(builtins, import_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002773 if (import == NULL)
2774 PyErr_SetObject(PyExc_KeyError, import_str);
2775 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002776 else
Fred Drakea76ba6e2001-03-06 06:31:15 +00002777 import = PyObject_GetAttr(builtins, import_str);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002778 if (import == NULL)
2779 goto err;
2780
Christian Heimes072c0f12008-01-03 23:01:04 +00002781 /* Call the __import__ function with the proper argument list
2782 * Always use absolute import here. */
2783 r = PyObject_CallFunction(import, "OOOOi", module_name, globals,
2784 globals, silly_list, 0, NULL);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002785
2786 err:
2787 Py_XDECREF(globals);
2788 Py_XDECREF(builtins);
2789 Py_XDECREF(import);
Tim Peters50d8d372001-02-28 05:34:27 +00002790
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002791 return r;
2792}
2793
2794
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002795/* Module 'imp' provides Python access to the primitives used for
2796 importing modules.
2797*/
2798
Guido van Rossum79f25d91997-04-29 20:08:16 +00002799static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +00002800imp_get_magic(PyObject *self, PyObject *noargs)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002801{
2802 char buf[4];
2803
Guido van Rossum96774c12000-05-01 20:19:08 +00002804 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
2805 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
2806 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
2807 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002808
Christian Heimes72b710a2008-05-26 13:28:38 +00002809 return PyBytes_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002810}
2811
Guido van Rossum79f25d91997-04-29 20:08:16 +00002812static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +00002813imp_get_suffixes(PyObject *self, PyObject *noargs)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002814{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002815 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002816 struct filedescr *fdp;
2817
Guido van Rossum79f25d91997-04-29 20:08:16 +00002818 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002819 if (list == NULL)
2820 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002821 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
2822 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002823 fdp->suffix, fdp->mode, fdp->type);
2824 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002825 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002826 return NULL;
2827 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002828 if (PyList_Append(list, item) < 0) {
2829 Py_DECREF(list);
2830 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002831 return NULL;
2832 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002833 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002834 }
2835 return list;
2836}
2837
Guido van Rossum79f25d91997-04-29 20:08:16 +00002838static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002839call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002840{
Tim Petersdbd9ba62000-07-09 03:09:57 +00002841 extern int fclose(FILE *);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002842 PyObject *fob, *ret;
Amaury Forgeot d'Arc9a5499b2008-11-11 23:04:59 +00002843 PyObject *pathobj;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002844 struct filedescr *fdp;
2845 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002846 FILE *fp = NULL;
Guido van Rossum40d20bc2007-10-22 00:09:51 +00002847 int fd = -1;
Brett Cannon3bb42d92007-10-20 03:43:15 +00002848 char *found_encoding = NULL;
Guido van Rossumce3a72a2007-10-19 23:16:50 +00002849 char *encoding = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002850
2851 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002852 if (path == Py_None)
2853 path = NULL;
Just van Rossum52e14d62002-12-30 22:08:05 +00002854 fdp = find_module(NULL, name, path, pathname, MAXPATHLEN+1, &fp, NULL);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002855 if (fdp == NULL)
2856 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002857 if (fp != NULL) {
Guido van Rossum40d20bc2007-10-22 00:09:51 +00002858 fd = fileno(fp);
2859 if (fd != -1)
2860 fd = dup(fd);
2861 fclose(fp);
2862 fp = NULL;
2863 }
2864 if (fd != -1) {
Guido van Rossumce3a72a2007-10-19 23:16:50 +00002865 if (strchr(fdp->mode, 'b') == NULL) {
Brett Cannon3bb42d92007-10-20 03:43:15 +00002866 /* PyTokenizer_FindEncoding() returns PyMem_MALLOC'ed
2867 memory. */
Guido van Rossum40d20bc2007-10-22 00:09:51 +00002868 found_encoding = PyTokenizer_FindEncoding(fd);
2869 lseek(fd, 0, 0); /* Reset position */
Amaury Forgeot d'Arc1b933ed2008-09-04 22:34:09 +00002870 if (found_encoding == NULL && PyErr_Occurred())
2871 return NULL;
Brett Cannon3bb42d92007-10-20 03:43:15 +00002872 encoding = (found_encoding != NULL) ? found_encoding :
Guido van Rossumce3a72a2007-10-19 23:16:50 +00002873 (char*)PyUnicode_GetDefaultEncoding();
2874 }
Guido van Rossum40d20bc2007-10-22 00:09:51 +00002875 fob = PyFile_FromFd(fd, pathname, fdp->mode, -1,
Guido van Rossume7fc50f2007-12-03 22:54:21 +00002876 (char*)encoding, NULL, NULL, 1);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002877 if (fob == NULL) {
Guido van Rossum40d20bc2007-10-22 00:09:51 +00002878 close(fd);
Brett Cannon3bb42d92007-10-20 03:43:15 +00002879 PyMem_FREE(found_encoding);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002880 return NULL;
2881 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002882 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002883 else {
2884 fob = Py_None;
2885 Py_INCREF(fob);
Tim Peters50d8d372001-02-28 05:34:27 +00002886 }
Amaury Forgeot d'Arc9a5499b2008-11-11 23:04:59 +00002887 pathobj = PyUnicode_DecodeFSDefault(pathname);
2888 ret = Py_BuildValue("NN(ssi)",
2889 fob, pathobj, fdp->suffix, fdp->mode, fdp->type);
Brett Cannon3bb42d92007-10-20 03:43:15 +00002890 PyMem_FREE(found_encoding);
2891
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002892 return ret;
2893}
2894
Guido van Rossum79f25d91997-04-29 20:08:16 +00002895static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002896imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002897{
2898 char *name;
Hirokazu Yamamoto90eaaf62009-01-30 03:15:05 +00002899 PyObject *ret, *path = NULL;
Amaury Forgeot d'Arc9a5499b2008-11-11 23:04:59 +00002900 if (!PyArg_ParseTuple(args, "es|O:find_module",
2901 Py_FileSystemDefaultEncoding, &name,
2902 &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002903 return NULL;
Hirokazu Yamamoto90eaaf62009-01-30 03:15:05 +00002904 ret = call_find_module(name, path);
2905 PyMem_Free(name);
2906 return ret;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002907}
2908
2909static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002910imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002911{
2912 char *name;
2913 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002914 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002915 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002916 return NULL;
2917 ret = init_builtin(name);
2918 if (ret < 0)
2919 return NULL;
2920 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002921 Py_INCREF(Py_None);
2922 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002923 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002924 m = PyImport_AddModule(name);
2925 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002926 return m;
2927}
2928
Guido van Rossum79f25d91997-04-29 20:08:16 +00002929static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002930imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002931{
2932 char *name;
2933 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002934 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002935 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002936 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002937 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002938 if (ret < 0)
2939 return NULL;
2940 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002941 Py_INCREF(Py_None);
2942 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002943 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002944 m = PyImport_AddModule(name);
2945 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002946 return m;
2947}
2948
Guido van Rossum79f25d91997-04-29 20:08:16 +00002949static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002950imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002951{
2952 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002953
Guido van Rossum43713e52000-02-29 13:59:29 +00002954 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002955 return NULL;
2956 return get_frozen_object(name);
2957}
2958
Guido van Rossum79f25d91997-04-29 20:08:16 +00002959static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002960imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002961{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002962 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002963 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002964 return NULL;
Christian Heimes217cfd12007-12-02 14:31:20 +00002965 return PyLong_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002966}
2967
Guido van Rossum79f25d91997-04-29 20:08:16 +00002968static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002969imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002970{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002971 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002972 struct _frozen *p;
Guido van Rossum43713e52000-02-29 13:59:29 +00002973 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002974 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002975 p = find_frozen(name);
Guido van Rossumb8bff3f2002-04-07 06:34:38 +00002976 return PyBool_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002977}
2978
2979static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002980get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002981{
2982 FILE *fp;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00002983 if (mode[0] == 'U')
2984 mode = "r" PY_STDIOTEXTMODE;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002985 if (fob == NULL) {
2986 fp = fopen(pathname, mode);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002987 }
2988 else {
Guido van Rossumda5b8f22007-06-12 23:30:11 +00002989 int fd = PyObject_AsFileDescriptor(fob);
2990 if (fd == -1)
2991 return NULL;
2992 /* XXX This will leak a FILE struct. Fix this!!!!
2993 (But it doesn't leak a file descrioptor!) */
2994 fp = fdopen(fd, mode);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002995 }
Guido van Rossumda5b8f22007-06-12 23:30:11 +00002996 if (fp == NULL)
2997 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002998 return fp;
2999}
3000
Guido van Rossum79f25d91997-04-29 20:08:16 +00003001static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003002imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003003{
3004 char *name;
3005 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003006 PyObject *fob = NULL;
3007 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003008 FILE *fp;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00003009 if (!PyArg_ParseTuple(args, "ss|O:load_compiled",
3010 &name, &pathname, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003011 return NULL;
3012 fp = get_file(pathname, fob, "rb");
3013 if (fp == NULL)
3014 return NULL;
3015 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003016 if (fob == NULL)
3017 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003018 return m;
3019}
3020
Guido van Rossum96a8fb71999-12-22 14:09:35 +00003021#ifdef HAVE_DYNAMIC_LOADING
3022
Guido van Rossum79f25d91997-04-29 20:08:16 +00003023static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003024imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003025{
3026 char *name;
3027 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003028 PyObject *fob = NULL;
3029 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00003030 FILE *fp = NULL;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00003031 if (!PyArg_ParseTuple(args, "ss|O:load_dynamic",
3032 &name, &pathname, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003033 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003034 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00003035 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003036 if (fp == NULL)
3037 return NULL;
3038 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003039 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00003040 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003041}
3042
Guido van Rossum96a8fb71999-12-22 14:09:35 +00003043#endif /* HAVE_DYNAMIC_LOADING */
3044
Guido van Rossum79f25d91997-04-29 20:08:16 +00003045static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003046imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003047{
3048 char *name;
3049 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003050 PyObject *fob = NULL;
3051 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003052 FILE *fp;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00003053 if (!PyArg_ParseTuple(args, "ss|O:load_source",
3054 &name, &pathname, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003055 return NULL;
3056 fp = get_file(pathname, fob, "r");
3057 if (fp == NULL)
3058 return NULL;
3059 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003060 if (fob == NULL)
3061 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003062 return m;
3063}
3064
Guido van Rossum79f25d91997-04-29 20:08:16 +00003065static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003066imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003067{
3068 char *name;
3069 PyObject *fob;
3070 char *pathname;
3071 char *suffix; /* Unused */
3072 char *mode;
3073 int type;
3074 FILE *fp;
3075
Guido van Rossum43713e52000-02-29 13:59:29 +00003076 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003077 &name, &fob, &pathname,
3078 &suffix, &mode, &type))
3079 return NULL;
Guido van Rossum5e2c5fa2002-05-30 17:33:07 +00003080 if (*mode) {
3081 /* Mode must start with 'r' or 'U' and must not contain '+'.
3082 Implicit in this test is the assumption that the mode
3083 may contain other modifiers like 'b' or 't'. */
3084
3085 if (!(*mode == 'r' || *mode == 'U') || strchr(mode, '+')) {
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00003086 PyErr_Format(PyExc_ValueError,
3087 "invalid file open mode %.200s", mode);
3088 return NULL;
Guido van Rossum5e2c5fa2002-05-30 17:33:07 +00003089 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003090 }
3091 if (fob == Py_None)
3092 fp = NULL;
3093 else {
Guido van Rossumda5b8f22007-06-12 23:30:11 +00003094 fp = get_file(NULL, fob, mode);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003095 if (fp == NULL)
3096 return NULL;
3097 }
Just van Rossum52e14d62002-12-30 22:08:05 +00003098 return load_module(name, fp, pathname, type, NULL);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003099}
3100
3101static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003102imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003103{
3104 char *name;
3105 char *pathname;
Guido van Rossum43713e52000-02-29 13:59:29 +00003106 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003107 return NULL;
3108 return load_package(name, pathname);
3109}
3110
3111static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003112imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003113{
3114 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00003115 if (!PyArg_ParseTuple(args, "s:new_module", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003116 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003117 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003118}
3119
Christian Heimes13a7a212008-01-07 17:13:09 +00003120static PyObject *
3121imp_reload(PyObject *self, PyObject *v)
3122{
3123 return PyImport_ReloadModule(v);
3124}
3125
3126PyDoc_STRVAR(doc_reload,
3127"reload(module) -> module\n\
3128\n\
3129Reload the module. The module must have been successfully imported before.");
3130
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003131/* Doc strings */
3132
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003133PyDoc_STRVAR(doc_imp,
3134"This module provides the components needed to build your own\n\
3135__import__ function. Undocumented functions are obsolete.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003136
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003137PyDoc_STRVAR(doc_find_module,
3138"find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003139Search for a module. If path is omitted or None, search for a\n\
3140built-in, frozen or special module and continue search in sys.path.\n\
3141The module name cannot contain '.'; to search for a submodule of a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003142package, pass the submodule name and the package's __path__.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003143
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003144PyDoc_STRVAR(doc_load_module,
3145"load_module(name, file, filename, (suffix, mode, type)) -> module\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003146Load a module, given information returned by find_module().\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003147The module name must include the full package name, if any.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003148
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003149PyDoc_STRVAR(doc_get_magic,
3150"get_magic() -> string\n\
3151Return the magic number for .pyc or .pyo files.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003152
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003153PyDoc_STRVAR(doc_get_suffixes,
3154"get_suffixes() -> [(suffix, mode, type), ...]\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003155Return a list of (suffix, mode, type) tuples describing the files\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003156that find_module() looks for.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003157
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003158PyDoc_STRVAR(doc_new_module,
3159"new_module(name) -> module\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003160Create a new module. Do not enter it in sys.modules.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003161The module name must include the full package name, if any.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003162
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003163PyDoc_STRVAR(doc_lock_held,
Tim Petersa7c65092004-08-01 23:26:05 +00003164"lock_held() -> boolean\n\
3165Return True if the import lock is currently held, else False.\n\
3166On platforms without threads, return False.");
Tim Peters69232342001-08-30 05:16:13 +00003167
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00003168PyDoc_STRVAR(doc_acquire_lock,
3169"acquire_lock() -> None\n\
Neal Norwitz2294c0d2003-02-12 23:02:21 +00003170Acquires the interpreter's import lock for the current thread.\n\
3171This lock should be used by import hooks to ensure thread-safety\n\
3172when importing modules.\n\
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00003173On platforms without threads, this function does nothing.");
3174
3175PyDoc_STRVAR(doc_release_lock,
3176"release_lock() -> None\n\
3177Release the interpreter's import lock.\n\
3178On platforms without threads, this function does nothing.");
3179
Guido van Rossum79f25d91997-04-29 20:08:16 +00003180static PyMethodDef imp_methods[] = {
Neal Norwitz08ea61a2003-02-17 18:18:00 +00003181 {"find_module", imp_find_module, METH_VARARGS, doc_find_module},
3182 {"get_magic", imp_get_magic, METH_NOARGS, doc_get_magic},
3183 {"get_suffixes", imp_get_suffixes, METH_NOARGS, doc_get_suffixes},
3184 {"load_module", imp_load_module, METH_VARARGS, doc_load_module},
3185 {"new_module", imp_new_module, METH_VARARGS, doc_new_module},
3186 {"lock_held", imp_lock_held, METH_NOARGS, doc_lock_held},
3187 {"acquire_lock", imp_acquire_lock, METH_NOARGS, doc_acquire_lock},
3188 {"release_lock", imp_release_lock, METH_NOARGS, doc_release_lock},
Christian Heimes13a7a212008-01-07 17:13:09 +00003189 {"reload", imp_reload, METH_O, doc_reload},
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003190 /* The rest are obsolete */
Neal Norwitz031829d2002-03-31 14:37:44 +00003191 {"get_frozen_object", imp_get_frozen_object, METH_VARARGS},
3192 {"init_builtin", imp_init_builtin, METH_VARARGS},
3193 {"init_frozen", imp_init_frozen, METH_VARARGS},
3194 {"is_builtin", imp_is_builtin, METH_VARARGS},
3195 {"is_frozen", imp_is_frozen, METH_VARARGS},
3196 {"load_compiled", imp_load_compiled, METH_VARARGS},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00003197#ifdef HAVE_DYNAMIC_LOADING
Neal Norwitz031829d2002-03-31 14:37:44 +00003198 {"load_dynamic", imp_load_dynamic, METH_VARARGS},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00003199#endif
Neal Norwitz031829d2002-03-31 14:37:44 +00003200 {"load_package", imp_load_package, METH_VARARGS},
Neal Norwitz031829d2002-03-31 14:37:44 +00003201 {"load_source", imp_load_source, METH_VARARGS},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003202 {NULL, NULL} /* sentinel */
3203};
3204
Guido van Rossum1a8791e1998-08-04 22:46:29 +00003205static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003206setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003207{
3208 PyObject *v;
3209 int err;
3210
Christian Heimes217cfd12007-12-02 14:31:20 +00003211 v = PyLong_FromLong((long)value);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003212 err = PyDict_SetItemString(d, name, v);
3213 Py_XDECREF(v);
3214 return err;
3215}
3216
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003217typedef struct {
3218 PyObject_HEAD
3219} NullImporter;
3220
3221static int
3222NullImporter_init(NullImporter *self, PyObject *args, PyObject *kwds)
3223{
3224 char *path;
Christian Heimes7d3bc0a2007-11-07 17:26:16 +00003225 Py_ssize_t pathlen;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003226
3227 if (!_PyArg_NoKeywords("NullImporter()", kwds))
3228 return -1;
3229
Amaury Forgeot d'Arcf1ca0b12008-06-11 17:40:47 +00003230 if (!PyArg_ParseTuple(args, "es:NullImporter",
3231 Py_FileSystemDefaultEncoding, &path))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003232 return -1;
3233
Christian Heimes7d3bc0a2007-11-07 17:26:16 +00003234 pathlen = strlen(path);
3235 if (pathlen == 0) {
Georg Brandl8494d572008-07-19 10:13:15 +00003236 PyMem_Free(path);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003237 PyErr_SetString(PyExc_ImportError, "empty pathname");
3238 return -1;
3239 } else {
Hirokazu Yamamoto21cbf5f2009-01-23 07:23:03 +00003240#ifndef MS_WINDOWS
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003241 struct stat statbuf;
3242 int rv;
3243
3244 rv = stat(path, &statbuf);
Georg Brandl8494d572008-07-19 10:13:15 +00003245 PyMem_Free(path);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003246 if (rv == 0) {
3247 /* it exists */
3248 if (S_ISDIR(statbuf.st_mode)) {
3249 /* it's a directory */
3250 PyErr_SetString(PyExc_ImportError,
3251 "existing directory");
3252 return -1;
3253 }
3254 }
Hirokazu Yamamoto21cbf5f2009-01-23 07:23:03 +00003255#else /* MS_WINDOWS */
3256 DWORD rv;
3257 /* see issue1293 and issue3677:
3258 * stat() on Windows doesn't recognise paths like
3259 * "e:\\shared\\" and "\\\\whiterab-c2znlh\\shared" as dirs.
3260 */
3261 rv = GetFileAttributesA(path);
Kristján Valur Jónsson92cb4382009-01-24 10:33:25 +00003262 PyMem_Free(path);
Hirokazu Yamamoto21cbf5f2009-01-23 07:23:03 +00003263 if (rv != INVALID_FILE_ATTRIBUTES) {
3264 /* it exists */
3265 if (rv & FILE_ATTRIBUTE_DIRECTORY) {
3266 /* it's a directory */
3267 PyErr_SetString(PyExc_ImportError,
3268 "existing directory");
3269 return -1;
3270 }
3271 }
3272#endif
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003273 }
3274 return 0;
3275}
3276
3277static PyObject *
3278NullImporter_find_module(NullImporter *self, PyObject *args)
3279{
3280 Py_RETURN_NONE;
3281}
3282
3283static PyMethodDef NullImporter_methods[] = {
3284 {"find_module", (PyCFunction)NullImporter_find_module, METH_VARARGS,
3285 "Always return None"
3286 },
3287 {NULL} /* Sentinel */
3288};
3289
3290
Christian Heimes9cd17752007-11-18 19:35:23 +00003291PyTypeObject PyNullImporter_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003292 PyVarObject_HEAD_INIT(NULL, 0)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003293 "imp.NullImporter", /*tp_name*/
3294 sizeof(NullImporter), /*tp_basicsize*/
3295 0, /*tp_itemsize*/
3296 0, /*tp_dealloc*/
3297 0, /*tp_print*/
3298 0, /*tp_getattr*/
3299 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00003300 0, /*tp_reserved*/
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003301 0, /*tp_repr*/
3302 0, /*tp_as_number*/
3303 0, /*tp_as_sequence*/
3304 0, /*tp_as_mapping*/
3305 0, /*tp_hash */
3306 0, /*tp_call*/
3307 0, /*tp_str*/
3308 0, /*tp_getattro*/
3309 0, /*tp_setattro*/
3310 0, /*tp_as_buffer*/
3311 Py_TPFLAGS_DEFAULT, /*tp_flags*/
3312 "Null importer object", /* tp_doc */
3313 0, /* tp_traverse */
3314 0, /* tp_clear */
3315 0, /* tp_richcompare */
3316 0, /* tp_weaklistoffset */
3317 0, /* tp_iter */
3318 0, /* tp_iternext */
3319 NullImporter_methods, /* tp_methods */
3320 0, /* tp_members */
3321 0, /* tp_getset */
3322 0, /* tp_base */
3323 0, /* tp_dict */
3324 0, /* tp_descr_get */
3325 0, /* tp_descr_set */
3326 0, /* tp_dictoffset */
3327 (initproc)NullImporter_init, /* tp_init */
3328 0, /* tp_alloc */
3329 PyType_GenericNew /* tp_new */
3330};
3331
Martin v. Löwis1a214512008-06-11 05:26:20 +00003332static struct PyModuleDef impmodule = {
3333 PyModuleDef_HEAD_INIT,
3334 "imp",
3335 doc_imp,
3336 0,
3337 imp_methods,
3338 NULL,
3339 NULL,
3340 NULL,
3341 NULL
3342};
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003343
Jason Tishler6bc06ec2003-09-04 11:59:50 +00003344PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00003345PyInit_imp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003346{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003347 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003348
Christian Heimes9cd17752007-11-18 19:35:23 +00003349 if (PyType_Ready(&PyNullImporter_Type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00003350 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003351
Martin v. Löwis1a214512008-06-11 05:26:20 +00003352 m = PyModule_Create(&impmodule);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00003353 if (m == NULL)
3354 goto failure;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003355 d = PyModule_GetDict(m);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003356 if (d == NULL)
3357 goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003358
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003359 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
3360 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
3361 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
3362 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
3363 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
3364 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
3365 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
3366 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00003367 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Just van Rossum52e14d62002-12-30 22:08:05 +00003368 if (setint(d, "IMP_HOOK", IMP_HOOK) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003369
Christian Heimes9cd17752007-11-18 19:35:23 +00003370 Py_INCREF(&PyNullImporter_Type);
3371 PyModule_AddObject(m, "NullImporter", (PyObject *)&PyNullImporter_Type);
Martin v. Löwis1a214512008-06-11 05:26:20 +00003372 return m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003373 failure:
Martin v. Löwis1a214512008-06-11 05:26:20 +00003374 Py_XDECREF(m);
3375 return NULL;
3376
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003377}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003378
3379
Guido van Rossumb18618d2000-05-03 23:44:39 +00003380/* API for embedding applications that want to add their own entries
3381 to the table of built-in modules. This should normally be called
3382 *before* Py_Initialize(). When the table resize fails, -1 is
3383 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003384
3385 After a similar function by Just van Rossum. */
3386
3387int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003388PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003389{
3390 static struct _inittab *our_copy = NULL;
3391 struct _inittab *p;
3392 int i, n;
3393
3394 /* Count the number of entries in both tables */
3395 for (n = 0; newtab[n].name != NULL; n++)
3396 ;
3397 if (n == 0)
3398 return 0; /* Nothing to do */
3399 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
3400 ;
3401
3402 /* Allocate new memory for the combined table */
Guido van Rossumb18618d2000-05-03 23:44:39 +00003403 p = our_copy;
3404 PyMem_RESIZE(p, struct _inittab, i+n+1);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003405 if (p == NULL)
3406 return -1;
3407
3408 /* Copy the tables into the new memory */
3409 if (our_copy != PyImport_Inittab)
3410 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
3411 PyImport_Inittab = our_copy = p;
3412 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
3413
3414 return 0;
3415}
3416
3417/* Shorthand to add a single entry given a name and a function */
3418
3419int
Martin v. Löwis1a214512008-06-11 05:26:20 +00003420PyImport_AppendInittab(char *name, PyObject* (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003421{
3422 struct _inittab newtab[2];
3423
3424 memset(newtab, '\0', sizeof newtab);
3425
3426 newtab[0].name = name;
3427 newtab[0].initfunc = initfunc;
3428
3429 return PyImport_ExtendInittab(newtab);
3430}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003431
3432#ifdef __cplusplus
3433}
3434#endif