blob: 9c70ed83dfb9aca54598e331ec622132afb6c556 [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
Hirokazu Yamamoto4f447fb2009-03-04 01:52:10 +0000993 newname = PyUnicode_DecodeFSDefault(pathname);
Antoine Pitroud35cbf62009-01-06 19:02:24 +0000994 if (newname == NULL)
995 return -1;
996
Hirokazu Yamamoto4f447fb2009-03-04 01:52:10 +0000997 if (!PyUnicode_Compare(co->co_filename, newname)) {
998 Py_DECREF(newname);
999 return 0;
1000 }
1001
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001002 oldname = co->co_filename;
1003 Py_INCREF(oldname);
1004 update_code_filenames(co, oldname, newname);
1005 Py_DECREF(oldname);
1006 Py_DECREF(newname);
1007 return 1;
1008}
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001009
1010/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001011 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
1012 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001013
Guido van Rossum79f25d91997-04-29 20:08:16 +00001014static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001015load_source_module(char *name, char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001016{
Christian Heimes05e8be12008-02-23 18:30:17 +00001017 struct stat st;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001018 FILE *fpc;
1019 char buf[MAXPATHLEN+1];
1020 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001021 PyCodeObject *co;
1022 PyObject *m;
Christian Heimes05e8be12008-02-23 18:30:17 +00001023
1024 if (fstat(fileno(fp), &st) != 0) {
Neal Norwitz708e51a2005-10-03 04:48:15 +00001025 PyErr_Format(PyExc_RuntimeError,
Christian Heimes05e8be12008-02-23 18:30:17 +00001026 "unable to get file status from '%s'",
Neal Norwitz708e51a2005-10-03 04:48:15 +00001027 pathname);
Fred Drake4c82b232000-06-30 16:18:57 +00001028 return NULL;
Neal Norwitz708e51a2005-10-03 04:48:15 +00001029 }
Fred Drake4c82b232000-06-30 16:18:57 +00001030#if SIZEOF_TIME_T > 4
1031 /* Python's .pyc timestamp handling presumes that the timestamp fits
1032 in 4 bytes. This will be fine until sometime in the year 2038,
1033 when a 4-byte signed time_t will overflow.
1034 */
Christian Heimes05e8be12008-02-23 18:30:17 +00001035 if (st.st_mtime >> 32) {
Fred Drake4c82b232000-06-30 16:18:57 +00001036 PyErr_SetString(PyExc_OverflowError,
Fred Drakec63d3e92001-03-01 06:33:32 +00001037 "modification time overflows a 4 byte field");
Fred Drake4c82b232000-06-30 16:18:57 +00001038 return NULL;
1039 }
1040#endif
Tim Peters36515e22001-11-18 04:06:29 +00001041 cpathname = make_compiled_pathname(pathname, buf,
Jeremy Hylton37832f02001-04-13 17:50:20 +00001042 (size_t)MAXPATHLEN + 1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001043 if (cpathname != NULL &&
Christian Heimes05e8be12008-02-23 18:30:17 +00001044 (fpc = check_compiled_module(pathname, st.st_mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001045 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001046 fclose(fpc);
1047 if (co == NULL)
1048 return NULL;
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001049 if (update_compiled_module(co, pathname) < 0)
1050 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001051 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001052 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001053 name, cpathname);
Guido van Rossumafd3dae1998-08-25 18:44:34 +00001054 pathname = cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001055 }
1056 else {
1057 co = parse_source_module(pathname, fp);
1058 if (co == NULL)
1059 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001060 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001061 PySys_WriteStderr("import %s # from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001062 name, pathname);
Christian Heimes790c8232008-01-07 21:14:23 +00001063 if (cpathname) {
1064 PyObject *ro = PySys_GetObject("dont_write_bytecode");
1065 if (ro == NULL || !PyObject_IsTrue(ro))
Christian Heimes05e8be12008-02-23 18:30:17 +00001066 write_compiled_module(co, cpathname, &st);
Christian Heimes790c8232008-01-07 21:14:23 +00001067 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001068 }
Guido van Rossumafd3dae1998-08-25 18:44:34 +00001069 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001070 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001071
1072 return m;
1073}
1074
Christian Heimes3b06e532008-01-07 20:12:44 +00001075/* Get source file -> unicode or None
1076 * Returns the path to the py file if available, else the given path
1077 */
1078static PyObject *
1079get_sourcefile(const char *file)
1080{
1081 char py[MAXPATHLEN + 1];
1082 Py_ssize_t len;
1083 PyObject *u;
1084 struct stat statbuf;
1085
1086 if (!file || !*file) {
1087 Py_RETURN_NONE;
1088 }
1089
1090 len = strlen(file);
Christian Heimes3540b502008-01-11 07:03:05 +00001091 /* match '*.py?' */
1092 if (len > MAXPATHLEN || PyOS_strnicmp(&file[len-4], ".py", 3) != 0) {
Christian Heimes3b06e532008-01-07 20:12:44 +00001093 return PyUnicode_DecodeFSDefault(file);
1094 }
1095
1096 strncpy(py, file, len-1);
Martin v. Löwis5021ebc2008-03-22 22:07:13 +00001097 py[len-1] = '\0';
Christian Heimes3b06e532008-01-07 20:12:44 +00001098 if (stat(py, &statbuf) == 0 &&
1099 S_ISREG(statbuf.st_mode)) {
1100 u = PyUnicode_DecodeFSDefault(py);
1101 }
1102 else {
1103 u = PyUnicode_DecodeFSDefault(file);
1104 }
1105 return u;
1106}
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001107
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001108/* Forward */
Just van Rossum52e14d62002-12-30 22:08:05 +00001109static PyObject *load_module(char *, FILE *, char *, int, PyObject *);
1110static struct filedescr *find_module(char *, char *, PyObject *,
1111 char *, size_t, FILE **, PyObject **);
Christian Heimes3b06e532008-01-07 20:12:44 +00001112static struct _frozen * find_frozen(char *);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001113
1114/* Load a package and return its module object WITH INCREMENTED
1115 REFERENCE COUNT */
1116
1117static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001118load_package(char *name, char *pathname)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001119{
Tim Peters1cd70172004-08-02 03:52:12 +00001120 PyObject *m, *d;
1121 PyObject *file = NULL;
1122 PyObject *path = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001123 int err;
1124 char buf[MAXPATHLEN+1];
1125 FILE *fp = NULL;
1126 struct filedescr *fdp;
1127
1128 m = PyImport_AddModule(name);
1129 if (m == NULL)
1130 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001131 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001132 PySys_WriteStderr("import %s # directory %s\n",
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001133 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001134 d = PyModule_GetDict(m);
Christian Heimes3b06e532008-01-07 20:12:44 +00001135 file = get_sourcefile(pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001136 if (file == NULL)
Tim Peters1cd70172004-08-02 03:52:12 +00001137 goto error;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001138 path = Py_BuildValue("[O]", file);
Tim Peters1cd70172004-08-02 03:52:12 +00001139 if (path == NULL)
1140 goto error;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001141 err = PyDict_SetItemString(d, "__file__", file);
1142 if (err == 0)
1143 err = PyDict_SetItemString(d, "__path__", path);
Tim Peters1cd70172004-08-02 03:52:12 +00001144 if (err != 0)
1145 goto error;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001146 buf[0] = '\0';
Just van Rossum52e14d62002-12-30 22:08:05 +00001147 fdp = find_module(name, "__init__", path, buf, sizeof(buf), &fp, NULL);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001148 if (fdp == NULL) {
1149 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
1150 PyErr_Clear();
Thomas Heller25653242004-06-07 15:04:10 +00001151 Py_INCREF(m);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001152 }
1153 else
1154 m = NULL;
1155 goto cleanup;
1156 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001157 m = load_module(name, fp, buf, fdp->type, NULL);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001158 if (fp != NULL)
1159 fclose(fp);
Tim Peters1cd70172004-08-02 03:52:12 +00001160 goto cleanup;
1161
1162 error:
1163 m = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001164 cleanup:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001165 Py_XDECREF(path);
1166 Py_XDECREF(file);
1167 return m;
1168}
1169
1170
1171/* Helper to test for built-in module */
1172
1173static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001174is_builtin(char *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001175{
1176 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +00001177 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
1178 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
1179 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001180 return -1;
1181 else
1182 return 1;
1183 }
1184 }
1185 return 0;
1186}
1187
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001188
Just van Rossum52e14d62002-12-30 22:08:05 +00001189/* Return an importer object for a sys.path/pkg.__path__ item 'p',
1190 possibly by fetching it from the path_importer_cache dict. If it
Thomas Wouters89f507f2006-12-13 04:49:30 +00001191 wasn't yet cached, traverse path_hooks until a hook is found
Just van Rossum52e14d62002-12-30 22:08:05 +00001192 that can handle the path item. Return None if no hook could;
1193 this tells our caller it should fall back to the builtin
1194 import mechanism. Cache the result in path_importer_cache.
1195 Returns a borrowed reference. */
1196
1197static PyObject *
1198get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks,
1199 PyObject *p)
1200{
1201 PyObject *importer;
Martin v. Löwis725507b2006-03-07 12:08:51 +00001202 Py_ssize_t j, nhooks;
Just van Rossum52e14d62002-12-30 22:08:05 +00001203
1204 /* These conditions are the caller's responsibility: */
1205 assert(PyList_Check(path_hooks));
1206 assert(PyDict_Check(path_importer_cache));
1207
1208 nhooks = PyList_Size(path_hooks);
1209 if (nhooks < 0)
1210 return NULL; /* Shouldn't happen */
1211
1212 importer = PyDict_GetItem(path_importer_cache, p);
1213 if (importer != NULL)
1214 return importer;
1215
1216 /* set path_importer_cache[p] to None to avoid recursion */
1217 if (PyDict_SetItem(path_importer_cache, p, Py_None) != 0)
1218 return NULL;
1219
1220 for (j = 0; j < nhooks; j++) {
1221 PyObject *hook = PyList_GetItem(path_hooks, j);
1222 if (hook == NULL)
1223 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001224 importer = PyObject_CallFunctionObjArgs(hook, p, NULL);
Just van Rossum52e14d62002-12-30 22:08:05 +00001225 if (importer != NULL)
1226 break;
1227
1228 if (!PyErr_ExceptionMatches(PyExc_ImportError)) {
1229 return NULL;
1230 }
1231 PyErr_Clear();
1232 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001233 if (importer == NULL) {
1234 importer = PyObject_CallFunctionObjArgs(
Christian Heimes9cd17752007-11-18 19:35:23 +00001235 (PyObject *)&PyNullImporter_Type, p, NULL
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001236 );
1237 if (importer == NULL) {
1238 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
1239 PyErr_Clear();
1240 return Py_None;
1241 }
1242 }
1243 }
1244 if (importer != NULL) {
Just van Rossum52e14d62002-12-30 22:08:05 +00001245 int err = PyDict_SetItem(path_importer_cache, p, importer);
1246 Py_DECREF(importer);
1247 if (err != 0)
1248 return NULL;
1249 }
1250 return importer;
1251}
1252
Christian Heimes9cd17752007-11-18 19:35:23 +00001253PyAPI_FUNC(PyObject *)
1254PyImport_GetImporter(PyObject *path) {
1255 PyObject *importer=NULL, *path_importer_cache=NULL, *path_hooks=NULL;
1256
1257 if ((path_importer_cache = PySys_GetObject("path_importer_cache"))) {
1258 if ((path_hooks = PySys_GetObject("path_hooks"))) {
1259 importer = get_path_importer(path_importer_cache,
1260 path_hooks, path);
1261 }
1262 }
1263 Py_XINCREF(importer); /* get_path_importer returns a borrowed reference */
1264 return importer;
1265}
1266
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001267/* Search the path (default sys.path) for a module. Return the
1268 corresponding filedescr struct, and (via return arguments) the
1269 pathname and an open file. Return NULL if the module is not found. */
1270
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001271#ifdef MS_COREDLL
Thomas Woutersb4bd21c2000-07-22 23:38:01 +00001272extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **,
Martin v. Löwis18e16552006-02-15 17:27:45 +00001273 char *, Py_ssize_t);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001274#endif
1275
Martin v. Löwis18e16552006-02-15 17:27:45 +00001276static int case_ok(char *, Py_ssize_t, Py_ssize_t, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001277static int find_init_module(char *); /* Forward */
Just van Rossum52e14d62002-12-30 22:08:05 +00001278static struct filedescr importhookdescr = {"", "", IMP_HOOK};
Guido van Rossum197346f1997-10-31 18:38:52 +00001279
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001280static struct filedescr *
Just van Rossum52e14d62002-12-30 22:08:05 +00001281find_module(char *fullname, char *subname, PyObject *path, char *buf,
1282 size_t buflen, FILE **p_fp, PyObject **p_loader)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001283{
Martin v. Löwis725507b2006-03-07 12:08:51 +00001284 Py_ssize_t i, npath;
Fred Drake4c82b232000-06-30 16:18:57 +00001285 size_t len, namelen;
Guido van Rossum80bb9651996-12-05 23:27:02 +00001286 struct filedescr *fdp = NULL;
Jack Jansenc88da1f2002-05-28 10:58:19 +00001287 char *filemode;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001288 FILE *fp = NULL;
Just van Rossum52e14d62002-12-30 22:08:05 +00001289 PyObject *path_hooks, *path_importer_cache;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001290 struct stat statbuf;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001291 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
1292 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
1293 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossum0506a431998-08-11 15:07:39 +00001294 char name[MAXPATHLEN+1];
Andrew MacIntyred9400542002-02-26 11:41:34 +00001295#if defined(PYOS_OS2)
1296 size_t saved_len;
1297 size_t saved_namelen;
1298 char *saved_buf = NULL;
1299#endif
Just van Rossum52e14d62002-12-30 22:08:05 +00001300 if (p_loader != NULL)
1301 *p_loader = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001302
Just van Rossum52e14d62002-12-30 22:08:05 +00001303 if (strlen(subname) > MAXPATHLEN) {
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001304 PyErr_SetString(PyExc_OverflowError,
1305 "module name is too long");
Fred Drake4c82b232000-06-30 16:18:57 +00001306 return NULL;
1307 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001308 strcpy(name, subname);
1309
1310 /* sys.meta_path import hook */
1311 if (p_loader != NULL) {
1312 PyObject *meta_path;
1313
1314 meta_path = PySys_GetObject("meta_path");
1315 if (meta_path == NULL || !PyList_Check(meta_path)) {
1316 PyErr_SetString(PyExc_ImportError,
1317 "sys.meta_path must be a list of "
1318 "import hooks");
1319 return NULL;
1320 }
1321 Py_INCREF(meta_path); /* zap guard */
1322 npath = PyList_Size(meta_path);
1323 for (i = 0; i < npath; i++) {
1324 PyObject *loader;
1325 PyObject *hook = PyList_GetItem(meta_path, i);
1326 loader = PyObject_CallMethod(hook, "find_module",
1327 "sO", fullname,
1328 path != NULL ?
1329 path : Py_None);
1330 if (loader == NULL) {
1331 Py_DECREF(meta_path);
1332 return NULL; /* true error */
1333 }
1334 if (loader != Py_None) {
1335 /* a loader was found */
1336 *p_loader = loader;
1337 Py_DECREF(meta_path);
1338 return &importhookdescr;
1339 }
1340 Py_DECREF(loader);
1341 }
1342 Py_DECREF(meta_path);
1343 }
Guido van Rossum0506a431998-08-11 15:07:39 +00001344
Benjamin Petersond968e272008-11-05 22:48:33 +00001345 if (find_frozen(fullname) != NULL) {
1346 strcpy(buf, fullname);
1347 return &fd_frozen;
Guido van Rossum0506a431998-08-11 15:07:39 +00001348 }
Benjamin Petersond968e272008-11-05 22:48:33 +00001349
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001350 if (path == NULL) {
1351 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +00001352 strcpy(buf, name);
1353 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001354 }
Guido van Rossumac279101996-08-22 23:10:58 +00001355#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001356 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
1357 if (fp != NULL) {
1358 *p_fp = fp;
1359 return fdp;
1360 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +00001361#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +00001362 path = PySys_GetObject("path");
1363 }
Benjamin Petersond968e272008-11-05 22:48:33 +00001364
Guido van Rossum79f25d91997-04-29 20:08:16 +00001365 if (path == NULL || !PyList_Check(path)) {
1366 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +00001367 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001368 return NULL;
1369 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001370
1371 path_hooks = PySys_GetObject("path_hooks");
1372 if (path_hooks == NULL || !PyList_Check(path_hooks)) {
1373 PyErr_SetString(PyExc_ImportError,
1374 "sys.path_hooks must be a list of "
1375 "import hooks");
1376 return NULL;
1377 }
1378 path_importer_cache = PySys_GetObject("path_importer_cache");
1379 if (path_importer_cache == NULL ||
1380 !PyDict_Check(path_importer_cache)) {
1381 PyErr_SetString(PyExc_ImportError,
1382 "sys.path_importer_cache must be a dict");
1383 return NULL;
1384 }
1385
Guido van Rossum79f25d91997-04-29 20:08:16 +00001386 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001387 namelen = strlen(name);
1388 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001389 PyObject *v = PyList_GetItem(path, i);
Guido van Rossumf15a29f2007-05-04 00:41:39 +00001390 PyObject *origv = v;
Guido van Rossum6262cc72007-05-09 23:29:27 +00001391 const char *base;
Guido van Rossumf15a29f2007-05-04 00:41:39 +00001392 Py_ssize_t size;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001393 if (!v)
1394 return NULL;
Guido van Rossuma4b8d1d2007-08-27 15:02:28 +00001395 if (PyUnicode_Check(v)) {
Amaury Forgeot d'Arcf1ca0b12008-06-11 17:40:47 +00001396 v = PyUnicode_AsEncodedString(v,
1397 Py_FileSystemDefaultEncoding, NULL);
Guido van Rossuma4b8d1d2007-08-27 15:02:28 +00001398 if (v == NULL)
1399 return NULL;
1400 }
Amaury Forgeot d'Arcf1ca0b12008-06-11 17:40:47 +00001401 else if (!PyBytes_Check(v))
Guido van Rossuma4b8d1d2007-08-27 15:02:28 +00001402 continue;
Amaury Forgeot d'Arcf1ca0b12008-06-11 17:40:47 +00001403 else
1404 Py_INCREF(v);
1405
Christian Heimes72b710a2008-05-26 13:28:38 +00001406 base = PyBytes_AS_STRING(v);
1407 size = PyBytes_GET_SIZE(v);
Guido van Rossumf15a29f2007-05-04 00:41:39 +00001408 len = size;
Walter Dörwald3430d702002-06-17 10:43:59 +00001409 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen) {
Amaury Forgeot d'Arcf1ca0b12008-06-11 17:40:47 +00001410 Py_DECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001411 continue; /* Too long */
Walter Dörwald3430d702002-06-17 10:43:59 +00001412 }
Guido van Rossumf15a29f2007-05-04 00:41:39 +00001413 strcpy(buf, base);
Amaury Forgeot d'Arcf1ca0b12008-06-11 17:40:47 +00001414 Py_DECREF(v);
1415
Walter Dörwald3430d702002-06-17 10:43:59 +00001416 if (strlen(buf) != len) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001417 continue; /* v contains '\0' */
Walter Dörwald3430d702002-06-17 10:43:59 +00001418 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001419
1420 /* sys.path_hooks import hook */
1421 if (p_loader != NULL) {
1422 PyObject *importer;
1423
1424 importer = get_path_importer(path_importer_cache,
Guido van Rossumf15a29f2007-05-04 00:41:39 +00001425 path_hooks, origv);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001426 if (importer == NULL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001427 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001428 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001429 /* Note: importer is a borrowed reference */
1430 if (importer != Py_None) {
Just van Rossum52e14d62002-12-30 22:08:05 +00001431 PyObject *loader;
1432 loader = PyObject_CallMethod(importer,
1433 "find_module",
1434 "s", fullname);
1435 if (loader == NULL)
1436 return NULL; /* error */
1437 if (loader != Py_None) {
1438 /* a loader was found */
1439 *p_loader = loader;
1440 return &importhookdescr;
1441 }
1442 Py_DECREF(loader);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001443 continue;
Just van Rossum52e14d62002-12-30 22:08:05 +00001444 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001445 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001446 /* no hook was found, use builtin import */
Just van Rossum52e14d62002-12-30 22:08:05 +00001447
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001448 if (len > 0 && buf[len-1] != SEP
1449#ifdef ALTSEP
1450 && buf[len-1] != ALTSEP
1451#endif
1452 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001453 buf[len++] = SEP;
Guido van Rossum215c3402000-11-13 17:26:32 +00001454 strcpy(buf+len, name);
1455 len += namelen;
Tim Peters50d8d372001-02-28 05:34:27 +00001456
1457 /* Check for package import (buf holds a directory name,
1458 and there's an __init__ module in that directory */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001459#ifdef HAVE_STAT
Walter Dörwald3430d702002-06-17 10:43:59 +00001460 if (stat(buf, &statbuf) == 0 && /* it exists */
1461 S_ISDIR(statbuf.st_mode) && /* it's a directory */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001462 case_ok(buf, len, namelen, name)) { /* case matches */
1463 if (find_init_module(buf)) { /* and has __init__.py */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001464 return &fd_package;
1465 }
1466 else {
1467 char warnstr[MAXPATHLEN+80];
1468 sprintf(warnstr, "Not importing directory "
1469 "'%.*s': missing __init__.py",
1470 MAXPATHLEN, buf);
Skip Montanaro46fc3372007-08-12 11:44:53 +00001471 if (PyErr_WarnEx(PyExc_ImportWarning,
1472 warnstr, 1)) {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001473 return NULL;
1474 }
1475 }
Walter Dörwald3430d702002-06-17 10:43:59 +00001476 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001477#endif
Andrew MacIntyred9400542002-02-26 11:41:34 +00001478#if defined(PYOS_OS2)
1479 /* take a snapshot of the module spec for restoration
1480 * after the 8 character DLL hackery
1481 */
1482 saved_buf = strdup(buf);
1483 saved_len = len;
1484 saved_namelen = namelen;
1485#endif /* PYOS_OS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001486 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum04110fb2007-08-24 16:32:05 +00001487#if defined(PYOS_OS2) && defined(HAVE_DYNAMIC_LOADING)
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001488 /* OS/2 limits DLLs to 8 character names (w/o
1489 extension)
Andrew MacIntyred9400542002-02-26 11:41:34 +00001490 * so if the name is longer than that and its a
1491 * dynamically loaded module we're going to try,
1492 * truncate the name before trying
1493 */
Just van Rossum52e14d62002-12-30 22:08:05 +00001494 if (strlen(subname) > 8) {
Andrew MacIntyred9400542002-02-26 11:41:34 +00001495 /* is this an attempt to load a C extension? */
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001496 const struct filedescr *scan;
1497 scan = _PyImport_DynLoadFiletab;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001498 while (scan->suffix != NULL) {
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001499 if (!strcmp(scan->suffix, fdp->suffix))
Andrew MacIntyred9400542002-02-26 11:41:34 +00001500 break;
1501 else
1502 scan++;
1503 }
1504 if (scan->suffix != NULL) {
1505 /* yes, so truncate the name */
1506 namelen = 8;
Just van Rossum52e14d62002-12-30 22:08:05 +00001507 len -= strlen(subname) - namelen;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001508 buf[len] = '\0';
1509 }
1510 }
1511#endif /* PYOS_OS2 */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001512 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001513 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001514 PySys_WriteStderr("# trying %s\n", buf);
Jack Jansenc88da1f2002-05-28 10:58:19 +00001515 filemode = fdp->mode;
Tim Peters86c7d2f2004-08-01 23:24:21 +00001516 if (filemode[0] == 'U')
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001517 filemode = "r" PY_STDIOTEXTMODE;
Jack Jansenc88da1f2002-05-28 10:58:19 +00001518 fp = fopen(buf, filemode);
Tim Peters50d8d372001-02-28 05:34:27 +00001519 if (fp != NULL) {
1520 if (case_ok(buf, len, namelen, name))
1521 break;
1522 else { /* continue search */
1523 fclose(fp);
1524 fp = NULL;
Barry Warsaw914a0b12001-02-02 19:12:16 +00001525 }
Barry Warsaw914a0b12001-02-02 19:12:16 +00001526 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001527#if defined(PYOS_OS2)
1528 /* restore the saved snapshot */
1529 strcpy(buf, saved_buf);
1530 len = saved_len;
1531 namelen = saved_namelen;
1532#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001533 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001534#if defined(PYOS_OS2)
1535 /* don't need/want the module name snapshot anymore */
1536 if (saved_buf)
1537 {
1538 free(saved_buf);
1539 saved_buf = NULL;
1540 }
1541#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001542 if (fp != NULL)
1543 break;
1544 }
1545 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001546 PyErr_Format(PyExc_ImportError,
1547 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001548 return NULL;
1549 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001550 *p_fp = fp;
1551 return fdp;
1552}
1553
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +00001554/* Helpers for main.c
1555 * Find the source file corresponding to a named module
1556 */
1557struct filedescr *
1558_PyImport_FindModule(const char *name, PyObject *path, char *buf,
1559 size_t buflen, FILE **p_fp, PyObject **p_loader)
1560{
1561 return find_module((char *) name, (char *) name, path,
1562 buf, buflen, p_fp, p_loader);
1563}
1564
1565PyAPI_FUNC(int) _PyImport_IsScript(struct filedescr * fd)
1566{
1567 return fd->type == PY_SOURCE || fd->type == PY_COMPILED;
1568}
1569
Martin v. Löwis18e16552006-02-15 17:27:45 +00001570/* case_ok(char* buf, Py_ssize_t len, Py_ssize_t namelen, char* name)
Tim Petersd1e87a82001-03-01 18:12:00 +00001571 * The arguments here are tricky, best shown by example:
1572 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1573 * ^ ^ ^ ^
1574 * |--------------------- buf ---------------------|
1575 * |------------------- len ------------------|
1576 * |------ name -------|
1577 * |----- namelen -----|
1578 * buf is the full path, but len only counts up to (& exclusive of) the
1579 * extension. name is the module name, also exclusive of extension.
1580 *
1581 * We've already done a successful stat() or fopen() on buf, so know that
1582 * there's some match, possibly case-insensitive.
1583 *
Tim Peters50d8d372001-02-28 05:34:27 +00001584 * case_ok() is to return 1 if there's a case-sensitive match for
1585 * name, else 0. case_ok() is also to return 1 if envar PYTHONCASEOK
1586 * exists.
Tim Petersd1e87a82001-03-01 18:12:00 +00001587 *
Tim Peters50d8d372001-02-28 05:34:27 +00001588 * case_ok() is used to implement case-sensitive import semantics even
1589 * on platforms with case-insensitive filesystems. It's trivial to implement
1590 * for case-sensitive filesystems. It's pretty much a cross-platform
1591 * nightmare for systems with case-insensitive filesystems.
1592 */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001593
Tim Peters50d8d372001-02-28 05:34:27 +00001594/* First we may need a pile of platform-specific header files; the sequence
1595 * of #if's here should match the sequence in the body of case_ok().
1596 */
Jason Tishler7961aa62005-05-20 00:56:54 +00001597#if defined(MS_WINDOWS)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001598#include <windows.h>
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001599
Tim Peters50d8d372001-02-28 05:34:27 +00001600#elif defined(DJGPP)
1601#include <dir.h>
1602
Jason Tishler7961aa62005-05-20 00:56:54 +00001603#elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001604#include <sys/types.h>
1605#include <dirent.h>
1606
Andrew MacIntyred9400542002-02-26 11:41:34 +00001607#elif defined(PYOS_OS2)
1608#define INCL_DOS
1609#define INCL_DOSERRORS
1610#define INCL_NOPMAPI
1611#include <os2.h>
Tim Peters50d8d372001-02-28 05:34:27 +00001612#endif
1613
Guido van Rossum0980bd91998-02-13 17:18:36 +00001614static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001615case_ok(char *buf, Py_ssize_t len, Py_ssize_t namelen, char *name)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001616{
Tim Peters50d8d372001-02-28 05:34:27 +00001617/* Pick a platform-specific implementation; the sequence of #if's here should
1618 * match the sequence just above.
1619 */
1620
Jason Tishler7961aa62005-05-20 00:56:54 +00001621/* MS_WINDOWS */
1622#if defined(MS_WINDOWS)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001623 WIN32_FIND_DATA data;
1624 HANDLE h;
Tim Peters50d8d372001-02-28 05:34:27 +00001625
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001626 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001627 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001628
Guido van Rossum0980bd91998-02-13 17:18:36 +00001629 h = FindFirstFile(buf, &data);
1630 if (h == INVALID_HANDLE_VALUE) {
1631 PyErr_Format(PyExc_NameError,
1632 "Can't find file for module %.100s\n(filename %.300s)",
1633 name, buf);
1634 return 0;
1635 }
1636 FindClose(h);
Tim Peters50d8d372001-02-28 05:34:27 +00001637 return strncmp(data.cFileName, name, namelen) == 0;
1638
1639/* DJGPP */
1640#elif defined(DJGPP)
1641 struct ffblk ffblk;
1642 int done;
1643
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001644 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001645 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001646
1647 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
1648 if (done) {
Guido van Rossum0980bd91998-02-13 17:18:36 +00001649 PyErr_Format(PyExc_NameError,
Tim Peters50d8d372001-02-28 05:34:27 +00001650 "Can't find file for module %.100s\n(filename %.300s)",
Guido van Rossum0980bd91998-02-13 17:18:36 +00001651 name, buf);
1652 return 0;
1653 }
Tim Peters50d8d372001-02-28 05:34:27 +00001654 return strncmp(ffblk.ff_name, name, namelen) == 0;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001655
Jason Tishler7961aa62005-05-20 00:56:54 +00001656/* new-fangled macintosh (macosx) or Cygwin */
1657#elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001658 DIR *dirp;
1659 struct dirent *dp;
Tim Petersd1e87a82001-03-01 18:12:00 +00001660 char dirname[MAXPATHLEN + 1];
1661 const int dirlen = len - namelen - 1; /* don't want trailing SEP */
Tim Peters430f5d42001-03-01 01:30:56 +00001662
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001663 if (Py_GETENV("PYTHONCASEOK") != NULL)
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001664 return 1;
1665
Tim Petersd1e87a82001-03-01 18:12:00 +00001666 /* Copy the dir component into dirname; substitute "." if empty */
1667 if (dirlen <= 0) {
1668 dirname[0] = '.';
1669 dirname[1] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001670 }
1671 else {
Tim Petersd1e87a82001-03-01 18:12:00 +00001672 assert(dirlen <= MAXPATHLEN);
1673 memcpy(dirname, buf, dirlen);
1674 dirname[dirlen] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001675 }
1676 /* Open the directory and search the entries for an exact match. */
Tim Petersd1e87a82001-03-01 18:12:00 +00001677 dirp = opendir(dirname);
Tim Peters430f5d42001-03-01 01:30:56 +00001678 if (dirp) {
Tim Peters677898a2001-03-02 03:28:03 +00001679 char *nameWithExt = buf + len - namelen;
Tim Peters430f5d42001-03-01 01:30:56 +00001680 while ((dp = readdir(dirp)) != NULL) {
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001681 const int thislen =
Tim Peters430f5d42001-03-01 01:30:56 +00001682#ifdef _DIRENT_HAVE_D_NAMELEN
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001683 dp->d_namlen;
Tim Peters430f5d42001-03-01 01:30:56 +00001684#else
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001685 strlen(dp->d_name);
Tim Peters430f5d42001-03-01 01:30:56 +00001686#endif
Tim Petersd1e87a82001-03-01 18:12:00 +00001687 if (thislen >= namelen &&
Tim Peters677898a2001-03-02 03:28:03 +00001688 strcmp(dp->d_name, nameWithExt) == 0) {
Tim Peters430f5d42001-03-01 01:30:56 +00001689 (void)closedir(dirp);
1690 return 1; /* Found */
1691 }
1692 }
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001693 (void)closedir(dirp);
Tim Peters430f5d42001-03-01 01:30:56 +00001694 }
Tim Peters430f5d42001-03-01 01:30:56 +00001695 return 0 ; /* Not found */
Tim Peters430f5d42001-03-01 01:30:56 +00001696
Andrew MacIntyred9400542002-02-26 11:41:34 +00001697/* OS/2 */
1698#elif defined(PYOS_OS2)
1699 HDIR hdir = 1;
1700 ULONG srchcnt = 1;
1701 FILEFINDBUF3 ffbuf;
1702 APIRET rc;
1703
Christian Heimes790c8232008-01-07 21:14:23 +00001704 if (Py_GETENV("PYTHONCASEOK") != NULL)
Andrew MacIntyred9400542002-02-26 11:41:34 +00001705 return 1;
1706
1707 rc = DosFindFirst(buf,
1708 &hdir,
1709 FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY,
1710 &ffbuf, sizeof(ffbuf),
1711 &srchcnt,
1712 FIL_STANDARD);
1713 if (rc != NO_ERROR)
1714 return 0;
1715 return strncmp(ffbuf.achName, name, namelen) == 0;
1716
Tim Peters50d8d372001-02-28 05:34:27 +00001717/* assuming it's a case-sensitive filesystem, so there's nothing to do! */
1718#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001719 return 1;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001720
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001721#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001722}
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001723
Guido van Rossum0980bd91998-02-13 17:18:36 +00001724
Guido van Rossum197346f1997-10-31 18:38:52 +00001725#ifdef HAVE_STAT
1726/* Helper to look for __init__.py or __init__.py[co] in potential package */
1727static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001728find_init_module(char *buf)
Guido van Rossum197346f1997-10-31 18:38:52 +00001729{
Tim Peters0f9431f2001-07-05 03:47:53 +00001730 const size_t save_len = strlen(buf);
Fred Drake4c82b232000-06-30 16:18:57 +00001731 size_t i = save_len;
Tim Peters0f9431f2001-07-05 03:47:53 +00001732 char *pname; /* pointer to start of __init__ */
Guido van Rossum197346f1997-10-31 18:38:52 +00001733 struct stat statbuf;
1734
Tim Peters0f9431f2001-07-05 03:47:53 +00001735/* For calling case_ok(buf, len, namelen, name):
1736 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1737 * ^ ^ ^ ^
1738 * |--------------------- buf ---------------------|
1739 * |------------------- len ------------------|
1740 * |------ name -------|
1741 * |----- namelen -----|
1742 */
Guido van Rossum197346f1997-10-31 18:38:52 +00001743 if (save_len + 13 >= MAXPATHLEN)
1744 return 0;
1745 buf[i++] = SEP;
Tim Peters0f9431f2001-07-05 03:47:53 +00001746 pname = buf + i;
1747 strcpy(pname, "__init__.py");
Guido van Rossum197346f1997-10-31 18:38:52 +00001748 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001749 if (case_ok(buf,
1750 save_len + 9, /* len("/__init__") */
1751 8, /* len("__init__") */
1752 pname)) {
1753 buf[save_len] = '\0';
1754 return 1;
1755 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001756 }
Tim Peters0f9431f2001-07-05 03:47:53 +00001757 i += strlen(pname);
1758 strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum197346f1997-10-31 18:38:52 +00001759 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001760 if (case_ok(buf,
1761 save_len + 9, /* len("/__init__") */
1762 8, /* len("__init__") */
1763 pname)) {
1764 buf[save_len] = '\0';
1765 return 1;
1766 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001767 }
1768 buf[save_len] = '\0';
1769 return 0;
1770}
Guido van Rossum48a680c2001-03-02 06:34:14 +00001771
Guido van Rossum197346f1997-10-31 18:38:52 +00001772#endif /* HAVE_STAT */
1773
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001774
Tim Petersdbd9ba62000-07-09 03:09:57 +00001775static int init_builtin(char *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001776
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001777/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001778 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001779
Guido van Rossum79f25d91997-04-29 20:08:16 +00001780static PyObject *
Just van Rossum52e14d62002-12-30 22:08:05 +00001781load_module(char *name, FILE *fp, char *buf, int type, PyObject *loader)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001782{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001783 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001784 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001785 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001786
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001787 /* First check that there's an open file (if we need one) */
1788 switch (type) {
1789 case PY_SOURCE:
1790 case PY_COMPILED:
1791 if (fp == NULL) {
1792 PyErr_Format(PyExc_ValueError,
1793 "file object required for import (type code %d)",
1794 type);
1795 return NULL;
1796 }
1797 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001798
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001799 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001800
1801 case PY_SOURCE:
1802 m = load_source_module(name, buf, fp);
1803 break;
1804
1805 case PY_COMPILED:
1806 m = load_compiled_module(name, buf, fp);
1807 break;
1808
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001809#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001810 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001811 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001812 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001813#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001814
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001815 case PKG_DIRECTORY:
1816 m = load_package(name, buf);
1817 break;
1818
1819 case C_BUILTIN:
1820 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001821 if (buf != NULL && buf[0] != '\0')
1822 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001823 if (type == C_BUILTIN)
1824 err = init_builtin(name);
1825 else
1826 err = PyImport_ImportFrozenModule(name);
1827 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001828 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001829 if (err == 0) {
1830 PyErr_Format(PyExc_ImportError,
1831 "Purported %s module %.200s not found",
1832 type == C_BUILTIN ?
1833 "builtin" : "frozen",
1834 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001835 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001836 }
1837 modules = PyImport_GetModuleDict();
1838 m = PyDict_GetItemString(modules, name);
1839 if (m == NULL) {
1840 PyErr_Format(
1841 PyExc_ImportError,
1842 "%s module %.200s not properly initialized",
1843 type == C_BUILTIN ?
1844 "builtin" : "frozen",
1845 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001846 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001847 }
1848 Py_INCREF(m);
1849 break;
1850
Just van Rossum52e14d62002-12-30 22:08:05 +00001851 case IMP_HOOK: {
1852 if (loader == NULL) {
1853 PyErr_SetString(PyExc_ImportError,
1854 "import hook without loader");
1855 return NULL;
1856 }
1857 m = PyObject_CallMethod(loader, "load_module", "s", name);
1858 break;
1859 }
1860
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001861 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001862 PyErr_Format(PyExc_ImportError,
1863 "Don't know how to import %.200s (type code %d)",
1864 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001865 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001866
1867 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001868
1869 return m;
1870}
1871
1872
1873/* Initialize a built-in module.
Thomas Wouters89f507f2006-12-13 04:49:30 +00001874 Return 1 for success, 0 if the module is not found, and -1 with
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001875 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001876
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001877static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001878init_builtin(char *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001879{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001880 struct _inittab *p;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001881
Greg Ward201baee2001-10-04 14:52:06 +00001882 if (_PyImport_FindExtension(name, name) != NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00001883 return 1;
1884
Guido van Rossum771c6c81997-10-31 18:37:24 +00001885 for (p = PyImport_Inittab; p->name != NULL; p++) {
Martin v. Löwis1a214512008-06-11 05:26:20 +00001886 PyObject *mod;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001887 if (strcmp(name, p->name) == 0) {
1888 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001889 PyErr_Format(PyExc_ImportError,
1890 "Cannot re-init internal module %.200s",
1891 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001892 return -1;
1893 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001894 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001895 PySys_WriteStderr("import %s # builtin\n", name);
Martin v. Löwis1a214512008-06-11 05:26:20 +00001896 mod = (*p->initfunc)();
1897 if (mod == 0)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001898 return -1;
Martin v. Löwis1a214512008-06-11 05:26:20 +00001899 if (_PyImport_FixupExtension(mod, name, name) < 0)
Guido van Rossum25ce5661997-08-02 03:10:38 +00001900 return -1;
Martin v. Löwis1a214512008-06-11 05:26:20 +00001901 /* FixupExtension has put the module into sys.modules,
1902 so we can release our own reference. */
1903 Py_DECREF(mod);
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001904 return 1;
1905 }
1906 }
1907 return 0;
1908}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001909
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001910
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001911/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001912
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001913static struct _frozen *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001914find_frozen(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001915{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001916 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001917
Benjamin Petersond968e272008-11-05 22:48:33 +00001918 if (!name)
1919 return NULL;
1920
Guido van Rossum79f25d91997-04-29 20:08:16 +00001921 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001922 if (p->name == NULL)
1923 return NULL;
1924 if (strcmp(p->name, name) == 0)
1925 break;
1926 }
1927 return p;
1928}
1929
Guido van Rossum79f25d91997-04-29 20:08:16 +00001930static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001931get_frozen_object(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001932{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001933 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001934 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001935
1936 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001937 PyErr_Format(PyExc_ImportError,
1938 "No such frozen object named %.200s",
1939 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001940 return NULL;
1941 }
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001942 if (p->code == NULL) {
1943 PyErr_Format(PyExc_ImportError,
1944 "Excluded frozen object named %.200s",
1945 name);
1946 return NULL;
1947 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001948 size = p->size;
1949 if (size < 0)
1950 size = -size;
1951 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001952}
1953
Brett Cannon8d110132009-03-15 02:20:16 +00001954static PyObject *
1955is_frozen_package(char *name)
1956{
1957 struct _frozen *p = find_frozen(name);
1958 int size;
1959
1960 if (p == NULL) {
1961 PyErr_Format(PyExc_ImportError,
1962 "No such frozen object named %.200s",
1963 name);
1964 return NULL;
1965 }
1966
1967 size = p->size;
1968
1969 if (size < 0)
1970 Py_RETURN_TRUE;
1971 else
1972 Py_RETURN_FALSE;
1973}
1974
1975
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001976/* Initialize a frozen module.
Brett Cannon3c2ac442009-03-08 20:49:47 +00001977 Return 1 for success, 0 if the module is not found, and -1 with
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001978 an exception set if the initialization failed.
1979 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001980
1981int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001982PyImport_ImportFrozenModule(char *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001983{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001984 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001985 PyObject *co;
1986 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001987 int ispackage;
1988 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001989
1990 if (p == NULL)
1991 return 0;
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001992 if (p->code == NULL) {
1993 PyErr_Format(PyExc_ImportError,
1994 "Excluded frozen object named %.200s",
1995 name);
1996 return -1;
1997 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001998 size = p->size;
1999 ispackage = (size < 0);
2000 if (ispackage)
2001 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002002 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00002003 PySys_WriteStderr("import %s # frozen%s\n",
Guido van Rossuma5568d31998-03-05 03:45:08 +00002004 name, ispackage ? " package" : "");
2005 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00002006 if (co == NULL)
2007 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002008 if (!PyCode_Check(co)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002009 PyErr_Format(PyExc_TypeError,
2010 "frozen object %.200s is not a code object",
2011 name);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002012 goto err_return;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00002013 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00002014 if (ispackage) {
2015 /* Set __path__ to the package name */
Benjamin Petersond968e272008-11-05 22:48:33 +00002016 PyObject *d, *s, *l;
Guido van Rossuma5568d31998-03-05 03:45:08 +00002017 int err;
2018 m = PyImport_AddModule(name);
2019 if (m == NULL)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002020 goto err_return;
Guido van Rossuma5568d31998-03-05 03:45:08 +00002021 d = PyModule_GetDict(m);
Martin v. Löwis5b222132007-06-10 09:51:05 +00002022 s = PyUnicode_InternFromString(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00002023 if (s == NULL)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002024 goto err_return;
Benjamin Petersond968e272008-11-05 22:48:33 +00002025 l = PyList_New(1);
2026 if (l == NULL) {
2027 Py_DECREF(s);
2028 goto err_return;
2029 }
2030 PyList_SET_ITEM(l, 0, s);
2031 err = PyDict_SetItemString(d, "__path__", l);
2032 Py_DECREF(l);
Guido van Rossuma5568d31998-03-05 03:45:08 +00002033 if (err != 0)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002034 goto err_return;
Guido van Rossuma5568d31998-03-05 03:45:08 +00002035 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00002036 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum7f9fa971995-01-20 16:53:12 +00002037 if (m == NULL)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002038 goto err_return;
2039 Py_DECREF(co);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002040 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00002041 return 1;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002042err_return:
2043 Py_DECREF(co);
2044 return -1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00002045}
Guido van Rossum74e6a111994-08-29 12:54:38 +00002046
2047
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002048/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00002049 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00002050
Guido van Rossum79f25d91997-04-29 20:08:16 +00002051PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00002052PyImport_ImportModule(const char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00002053{
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00002054 PyObject *pname;
2055 PyObject *result;
2056
Martin v. Löwis5b222132007-06-10 09:51:05 +00002057 pname = PyUnicode_FromString(name);
Neal Norwitza11e4c12003-03-23 14:31:01 +00002058 if (pname == NULL)
2059 return NULL;
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00002060 result = PyImport_Import(pname);
2061 Py_DECREF(pname);
2062 return result;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002063}
2064
Christian Heimes072c0f12008-01-03 23:01:04 +00002065/* Import a module without blocking
2066 *
2067 * At first it tries to fetch the module from sys.modules. If the module was
2068 * never loaded before it loads it with PyImport_ImportModule() unless another
2069 * thread holds the import lock. In the latter case the function raises an
2070 * ImportError instead of blocking.
2071 *
2072 * Returns the module object with incremented ref count.
2073 */
2074PyObject *
2075PyImport_ImportModuleNoBlock(const char *name)
2076{
2077 PyObject *result;
2078 PyObject *modules;
2079 long me;
2080
2081 /* Try to get the module from sys.modules[name] */
2082 modules = PyImport_GetModuleDict();
2083 if (modules == NULL)
2084 return NULL;
2085
2086 result = PyDict_GetItemString(modules, name);
2087 if (result != NULL) {
2088 Py_INCREF(result);
2089 return result;
2090 }
2091 else {
2092 PyErr_Clear();
2093 }
Benjamin Peterson3e4f0552008-09-02 00:31:15 +00002094#ifdef WITH_THREAD
Christian Heimes072c0f12008-01-03 23:01:04 +00002095 /* check the import lock
2096 * me might be -1 but I ignore the error here, the lock function
2097 * takes care of the problem */
2098 me = PyThread_get_thread_ident();
2099 if (import_lock_thread == -1 || import_lock_thread == me) {
2100 /* no thread or me is holding the lock */
2101 return PyImport_ImportModule(name);
2102 }
2103 else {
2104 PyErr_Format(PyExc_ImportError,
2105 "Failed to import %.200s because the import lock"
2106 "is held by another thread.",
2107 name);
2108 return NULL;
2109 }
Benjamin Peterson3e4f0552008-09-02 00:31:15 +00002110#else
2111 return PyImport_ImportModule(name);
2112#endif
Christian Heimes072c0f12008-01-03 23:01:04 +00002113}
2114
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002115/* Forward declarations for helper routines */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002116static PyObject *get_parent(PyObject *globals, char *buf,
2117 Py_ssize_t *p_buflen, int level);
Tim Petersdbd9ba62000-07-09 03:09:57 +00002118static PyObject *load_next(PyObject *mod, PyObject *altmod,
Martin v. Löwis18e16552006-02-15 17:27:45 +00002119 char **p_name, char *buf, Py_ssize_t *p_buflen);
Tim Petersdbd9ba62000-07-09 03:09:57 +00002120static int mark_miss(char *name);
2121static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
Martin v. Löwis18e16552006-02-15 17:27:45 +00002122 char *buf, Py_ssize_t buflen, int recursive);
Tim Petersdbd9ba62000-07-09 03:09:57 +00002123static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002124
2125/* The Magnum Opus of dotted-name import :-) */
2126
Guido van Rossum75acc9c1998-03-03 22:26:50 +00002127static PyObject *
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002128import_module_level(char *name, PyObject *globals, PyObject *locals,
2129 PyObject *fromlist, int level)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002130{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002131 char buf[MAXPATHLEN+1];
Martin v. Löwis18e16552006-02-15 17:27:45 +00002132 Py_ssize_t buflen = 0;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002133 PyObject *parent, *head, *next, *tail;
2134
Christian Heimes454f37b2008-01-10 00:10:02 +00002135 if (strchr(name, '/') != NULL
2136#ifdef MS_WINDOWS
2137 || strchr(name, '\\') != NULL
2138#endif
2139 ) {
2140 PyErr_SetString(PyExc_ImportError,
2141 "Import by filename is not supported.");
2142 return NULL;
2143 }
2144
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002145 parent = get_parent(globals, buf, &buflen, level);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002146 if (parent == NULL)
2147 return NULL;
2148
2149 head = load_next(parent, Py_None, &name, buf, &buflen);
2150 if (head == NULL)
2151 return NULL;
2152
2153 tail = head;
2154 Py_INCREF(tail);
2155 while (name) {
2156 next = load_next(tail, tail, &name, buf, &buflen);
2157 Py_DECREF(tail);
2158 if (next == NULL) {
2159 Py_DECREF(head);
2160 return NULL;
2161 }
2162 tail = next;
2163 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002164 if (tail == Py_None) {
2165 /* If tail is Py_None, both get_parent and load_next found
2166 an empty module name: someone called __import__("") or
2167 doctored faulty bytecode */
2168 Py_DECREF(tail);
2169 Py_DECREF(head);
2170 PyErr_SetString(PyExc_ValueError,
2171 "Empty module name");
2172 return NULL;
2173 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002174
2175 if (fromlist != NULL) {
2176 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
2177 fromlist = NULL;
2178 }
2179
2180 if (fromlist == NULL) {
2181 Py_DECREF(tail);
2182 return head;
2183 }
2184
2185 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00002186 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002187 Py_DECREF(tail);
2188 return NULL;
2189 }
2190
2191 return tail;
2192}
2193
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002194PyObject *
2195PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals,
2196 PyObject *fromlist, int level)
2197{
2198 PyObject *result;
2199 lock_import();
2200 result = import_module_level(name, globals, locals, fromlist, level);
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00002201 if (unlock_import() < 0) {
2202 Py_XDECREF(result);
2203 PyErr_SetString(PyExc_RuntimeError,
2204 "not holding the import lock");
2205 return NULL;
2206 }
Guido van Rossum75acc9c1998-03-03 22:26:50 +00002207 return result;
2208}
2209
Fred Drake87590902004-05-28 20:21:36 +00002210/* Return the package that an import is being performed in. If globals comes
2211 from the module foo.bar.bat (not itself a package), this returns the
2212 sys.modules entry for foo.bar. If globals is from a package's __init__.py,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002213 the package's entry in sys.modules is returned, as a borrowed reference.
Fred Drake87590902004-05-28 20:21:36 +00002214
2215 The *name* of the returned package is returned in buf, with the length of
2216 the name in *p_buflen.
2217
2218 If globals doesn't come from a package or a module in a package, or a
2219 corresponding entry is not found in sys.modules, Py_None is returned.
2220*/
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002221static PyObject *
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002222get_parent(PyObject *globals, char *buf, Py_ssize_t *p_buflen, int level)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002223{
2224 static PyObject *namestr = NULL;
2225 static PyObject *pathstr = NULL;
Nick Coghlande10c852007-12-04 12:22:52 +00002226 static PyObject *pkgstr = NULL;
2227 PyObject *pkgname, *modname, *modpath, *modules, *parent;
Georg Brandl2ee470f2008-07-16 12:55:28 +00002228 int orig_level = level;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002229
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002230 if (globals == NULL || !PyDict_Check(globals) || !level)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002231 return Py_None;
2232
2233 if (namestr == NULL) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00002234 namestr = PyUnicode_InternFromString("__name__");
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002235 if (namestr == NULL)
2236 return NULL;
2237 }
2238 if (pathstr == NULL) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00002239 pathstr = PyUnicode_InternFromString("__path__");
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002240 if (pathstr == NULL)
2241 return NULL;
2242 }
Nick Coghlande10c852007-12-04 12:22:52 +00002243 if (pkgstr == NULL) {
2244 pkgstr = PyUnicode_InternFromString("__package__");
2245 if (pkgstr == NULL)
2246 return NULL;
2247 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002248
2249 *buf = '\0';
2250 *p_buflen = 0;
Nick Coghlande10c852007-12-04 12:22:52 +00002251 pkgname = PyDict_GetItem(globals, pkgstr);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002252
Nick Coghlande10c852007-12-04 12:22:52 +00002253 if ((pkgname != NULL) && (pkgname != Py_None)) {
2254 /* __package__ is set, so use it */
Alexandre Vassalottia85998a2008-05-03 18:24:43 +00002255 char *pkgname_str;
Nick Coghlande10c852007-12-04 12:22:52 +00002256 Py_ssize_t len;
Alexandre Vassalottia85998a2008-05-03 18:24:43 +00002257
Nick Coghlande10c852007-12-04 12:22:52 +00002258 if (!PyUnicode_Check(pkgname)) {
2259 PyErr_SetString(PyExc_ValueError,
2260 "__package__ set to non-string");
2261 return NULL;
2262 }
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00002263 pkgname_str = _PyUnicode_AsStringAndSize(pkgname, &len);
Nick Coghlande10c852007-12-04 12:22:52 +00002264 if (len == 0) {
2265 if (level > 0) {
2266 PyErr_SetString(PyExc_ValueError,
2267 "Attempted relative import in non-package");
2268 return NULL;
2269 }
2270 return Py_None;
2271 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002272 if (len > MAXPATHLEN) {
2273 PyErr_SetString(PyExc_ValueError,
Nick Coghlande10c852007-12-04 12:22:52 +00002274 "Package name too long");
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002275 return NULL;
2276 }
Alexandre Vassalottia85998a2008-05-03 18:24:43 +00002277 strcpy(buf, pkgname_str);
Nick Coghlande10c852007-12-04 12:22:52 +00002278 } else {
2279 /* __package__ not set, so figure it out and set it */
2280 modname = PyDict_GetItem(globals, namestr);
2281 if (modname == NULL || !PyUnicode_Check(modname))
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002282 return Py_None;
Nick Coghlande10c852007-12-04 12:22:52 +00002283
2284 modpath = PyDict_GetItem(globals, pathstr);
2285 if (modpath != NULL) {
2286 /* __path__ is set, so modname is already the package name */
Alexandre Vassalottia85998a2008-05-03 18:24:43 +00002287 char *modname_str;
2288 Py_ssize_t len;
Nick Coghlande10c852007-12-04 12:22:52 +00002289 int error;
Alexandre Vassalottia85998a2008-05-03 18:24:43 +00002290
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00002291 modname_str = _PyUnicode_AsStringAndSize(modname, &len);
Nick Coghlande10c852007-12-04 12:22:52 +00002292 if (len > MAXPATHLEN) {
2293 PyErr_SetString(PyExc_ValueError,
2294 "Module name too long");
2295 return NULL;
2296 }
Alexandre Vassalottia85998a2008-05-03 18:24:43 +00002297 strcpy(buf, modname_str);
Nick Coghlande10c852007-12-04 12:22:52 +00002298 error = PyDict_SetItem(globals, pkgstr, modname);
2299 if (error) {
2300 PyErr_SetString(PyExc_ValueError,
2301 "Could not set __package__");
2302 return NULL;
2303 }
2304 } else {
2305 /* Normal module, so work out the package name if any */
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00002306 char *start = _PyUnicode_AsString(modname);
Nick Coghlande10c852007-12-04 12:22:52 +00002307 char *lastdot = strrchr(start, '.');
2308 size_t len;
2309 int error;
2310 if (lastdot == NULL && level > 0) {
2311 PyErr_SetString(PyExc_ValueError,
2312 "Attempted relative import in non-package");
2313 return NULL;
2314 }
2315 if (lastdot == NULL) {
2316 error = PyDict_SetItem(globals, pkgstr, Py_None);
2317 if (error) {
2318 PyErr_SetString(PyExc_ValueError,
2319 "Could not set __package__");
2320 return NULL;
2321 }
2322 return Py_None;
2323 }
2324 len = lastdot - start;
2325 if (len >= MAXPATHLEN) {
2326 PyErr_SetString(PyExc_ValueError,
2327 "Module name too long");
2328 return NULL;
2329 }
2330 strncpy(buf, start, len);
2331 buf[len] = '\0';
2332 pkgname = PyUnicode_FromString(buf);
2333 if (pkgname == NULL) {
2334 return NULL;
2335 }
2336 error = PyDict_SetItem(globals, pkgstr, pkgname);
2337 Py_DECREF(pkgname);
2338 if (error) {
2339 PyErr_SetString(PyExc_ValueError,
2340 "Could not set __package__");
2341 return NULL;
2342 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002343 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002344 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002345 while (--level > 0) {
2346 char *dot = strrchr(buf, '.');
2347 if (dot == NULL) {
2348 PyErr_SetString(PyExc_ValueError,
Thomas Wouters89f507f2006-12-13 04:49:30 +00002349 "Attempted relative import beyond "
2350 "toplevel package");
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002351 return NULL;
2352 }
2353 *dot = '\0';
2354 }
2355 *p_buflen = strlen(buf);
2356
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002357 modules = PyImport_GetModuleDict();
2358 parent = PyDict_GetItemString(modules, buf);
Georg Brandl2ee470f2008-07-16 12:55:28 +00002359 if (parent == NULL) {
2360 if (orig_level < 1) {
2361 PyObject *err_msg = PyBytes_FromFormat(
2362 "Parent module '%.200s' not found "
2363 "while handling absolute import", buf);
2364 if (err_msg == NULL) {
2365 return NULL;
2366 }
2367 if (!PyErr_WarnEx(PyExc_RuntimeWarning,
2368 PyBytes_AsString(err_msg), 1)) {
2369 *buf = '\0';
2370 *p_buflen = 0;
2371 parent = Py_None;
2372 }
2373 Py_DECREF(err_msg);
2374 } else {
2375 PyErr_Format(PyExc_SystemError,
2376 "Parent module '%.200s' not loaded, "
2377 "cannot perform relative import", buf);
2378 }
2379 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002380 return parent;
2381 /* We expect, but can't guarantee, if parent != None, that:
2382 - parent.__name__ == buf
2383 - parent.__dict__ is globals
2384 If this is violated... Who cares? */
2385}
2386
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002387/* altmod is either None or same as mod */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002388static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002389load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
Martin v. Löwis18e16552006-02-15 17:27:45 +00002390 Py_ssize_t *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002391{
2392 char *name = *p_name;
2393 char *dot = strchr(name, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00002394 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002395 char *p;
2396 PyObject *result;
2397
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002398 if (strlen(name) == 0) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002399 /* completely empty module name should only happen in
2400 'from . import' (or '__import__("")')*/
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002401 Py_INCREF(mod);
2402 *p_name = NULL;
2403 return mod;
2404 }
2405
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002406 if (dot == NULL) {
2407 *p_name = NULL;
2408 len = strlen(name);
2409 }
2410 else {
2411 *p_name = dot+1;
2412 len = dot-name;
2413 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00002414 if (len == 0) {
2415 PyErr_SetString(PyExc_ValueError,
2416 "Empty module name");
2417 return NULL;
2418 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002419
2420 p = buf + *p_buflen;
2421 if (p != buf)
2422 *p++ = '.';
2423 if (p+len-buf >= MAXPATHLEN) {
2424 PyErr_SetString(PyExc_ValueError,
2425 "Module name too long");
2426 return NULL;
2427 }
2428 strncpy(p, name, len);
2429 p[len] = '\0';
2430 *p_buflen = p+len-buf;
2431
2432 result = import_submodule(mod, p, buf);
2433 if (result == Py_None && altmod != mod) {
2434 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00002435 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00002436 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00002437 if (result != NULL && result != Py_None) {
2438 if (mark_miss(buf) != 0) {
2439 Py_DECREF(result);
2440 return NULL;
2441 }
2442 strncpy(buf, name, len);
2443 buf[len] = '\0';
2444 *p_buflen = len;
2445 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002446 }
2447 if (result == NULL)
2448 return NULL;
2449
2450 if (result == Py_None) {
2451 Py_DECREF(result);
2452 PyErr_Format(PyExc_ImportError,
2453 "No module named %.200s", name);
2454 return NULL;
2455 }
2456
2457 return result;
2458}
2459
2460static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002461mark_miss(char *name)
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00002462{
2463 PyObject *modules = PyImport_GetModuleDict();
2464 return PyDict_SetItemString(modules, name, Py_None);
2465}
2466
2467static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002468ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, Py_ssize_t buflen,
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002469 int recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002470{
2471 int i;
2472
2473 if (!PyObject_HasAttrString(mod, "__path__"))
2474 return 1;
2475
2476 for (i = 0; ; i++) {
2477 PyObject *item = PySequence_GetItem(fromlist, i);
2478 int hasit;
2479 if (item == NULL) {
2480 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2481 PyErr_Clear();
2482 return 1;
2483 }
2484 return 0;
2485 }
Martin v. Löwis5b222132007-06-10 09:51:05 +00002486 if (!PyUnicode_Check(item)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002487 PyErr_SetString(PyExc_TypeError,
Neal Norwitz80e7f272007-08-26 06:45:23 +00002488 "Item in ``from list'' not a string");
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002489 Py_DECREF(item);
2490 return 0;
2491 }
Martin v. Löwis5b222132007-06-10 09:51:05 +00002492 if (PyUnicode_AS_UNICODE(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00002493 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002494 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00002495 /* See if the package defines __all__ */
2496 if (recursive)
2497 continue; /* Avoid endless recursion */
2498 all = PyObject_GetAttrString(mod, "__all__");
2499 if (all == NULL)
2500 PyErr_Clear();
2501 else {
Martin v. Löwis83969ee2004-03-23 16:28:13 +00002502 int ret = ensure_fromlist(mod, all, buf, buflen, 1);
Guido van Rossum9905ef91997-09-08 16:07:11 +00002503 Py_DECREF(all);
Martin v. Löwis83969ee2004-03-23 16:28:13 +00002504 if (!ret)
2505 return 0;
Guido van Rossum9905ef91997-09-08 16:07:11 +00002506 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002507 continue;
2508 }
2509 hasit = PyObject_HasAttr(mod, item);
2510 if (!hasit) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00002511 PyObject *item8;
2512 char *subname;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002513 PyObject *submod;
2514 char *p;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002515 if (!Py_FileSystemDefaultEncoding) {
2516 item8 = PyUnicode_EncodeASCII(PyUnicode_AsUnicode(item),
2517 PyUnicode_GetSize(item),
Martin v. Löwis427dbff2007-06-12 05:53:00 +00002518 NULL);
Martin v. Löwis5b222132007-06-10 09:51:05 +00002519 } else {
Guido van Rossum98297ee2007-11-06 21:34:58 +00002520 item8 = PyUnicode_AsEncodedString(item,
2521 Py_FileSystemDefaultEncoding, NULL);
Martin v. Löwis5b222132007-06-10 09:51:05 +00002522 }
2523 if (!item8) {
2524 PyErr_SetString(PyExc_ValueError, "Cannot encode path item");
2525 return 0;
2526 }
Christian Heimes72b710a2008-05-26 13:28:38 +00002527 subname = PyBytes_AS_STRING(item8);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002528 if (buflen + strlen(subname) >= MAXPATHLEN) {
2529 PyErr_SetString(PyExc_ValueError,
2530 "Module name too long");
2531 Py_DECREF(item);
2532 return 0;
2533 }
2534 p = buf + buflen;
2535 *p++ = '.';
2536 strcpy(p, subname);
2537 submod = import_submodule(mod, subname, buf);
Martin v. Löwis5b222132007-06-10 09:51:05 +00002538 Py_DECREF(item8);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002539 Py_XDECREF(submod);
2540 if (submod == NULL) {
2541 Py_DECREF(item);
2542 return 0;
2543 }
2544 }
2545 Py_DECREF(item);
2546 }
2547
Guido van Rossuma7f2e811997-10-03 15:33:32 +00002548 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002549}
2550
Neil Schemenauer00b09662003-06-16 21:03:07 +00002551static int
2552add_submodule(PyObject *mod, PyObject *submod, char *fullname, char *subname,
2553 PyObject *modules)
2554{
2555 if (mod == Py_None)
2556 return 1;
2557 /* Irrespective of the success of this load, make a
2558 reference to it in the parent package module. A copy gets
2559 saved in the modules dictionary under the full name, so get a
2560 reference from there, if need be. (The exception is when the
2561 load failed with a SyntaxError -- then there's no trace in
2562 sys.modules. In that case, of course, do nothing extra.) */
2563 if (submod == NULL) {
2564 submod = PyDict_GetItemString(modules, fullname);
2565 if (submod == NULL)
2566 return 1;
2567 }
2568 if (PyModule_Check(mod)) {
2569 /* We can't use setattr here since it can give a
2570 * spurious warning if the submodule name shadows a
2571 * builtin name */
2572 PyObject *dict = PyModule_GetDict(mod);
2573 if (!dict)
2574 return 0;
2575 if (PyDict_SetItemString(dict, subname, submod) < 0)
2576 return 0;
2577 }
2578 else {
2579 if (PyObject_SetAttrString(mod, subname, submod) < 0)
2580 return 0;
2581 }
2582 return 1;
2583}
2584
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002585static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002586import_submodule(PyObject *mod, char *subname, char *fullname)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002587{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002588 PyObject *modules = PyImport_GetModuleDict();
Neil Schemenauer00b09662003-06-16 21:03:07 +00002589 PyObject *m = NULL;
Guido van Rossum74e6a111994-08-29 12:54:38 +00002590
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002591 /* Require:
2592 if mod == None: subname == fullname
2593 else: mod.__name__ + "." + subname == fullname
2594 */
2595
Tim Peters50d8d372001-02-28 05:34:27 +00002596 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002597 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00002598 }
2599 else {
Just van Rossum52e14d62002-12-30 22:08:05 +00002600 PyObject *path, *loader = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002601 char buf[MAXPATHLEN+1];
2602 struct filedescr *fdp;
2603 FILE *fp = NULL;
2604
Guido van Rossum9c0afe51998-05-19 15:09:05 +00002605 if (mod == Py_None)
2606 path = NULL;
2607 else {
2608 path = PyObject_GetAttrString(mod, "__path__");
2609 if (path == NULL) {
2610 PyErr_Clear();
2611 Py_INCREF(Py_None);
2612 return Py_None;
2613 }
2614 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002615
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002616 buf[0] = '\0';
Just van Rossum52e14d62002-12-30 22:08:05 +00002617 fdp = find_module(fullname, subname, path, buf, MAXPATHLEN+1,
2618 &fp, &loader);
Guido van Rossumb68cd421998-07-01 17:36:26 +00002619 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002620 if (fdp == NULL) {
2621 if (!PyErr_ExceptionMatches(PyExc_ImportError))
2622 return NULL;
2623 PyErr_Clear();
2624 Py_INCREF(Py_None);
2625 return Py_None;
2626 }
Just van Rossum52e14d62002-12-30 22:08:05 +00002627 m = load_module(fullname, fp, buf, fdp->type, loader);
2628 Py_XDECREF(loader);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002629 if (fp)
2630 fclose(fp);
Neil Schemenauer00b09662003-06-16 21:03:07 +00002631 if (!add_submodule(mod, m, fullname, subname, modules)) {
2632 Py_XDECREF(m);
2633 m = NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002634 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00002635 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002636
2637 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00002638}
2639
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002640
2641/* Re-import a module of any kind and return its module object, WITH
2642 INCREMENTED REFERENCE COUNT */
2643
Guido van Rossum79f25d91997-04-29 20:08:16 +00002644PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002645PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002646{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002647 PyInterpreterState *interp = PyThreadState_Get()->interp;
2648 PyObject *modules_reloading = interp->modules_reloading;
Guido van Rossum25ce5661997-08-02 03:10:38 +00002649 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossumd8faa362007-04-27 19:54:29 +00002650 PyObject *path = NULL, *loader = NULL, *existing_m = NULL;
Guido van Rossum222ef561997-09-06 19:41:09 +00002651 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002652 char buf[MAXPATHLEN+1];
2653 struct filedescr *fdp;
2654 FILE *fp = NULL;
Tim Peters1cd70172004-08-02 03:52:12 +00002655 PyObject *newm;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002656
2657 if (modules_reloading == NULL) {
2658 Py_FatalError("PyImport_ReloadModule: "
Guido van Rossume7ba4952007-06-06 23:52:48 +00002659 "no modules_reloading dictionary!");
Guido van Rossumd8faa362007-04-27 19:54:29 +00002660 return NULL;
2661 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002662
Guido van Rossum79f25d91997-04-29 20:08:16 +00002663 if (m == NULL || !PyModule_Check(m)) {
2664 PyErr_SetString(PyExc_TypeError,
2665 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002666 return NULL;
2667 }
Neal Norwitz5616c6d2007-08-26 05:32:41 +00002668 name = (char*)PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002669 if (name == NULL)
2670 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00002671 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002672 PyErr_Format(PyExc_ImportError,
2673 "reload(): module %.200s not in sys.modules",
2674 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002675 return NULL;
2676 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002677 existing_m = PyDict_GetItemString(modules_reloading, name);
2678 if (existing_m != NULL) {
2679 /* Due to a recursive reload, this module is already
2680 being reloaded. */
2681 Py_INCREF(existing_m);
2682 return existing_m;
2683 }
2684 if (PyDict_SetItemString(modules_reloading, name, m) < 0)
2685 return NULL;
2686
Guido van Rossum222ef561997-09-06 19:41:09 +00002687 subname = strrchr(name, '.');
2688 if (subname == NULL)
2689 subname = name;
2690 else {
2691 PyObject *parentname, *parent;
Christian Heimesc4cb3b82007-11-04 12:10:01 +00002692 parentname = PyUnicode_FromStringAndSize(name, (subname-name));
Guido van Rossumd8faa362007-04-27 19:54:29 +00002693 if (parentname == NULL) {
2694 imp_modules_reloading_clear();
Guido van Rossum222ef561997-09-06 19:41:09 +00002695 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002696 }
Guido van Rossum222ef561997-09-06 19:41:09 +00002697 parent = PyDict_GetItem(modules, parentname);
2698 if (parent == NULL) {
2699 PyErr_Format(PyExc_ImportError,
2700 "reload(): parent %.200s not in sys.modules",
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00002701 _PyUnicode_AsString(parentname));
Georg Brandl0c55f292005-09-14 06:56:20 +00002702 Py_DECREF(parentname);
Guido van Rossume7ba4952007-06-06 23:52:48 +00002703 imp_modules_reloading_clear();
Guido van Rossum222ef561997-09-06 19:41:09 +00002704 return NULL;
2705 }
Georg Brandl0c55f292005-09-14 06:56:20 +00002706 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00002707 subname++;
2708 path = PyObject_GetAttrString(parent, "__path__");
2709 if (path == NULL)
2710 PyErr_Clear();
2711 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002712 buf[0] = '\0';
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002713 fdp = find_module(name, subname, path, buf, MAXPATHLEN+1, &fp, &loader);
Guido van Rossum222ef561997-09-06 19:41:09 +00002714 Py_XDECREF(path);
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002715
2716 if (fdp == NULL) {
2717 Py_XDECREF(loader);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002718 imp_modules_reloading_clear();
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002719 return NULL;
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002720 }
2721
2722 newm = load_module(name, fp, buf, fdp->type, loader);
2723 Py_XDECREF(loader);
2724
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002725 if (fp)
2726 fclose(fp);
Tim Peters1cd70172004-08-02 03:52:12 +00002727 if (newm == NULL) {
2728 /* load_module probably removed name from modules because of
2729 * the error. Put back the original module object. We're
2730 * going to return NULL in this case regardless of whether
2731 * replacing name succeeds, so the return value is ignored.
2732 */
2733 PyDict_SetItemString(modules, name, m);
2734 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002735 imp_modules_reloading_clear();
Tim Peters1cd70172004-08-02 03:52:12 +00002736 return newm;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002737}
2738
2739
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002740/* Higher-level import emulator which emulates the "import" statement
2741 more accurately -- it invokes the __import__() function from the
2742 builtins of the current globals. This means that the import is
2743 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00002744 environment, e.g. by "rexec".
2745 A dummy list ["__doc__"] is passed as the 4th argument so that
Neal Norwitz80e7f272007-08-26 06:45:23 +00002746 e.g. PyImport_Import(PyUnicode_FromString("win32com.client.gencache"))
Guido van Rossum6058eb41998-12-21 19:51:00 +00002747 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002748
2749PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002750PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002751{
2752 static PyObject *silly_list = NULL;
2753 static PyObject *builtins_str = NULL;
2754 static PyObject *import_str = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002755 PyObject *globals = NULL;
2756 PyObject *import = NULL;
2757 PyObject *builtins = NULL;
2758 PyObject *r = NULL;
2759
2760 /* Initialize constant string objects */
2761 if (silly_list == NULL) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00002762 import_str = PyUnicode_InternFromString("__import__");
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002763 if (import_str == NULL)
2764 return NULL;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002765 builtins_str = PyUnicode_InternFromString("__builtins__");
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002766 if (builtins_str == NULL)
2767 return NULL;
2768 silly_list = Py_BuildValue("[s]", "__doc__");
2769 if (silly_list == NULL)
2770 return NULL;
2771 }
2772
2773 /* Get the builtins from current globals */
2774 globals = PyEval_GetGlobals();
Guido van Rossum85cd1d62001-02-20 21:43:24 +00002775 if (globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00002776 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002777 builtins = PyObject_GetItem(globals, builtins_str);
2778 if (builtins == NULL)
2779 goto err;
2780 }
2781 else {
2782 /* No globals -- use standard builtins, and fake globals */
2783 PyErr_Clear();
2784
Georg Brandl1a3284e2007-12-02 09:40:06 +00002785 builtins = PyImport_ImportModuleLevel("builtins",
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002786 NULL, NULL, NULL, 0);
Guido van Rossum85cd1d62001-02-20 21:43:24 +00002787 if (builtins == NULL)
2788 return NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002789 globals = Py_BuildValue("{OO}", builtins_str, builtins);
2790 if (globals == NULL)
2791 goto err;
2792 }
2793
2794 /* Get the __import__ function from the builtins */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002795 if (PyDict_Check(builtins)) {
Fred Drakea76ba6e2001-03-06 06:31:15 +00002796 import = PyObject_GetItem(builtins, import_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002797 if (import == NULL)
2798 PyErr_SetObject(PyExc_KeyError, import_str);
2799 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002800 else
Fred Drakea76ba6e2001-03-06 06:31:15 +00002801 import = PyObject_GetAttr(builtins, import_str);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002802 if (import == NULL)
2803 goto err;
2804
Christian Heimes072c0f12008-01-03 23:01:04 +00002805 /* Call the __import__ function with the proper argument list
2806 * Always use absolute import here. */
2807 r = PyObject_CallFunction(import, "OOOOi", module_name, globals,
2808 globals, silly_list, 0, NULL);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002809
2810 err:
2811 Py_XDECREF(globals);
2812 Py_XDECREF(builtins);
2813 Py_XDECREF(import);
Tim Peters50d8d372001-02-28 05:34:27 +00002814
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002815 return r;
2816}
2817
2818
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002819/* Module 'imp' provides Python access to the primitives used for
2820 importing modules.
2821*/
2822
Guido van Rossum79f25d91997-04-29 20:08:16 +00002823static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +00002824imp_get_magic(PyObject *self, PyObject *noargs)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002825{
2826 char buf[4];
2827
Guido van Rossum96774c12000-05-01 20:19:08 +00002828 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
2829 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
2830 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
2831 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002832
Christian Heimes72b710a2008-05-26 13:28:38 +00002833 return PyBytes_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002834}
2835
Guido van Rossum79f25d91997-04-29 20:08:16 +00002836static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +00002837imp_get_suffixes(PyObject *self, PyObject *noargs)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002838{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002839 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002840 struct filedescr *fdp;
2841
Guido van Rossum79f25d91997-04-29 20:08:16 +00002842 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002843 if (list == NULL)
2844 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002845 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
2846 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002847 fdp->suffix, fdp->mode, fdp->type);
2848 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002849 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002850 return NULL;
2851 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002852 if (PyList_Append(list, item) < 0) {
2853 Py_DECREF(list);
2854 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002855 return NULL;
2856 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002857 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002858 }
2859 return list;
2860}
2861
Guido van Rossum79f25d91997-04-29 20:08:16 +00002862static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002863call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002864{
Tim Petersdbd9ba62000-07-09 03:09:57 +00002865 extern int fclose(FILE *);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002866 PyObject *fob, *ret;
Amaury Forgeot d'Arc9a5499b2008-11-11 23:04:59 +00002867 PyObject *pathobj;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002868 struct filedescr *fdp;
2869 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002870 FILE *fp = NULL;
Guido van Rossum40d20bc2007-10-22 00:09:51 +00002871 int fd = -1;
Brett Cannon3bb42d92007-10-20 03:43:15 +00002872 char *found_encoding = NULL;
Guido van Rossumce3a72a2007-10-19 23:16:50 +00002873 char *encoding = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002874
2875 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002876 if (path == Py_None)
2877 path = NULL;
Just van Rossum52e14d62002-12-30 22:08:05 +00002878 fdp = find_module(NULL, name, path, pathname, MAXPATHLEN+1, &fp, NULL);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002879 if (fdp == NULL)
2880 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002881 if (fp != NULL) {
Guido van Rossum40d20bc2007-10-22 00:09:51 +00002882 fd = fileno(fp);
2883 if (fd != -1)
2884 fd = dup(fd);
2885 fclose(fp);
2886 fp = NULL;
2887 }
2888 if (fd != -1) {
Guido van Rossumce3a72a2007-10-19 23:16:50 +00002889 if (strchr(fdp->mode, 'b') == NULL) {
Brett Cannon3bb42d92007-10-20 03:43:15 +00002890 /* PyTokenizer_FindEncoding() returns PyMem_MALLOC'ed
2891 memory. */
Guido van Rossum40d20bc2007-10-22 00:09:51 +00002892 found_encoding = PyTokenizer_FindEncoding(fd);
2893 lseek(fd, 0, 0); /* Reset position */
Amaury Forgeot d'Arc1b933ed2008-09-04 22:34:09 +00002894 if (found_encoding == NULL && PyErr_Occurred())
2895 return NULL;
Brett Cannon3bb42d92007-10-20 03:43:15 +00002896 encoding = (found_encoding != NULL) ? found_encoding :
Guido van Rossumce3a72a2007-10-19 23:16:50 +00002897 (char*)PyUnicode_GetDefaultEncoding();
2898 }
Guido van Rossum40d20bc2007-10-22 00:09:51 +00002899 fob = PyFile_FromFd(fd, pathname, fdp->mode, -1,
Guido van Rossume7fc50f2007-12-03 22:54:21 +00002900 (char*)encoding, NULL, NULL, 1);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002901 if (fob == NULL) {
Guido van Rossum40d20bc2007-10-22 00:09:51 +00002902 close(fd);
Brett Cannon3bb42d92007-10-20 03:43:15 +00002903 PyMem_FREE(found_encoding);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002904 return NULL;
2905 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002906 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002907 else {
2908 fob = Py_None;
2909 Py_INCREF(fob);
Tim Peters50d8d372001-02-28 05:34:27 +00002910 }
Amaury Forgeot d'Arc9a5499b2008-11-11 23:04:59 +00002911 pathobj = PyUnicode_DecodeFSDefault(pathname);
2912 ret = Py_BuildValue("NN(ssi)",
2913 fob, pathobj, fdp->suffix, fdp->mode, fdp->type);
Brett Cannon3bb42d92007-10-20 03:43:15 +00002914 PyMem_FREE(found_encoding);
2915
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002916 return ret;
2917}
2918
Guido van Rossum79f25d91997-04-29 20:08:16 +00002919static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002920imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002921{
2922 char *name;
Hirokazu Yamamoto90eaaf62009-01-30 03:15:05 +00002923 PyObject *ret, *path = NULL;
Amaury Forgeot d'Arc9a5499b2008-11-11 23:04:59 +00002924 if (!PyArg_ParseTuple(args, "es|O:find_module",
2925 Py_FileSystemDefaultEncoding, &name,
2926 &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002927 return NULL;
Hirokazu Yamamoto90eaaf62009-01-30 03:15:05 +00002928 ret = call_find_module(name, path);
2929 PyMem_Free(name);
2930 return ret;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002931}
2932
2933static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002934imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002935{
2936 char *name;
2937 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002938 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002939 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002940 return NULL;
2941 ret = init_builtin(name);
2942 if (ret < 0)
2943 return NULL;
2944 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002945 Py_INCREF(Py_None);
2946 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002947 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002948 m = PyImport_AddModule(name);
2949 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002950 return m;
2951}
2952
Guido van Rossum79f25d91997-04-29 20:08:16 +00002953static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002954imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002955{
2956 char *name;
2957 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002958 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002959 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002960 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002961 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002962 if (ret < 0)
2963 return NULL;
2964 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002965 Py_INCREF(Py_None);
2966 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002967 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002968 m = PyImport_AddModule(name);
2969 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002970 return m;
2971}
2972
Guido van Rossum79f25d91997-04-29 20:08:16 +00002973static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002974imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002975{
2976 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002977
Guido van Rossum43713e52000-02-29 13:59:29 +00002978 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002979 return NULL;
2980 return get_frozen_object(name);
2981}
2982
Guido van Rossum79f25d91997-04-29 20:08:16 +00002983static PyObject *
Brett Cannon8d110132009-03-15 02:20:16 +00002984imp_is_frozen_package(PyObject *self, PyObject *args)
2985{
2986 char *name;
2987
2988 if (!PyArg_ParseTuple(args, "s:is_frozen_package", &name))
2989 return NULL;
2990 return is_frozen_package(name);
2991}
2992
2993static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002994imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002995{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002996 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002997 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002998 return NULL;
Christian Heimes217cfd12007-12-02 14:31:20 +00002999 return PyLong_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003000}
3001
Guido van Rossum79f25d91997-04-29 20:08:16 +00003002static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003003imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003004{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003005 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00003006 struct _frozen *p;
Guido van Rossum43713e52000-02-29 13:59:29 +00003007 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003008 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00003009 p = find_frozen(name);
Guido van Rossumb8bff3f2002-04-07 06:34:38 +00003010 return PyBool_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003011}
3012
3013static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003014get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003015{
3016 FILE *fp;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00003017 if (mode[0] == 'U')
3018 mode = "r" PY_STDIOTEXTMODE;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003019 if (fob == NULL) {
3020 fp = fopen(pathname, mode);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003021 }
3022 else {
Guido van Rossumda5b8f22007-06-12 23:30:11 +00003023 int fd = PyObject_AsFileDescriptor(fob);
3024 if (fd == -1)
3025 return NULL;
3026 /* XXX This will leak a FILE struct. Fix this!!!!
3027 (But it doesn't leak a file descrioptor!) */
3028 fp = fdopen(fd, mode);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003029 }
Guido van Rossumda5b8f22007-06-12 23:30:11 +00003030 if (fp == NULL)
3031 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003032 return fp;
3033}
3034
Guido van Rossum79f25d91997-04-29 20:08:16 +00003035static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003036imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003037{
3038 char *name;
3039 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003040 PyObject *fob = NULL;
3041 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003042 FILE *fp;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00003043 if (!PyArg_ParseTuple(args, "ss|O:load_compiled",
3044 &name, &pathname, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003045 return NULL;
3046 fp = get_file(pathname, fob, "rb");
3047 if (fp == NULL)
3048 return NULL;
3049 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003050 if (fob == NULL)
3051 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003052 return m;
3053}
3054
Guido van Rossum96a8fb71999-12-22 14:09:35 +00003055#ifdef HAVE_DYNAMIC_LOADING
3056
Guido van Rossum79f25d91997-04-29 20:08:16 +00003057static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003058imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003059{
3060 char *name;
3061 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003062 PyObject *fob = NULL;
3063 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00003064 FILE *fp = NULL;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00003065 if (!PyArg_ParseTuple(args, "ss|O:load_dynamic",
3066 &name, &pathname, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003067 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003068 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00003069 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003070 if (fp == NULL)
3071 return NULL;
3072 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003073 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00003074 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003075}
3076
Guido van Rossum96a8fb71999-12-22 14:09:35 +00003077#endif /* HAVE_DYNAMIC_LOADING */
3078
Guido van Rossum79f25d91997-04-29 20:08:16 +00003079static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003080imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003081{
3082 char *name;
3083 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003084 PyObject *fob = NULL;
3085 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003086 FILE *fp;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00003087 if (!PyArg_ParseTuple(args, "ss|O:load_source",
3088 &name, &pathname, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003089 return NULL;
3090 fp = get_file(pathname, fob, "r");
3091 if (fp == NULL)
3092 return NULL;
3093 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003094 if (fob == NULL)
3095 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003096 return m;
3097}
3098
Guido van Rossum79f25d91997-04-29 20:08:16 +00003099static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003100imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003101{
3102 char *name;
3103 PyObject *fob;
3104 char *pathname;
3105 char *suffix; /* Unused */
3106 char *mode;
3107 int type;
3108 FILE *fp;
3109
Guido van Rossum43713e52000-02-29 13:59:29 +00003110 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003111 &name, &fob, &pathname,
3112 &suffix, &mode, &type))
3113 return NULL;
Guido van Rossum5e2c5fa2002-05-30 17:33:07 +00003114 if (*mode) {
3115 /* Mode must start with 'r' or 'U' and must not contain '+'.
3116 Implicit in this test is the assumption that the mode
3117 may contain other modifiers like 'b' or 't'. */
3118
3119 if (!(*mode == 'r' || *mode == 'U') || strchr(mode, '+')) {
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00003120 PyErr_Format(PyExc_ValueError,
3121 "invalid file open mode %.200s", mode);
3122 return NULL;
Guido van Rossum5e2c5fa2002-05-30 17:33:07 +00003123 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003124 }
3125 if (fob == Py_None)
3126 fp = NULL;
3127 else {
Guido van Rossumda5b8f22007-06-12 23:30:11 +00003128 fp = get_file(NULL, fob, mode);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003129 if (fp == NULL)
3130 return NULL;
3131 }
Just van Rossum52e14d62002-12-30 22:08:05 +00003132 return load_module(name, fp, pathname, type, NULL);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003133}
3134
3135static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003136imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003137{
3138 char *name;
3139 char *pathname;
Guido van Rossum43713e52000-02-29 13:59:29 +00003140 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003141 return NULL;
3142 return load_package(name, pathname);
3143}
3144
3145static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003146imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003147{
3148 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00003149 if (!PyArg_ParseTuple(args, "s:new_module", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003150 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003151 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003152}
3153
Christian Heimes13a7a212008-01-07 17:13:09 +00003154static PyObject *
3155imp_reload(PyObject *self, PyObject *v)
3156{
3157 return PyImport_ReloadModule(v);
3158}
3159
3160PyDoc_STRVAR(doc_reload,
3161"reload(module) -> module\n\
3162\n\
3163Reload the module. The module must have been successfully imported before.");
3164
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003165/* Doc strings */
3166
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003167PyDoc_STRVAR(doc_imp,
3168"This module provides the components needed to build your own\n\
3169__import__ function. Undocumented functions are obsolete.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003170
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003171PyDoc_STRVAR(doc_find_module,
3172"find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003173Search for a module. If path is omitted or None, search for a\n\
3174built-in, frozen or special module and continue search in sys.path.\n\
3175The module name cannot contain '.'; to search for a submodule of a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003176package, pass the submodule name and the package's __path__.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003177
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003178PyDoc_STRVAR(doc_load_module,
3179"load_module(name, file, filename, (suffix, mode, type)) -> module\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003180Load a module, given information returned by find_module().\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003181The module name must include the full package name, if any.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003182
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003183PyDoc_STRVAR(doc_get_magic,
3184"get_magic() -> string\n\
3185Return the magic number for .pyc or .pyo files.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003186
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003187PyDoc_STRVAR(doc_get_suffixes,
3188"get_suffixes() -> [(suffix, mode, type), ...]\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003189Return a list of (suffix, mode, type) tuples describing the files\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003190that find_module() looks for.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003191
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003192PyDoc_STRVAR(doc_new_module,
3193"new_module(name) -> module\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003194Create a new module. Do not enter it in sys.modules.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003195The module name must include the full package name, if any.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003196
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003197PyDoc_STRVAR(doc_lock_held,
Tim Petersa7c65092004-08-01 23:26:05 +00003198"lock_held() -> boolean\n\
3199Return True if the import lock is currently held, else False.\n\
3200On platforms without threads, return False.");
Tim Peters69232342001-08-30 05:16:13 +00003201
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00003202PyDoc_STRVAR(doc_acquire_lock,
3203"acquire_lock() -> None\n\
Neal Norwitz2294c0d2003-02-12 23:02:21 +00003204Acquires the interpreter's import lock for the current thread.\n\
3205This lock should be used by import hooks to ensure thread-safety\n\
3206when importing modules.\n\
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00003207On platforms without threads, this function does nothing.");
3208
3209PyDoc_STRVAR(doc_release_lock,
3210"release_lock() -> None\n\
3211Release the interpreter's import lock.\n\
3212On platforms without threads, this function does nothing.");
3213
Guido van Rossum79f25d91997-04-29 20:08:16 +00003214static PyMethodDef imp_methods[] = {
Neal Norwitz08ea61a2003-02-17 18:18:00 +00003215 {"find_module", imp_find_module, METH_VARARGS, doc_find_module},
3216 {"get_magic", imp_get_magic, METH_NOARGS, doc_get_magic},
3217 {"get_suffixes", imp_get_suffixes, METH_NOARGS, doc_get_suffixes},
3218 {"load_module", imp_load_module, METH_VARARGS, doc_load_module},
3219 {"new_module", imp_new_module, METH_VARARGS, doc_new_module},
3220 {"lock_held", imp_lock_held, METH_NOARGS, doc_lock_held},
3221 {"acquire_lock", imp_acquire_lock, METH_NOARGS, doc_acquire_lock},
3222 {"release_lock", imp_release_lock, METH_NOARGS, doc_release_lock},
Christian Heimes13a7a212008-01-07 17:13:09 +00003223 {"reload", imp_reload, METH_O, doc_reload},
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003224 /* The rest are obsolete */
Neal Norwitz031829d2002-03-31 14:37:44 +00003225 {"get_frozen_object", imp_get_frozen_object, METH_VARARGS},
Brett Cannon8d110132009-03-15 02:20:16 +00003226 {"is_frozen_package", imp_is_frozen_package, METH_VARARGS},
Neal Norwitz031829d2002-03-31 14:37:44 +00003227 {"init_builtin", imp_init_builtin, METH_VARARGS},
3228 {"init_frozen", imp_init_frozen, METH_VARARGS},
3229 {"is_builtin", imp_is_builtin, METH_VARARGS},
3230 {"is_frozen", imp_is_frozen, METH_VARARGS},
3231 {"load_compiled", imp_load_compiled, METH_VARARGS},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00003232#ifdef HAVE_DYNAMIC_LOADING
Neal Norwitz031829d2002-03-31 14:37:44 +00003233 {"load_dynamic", imp_load_dynamic, METH_VARARGS},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00003234#endif
Neal Norwitz031829d2002-03-31 14:37:44 +00003235 {"load_package", imp_load_package, METH_VARARGS},
Neal Norwitz031829d2002-03-31 14:37:44 +00003236 {"load_source", imp_load_source, METH_VARARGS},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003237 {NULL, NULL} /* sentinel */
3238};
3239
Guido van Rossum1a8791e1998-08-04 22:46:29 +00003240static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003241setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003242{
3243 PyObject *v;
3244 int err;
3245
Christian Heimes217cfd12007-12-02 14:31:20 +00003246 v = PyLong_FromLong((long)value);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003247 err = PyDict_SetItemString(d, name, v);
3248 Py_XDECREF(v);
3249 return err;
3250}
3251
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003252typedef struct {
3253 PyObject_HEAD
3254} NullImporter;
3255
3256static int
3257NullImporter_init(NullImporter *self, PyObject *args, PyObject *kwds)
3258{
3259 char *path;
Christian Heimes7d3bc0a2007-11-07 17:26:16 +00003260 Py_ssize_t pathlen;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003261
3262 if (!_PyArg_NoKeywords("NullImporter()", kwds))
3263 return -1;
3264
Amaury Forgeot d'Arcf1ca0b12008-06-11 17:40:47 +00003265 if (!PyArg_ParseTuple(args, "es:NullImporter",
3266 Py_FileSystemDefaultEncoding, &path))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003267 return -1;
3268
Christian Heimes7d3bc0a2007-11-07 17:26:16 +00003269 pathlen = strlen(path);
3270 if (pathlen == 0) {
Georg Brandl8494d572008-07-19 10:13:15 +00003271 PyMem_Free(path);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003272 PyErr_SetString(PyExc_ImportError, "empty pathname");
3273 return -1;
3274 } else {
Hirokazu Yamamoto21cbf5f2009-01-23 07:23:03 +00003275#ifndef MS_WINDOWS
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003276 struct stat statbuf;
3277 int rv;
3278
3279 rv = stat(path, &statbuf);
Georg Brandl8494d572008-07-19 10:13:15 +00003280 PyMem_Free(path);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003281 if (rv == 0) {
3282 /* it exists */
3283 if (S_ISDIR(statbuf.st_mode)) {
3284 /* it's a directory */
3285 PyErr_SetString(PyExc_ImportError,
3286 "existing directory");
3287 return -1;
3288 }
3289 }
Hirokazu Yamamoto21cbf5f2009-01-23 07:23:03 +00003290#else /* MS_WINDOWS */
3291 DWORD rv;
3292 /* see issue1293 and issue3677:
3293 * stat() on Windows doesn't recognise paths like
3294 * "e:\\shared\\" and "\\\\whiterab-c2znlh\\shared" as dirs.
3295 */
3296 rv = GetFileAttributesA(path);
Kristján Valur Jónsson92cb4382009-01-24 10:33:25 +00003297 PyMem_Free(path);
Hirokazu Yamamoto21cbf5f2009-01-23 07:23:03 +00003298 if (rv != INVALID_FILE_ATTRIBUTES) {
3299 /* it exists */
3300 if (rv & FILE_ATTRIBUTE_DIRECTORY) {
3301 /* it's a directory */
3302 PyErr_SetString(PyExc_ImportError,
3303 "existing directory");
3304 return -1;
3305 }
3306 }
3307#endif
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003308 }
3309 return 0;
3310}
3311
3312static PyObject *
3313NullImporter_find_module(NullImporter *self, PyObject *args)
3314{
3315 Py_RETURN_NONE;
3316}
3317
3318static PyMethodDef NullImporter_methods[] = {
3319 {"find_module", (PyCFunction)NullImporter_find_module, METH_VARARGS,
3320 "Always return None"
3321 },
3322 {NULL} /* Sentinel */
3323};
3324
3325
Christian Heimes9cd17752007-11-18 19:35:23 +00003326PyTypeObject PyNullImporter_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003327 PyVarObject_HEAD_INIT(NULL, 0)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003328 "imp.NullImporter", /*tp_name*/
3329 sizeof(NullImporter), /*tp_basicsize*/
3330 0, /*tp_itemsize*/
3331 0, /*tp_dealloc*/
3332 0, /*tp_print*/
3333 0, /*tp_getattr*/
3334 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00003335 0, /*tp_reserved*/
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003336 0, /*tp_repr*/
3337 0, /*tp_as_number*/
3338 0, /*tp_as_sequence*/
3339 0, /*tp_as_mapping*/
3340 0, /*tp_hash */
3341 0, /*tp_call*/
3342 0, /*tp_str*/
3343 0, /*tp_getattro*/
3344 0, /*tp_setattro*/
3345 0, /*tp_as_buffer*/
3346 Py_TPFLAGS_DEFAULT, /*tp_flags*/
3347 "Null importer object", /* tp_doc */
3348 0, /* tp_traverse */
3349 0, /* tp_clear */
3350 0, /* tp_richcompare */
3351 0, /* tp_weaklistoffset */
3352 0, /* tp_iter */
3353 0, /* tp_iternext */
3354 NullImporter_methods, /* tp_methods */
3355 0, /* tp_members */
3356 0, /* tp_getset */
3357 0, /* tp_base */
3358 0, /* tp_dict */
3359 0, /* tp_descr_get */
3360 0, /* tp_descr_set */
3361 0, /* tp_dictoffset */
3362 (initproc)NullImporter_init, /* tp_init */
3363 0, /* tp_alloc */
3364 PyType_GenericNew /* tp_new */
3365};
3366
Martin v. Löwis1a214512008-06-11 05:26:20 +00003367static struct PyModuleDef impmodule = {
3368 PyModuleDef_HEAD_INIT,
3369 "imp",
3370 doc_imp,
3371 0,
3372 imp_methods,
3373 NULL,
3374 NULL,
3375 NULL,
3376 NULL
3377};
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003378
Jason Tishler6bc06ec2003-09-04 11:59:50 +00003379PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00003380PyInit_imp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003381{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003382 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003383
Christian Heimes9cd17752007-11-18 19:35:23 +00003384 if (PyType_Ready(&PyNullImporter_Type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00003385 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003386
Martin v. Löwis1a214512008-06-11 05:26:20 +00003387 m = PyModule_Create(&impmodule);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00003388 if (m == NULL)
3389 goto failure;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003390 d = PyModule_GetDict(m);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003391 if (d == NULL)
3392 goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003393
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003394 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
3395 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
3396 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
3397 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
3398 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
3399 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
3400 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
3401 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00003402 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Just van Rossum52e14d62002-12-30 22:08:05 +00003403 if (setint(d, "IMP_HOOK", IMP_HOOK) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003404
Christian Heimes9cd17752007-11-18 19:35:23 +00003405 Py_INCREF(&PyNullImporter_Type);
3406 PyModule_AddObject(m, "NullImporter", (PyObject *)&PyNullImporter_Type);
Martin v. Löwis1a214512008-06-11 05:26:20 +00003407 return m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003408 failure:
Martin v. Löwis1a214512008-06-11 05:26:20 +00003409 Py_XDECREF(m);
3410 return NULL;
3411
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003412}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003413
3414
Guido van Rossumb18618d2000-05-03 23:44:39 +00003415/* API for embedding applications that want to add their own entries
3416 to the table of built-in modules. This should normally be called
3417 *before* Py_Initialize(). When the table resize fails, -1 is
3418 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003419
3420 After a similar function by Just van Rossum. */
3421
3422int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003423PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003424{
3425 static struct _inittab *our_copy = NULL;
3426 struct _inittab *p;
3427 int i, n;
3428
3429 /* Count the number of entries in both tables */
3430 for (n = 0; newtab[n].name != NULL; n++)
3431 ;
3432 if (n == 0)
3433 return 0; /* Nothing to do */
3434 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
3435 ;
3436
3437 /* Allocate new memory for the combined table */
Guido van Rossumb18618d2000-05-03 23:44:39 +00003438 p = our_copy;
3439 PyMem_RESIZE(p, struct _inittab, i+n+1);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003440 if (p == NULL)
3441 return -1;
3442
3443 /* Copy the tables into the new memory */
3444 if (our_copy != PyImport_Inittab)
3445 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
3446 PyImport_Inittab = our_copy = p;
3447 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
3448
3449 return 0;
3450}
3451
3452/* Shorthand to add a single entry given a name and a function */
3453
3454int
Martin v. Löwis1a214512008-06-11 05:26:20 +00003455PyImport_AppendInittab(char *name, PyObject* (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003456{
3457 struct _inittab newtab[2];
3458
3459 memset(newtab, '\0', sizeof newtab);
3460
3461 newtab[0].name = name;
3462 newtab[0].initfunc = initfunc;
3463
3464 return PyImport_ExtendInittab(newtab);
3465}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003466
3467#ifdef __cplusplus
3468}
3469#endif